必读收藏:大模型RAG技术全攻略 - 8种架构实现与LangChain代码详解

LangChain多模态智能体:文生图、识图、RAG问答与小说生成全攻略 本项目基于LangChain框架,构建了一个多模态智能体,整合了文生图、识图、RAG问答与小说生成等功能,旨在打造一个全能型智能助手。通过多模态大模型Qwen2.5-VL和Qwen3-235B-A22B,智能体能够处理图文结合的复杂查询,并实现知识驱动的精准回答与自动化内容生成。技术架构包括多模态大模型、文生图工具、识图工具、RAG问答、实时搜索工具和小说生成工作流,采用ReAct模式进行工具调用决策。核心功能涵盖图文理解与生成、知识问答、多章节小说生成等,展示了智能体在跨模态任务中的强大能力。未来计划包括 阅读详情

本文详细介绍了8种RAG架构,包括Naive RAG、Multi-Head RAG、Corrective RAG等。每种架构阐述了核心思想、实现步骤,并提供基于LangChain的参考代码。这些架构从基础到高级,涵盖从简单检索到复杂推理、从静态策略到动态适应等多种技术路径,为开发者构建高效的大模型检索增强生成系统提供了全面的技术参考和实践指导。

1、 Naive RAG

简介:

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

实现步骤:

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

参考代码:

from langchain_openai import ChatOpenAI
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import LanceDB
from langchain.schema import Document
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
import lancedb

class 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 ChatOpenAI
from langchain_community.vectorstores import LanceDB
from langchain.schema import Document
from langchain.embeddings.base import Embeddings
from transformers import AutoModel, AutoTokenizer
import torch
import lancedb
from typing import List

class 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 ChatOpenAI
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import LanceDB
from langchain_community.tools import TavilySearchResults
from langchain.schema import Document
from langchain.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
import lancedb
from typing import List

class 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 ChatOpenAI
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import LanceDB
from langchain.schema import Document
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain.tools import tool
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
import lancedb
from typing import List

class 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 ChatOpenAI
from langchain_community.graphs import Neo4jGraph
from langchain.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
import networkx as nx
from typing import List, Dict
import json

class 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 ChatOpenAI
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import LanceDB
from langchain.schema import Document
from langchain.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
import lancedb
from typing import List, Tuple

class 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 ChatOpenAI
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import LanceDB
from langchain.schema import Document
from langchain.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableLambda, RunnablePassthrough
import lancedb
from enum import Enum
from typing import List

class 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_ENDED
print(answer)

8、SFR RAG

简介:

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

架构:

实现步骤:

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

参考代码:

from langchain_openai import ChatOpenAI
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_community.vectorstores import LanceDB
from langchain_community.cross_encoders import HuggingFaceCrossEncoder
from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain.retrievers import ContextualCompressionRetriever
from langchain.schema import Document
from langchain.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
import lancedb
from typing import List, Dict

class 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大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

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

https://img-blog.csdnimg.cn/img_convert/05840567e2912bcdcdda7b15cba33d93.jpeg

在这里插入图片描述

为什么要学习大模型?

我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着AI技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。

在这里插入图片描述

在这里插入图片描述

大模型入门到实战全套学习大礼包

1、大模型系统化学习路线

作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!

img


2、大模型学习书籍&文档

学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。

在这里插入图片描述

3、AI大模型最新行业报告

2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

img

4、大模型项目实战&配套源码

学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。

img

5、大模型大厂面试真题

面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

img

适用人群

在这里插入图片描述

第一阶段(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%免费】

https://img-blog.csdnimg.cn/img_convert/05840567e2912bcdcdda7b15cba33d93.jpeg

【愚公系列】《AIGC辅助软件开发》041-如何使用 AI技术提升工作效率:AI辅助软件架构师实践 在数字化转型的浪潮中,软件架构师作为技术团队的核心,承载着系统设计与架构优化的重要责任。然而,随着项目复杂度的增加和技术环境的变化,架构师面临着前所未有的挑战。幸运的是,人工智能(AI)技术的迅猛发展为这一行业带来了新的机遇,帮助架构师提升工作效率、优化决策过程,并改善团队协作。本文将深入探讨AI如何辅助软件架构师的实际工作,具体分析AI在需求分析、架构设计、代码生成、测试和优化等环节的应用。 阅读详情

相关推荐

微信小程序推送微信服务号模板消息

微信小程序中发送微信服务号模板消息,无需用户手动确认订阅,无需绑定开放平台,无需使用UnionId。

qq_20751269的博客 1556

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

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

2401_85375151的博客 3200

Android13 CarPowerManagementService启动流程分析

在CarPowerManagementService中init调用PowerHalService的setListener设置事件侦听器以接收车辆的电源事件。

liuning1985622的博客 956

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

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

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

从入门到精通:dirmap 高级 Web 目录扫描实战指南

本文提供了一份从环境搭建到高级配置的dirmap Web目录扫描实战指南。详细解析了工具安装、核心配置文件dirmap.conf的深度调优,包括递归扫描、四种扫描模式(字典、爆破、爬虫、Fuzz)的实战应用,并演示了分阶段资产发现的完整工作流程,帮助安全人员高效发现隐藏目录与敏感文件。

rnn9storyteller的博客 482

雷达原理习题答案【西电】

  目前教材用的是陈老师新版的,但是,我发现课后题有一部分是之前某本书里的。答案如下【建议参看原题→查阅答案】 【原题点这里!!点这里!!】 目录跳转功能目前好像只支持网页版 文章目录% 第一章、第二章% 第三章% 第四章% 第五章% 第六章% 第七章% 第八章 % 第一章、第二章 % 第三章 % 第四章 % 第五章 % 第六章 % 第七章 % 第八章 ...

薛定谔的壳的博客 1万+

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

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

m0_74942241的博客 821

STM32H743 SD卡读写避坑实录:CubeMX配置MDMA给FATFS,我的FreeRTOS项目踩了哪些雷?

本文详细解析了STM32H743在CubeMX配置中结合SDMMC、MDMA与FATFS的实战避坑指南,特别针对FreeRTOS环境下的SD卡读写问题提供了解决方案。从时钟配置到FATFS参数设置,再到DMA缓存维护和FreeRTOS集成技巧,帮助开发者高效解决数据损坏、DMA传输错误等常见问题,提升项目稳定性。

weixin_30878501的博客 494

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

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

m0_59164520的博客 1445

大疆司空 2 私有化部署:FH2、Terra、4G 三大服务区别详解

摘要: 司空2私有版包含三大模块:FH2(核心平台,必选)、Terra(建模算力,需NVIDIA显卡)、4G(内网图传)。FH2是基础,支持设备管理与任务调度;Terra适用于测绘建模场景,依赖GPU算力;4G模块保障复杂环境下的图传稳定性,适合纯内网部署。选择逻辑:先部署FH2,再按需添加Terra(需显卡)或4G(需内网支持),避免资源浪费。

2501_93651177的博客 580

YOLOv8 置信度阈值 (conf) 和 IoU 阈值 (iou) 详解:如何平衡漏检与误检?

摘要 本文深入探讨了YOLOv8目标检测模型中两个关键参数——置信度阈值(conf)和IoU阈值(iou)的核心作用。文章从目标检测的基础概念出发,解释了置信度分数反映模型预测可靠性,IoU衡量预测框重叠程度。重点剖析了非极大值抑制(NMS)机制如何通过这两个阈值进行预测框筛选:置信度阈值作为初筛门槛,IoU阈值决定重叠框的取舍。通过生动比喻和可视化图表,阐述了合理调节这两个参数能有效平衡误检与漏检问题,是优化YOLOv8模型实际表现的重要技巧。全文以实践为导向,帮助开发者掌握成为"调参大师&qu

深耕 Vue 生态与 JS/TS 技术,聚焦组件封装、响应式原理、TS 类型设计,解析工程化配置与性能优化方案。同时分享 YOLOv8 目标检测实战、AI 大模型面试核心考点,以代码实例拆解技术实现与业务解法。 1249

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

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

Y525698136的博客 356

【图像超分】论文复现:新手入门必备!Pytorch实现SRGAN!手把手详细教程!代码注释详尽!可用于训练自己的数据集!实时验证模型性能!绘制PSNR曲线图!附训练好的各放大倍数的模型权重文件!

【图像超分】论文精读:SRResNet/SRGAN【图像超分】论文复现:万字长文!Pytorch实现SRResNet代码修改无报错!踩坑全记录!适合各种深度学习新手!帮助你少走弯路!附修改后的代码和PSNR最优的模型权重文件!请配合上述论文精读文章使用,效果更佳!与原论文描述不一样的实现部分,也即可以修改的部分数据集使用:论文中是ImageNet随机选35000张图像,本文是VOC2012数据集16700张图像。数据集预处理:裁剪大小不同,论文是96×96,本文是88×88。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 6853

RAG技术全攻略:bRAG-langchain项目指南,值得收藏的系统学习资源

bRAG-langchain是一个专注于RAG技术的开源学习项目,通过一系列Jupyter Notebooks从基础到高级系统化地教授RAG技术。项目涵盖文档处理、向量化、存储、检索及生成等核心环节,并深入多查询、智能路由、高级索引和重排序等进阶技术。它提供可直接运行的代码示例和结构化学习路径,帮助开发者从零构建高效、智能的RAG系统,是学习RAG技术的必藏资源。

2401_85154887的博客 817

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【建议收藏】2026年RAG技术全攻略:从基础架构到智能Agent的实战指南

文章系统介绍了2025年检索增强生成(RAG)技术的架构演进,从基础Naive RAG到智能Agent的发展路径,对比了主流RAG工具的特点与适用场景,并详细阐述了构建高效RAG系统的最佳实践,包括数据处理、检索优化、生成策略和评估迭代方法。文章还展望了多模态融合、自适应技术等未来发展方向,以及企业应用中面临的挑战。

datian1234的博客 1866

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

程序员必学!RAG技术详解+大模型学习资源全攻略(建议收藏)

文章详细介绍了RAG检索增强生成技术,这是一种结合信息检索与大语言模型生成的框架,通过检索外部知识库辅助LLM生成更准确回答、减少"幻觉"。内容涵盖RAG技术栈(检索层、生成层、辅助层)、核心流程(离线准备和在线服务)及优化方法。同时提供大模型学习资源和路径,帮助读者掌握从理论到实战的AI大模型技术,包括RAG开发、Agent设计、模型微调等关键技能。

2401_85375186的博客 925

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

小白也能懂:RAG应用架构与优化全攻略(值得收藏)

文章介绍了RAG应用的架构、挑战与演进。分为数据索引(加载、分割、嵌入、索引)和数据查询(检索、生成)阶段。面临检索精确度、模型抗干扰能力、上下文限制等挑战。架构从Naive RAG发展到Advanced RAG再到Modular RAG。RAG通过检索增强生成,提高大模型在专业领域的适应性和输出准确性。

2401_85325726的博客 1151

【大模型实战】大模型框架性能优化全攻略:LangChain、vLLM与RAG系统高效实践!!

本文系统介绍大模型框架性能优化三大策略:通过批量推理、异步执行和缓存降低延迟;利用流水线化、多模型并行和硬件异构提升吞吐量;结合模型选择、资源调度和优先级控制成本。文章提供vLLM等框架的具体代码实现,并展示LangChain+vLLM+RAG的综合架构,帮助开发者构建高性能、低延迟、成本可控的大模型应用系统。

2401_85343303的博客 830

【技术收藏】从朴素到高阶:RAG技术演进与智能问答系统全攻略

本文系统阐述了检索增强生成(RAG)技术从基础到高阶的演进过程,详细分析了朴素RAG的局限性,提出了涵盖数据预处理、增强检索和精炼后处理的高级RAG框架。介绍了混合检索、查询转换、重排序和上下文压缩等关键技术,并通过端到端项目实战展示了如何构建生产级RAG管道,旨在帮助AI工程师将问答能力从"可用"提升至"卓越",实现更准确、可信赖的智能问答体验。

2401_85375186的博客 1687

大模型实用技术详解:提示词工程 + MCP 协议 + RAG 架构全攻略

大模型实用技术详解:提示词工程 + MCP 协议 + RAG 架构全攻略

2301_76168381的博客 1229

【收藏必备】AI应用开发框架选型指南:LangChain、n8n、Dify、Coze全攻略

本文对比了LangChain、n8n、Dify、Coze等AI开发框架的特点与适用场景。LangChain适合复杂定制;n8n擅长系统集成;Dify适合快速上线;Coze适合轻量应用。文章从技术门槛、功能特点、场景需求和社区生态等方面提供选型建议,帮助技术团队根据项目复杂度和团队能力做出合理选择,强调技术应服务于业务需求。

2401_84815887的博客 1901

LangChain 文档切割全攻略:8 大主流切割技术选型 + 实战代码详解

在 RAG(检索增强生成)系统中,文档切割(Chunking) 是决定最终效果的核心环节,没有之一。 切得太粗:单个块太长,超出模型上下文窗口,检索时会混入大量无关信息,导致 “噪音过大” 切得太碎:语义被强行割裂,上下文丢失,检索结果不完整,大模型无法理解整体逻辑

qq_28372005的博客 514

零代码玩转本地大模型:Qwen/DeepSeek本地化部署与RAG应用全攻略

还在为API调用成本高、网络不稳定而烦恼吗?想在没有网络的环境下也能运行大模型吗?本文将带你从零开始,手把手教你在本地部署Qwen(通义千问)和DeepSeek(深度求索)开源大模型,并构建一个属于自己的知识库助手。无需复杂编程,只需跟着步骤操作,你就能在个人电脑上体验大模型的强大功能。读完本文,你将掌握模型本地化部署的核心方法、RAG应用构建技巧以及前端界面开发,让大模型真正为你所用。 ##

gitblog_00988的博客 996

【收藏必备】深入理解LangChain框架:Agent智能体开发与RAG知识库集成全攻略

本文详细介绍了LangChain、Agent和RAG三者的关系及协同工作方式。LangChain作为代码驱动的开发框架,适合高度定制化的复杂AI应用开发。文章系统讲解了如何使用LangChain开发Agent智能体,包括工具使用、Agent类型选择、记忆管理和执行链设计。同时,详细阐述了在LangChain中接入RAG的流程,包括数据索引构建、检索器封装和工具链整合,帮助开发者构建更智能、更准确的大模型应用。简单一句话,像工厂里的项目经理,负责把生产任务规划做起来,它具备记忆、规划、操作工具、反思等能力。

大模型教程的博客 960

2025最新保姆级教程:零基础掌握大模型RAG技术,从入门到实战全攻略

不会写代码也能玩转大模型?RAG技术让普通人秒变AI工程师!ChatGPT的爆火让大模型走进大众视野,但你是否遇到过模型“一本正经胡说八道”的尴尬?答案藏在RAG技术中!微软开源的GraphRAG项目上线即斩获16.5k星标,阿里、腾讯等大厂纷纷布局RAG赛道。本文将结合2025年最新技术趋势,为普通人打造一条从零到精通的RAG学习路线,手把手教你用“外挂知识库”破解大模型幻觉难题,成为AI时代的稀缺人才!

2401_84204207的博客 2335

【强烈收藏】LangChain+RAG:从理论到实践,零基础构建智能问答系统全攻略

文章详细介绍了LangChain框架与RAG技术的结合应用,通过模块化组件构建智能问答系统。从LangChain核心模块解析到Chain Type选择,再到完整示例展示如何使用DeepSeek和Faiss构建本地知识库检索,文章提供了从理论到实践的全面指导。这种结合不仅提高了答案的实时性和可追溯性,还大幅降低了开发难度,适合开发者快速构建企业级智能应用。

2401_84815887的博客 953
上一篇: 收藏!AI Agent薪资天花板揭秘:从60万到300万,程序员入局黄金赛道指南
下一篇: 1月19日开启AI大模型学习,多久能入门上手?_超全学习路线解析
冻感糕人~
博客等级 码龄3年 8926粉丝 2384原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值