RAG架构实战教程(非常详细),8种模式从入门到精通,收藏这一篇就够了!

SAP中寄售结算规则及要点分析 在做MRKO寄售结算时,系统会根据选定的期间和供应商等条件,将符合条件的寄售消耗或寄售上线的物料凭证找出。然后以供应商为单位。合并产生一张会计凭证。下图显示了通过MRKO结算后自动生成的会计凭证。 那么,在MRKO做寄售结算的规则是什么样的?做为寄售业务处理者的物流和财务需要掌握和了解哪些关于寄售结算的规则和控制逻辑。下面以笔者的经验分析一下: 1、寄售物料在系统中有两种处理方法,一种是通过MB1B 411 K ,通常该操作达到两个目的:将物料从仓库转移到线边库(表示即将要投入生产了)的同时将寄售库 阅读详情

因为项目的需要,之前研究了一段时间的RAG,于是本文总结 8 种 RAG 架构,对每种架构进行简要介绍,并用 langchain 实现其参考代码。

1. Naive RAG

简介:

Naive RAG 是最基础的检索增强生成架构,采用“索引-检索-生成”的经典流程。架构:

实现步骤:

  • 数据加载 :收集数据并进行清洗,比如各个文档格式的转换,OCR 文字提取等
  • 分块和 embedding :将文档拆分更小的 chunk,一方面让 embedding 更好转换语义信息,另一方面解决LLM的上下文长度限制问题
  • 向量存储:将 embedding 存储到向量数据库中,方便快速搜索
  • search 和 Prompt工程:对于查找的问题先通过向量数据库检索,然后将召回的文件原文,通过 Prompt 加工提供给LLM
  • 输出答案:LLM 根据 Prompt 生成答案输出

参考代码:

from langchain_openai import ChatOpenAIfrom langchain_huggingface import HuggingFaceEmbeddingsfrom langchain_community.vectorstores import LanceDBfrom langchain.schema import Documentfrom langchain.chains import RetrievalQAfrom langchain.prompts import PromptTemplateimport lancedbclass NaiveRAG:    def __init__(self):        self.llm = ChatOpenAI(model="gpt-5", temperature=0)        # 使用轻量级的all-MiniLM-L6-v2模型,仅80MB        self.embeddings = HuggingFaceEmbeddings(            model_name="sentence-transformers/all-MiniLM-L6-v2",            model_kwargs={"device": "cpu"},            encode_kwargs={"normalize_embeddings": True}        )        self.db = lancedb.connect("/tmp/lancedb_naive_rag")        self.vectorstore = None        def build_index(self, documents: list):        """构建向量索引"""        docs = [Document(page_content=d) for d in documents]        self.vectorstore = LanceDB.from_documents(            docs,             self.embeddings,            connection=self.db,            table_name="naive_rag_docs"        )        def query(self, question: str) -> str:        """执行检索并生成答案"""        # 创建检索链        retriever = self.vectorstore.as_retriever(search_kwargs={"k": 3})                prompt_template = PromptTemplate(            input_variables=["context", "question"],            template="""基于以下上下文回答问题:            上下文: {context}            问题: {question}            答案:"""        )                qa_chain = RetrievalQA.from_chain_type(            llm=self.llm,            chain_type="stuff",            retriever=retriever,            chain_type_kwargs={"prompt": prompt_template}        )                return qa_chain.invoke({"query": question})["result"]# 使用示例naive_rag = NaiveRAG()naive_rag.build_index(["文档1内容...", "文档2内容...", "文档3内容..."])answer = naive_rag.query("What is issue date of lease?")print(answer)

2. Multi-Head RAG

简介:

Multi-Head RAG 借鉴了 Transformer 的多头注意力机制,利用模型不同注意力头捕获的多样化语义特征进行并行检索。

架构:

实现步骤:

  • 多头注意力Embedding:利用 Transformer 模型的多头注意力层(而非最后一层)生成多个embedding,每个头捕获不同的语义特征
  • 多向量索引构建:为每个注意力头构建独立的向量索引,存储不同维度的语义信息
  • 并行检索:针对查询,在多个索引上并行检索,每个头返回最相关的文档片段
  • 结果融合:将多个头的检索结果进行去重和融合,综合考虑不同语义维度的相关性
  • 上下文生成:将融合后的文档片段组装成上下文,输入LLM生成答案

相关参考如下:

论文:https://arxiv.org/pdf/2406.05085

代码:https://github.com/spcl/MRAG

参考代码:

from langchain_openai import ChatOpenAIfrom langchain_community.vectorstores import LanceDBfrom langchain.schema import Documentfrom langchain.embeddings.base import Embeddingsfrom transformers import AutoModel, AutoTokenizerimport torchimport lancedbfrom typing import Listclass MultiHeadEmbeddings(Embeddings):    """自定义多头注意力Embedding,继承LangChain的Embeddings基类"""    def __init__(self, model_name="bert-base-uncased", head_index=0, num_heads=12):        self.tokenizer = AutoTokenizer.from_pretrained(model_name)        self.model = AutoModel.from_pretrained(model_name, output_hidden_states=True)        self.head_index = head_index        self.num_heads = num_heads        self.head_dim = 768 // num_heads  # BERT hidden size / num_heads        def _get_head_embedding(self, texts: List[str]) -> List[List[float]]:        """获取指定头的embedding"""        inputs = self.tokenizer(texts, return_tensors="pt", padding=True, truncation=True)        with torch.no_grad():            outputs = self.model(**inputs, output_hidden_states=True)        hidden_states = outputs.hidden_states[-2]  # 倒数第二层        start = self.head_index * self.head_dim        end = (self.head_index + 1) * self.head_dim        head_emb = hidden_states[:, 0, start:end].numpy()        return head_emb.tolist()        def embed_documents(self, texts: List[str]) -> List[List[float]]:        return self._get_head_embedding(texts)        def embed_query(self, text: str) -> List[float]:        return self._get_head_embedding([text])[0]class MultiHeadRAG:    def __init__(self, num_heads=12):        self.llm = ChatOpenAI(model="gpt-5", temperature=0)        self.num_heads = num_heads        self.db = lancedb.connect("/tmp/lancedb_multihead_rag")        self.vectorstores = []  # 每个头一个向量存储        self.documents = []        def build_index(self, documents: List[str]):        """为每个头构建独立的LanceDB向量存储"""        self.documents = documents        docs = [Document(page_content=d) for d in documents]                for head_idx in range(self.num_heads):            embeddings = MultiHeadEmbeddings(head_index=head_idx, num_heads=self.num_heads)            vectorstore = LanceDB.from_documents(                docs,                 embeddings,                connection=self.db,                table_name=f"head_{head_idx}_docs"            )            self.vectorstores.append(vectorstore)        def search(self, query: str, top_k: int = 3) -> List[str]:        """多头并行检索并融合结果"""        all_results = set()        for vectorstore in self.vectorstores:            docs = vectorstore.similarity_search(query, k=top_k)            for doc in docs:                all_results.add(doc.page_content)        return list(all_results)        def query(self, question: str) -> str:        """检索并生成答案"""        retrieved_docs = self.search(question)        context = "\n\n".join(retrieved_docs)                from langchain.prompts import ChatPromptTemplate        prompt = ChatPromptTemplate.from_template(            """基于以下多维度检索的上下文回答问题:            上下文: {context}            问题: {question}            答案:"""        )        chain = prompt | self.llm        response = chain.invoke({"context": context, "question": question})        return response.content# 使用示例mrag = MultiHeadRAG(num_heads=12)documents = ["文档1的内容...", "文档2的内容...", "文档3的内容..."]mrag.build_index(documents)answer = mrag.query("查询问题")print(answer)

3. Corrective RAG

简介:

Corrective RAG 在传统 RAG 基础上引入了文档质量评估和自我修正机制。对检索到的每个文档进行相关性评分(Correct/Incorrect/Ambiguous),对于质量不足的检索结果,搜索外部知识源进行补充。

架构:

实现步骤:

  • 初始检索:使用向量检索获取与查询相关的候选文档
  • 相关性评估:使用LLM或专门的评估模型对每个检索到的文档进行相关性评分(Correct/Incorrect/Ambiguous)
  • 知识修正:对于评估为不相关或模糊的文档,触发知识修正机制
  • 网络搜索增强:当本地知识库文档质量不足时,调用外部搜索引擎获取补充信息
  • 文档重组:将评估为相关的文档和补充搜索结果重新组织,去除冗余信息
  • 答案生成:基于修正后的高质量上下文生成最终答案

参考代码:

from langchain_openai import ChatOpenAIfrom langchain_huggingface import HuggingFaceEmbeddingsfrom langchain_community.vectorstores import LanceDBfrom langchain_community.tools import TavilySearchResultsfrom langchain.schema import Documentfrom langchain.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParserimport lancedbfrom typing import Listclass CorrectiveRAG:    def __init__(self):        self.llm = ChatOpenAI(model="gpt-5", temperature=0)        self.embeddings = HuggingFaceEmbeddings(            model_name="sentence-transformers/all-MiniLM-L6-v2",            model_kwargs={"device": "cpu"},            encode_kwargs={"normalize_embeddings": True}        )        self.db = lancedb.connect("/tmp/lancedb_corrective_rag")        self.vectorstore = None        # 使用Tavily进行网络搜索        self.web_search = TavilySearchResults(max_results=3)        def build_index(self, documents: List[str]):        """构建向量索引"""        docs = [Document(page_content=d) for d in documents]        self.vectorstore = LanceDB.from_documents(            docs,             self.embeddings,            connection=self.db,            table_name="corrective_rag_docs"        )        def evaluate_relevance(self, query: str, document: str) -> str:        """评估文档与查询的相关性"""        prompt = ChatPromptTemplate.from_template(            """评估以下文档与查询的相关性。            查询: {query}            文档: {document}                        请回答: CORRECT(相关), INCORRECT(不相关), 或 AMBIGUOUS(模糊)            只返回一个词。"""        )        chain = prompt | self.llm | StrOutputParser()        response = chain.invoke({"query": query, "document": document})        return response.strip().upper()        def search_web(self, query: str) -> List[str]:        """当本地文档不足时进行网络搜索"""        try:            results = self.web_search.invoke(query)            return [r["content"] for r in results if"content"in r]        except:            return []        def retrieve_and_correct(self, query: str, top_k: int = 5) -> List[str]:        """检索并修正文档"""        # 1. 初始检索        retriever = self.vectorstore.as_retriever(search_kwargs={"k": top_k})        docs = retriever.invoke(query)                # 2. 评估每个文档的相关性        correct_docs = []        need_web_search = True                for doc in docs:            relevance = self.evaluate_relevance(query, doc.page_content)            if relevance == "CORRECT":                correct_docs.append(doc.page_content)                need_web_search = False            elif relevance == "AMBIGUOUS":                # 对模糊文档进行知识精炼                refined = self.refine_document(query, doc.page_content)                correct_docs.append(refined)                # 3. 必要时进行网络搜索补充        if need_web_search or len(correct_docs) < 2:            web_results = self.search_web(query)            correct_docs.extend(web_results)                return correct_docs        def refine_document(self, query: str, document: str) -> str:        """精炼文档,提取与查询相关的部分"""        prompt = ChatPromptTemplate.from_template(            """从以下文档中提取与查询最相关的信息:            查询: {query}            文档: {document}                        请只返回相关的精炼内容:"""        )        chain = prompt | self.llm | StrOutputParser()        return chain.invoke({"query": query, "document": document})        def query(self, question: str) -> str:        """生成最终答案"""        corrected_docs = self.retrieve_and_correct(question)        context = "\n\n".join(corrected_docs)                prompt = ChatPromptTemplate.from_template(            """基于以下经过修正的上下文回答问题:            上下文: {context}            问题: {question}            答案:"""        )        chain = prompt | self.llm | StrOutputParser()        return chain.invoke({"context": context, "question": question})# 使用示例crag = CorrectiveRAG()crag.build_index(["文档1...", "文档2...", "文档3..."])answer = crag.query("你的问题是什么?")print(answer)

4. Agentic RAG

简介:

Agentic RAG(智能体RAG)将 AI Agent 的规划和推理能力与 RAG 相结合。
Agent 可以自主分析查询、制定检索策略、选择合适的工具(语义搜索、关键词搜索、计算器等),并根据中间结果进行迭代优化。

架构:

实现步骤:

  • Agent初始化:创建具有推理和规划能力的AI Agent,配备检索工具
  • 任务分解:Agent分析用户查询,将复杂问题分解为多个子任务
  • 工具选择:Agent根据子任务特点选择合适的工具(检索、计算、API调用等)
  • 迭代检索:Agent可以根据中间结果决定是否需要进一步检索或调整查询策略
  • 推理整合:Agent对多轮检索和工具调用的结果进行推理和整合
  • 自我反思:Agent评估答案质量,必要时进行自我修正
  • 最终输出:生成完整、准确的答案

参考代码:

from langchain_openai import ChatOpenAIfrom langchain_huggingface import HuggingFaceEmbeddingsfrom langchain_community.vectorstores import LanceDBfrom langchain.schema import Documentfrom langchain.agents import AgentExecutor, create_tool_calling_agentfrom langchain.tools import toolfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderimport lancedbfrom typing import Listclass AgenticRAG:    def __init__(self):        self.llm = ChatOpenAI(model="gpt-4", temperature=0)        # 使用轻量级的all-MiniLM-L6-v2模型,仅80MB        self.embeddings = HuggingFaceEmbeddings(            model_name="sentence-transformers/all-MiniLM-L6-v2",            model_kwargs={"device": "cpu"},            encode_kwargs={"normalize_embeddings": True}        )        self.db = lancedb.connect("/tmp/lancedb_agentic_rag")        self.vectorstore = None        self.agent_executor = None        def build_index(self, documents: List[str]):        """构建向量索引"""        docs = [Document(page_content=d) for d in documents]        self.vectorstore = LanceDB.from_documents(            docs,             self.embeddings,            connection=self.db,            table_name="agentic_rag_docs"        )        def setup_agent(self):        """配置Agent和工具"""        vectorstore = self.vectorstore  # 闭包引用                @tool        def semantic_search(query: str) -> str:            """用于语义搜索,当需要理解问题含义并查找相关文档时使用"""            docs = vectorstore.similarity_search(query, k=3)            return"\n".join([d.page_content for d in docs])                @tool        def keyword_search(query: str) -> str:            """用于关键词搜索,当需要精确匹配特定术语时使用"""            docs = vectorstore.similarity_search(query, k=2)            return"\n".join([d.page_content for d in docs])                @tool        def calculator(expression: str) -> str:            """用于数学计算,输入数学表达式"""            try:                return str(eval(expression))            except:                return"计算错误"                tools = [semantic_search, keyword_search, calculator]                # 使用新版本的Agent提示模板        prompt = ChatPromptTemplate.from_messages([            ("system", """你是一个智能助手,可以使用工具来回答问题。                        可用工具:            - semantic_search: 用于语义搜索,查找相关文档            - keyword_search: 用于关键词精确匹配            - calculator: 用于数学计算                        请根据问题选择合适的工具,可以多次调用工具来获取完整信息。"""),            ("human", "{input}"),            MessagesPlaceholder(variable_name="agent_scratchpad")        ])                # 创建Tool Calling Agent        agent = create_tool_calling_agent(self.llm, tools, prompt)        self.agent_executor = AgentExecutor(            agent=agent,             tools=tools,             verbose=True,            max_iterations=5,            handle_parsing_errors=True        )        def query(self, question: str) -> str:        """执行查询"""        ifnot self.agent_executor:            self.setup_agent()        result = self.agent_executor.invoke({"input": question})        return result["output"]# 使用示例arag = AgenticRAG()arag.build_index(["产品A价格100元...", "产品B价格200元...", "优惠政策..."])answer = arag.query("产品A和产品B的总价是多少?有什么优惠?")print(answer)

5. Graph RAG

简介:

Graph RAG 将知识图谱技术与 RAG 相结合,通过从文档中抽取实体和关系构建知识图谱,并进行社区检测和摘要生成。

架构:

实现步骤:

  • 实体抽取:使用NER或LLM从文档中抽取实体(人物、地点、概念等)
  • 关系抽取:识别实体之间的关系,构建三元组(实体-关系-实体)
  • 知识图谱构建:将实体和关系存储到图数据库中(如Neo4j)
  • 社区检测:对图进行社区划分,识别主题聚类
  • 社区摘要:为每个社区生成摘要描述
  • 图检索:根据查询在知识图谱中检索相关子图和社区摘要
  • 答案生成:结合图结构信息和社区摘要生成更全面的答案

参考代码:

from langchain_openai import ChatOpenAIfrom langchain_community.graphs import Neo4jGraphfrom langchain.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParser, JsonOutputParserimport networkx as nxfrom typing import List, Dictimport jsonclass GraphRAG:    def __init__(self, neo4j_uri="bolt://localhost:7687",                  neo4j_user="neo4j", neo4j_password="password"):        self.llm = ChatOpenAI(model="gpt-5", temperature=0)        # 使用LangChain的Neo4j集成        self.graph_db = Neo4jGraph(            url=neo4j_uri,             username=neo4j_user,             password=neo4j_password        )        self.nx_graph = nx.Graph()        def extract_entities_and_relations(self, text: str) -> Dict:        """使用LLM抽取实体和关系"""        prompt = ChatPromptTemplate.from_template(            """从以下文本中抽取实体和关系,返回JSON格式:            文本: {text}                        返回格式(只返回JSON):            {{                "entities": ["实体1", "实体2", ...],                "relations": [["实体1", "关系", "实体2"], ...]            }}"""        )        chain = prompt | self.llm | StrOutputParser()        response = chain.invoke({"text": text})        try:            return json.loads(response)        except:            return {"entities": [], "relations": []}        def build_knowledge_graph(self, documents: List[str]):        """构建知识图谱"""        for doc in documents:            extracted = self.extract_entities_and_relations(doc)                        # 添加到NetworkX图            for entity in extracted["entities"]:                self.nx_graph.add_node(entity)                        for rel in extracted["relations"]:                if len(rel) == 3:                    self.nx_graph.add_edge(rel[0], rel[2], relation=rel[1])                        # 存储到Neo4j            for entity in extracted["entities"]:                self.graph_db.query(                    "MERGE (e:Entity {name: $name})",                     {"name": entity}                )            for rel in extracted["relations"]:                if len(rel) == 3:                    self.graph_db.query(                        """MATCH (a:Entity {name: $from})                           MATCH (b:Entity {name: $to})                           MERGE (a)-[r:RELATED {type: $rel}]->(b)""",                        {"from": rel[0], "to": rel[2], "rel": rel[1]}                    )        def detect_communities(self) -> List[List[str]]:        """社区检测"""        from networkx.algorithms import community        if len(self.nx_graph.nodes()) == 0:            return []        communities = community.louvain_communities(self.nx_graph)        return [list(c) for c in communities]        def generate_community_summaries(self, communities: List[List[str]]) -> List[Dict]:        """为每个社区生成摘要"""        summaries = []        for i, comm in enumerate(communities):            subgraph = self.nx_graph.subgraph(comm)            edges_info = [(u, v, d.get('relation', ''))                          for u, v, d in subgraph.edges(data=True)]                        prompt = ChatPromptTemplate.from_template(                """为以下实体群组生成简短摘要:                实体: {entities}                关系: {relations}                摘要:"""            )            chain = prompt | self.llm | StrOutputParser()            summary = chain.invoke({"entities": comm, "relations": edges_info})            summaries.append({"community": i, "entities": comm, "summary": summary})        return summaries        def query(self, question: str) -> str:        """基于图的检索和回答"""        # 1. 从问题中提取关键实体        entities = self.extract_entities_and_relations(question)["entities"]                # 2. 在Neo4j中查找相关子图        graph_context = self.graph_db.query(            """MATCH (e:Entity)-[r]-(related)               WHERE e.name IN $entities               RETURN e.name AS entity, type(r) AS rel_type,                       r.type AS relation, related.name AS related_entity               LIMIT 20""",            {"entities": entities}        )                # 3. 获取社区摘要        communities = self.detect_communities()        summaries = self.generate_community_summaries(communities[:3])                # 4. 生成答案        context = f"图关系: {graph_context}\n社区摘要: {summaries}"        prompt = ChatPromptTemplate.from_template(            """基于以下知识图谱信息回答问题:            {context}                        问题: {question}            答案:"""        )        chain = prompt | self.llm | StrOutputParser()        return chain.invoke({"context": context, "question": question})# 使用示例grag = GraphRAG()grag.build_knowledge_graph([    "张三是ABC公司的CEO,该公司位于北京",    "李四是ABC公司的CTO,他与张三是大学同学",    "ABC公司开发了产品X,市场份额领先"])answer = grag.query("ABC公司的领导层有哪些人?")print(answer)

6. Self RAG

简介:

Self RAG 提供给模型自我评估和决策能力,它通过四个反思标记(Retrieve/ISREL/ISSUP/ISUSE)来判断:是否需要检索、文档是否相关、答案是否被支持、答案是否有用,模型会生成多个候选答案并综合评分,选择最优结果输出。

架构:

实现步骤:

  • 检索决策:模型首先判断是否需要检索(生成Retrieve标记)
  • 按需检索:如果需要检索,从知识库中获取相关文档
  • 相关性评估:模型评估检索到的文档是否与查询相关(生成ISREL标记)
  • 支持度评估:模型评估生成的内容是否被检索文档支持(生成ISSUP标记)
  • 有用性评估:模型评估生成的回答是否对用户有用(生成ISUSE标记)
  • 自适应生成:基于以上评估标记,模型决定是否使用检索内容、重新检索或直接生成
  • 输出最优答案:选择评分最高的生成结果作为最终输出

参考代码:

from langchain_openai import ChatOpenAIfrom langchain_huggingface import HuggingFaceEmbeddingsfrom langchain_community.vectorstores import LanceDBfrom langchain.schema import Documentfrom langchain.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParserimport lancedbfrom typing import List, Tupleclass SelfRAG:    def __init__(self):        self.llm = ChatOpenAI(model="gpt-4", temperature=0)        # 使用轻量级的all-MiniLM-L6-v2模型,仅80MB        self.embeddings = HuggingFaceEmbeddings(            model_name="sentence-transformers/all-MiniLM-L6-v2",            model_kwargs={"device": "cpu"},            encode_kwargs={"normalize_embeddings": True}        )        self.db = lancedb.connect("/tmp/lancedb_self_rag")        self.vectorstore = None        def build_index(self, documents: List[str]):        """构建向量索引"""        docs = [Document(page_content=d) for d in documents]        self.vectorstore = LanceDB.from_documents(            docs,             self.embeddings,            connection=self.db,            table_name="self_rag_docs"        )        def should_retrieve(self, query: str) -> bool:        """判断是否需要检索 (Retrieve标记)"""        prompt = ChatPromptTemplate.from_template(            """判断以下问题是否需要检索外部知识来回答。            问题: {query}                        如果问题需要事实性知识、最新信息或特定领域知识,回答YES。            如果问题是通用问题或推理问题,回答NO。            只回答YES或NO:"""        )        chain = prompt | self.llm | StrOutputParser()        response = chain.invoke({"query": query}).strip().upper()        return"YES"in response        def evaluate_relevance(self, query: str, document: str) -> Tuple[bool, float]:        """评估文档相关性 (ISREL标记)"""        prompt = ChatPromptTemplate.from_template(            """评估文档与问题的相关性,打分1-5分。            问题: {query}            文档: {document}                        返回格式: 分数|理由            示例: 4|文档直接回答了问题的核心内容"""        )        chain = prompt | self.llm | StrOutputParser()        response = chain.invoke({"query": query, "document": document})        try:            score = int(response.split("|")[0].strip())            return score >= 3, score / 5.0        except:            returnTrue, 0.6        def evaluate_support(self, document: str, answer: str) -> Tuple[bool, float]:        """评估答案是否被文档支持 (ISSUP标记)"""        prompt = ChatPromptTemplate.from_template(            """评估答案是否被文档内容支持,打分1-5分。            文档: {document}            答案: {answer}                        返回格式: 分数|理由"""        )        chain = prompt | self.llm | StrOutputParser()        response = chain.invoke({"document": document, "answer": answer})        try:            score = int(response.split("|")[0].strip())            return score >= 3, score / 5.0        except:            returnTrue, 0.6        def evaluate_usefulness(self, query: str, answer: str) -> Tuple[bool, float]:        """评估答案有用性 (ISUSE标记)"""        prompt = ChatPromptTemplate.from_template(            """评估答案对用户问题的有用程度,打分1-5分。            问题: {query}            答案: {answer}                        返回格式: 分数|理由"""        )        chain = prompt | self.llm | StrOutputParser()        response = chain.invoke({"query": query, "answer": answer})        try:            score = int(response.split("|")[0].strip())            return score >= 3, score / 5.0        except:            returnTrue, 0.6        def generate_with_context(self, query: str, context: str) -> str:        """基于上下文生成答案"""        prompt = ChatPromptTemplate.from_template(            """基于以下上下文回答问题。如果上下文不足以回答,请说明。            上下文: {context}            问题: {query}            答案:"""        )        chain = prompt | self.llm | StrOutputParser()        return chain.invoke({"context": context, "query": query})        def generate_without_context(self, query: str) -> str:        """不使用检索直接生成"""        prompt = ChatPromptTemplate.from_template("请回答以下问题: {query}")        chain = prompt | self.llm | StrOutputParser()        return chain.invoke({"query": query})        def query(self, question: str) -> str:        """Self-RAG主流程"""        # 1. 检索决策        need_retrieval = self.should_retrieve(question)                ifnot need_retrieval:            # 直接生成            answer = self.generate_without_context(question)            _, usefulness = self.evaluate_usefulness(question, answer)            return answer                # 2. 检索文档        retriever = self.vectorstore.as_retriever(search_kwargs={"k": 3})        docs = retriever.invoke(question)                # 3. 对每个文档生成候选答案并评分        candidates = []        for doc in docs:            # 评估相关性 (ISREL)            is_relevant, rel_score = self.evaluate_relevance(question, doc.page_content)            ifnot is_relevant:                continue                        # 生成答案            answer = self.generate_with_context(question, doc.page_content)                        # 评估支持度 (ISSUP)            is_supported, sup_score = self.evaluate_support(doc.page_content, answer)                        # 评估有用性 (ISUSE)            is_useful, use_score = self.evaluate_usefulness(question, answer)                        # 综合评分            total_score = rel_score * 0.3 + sup_score * 0.4 + use_score * 0.3            candidates.append((answer, total_score))                # 4. 选择最佳答案        if candidates:            candidates.sort(key=lambda x: x[1], reverse=True)            return candidates[0][0]        else:            # 如果没有合适的检索结果,直接生成            return self.generate_without_context(question)# 使用示例srag = SelfRAG()srag.build_index(["文档1内容...", "文档2内容...", "文档3内容..."])answer = srag.query("你的问题是什么?")print(answer)

7. Adaptive RAG

简介:

Adaptive RAG 根据查询的类型和复杂度动态选择最优的处理策略。

架构:

实现步骤:

  • 查询分类:分析用户查询的类型和复杂度(简单事实/多跳推理/开放性问题)
  • 策略选择:根据查询类型选择最优的RAG策略
  • 简单查询:直接LLM回答或单次检索
  • 复杂查询:多轮迭代检索
  • 开放性问题:结合网络搜索
  • 动态路由:将查询路由到对应的处理流程
  • 自适应检索:根据中间结果动态调整检索深度和范围
  • 结果整合:整合不同策略的结果生成最终答案

参考代码:

from langchain_openai import ChatOpenAIfrom langchain_huggingface import HuggingFaceEmbeddingsfrom langchain_community.vectorstores import LanceDBfrom langchain.schema import Documentfrom langchain.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.runnables import RunnableLambda, RunnablePassthroughimport lancedbfrom enum import Enumfrom typing import Listclass QueryType(Enum):    SIMPLE = "simple"           # 简单事实查询    MULTI_HOP = "multi_hop"     # 多跳推理查询    OPEN_ENDED = "open_ended"   # 开放性问题    NO_RETRIEVAL = "no_retrieval"# 不需要检索class AdaptiveRAG:    def __init__(self):        self.llm = ChatOpenAI(model="gpt-4", temperature=0)        # 使用轻量级的all-MiniLM-L6-v2模型,仅80MB        self.embeddings = HuggingFaceEmbeddings(            model_name="sentence-transformers/all-MiniLM-L6-v2",            model_kwargs={"device": "cpu"},            encode_kwargs={"normalize_embeddings": True}        )        self.db = lancedb.connect("/tmp/lancedb_adaptive_rag")        self.vectorstore = None        def build_index(self, documents: List[str]):        """构建向量索引"""        docs = [Document(page_content=d) for d in documents]        self.vectorstore = LanceDB.from_documents(            docs,             self.embeddings,            connection=self.db,            table_name="adaptive_rag_docs"        )        def classify_query(self, query: str) -> QueryType:        """分类查询类型"""        prompt = ChatPromptTemplate.from_template(            """分析以下查询的类型,返回对应类别:            查询: {query}                        类别说明:            - SIMPLE: 简单的事实性问题,可以直接从单个文档找到答案            - MULTI_HOP: 需要综合多个信息源进行推理的复杂问题            - OPEN_ENDED: 开放性问题,需要广泛的知识和创造性思考            - NO_RETRIEVAL: 通用知识问题,不需要检索即可回答                        只返回类别名称(SIMPLE/MULTI_HOP/OPEN_ENDED/NO_RETRIEVAL):"""        )        chain = prompt | self.llm | StrOutputParser()        response = chain.invoke({"query": query}).strip().upper()        mapping = {            "SIMPLE": QueryType.SIMPLE,            "MULTI_HOP": QueryType.MULTI_HOP,            "OPEN_ENDED": QueryType.OPEN_ENDED,            "NO_RETRIEVAL": QueryType.NO_RETRIEVAL        }        return mapping.get(response, QueryType.SIMPLE)        def simple_rag(self, query: str) -> str:        """简单RAG:单次检索"""        retriever = self.vectorstore.as_retriever(search_kwargs={"k": 2})                prompt = ChatPromptTemplate.from_template(            "基于以下内容回答问题:\n{context}\n\n问题:{question}\n答案:"        )                def format_docs(docs):            return"\n".join([d.page_content for d in docs])                chain = (            {"context": retriever | format_docs, "question": RunnablePassthrough()}            | prompt            | self.llm            | StrOutputParser()        )        return chain.invoke(query)        def multi_hop_rag(self, query: str, max_hops: int = 3) -> str:        """多跳RAG:迭代检索"""        accumulated_context = []        current_query = query        retriever = self.vectorstore.as_retriever(search_kwargs={"k": 2})                for hop in range(max_hops):            # 检索            docs = retriever.invoke(current_query)            accumulated_context.extend([d.page_content for d in docs])                        # 检查是否已有足够信息            context = "\n".join(accumulated_context)            check_prompt = ChatPromptTemplate.from_template(                """基于当前收集的信息,判断是否足够回答问题。                收集的信息: {context}                问题: {query}                                回答YES如果信息足够,回答NO如果需要更多信息。                如果回答NO,请提供下一步应该搜索的子问题。                格式: YES 或 NO|子问题"""            )            check_chain = check_prompt | self.llm | StrOutputParser()            check_response = check_chain.invoke({"context": context, "query": query})                        if check_response.strip().upper().startswith("YES"):                break            elif"|"in check_response:                current_query = check_response.split("|")[1].strip()                # 生成最终答案        final_context = "\n".join(accumulated_context)        final_prompt = ChatPromptTemplate.from_template(            "综合以下信息回答问题:\n{context}\n\n问题:{question}\n答案:"        )        final_chain = final_prompt | self.llm | StrOutputParser()        return final_chain.invoke({"context": final_context, "question": query})        def open_ended_rag(self, query: str) -> str:        """开放性RAG:广泛检索+创造性生成"""        # 扩展查询        expand_prompt = ChatPromptTemplate.from_template(            "为以下问题生成3个相关的搜索查询:\n{query}\n查询列表:"        )        expand_chain = expand_prompt | self.llm | StrOutputParser()        expanded = expand_chain.invoke({"query": query})        queries = [query] + [q.strip() for q in expanded.split("\n") if q.strip()][:3]                # 多查询检索        retriever = self.vectorstore.as_retriever(search_kwargs={"k": 2})        all_docs = []        for q in queries:            docs = retriever.invoke(q)            all_docs.extend([d.page_content for d in docs])                # 去重        unique_docs = list(set(all_docs))        context = "\n".join(unique_docs[:5])                final_prompt = ChatPromptTemplate.from_template(            """基于以下信息,对问题给出全面、有见地的回答:            信息: {context}            问题: {question}                        请提供详细的分析和见解:"""        )        final_chain = final_prompt | self.llm | StrOutputParser()        return final_chain.invoke({"context": context, "question": query})        def no_retrieval_generate(self, query: str) -> str:        """直接生成:不使用检索"""        prompt = ChatPromptTemplate.from_template("请回答:{query}")        chain = prompt | self.llm | StrOutputParser()        return chain.invoke({"query": query})        def query(self, question: str) -> str:        """自适应查询主流程 - 使用LangChain路由"""        # 1. 分类查询        query_type = self.classify_query(question)        print(f"查询类型: {query_type.value}")                # 2. 路由到对应策略        routing_map = {            QueryType.SIMPLE: self.simple_rag,            QueryType.MULTI_HOP: self.multi_hop_rag,            QueryType.OPEN_ENDED: self.open_ended_rag,            QueryType.NO_RETRIEVAL: self.no_retrieval_generate        }        return routing_map[query_type](question)# 使用示例arag = AdaptiveRAG()arag.build_index(["公司财报数据...", "市场分析报告...", "行业趋势..."])answer = arag.query("分析公司未来的发展前景")  # 会被识别为OPEN_ENDEDprint(answer)

8. SFR RAG

简介:

SFR RAG(Salesforce Research RAG)是工业级高质量 RAG 的最佳实践。它采用经过指令微调的高性能 embedding 模型(如 BGE),结合 Cross-Encoder 重排序、上下文压缩、引用生成和质量验证等多项优化技术。

架构:

实现步骤:

  • 高质量Embedding:使用SFR(Salesforce Research)的高性能embedding模型进行文档和查询编码
  • 指令微调检索:使用指令微调的检索模型,支持多种检索任务(问答、摘要、事实核查等)
  • 上下文压缩:对检索到的文档进行智能压缩,去除冗余信息
  • 重排序:使用专门的重排序模型对候选文档进行精细排序
  • 引用生成:生成答案时附带引用来源,提高可信度
  • 质量控制:对生成结果进行事实性检验和质量评估

参考代码:

from langchain_openai import ChatOpenAIfrom langchain_community.embeddings import HuggingFaceBgeEmbeddingsfrom langchain_community.vectorstores import LanceDBfrom langchain_community.cross_encoders import HuggingFaceCrossEncoderfrom langchain.retrievers.document_compressors import CrossEncoderRerankerfrom langchain.retrievers import ContextualCompressionRetrieverfrom langchain.schema import Documentfrom langchain.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParserimport lancedbfrom typing import List, Dictclass SFRRAG:    def __init__(self):        # 使用BGE高质量Embedding模型        self.embeddings = HuggingFaceBgeEmbeddings(            model_name="BAAI/bge-large-en-v1.5",            model_kwargs={"device": "cpu"},            encode_kwargs={"normalize_embeddings": True},            query_instruction="为检索任务生成查询表示: "        )        # 重排序模型        self.reranker_model = HuggingFaceCrossEncoder(            model_name="cross-encoder/ms-marco-MiniLM-L-6-v2"        )        self.llm = ChatOpenAI(model="gpt-5", temperature=0)        self.db = lancedb.connect("./lancedb_sfr_rag")        self.vectorstore = None        self.documents = []        def build_index(self, documents: List[str]):        """构建高质量向量索引"""        self.documents = documents        docs = [Document(page_content=d) for d in documents]        self.vectorstore = LanceDB.from_documents(            docs,             self.embeddings,            connection=self.db,            table_name="sfr_rag_docs"        )        def get_retriever_with_reranker(self, top_k: int = 5):        """创建带重排序的检索器"""        # 基础检索器        base_retriever = self.vectorstore.as_retriever(search_kwargs={"k": 10})                # 重排序压缩器        reranker = CrossEncoderReranker(            model=self.reranker_model,             top_n=top_k        )                # 组合检索器        return ContextualCompressionRetriever(            base_compressor=reranker,            base_retriever=base_retriever        )        def compress_context(self, query: str, documents: List[Document]) -> str:        """上下文压缩"""        doc_texts = "\n".join([f"[{i+1}] {doc.page_content}"                              for i, doc in enumerate(documents)])        prompt = ChatPromptTemplate.from_template(            """提取以下文档中与问题相关的关键信息:            问题: {query}                        文档:            {documents}                        请返回压缩后的关键信息,保留文档编号以便引用:"""        )        chain = prompt | self.llm | StrOutputParser()        return chain.invoke({"query": query, "documents": doc_texts})        def generate_with_citations(self, query: str, context: str) -> str:        """生成带引用的答案"""        prompt = ChatPromptTemplate.from_template(            """基于以下上下文回答问题,并标注引用来源[1][2]等。                        上下文: {context}                        问题: {query}                        要求:            1. 准确回答问题            2. 在相关陈述后标注引用来源            3. 如果上下文不足以回答,请说明                        答案:"""        )        chain = prompt | self.llm | StrOutputParser()        return chain.invoke({"context": context, "query": query})        def verify_answer(self, query: str, answer: str, documents: List[Document]) -> Dict:        """验证答案质量"""        doc_contents = [doc.page_content for doc in documents]        prompt = ChatPromptTemplate.from_template(            """评估以下答案的质量:            问题: {query}            答案: {answer}            参考文档: {documents}                        评估维度(1-5分):            1. 准确性:答案是否被文档支持            2. 完整性:答案是否全面回答了问题            3. 相关性:答案是否紧扣问题                        返回格式: 准确性分数|完整性分数|相关性分数|总评"""        )        chain = prompt | self.llm | StrOutputParser()        response = chain.invoke({            "query": query,             "answer": answer,             "documents": doc_contents        })        try:            parts = response.split("|")            return {                "accuracy": int(parts[0].strip()),                "completeness": int(parts[1].strip()),                "relevance": int(parts[2].strip()),                "summary": parts[3].strip() if len(parts) > 3else""            }        except:            return {"accuracy": 3, "completeness": 3, "relevance": 3, "summary": ""}        def query(self, question: str) -> Dict:        """SFR-RAG主流程"""        # 1. 初始检索 + 重排序        retriever = self.get_retriever_with_reranker(top_k=5)        docs = retriever.invoke(question)                # 2. 上下文压缩        compressed_context = self.compress_context(question, docs)                # 3. 生成带引用的答案        answer = self.generate_with_citations(question, compressed_context)                # 4. 质量验证        quality = self.verify_answer(question, answer, docs)                return {            "answer": answer,            "sources": [{"content": doc.page_content[:100]} for doc in docs],            "quality": quality        }# 使用示例sfr_rag = SFRRAG()sfr_rag.build_index([    "人工智能是计算机科学的一个分支...",    "机器学习是AI的核心技术之一...",    "深度学习使用神经网络进行学习..."])result = sfr_rag.query("什么是人工智能?")print(f"答案: {result['answer']}")print(f"质量评估: {result['quality']}")

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范
  • …

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署
  • …

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建
  • …

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案
  • …

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

在这里插入图片描述

LK启动流程深度解析:从硬件初始化到内核加载的MTK平台实践 本文深度解析了MTK平台上LK(Little Kernel)的完整启动流程。从硬件初始化、内存管理(MMU/Cache)开启,到多线程环境建立,再到内核镜像加载与安全校验,详细阐述了LK如何作为Bootloader核心,完成从芯片上电到成功引导Linux内核的关键任务,是MTK平台开发者必须掌握的核心知识。 阅读详情

相关推荐

SCL3400-D01双轴高精度倾角计

简介 两轴高精度加速度计,提供两个模式。 ±30° with 10 Hz LPF ±90° with 40 Hz LPF Resolution up to 32768 LSB/g Ultra-low 0.0009°/√Hz noise density 这款传感器是替换之前村田的停产的模拟量系列的芯片,正在测试中,具体效果大伙可以评测。 一、引脚连接图 引脚图兼容SCL3300 二、SPI接口 1.SCL3300和SCL3400略有区别如下图 左边为SCL3...

专注惯导领域 3808

一文带你了解RAG(检索增强生成) | 概念理论介绍+ 代码实操

RAG(Retrieval Augmented Generation, 检索增强生成)是一种技术框架,其核心在于当 LLM 面对解答问题或创作文本任务时,首先会在大规模文档库中搜索并筛选出与任务紧密相关的素材,继而依据这些素材精准指导后续的回答生成或文本构造过程,旨在通过此种方式提升模型输出的准确性和可靠性。RAG 技术架构图介绍:富文本 主要存储于 txt 文件中,因为排版比较整洁,所以获取方式比较简单实战技巧:【版面分析——富文本txt读取】

2401_85375151的博客 3200

PSIM仿真实战:反激电源从设计到调试的完整流程(附短路保护配置)

本文详细介绍了使用PSIM仿真工具进行反激电源从设计到调试的完整流程,包括变压器参数设计、功率器件选型、动态特性调试以及短路保护配置。通过实战案例和仿真技巧,帮助工程师提前暴露并解决设计中的常见问题,如负载突变、输入电压波动和短路保护失效等,显著降低硬件试错成本。

weixin_29216353的博客 244

AI超级智能体教程(七)---RAG实战本地知识库和云端知识库

1.RAG实战--本地知识库的应用 1.1编写代码 1.2调试观察效果 1.3输出结果 2.RAG实战--云端知识库的应用 2.1新建云端知识库 2.2使用知识库 2.3断点调试 2.4输出结果

大学成长道路上的探索经历与点滴思考,与君共勉,共筑成长。 1512

5G 网络的移动性管理上下文对比介绍

5G 网络的移动性管理上下文对比介绍 4G/5G MM移动性管理机制对比 5G引入了新移动性管理状态,通过mobility pattern(移动方式)实现按需的移动性管理等。 MM的相关状态分为一下几种: RM状态(用户注册管理 注册态/非注册态)和CM状态(用户连接态/空闲态)独立;RM状态标识UE是否注册到网络,CM状态标识UE和核心网的信令连接是否存在。 RAN侧引入RRC-inactive state:UE(用户端)对于CN(核心网)而言处于连接态,对RAN(接入网)而言处于Ld..

m0_59032675的博客 4822

CUDA详细安装及环境配置——环境配置指南 – CUDA+cuDNN+PyTorch 安装

本文详细介绍了如何确定显卡支持的CUDA版本、选择对应的cuDNN版本,并逐步安装CUDA、cuDNN和PyTorch。首先,通过命令行输入nvidia-smi.exe查看显卡支持的CUDA版本。接着,根据CUDA版本选择对应的cuDNN版本并下载。然后,从NVIDIA官方网站下载CUDA安装包,按照提示进行安装,并检查是否安装成功。同样地,下载cuDNN安装包,解压后将文件拷贝到CUDA安装目录中,并通过命令行验证安装是否成功。最后,根据PyTorch官网的指引,选择合适的安装命令进行PyTorch的安装

2501_90350274的博客 5098

大模型RAG架构实战:8种方案详解+代码实现,建议收藏反复学习

本文介绍了8种RAG架构的概述与实现,包括基础版Naive RAG和进阶版Multi-Head RAG。Naive RAG采用经典"索引-检索-生成"流程,通过向量数据库实现文档检索;Multi-Head RAG则利用Transformer多头注意力机制进行并行检索,融合多语义维度结果。文章提供了每种架构的简介、实现步骤和LangChain参考代码,帮助开发者理解不同RAG技术的应用场景与实现方法,从基础到高级逐步掌握RAG系统的构建。(149字)

m0_74942241的博客 821

JW01二氧化碳传感器实战:5分钟搞定Arduino环境监测系统(附完整代码)

本文详细介绍了如何使用JW01二氧化碳传感器与Arduino快速搭建环境监测系统。通过简单的硬件连接和完整的代码示例,读者可以在5分钟内实现CO2浓度实时监测,并了解数据解析、常见问题解决及进阶应用扩展。JW01传感器的高精度和易用性使其成为创客和嵌入式开发者的理想选择。

kite3的博客 383

基于RAG的企业智能客服项目,已拿70万offer!

基于 RAG 构建一套企业智能客服系统📖。

m0_59164520的博客 1445

RAG面试内容整理-7. 多轮问答与上下文拼接策略

在对话式的RAG应用中,多轮问答需要处理上下文相关性问题:用户的提问往往依赖于之前的对话内容。为正确理解用户每一轮的问题,系统需要保留和传递对话历史信息。

不务正业的猿 377

ResNet改进(50):SKConv和CBAM增强的ResNet模型

动态调整感受野大小- 结合通道和空间注意力模型的核心思想是在ResNet的每个残差块后插入这些注意力模块,使网络能够自适应地关注更重要的特征。模型的核心是类,它在标准ResNet34的基础上:替换了初始卷积层,使用更小的核(3×3)和步长(1)在每个残差块后选择性添加SKConv和CBAM模块# 加载预训练ResNet34# 自定义初始层# 添加注意力机制的残差层通过集成SKConv和CBAM,这个改进的ResNet模型能够更有效地捕捉多尺度特征并关注关键信息区域。

2401_82355416的博客 621

RAG从理论到实战,保姆手册教程

本文将从理论到实战将清楚,你什么时候需要使用rag,选择什么模型和技术框架才能让落地效果翻倍。

Y525698136的博客 356

军品研制过程评审活动-(一)论证阶段

军品研制过程评审活动-(一)论证阶段

Abel的博客 3815

大模型RAG入门到实战基础教程(非常详细),大模型RAG入门到精通,收藏这一篇就够了!

大模型(Large Language Model,LLM)的浪潮已经席卷了几乎各行业,但当涉及到专业场景或行业细分域时,通用大模型就会面临专业知识不足的问题。相对于成本昂贵的“Post Train”或“SFT”,基于RAG的技术方案往成为一种更优选择。本文从RAG架构入手,详细介绍相关技术细节,并附上一份实践案例。前排提示,文末有大模型AGI-优快云独家资料包哦!本文列举了LLM的问题。简单介绍了什么是 RAG ,以及 RAG 的流程。最后使用了一个简单的LangChain代码示例来展示 RAG 的使用。

2301_76161259的博客 3775

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

AI大模型入门基础教程(非常详细),AI大模型入门到精通,收藏这一篇就够了!

AI大模型是指使用大规模数据和强大的计算能力训练出来的人工智能模型。这些模型通常具有高度的准确性和泛化能力,可以应用于各种领域,如自然语言处理、图像识别、语音识别等。

weixin_58753619的博客 6169

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

大模型RAG入门到精通(实战教程),非常详细收藏这一篇就好了!

RAG(Retrieval Augmented Generation, 检索增强生成)是一种技术框架,其核心在于当 LLM 面对解答问题或创作文本任务时,首先会在大规模文档库中搜索并筛选出与任务紧密相关的素材,继而依据这些素材精准指导后续的回答生成或文本构造过程,旨在通过此种方式提升模型输出的准确性和可靠性。RAG 技术架构图介绍:富文本 主要存储于 txt 文件中,因为排版比较整洁,所以获取方式比较简单实战技巧:【版面分析——富文本txt读取】

2401_85375151的博客 1443

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

AI大模型RAG实战教程,从入门到精通,非常详细,看这一篇就够了!!

RAG(Retrieval Augmented Generation, 检索增强生成)是一种技术框架,其核心在于当 LLM 面对解答问题或创作文本任务时,首先会在大规模文档库中搜索并筛选出与任务紧密相关的素材,继而依据这些素材精准指导后续的回答生成或文本构造过程,旨在通过此种方式提升模型输出的准确性和可靠性。RAG 技术架构图介绍:富文本 主要存储于 txt 文件中,因为排版比较整洁,所以获取方式比较简单实战技巧:【版面分析——富文本txt读取】

m0_48891301的博客 5019

大模型RAG实战教程(超详细):从入门到精通,一篇就够,建议收藏!

RAG(Retrieval Augmented Generation, 检索增强生成)是一种技术框架,其核心在于当 LLM 面对解答问题或创作文本任务时,首先会在大规模文档库中搜索并筛选出与任务紧密相关的素材,继而依据这些素材精准指导后续的回答生成或文本构造过程,旨在通过此种方式提升模型输出的准确性和可靠性。RAG 技术架构图介绍:富文本 主要存储于 txt 文件中,因为排版比较整洁,所以获取方式比较简单实战技巧:【版面分析——富文本txt读取】

Everly_的博客 1596

自己搭建知识库:9种RAG架构全解析(非常详细),从入门到精通,收藏这一篇就够了!

在深入探讨架构之前,我们先来明确一下讨论的内容。**RAG 通过让语言模型在生成回答前参考外部知识库,来优化其输出** 。 **它并非纯粹依赖模型在训练中学到的内容,而是从你的文档、数据库或知识图谱中提取相关的最新信息。

m0_59235945的博客 1984

LangChain从入门到精通,非常详细,收藏这一篇就够了!!!

LangChain从入门到精通,非常详细,收藏这一篇就够了!!!

ytt0523_com的博客 5514

RAG入门教程(非常详细),RAG 的优化方案及评估入门到精通,收藏这一篇就够了!

组成,并分两步检索,首先将query与摘要匹配过滤掉不相关的文档,并只在相关组内检索第二层文档块。这种方式虽然能够通过。

2401_85373898的博客 1408

大模型教程(非常详细),大模型入门到精通,收藏这一篇就够了!

本文介绍了大模型的概念及其学习路径。大模型是指拥有数十亿甚至数万亿参数的深度学习模型,在文本生成、语言理解等任务中表现优异。学习大模型需要三步:1)掌握Python和Linux基础,熟悉NLP相关知识;2)学习NLP基础技术,理解Transformer等模型原理;3)实践GPT API调用、Prompt设计和模型微调。学习过程中需结合理论知识与实际操作,最终能够独立完成模型训练和部署工作。

2401_84204207的博客 998

RAG技术架构深度解析(非常详细)零基础入门到精通,收藏这一篇就够了

本文主要介绍了RAG技术架构在AI编程中的创新应用及其面临的挑战。文章深入分析了RAG技术架构的兼容性、实时性和智能化水平等方面的问题,并提出了相应的改进措施,如加强标准化建设、引入实时数据处理技术和先进算法模型。同时,文章预测了RAG技术架构在智能化水平持续提升、跨领域融合加速以及数据隐私与安全保障方面的未来发展趋势。最后,文章回顾了RAG技术在AI编程领域的应用成果,并展望了其广阔的应用前景,同时设定了未来研究方向和目标,以推动RAG技术的进一步发展和优化。第一章 RAG技术概述与基本原理。

Javachichi的博客 3623
上一篇: 大模型时代新风口!AI Agent全栈开发指南:从零构建你的智能协作系统[特殊字符]
下一篇: 内存价格暴涨300%!AI大模型“吃光“内存,程序员如何配置电脑才能跑得动代码?
Python_金钱豹
博客等级 码龄5年 1万+粉丝 2835原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值