超越基础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
针对过具体查询,生成通用问题,结合通用和具体上下文提升回答质量。

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

三、路由与查询构建:智能数据源管理
生产系统通常涉及多个数据源。路由分析查询,将其引导到正确目标;查询结构化则利用元数据进行精确过滤。
逻辑路由
使用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)
为每个词生成嵌入,通过"后期交互"提升细粒度相关性。

五、高级检索与生成:减少噪声与自我纠正
专用重新排序
用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])
七、总结
构建生产级RAG系统需要分层构建:从基础流水线开始,逐步添加查询转换、路由、高级索引和自纠正机制,最后通过严格评估验证。
主要要点:
原文来源:腾讯云开发者社区