为什么需要RAG?大模型的两大核心局限
直接使用大语言模型(LLM)构建企业应用时,面临两个根本性问题:
- 知识截止日期:LLM的训练数据有截止时间,无法了解最新信息(如今天的新闻、公司最新政策)。
- 幻觉问题(Hallucination):当模型不知道答案时,它会”编造”听起来合理的内容,在企业场景中这是不可接受的。
RAG(Retrieval-Augmented Generation,检索增强生成)通过在生成回答前先检索相关文档,将事实性内容注入提示词,从根本上解决了这两个问题。
RAG 完整工作流程
RAG系统分为两个阶段:
阶段一:离线索引(Indexing)
- 文档加载:读取PDF、Word、网页、数据库等各种格式的知识源。
- 文档分块(Chunking):将长文档切割成适合检索的小块(通常256~512 tokens),同时保留上下文重叠(Overlap)。
- 向量化(Embedding):用Embedding模型将每个文本块转换为高维向量(如1536维),语义相近的文本向量距离相近。
- 存入向量数据库:将向量及原文存储到向量数据库(如Chroma、Milvus、Pinecone、Weaviate)中建立索引。
阶段二:在线检索与生成(Retrieval & Generation)
- 查询向量化:用相同的Embedding模型将用户问题转换为向量。
- 相似度检索:在向量数据库中找出与查询向量最相似的Top-K个文档块(常用余弦相似度)。
- 上下文注入:将检索到的文档块与用户问题拼接成完整的Prompt。
- LLM生成:大模型基于注入的上下文生成准确、有依据的回答。
核心技术:向量数据库对比
| 向量数据库 | 特点 | 适用场景 |
|---|---|---|
| Chroma | 轻量级,嵌入式,开源 | 开发测试、小型项目 |
| Milvus | 高性能,分布式,开源 | 大规模生产环境 |
| Pinecone | 全托管云服务 | 快速上线,免运维 |
| Weaviate | 多模态支持,混合检索 | 图文混合知识库 |
| PGVector | PostgreSQL扩展 | 已有PG数据库的场景 |
从 Naive RAG 到 Advanced RAG
基础RAG在复杂问题上效果不佳,高级RAG引入了多项优化:
- 混合检索(Hybrid Search):结合向量相似度检索和关键词检索(BM25),提升召回率。
- 查询改写(Query Rewriting):用LLM将用户问题扩展或改写为多个子查询,提升检索覆盖面。
- 重排序(Re-ranking):用专门的Cross-Encoder模型对初步检索结果重新排序,提升精准度。
- 自反思RAG(Self-RAG):模型在生成过程中主动判断是否需要检索,检索后对结果质量打分,实现更智能的检索控制。
- GraphRAG:微软提出的基于知识图谱的RAG增强方案,对需要跨文档推理的复杂问题效果显著。
RAG 实战架构参考(LangChain方案)
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
# 1. 加载文档
loader = PyPDFLoader("company_policy.pdf")
docs = loader.load()
# 2. 分块
splitter = RecursiveCharacterTextSplitter(chunk_size=512, chunk_overlap=50)
chunks = splitter.split_documents(docs)
# 3. 向量化 + 存储
vectordb = Chroma.from_documents(chunks, OpenAIEmbeddings())
# 4. 构建RAG链
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-4-turbo"),
retriever=vectordb.as_retriever(search_kwargs={"k": 4})
)
# 5. 查询
answer = qa_chain.invoke("公司年假政策是什么?")
print(answer['result'])
RAG 效果评估指标
| 指标 | 含义 | 评估工具 |
|---|---|---|
| Context Recall | 检索到的相关文档覆盖率 | RAGAS框架 |
| Context Precision | 检索结果的准确率(有多少是真正相关的) | RAGAS框架 |
| Faithfulness | 生成答案与检索内容的一致性(防幻觉) | RAGAS框架 |
| Answer Relevancy | 回答与问题的相关程度 | RAGAS框架 |