大多数团队在构建RAG系统时,会经历多轮实验,依赖多个组件如查询转换、智能路由、索引策略等。每个组件都需要独立的设置和调优,稍有不慎就会影响整体性能。今天我将深度解析从基础架构入手,逐步深入到高级优化技术,并强调端到端评估的重要性。

不仅仅是简单检索+生成,而是一个自洽的生态系统,能处理复杂查询、减少噪声,并通过自我纠正机制持续优化。

RAG生态系统架构

一、基础RAG系统:索引、检索与生成

任何高级RAG系统都建立在基础流水线上。核心分为三部分:索引(结构化数据存储)、检索(搜索相关上下文)、生成(生成最终回答)。

索引阶段

加载数据、分块和嵌入。使用 WebBaseLoader 拉取内容,并通过 RecursiveCharacterTextSplitter 分块(1000字符块,200字符重叠),确保语义连贯性。

from langchain_community.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings

loader = WebBaseLoader(web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",))
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())

索引阶段代码

检索阶段

将用户查询嵌入,从向量库中获取最相似块。

retriever = vectorstore.as_retriever()
docs = retriever.get_relevant_documents("What is Task Decomposition?")

生成阶段

使用LLM结合提示模板生成回答。

from langchain import hub
from langchain_openai import ChatOpenAI
from langchain_core.runnables import RunnablePassthrough

prompt = hub.pull("rlm/rag-prompt")
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
rag_chain = (
{"context": retriever | (lambda docs: "\\n\\n".join(doc.page_content for doc in docs)), "question": RunnablePassthrough()}
| prompt | llm | StrOutputParser()
)
response = rag_chain.invoke("What is Task Decomposition?")

二、高级查询转换:提升检索精度

生产环境中,用户查询往往不完美——可能太具体、太宽泛或用词不当。查询转换技术重写或扩展问题,显著提高召回率。

多查询生成

让LLM生成多个问题变体,合并检索结果以覆盖更广上下文。

from langchain.prompts import ChatPromptTemplate
prompt_perspectives = ChatPromptTemplate.from_template("Generate five versions of: {question}")
generate_queries = (prompt_perspectives | ChatOpenAI() | StrOutputParser() | (lambda x: x.split("\\n")))

多查询生成代码

RAG-Fusion

改进多查询,通过RRF(Reciprocal Rank Fusion)重新排序文档,优先高频高排名结果。

拆解(Decomposition)

将复杂问题拆解为子问题,独立回答后综合。

分解示意图

Step-Back Prompting

针对过具体查询,生成通用问题,结合通用和具体上下文提升回答质量。

Step-Back示意

HyDE(Hypothetical Document Embeddings)

让LLM生成假设回答,基于其嵌入检索真实文档,解决词汇不匹配问题。

HyDE示意

三、路由与查询构建:智能数据源管理

生产系统通常涉及多个数据源。路由分析查询,将其引导到正确目标;查询结构化则利用元数据进行精确过滤。

逻辑路由

使用LLM和Pydantic模型分类查询。

from langchain_core.pydantic_v1 import BaseModel, Field
class RouteQuery(BaseModel):
    datasource: Literal["python_docs", "js_docs", "golang_docs"] = Field(..., description="Select data source")
structured_llm = ChatOpenAI().with_structured_output(RouteQuery)
router = ChatPromptTemplate.from_messages([("system", "Route based on language"), ("human", "{question}")]) | structured_llm

逻辑路由代码

语义路由

根据问题风格匹配专家提示,通过嵌入相似性动态选择。

语义路由代码

查询结构化

将自然语言问题转为带元数据过滤的查询。

四、高级索引策略:平衡检索精度与上下文丰富性

多表示索引

为每个块生成摘要并嵌入,检索摘要后获取完整父文档。

层次索引(RAPTOR)

构建多层摘要树(聚类块→摘要集群→更高层摘要),支持从细节到概念的检索。

多表示索引代码

词级精度(ColBERT)

为每个词生成嵌入,通过"后期交互"提升细粒度相关性。

ColBERT示意

五、高级检索与生成:减少噪声与自我纠正

专用重新排序

用CohereRerank等模型对初始结果重新排序,优先高相关性文档。

专用重新排序代码

自我纠正代理(CRAG/Self-RAG)

使用LangGraph构建状态机,动态评估检索质量或回答忠实度。

自我纠正代理示意

长上下文影响

虽然有大窗口模型,但RAG仍不可替代:它精准检索关键信息,避免"大海捞针"问题。

长上下文影响

六、端到端评估:确保生产可靠性

评估量化系统性能,核心指标包括忠实度、正确性、上下文相关性。

框架评估

使用RAGAS等工具自动化:

from ragas import evaluate
from ragas.metrics import faithfulness, answer_correctness
result = evaluate(dataset, metrics=[faithfulness, answer_correctness])

RAGAS评估代码

七、总结

构建生产级RAG系统需要分层构建:从基础流水线开始,逐步添加查询转换、路由、高级索引和自纠正机制,最后通过严格评估验证。

主要要点:

  • 查询转换和路由处理模糊查询和多源数据

  • 多表示索引和ColBERT平衡检索精度与上下文丰富性

  • 重新排序和自我纠正代理减少噪声和幻觉

  • 评估不是终点,而是迭代起点,确保系统在生产中可靠

  • 原文来源:腾讯云开发者社区

    标签: none

    添加新评论