RAG 技术深度解析:让大模型用上你的私有数据

RAG 技术深度解析:让大模型用上你的私有数据

RAG 技术深度解析:让大模型用上你的私有数据

大模型很聪明,但它有个硬伤:训练数据有截止日期,而且不知道你的私有数据

RAG(Retrieval-Augmented Generation,检索增强生成)就是用来补这个短板的。它的核心思路很简单——不让模型死记硬背,而是让它学会查资料

RAG 到底解决了什么问题

假设你有一个包含 10 万份内部文档的知识库,想让大模型基于这些文档回答问题。直接把文档塞进 prompt?不可能,上下文窗口根本装不下。

微调模型?也不是好选择——成本高、周期长,而且每次文档更新都要重新训练。

RAG 的做法是:把文档向量化存起来,用户提问时先去向量库里找最相关的内容,再把找到的内容连同问题一起交给大模型。大模型拿到了"参考资料",自然能给出更准确的回答。

用户提问
   ↓
向量检索(找相关文档片段)
   ↓
拼接:问题 + 检索结果
   ↓
大模型生成回答

一个典型的 RAG 系统长什么样

拆解开来,RAG 系统通常包含这几个模块:

1. 文档处理
原始文档可能是 PDF、Word、Markdown、网页。你需要把它们解析成纯文本,然后做分块(chunking)。分块大小很有讲究——太大浪费 token,太小丢失上下文。

# 常见的分块策略
from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,        # 每块约 500 字符
    chunk_overlap=50,      # 块之间重叠 50 字符,保持上下文连贯
)
chunks = splitter.split_documents(documents)

2. 向量化(Embedding)
把每个文本块转换成一个向量(一串数字)。语义相近的文本,向量在空间中距离也更近。OpenAI 的 text-embedding-3-small、国产的 bge-large-zh 都是常用选择。

3. 向量存储
把向量和对应的原文存起来。主流方案有 Pinecone(托管)、Chroma(本地)、Milvus(生产级)。对小项目来说,Chroma 零配置就能跑起来。

4. 检索
用户提问时,先把问题也向量化,然后去向量库里找"距离最近"的几个文本块。这里的"距离"通常用余弦相似度衡量。

5. 生成
把检索到的文本块拼到 prompt 里,让大模型基于这些上下文生成回答。

prompt = f"""
基于以下参考信息回答问题:

{retrieved_docs}

问题:{user_question}

请只基于上述参考信息回答,不确定就说不确定。
"""

实践中的坑

理论很美好,落地时却有不少细节要处理:

分块策略影响很大。 按固定字符数切分,可能把一句话拦腰截断。更好的做法是按语义边界(段落、句子)切分,或者用滑动窗口。

检索不总是准确的。 向量检索是近似匹配,不一定能找到最相关的文档。解决办法:调整 top-k(多取几个候选)、用混合检索(向量 + 关键词 BM25)、或者加入 Reranker 做二次排序。

上下文污染。 如果检索到的文档和问题是无关的,反而会让模型"跑偏"。这里需要做好相关性过滤——得分太低的文档直接丢弃,宁可让模型说"找不到相关信息"。

重复内容问题。 同一个信息可能在多个文档块里出现,不处理的话 prompt 里会有大量重复内容,浪费 token。可以做简单的去重,或者让 Reranker 帮忙筛选。

进阶:RAG 的进化方向

基础 RAG 只是起点,业界已经在往这些方向探索:

Self-RAG:让模型自己判断是否需要检索,以及检索结果是否足够回答问题。如果不够,自动改写查询再次检索。

GraphRAG:不只是存文本块,还构建知识图谱(实体-关系-实体)。回答复杂多跳问题时,图结构比纯向量检索更有优势。

Agentic RAG:把 RAG 嵌入 Agent 工作流。Agent 可以根据中间结果决定下一步要检索什么,而不是一次性把所有相关文档塞进去。

混合检索:向量检索擅长语义匹配,关键词检索(BM25)擅长精确匹配。二者结合,召回率明显提升。

总结

RAG 本质上是在模型"记忆"之外,加了一个"查资料"的能力。它让大模型从"训练完就固化"变成了"随时可以更新知识"。

对于大多数企业场景——内部知识库问答、文档助手、客服机器人——RAG 是目前最务实的方案:成本低、见效快、数据可控。

当然,RAG 不是银弹。检索质量、上下文管理、回答可靠性,每个环节都需要精心打磨。但正因为它的开放性,你可以根据场景不断迭代优化,而不是被模型的能力边界死死卡住。

下一步建议:如果你准备动手搭一套 RAG 系统,先用 LangChain 或 LlamaIndex 快速跑通流程,然后重点优化检索质量——这通常是决定最终效果的关键瓶颈。