# Python 实现 RAG 系统实战:让你的 AI 应用拥有“记忆”
## 背景
大语言模型很强大,但有个致命缺点:它不知道你公司的事儿。你喂给它的训练数据早就过时了,最新产品文档、内部技术文档、客户问答记录——这些它通通看不到。
这就是检索增强生成(RAG,Retrieval-Augmented Generation)要解决的问题。简单说,RAG 让 AI 在回答问题之前,先去查一下相关的文档,然后结合文档内容来生成答案。这样一来,AI 就能基于你的私有数据来回答问题了。
## 问题
举几个实际场景:
– 企业有几百份产品手册,客户问”这款产品保修多久”,AI 需要从手册里找到答案
– 技术团队有大量内部 Wiki,工程师问”怎么部署 Kubernetes 集群”,需要从文档里检索
– 客服系统需要根据历史对话记录,回答用户关于产品功能的问题
传统做法有几种:关键词搜索、FAQ 匹配、训练专属问答模型。但关键词搜索不懂语义,FAQ 覆盖不全,训练模型成本太高——需要大量标注数据和 GPU 资源。
RAG 的思路是:先把所有文档转换成向量,存到向量数据库里。用户提问时,把问题也转换成向量,去数据库里找最相似的文档片段,然后把片段和问题一起发给 LLM,让它基于这些“参考资料”来生成回答。
## 实战步骤
搭建 RAG 系统分为以下几步:
**1. 加载文档**
从各种来源读取内容:PDF、Word、Markdown、网页、数据库都可以。LangChain 提供了丰富的文档加载器。
**2. 分 chunk**
文档太长的话,向量表示会不准确。一般切成 500-1000 字的小段落,相邻段落之间保留一些重叠,避免关键信息被切断。
**3. 向量化**
用嵌入模型把文字转换成向量。常用的有 OpenAI 的 text-embedding-3-small、开源的 BGE、M3E 等。选什么模型直接决定检索效果。
**4. 存入向量数据库**
Chroma、Milvus、Qdrant、Weaviate 都可以。存的时候要把向量和原始文本对应起来,方便后续检索和展示参考来源。
**5. 检索**
用户提问时,先把问题转成向量,去数据库里找 Top-K 个最相似的文档片段。
**6. 生成**
把检索到的文档片段和问题一起组成提示词,发给 LLM 生成答案。
## 代码实现
直接上代码。这里用的是 LangChain + Chroma + OpenAI:
“`python
# 先安装依赖
# pip install langchain langchain-community langchain-openai chromadb openai tiktoken
import os
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_chroma import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
# 填入你的 API Key
os.environ[“OPENAI_API_KEY”] = “sk-xxx”
# ——– 第一步:加载文档 ——–
loader = TextLoader(“knowledge_base.txt”, encoding=”utf-8″)
documents = loader.load()
# ——– 第二步:分 chunk ——–
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
length_function=len,
)
chunks = text_splitter.split_documents(documents)
# ——– 第三步:向量化和存储 ——–
embeddings = OpenAIEmbeddings(model=”text-embedding-3-small”)
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory=”chroma_db”
)
# ——– 第四步:构建检索器 ——–
retriever = vectorstore.as_retriever(search_kwargs={“k”: 3})
# ——– 第五步:设计提示词 ——–
template = “””你是一个专业的技术问答助手。请根据以下参考文档回答用户的问题。
如果文档中没有相关信息,请如实告知,不要编造答案。
参考文档:
{context}
用户问题:{question}
请给出详细的回答:”””
prompt = ChatPromptTemplate.from_template(template)
# ——– 第六步:组装问答链 ——–
llm = ChatOpenAI(model=”gpt-4o”, temperature=0.7)
rag_chain = (
{“context”: retriever, “question”: RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# ——– 测试 ——–
question = “什么是 RAG?它的主要优势是什么?”
answer = rag_chain.invoke(question)
print(f”问题:{question}”)
print(f”回答:{answer}”)
“`
如果文档是 PDF 或网页,换个加载器就行:
“`python
# PDF 加载
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader(“document.pdf”)
pages = loader.load_and_split()
# 网页加载
from langchain_community.document_loaders import WebBaseLoader
loader = WebBaseLoader(“https://example.com/article”)
docs = loader.load()
“`
生产环境下还可以做这些优化:
“`python
# 混合搜索 + LLM 提取关键信息
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
compressor = LLMChainExtractor.from_llm(llm)
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=retriever
)
# 多查询检索——把问题变着花样问几遍,提高召回率
from langchain.retrievers import MultiQueryRetriever
retriever_multi = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(),
llm=llm
)
“`
## 运行效果
跑一下上面的代码,输出大概是这样:
“`
问题:什么是 RAG?它的主要优势是什么?
回答:RAG(检索增强生成)是一种将外部知识检索与大语言模型生成能力相结合的技术架构。
主要优势包括:
1. **知识时效性**:可以动态接入最新的文档和数据,解决 LLM 训练数据截止日期的问题。
2. **成本效率**:无需频繁微调模型,通过检索替换模型参数更新,大幅降低维护成本。
3. **可解释性**:用户可以查看检索到的参考文档,增强答案的可信度和可追溯性。
4. **私有数据支持**:能够安全地使用企业的内部文档和专有数据,不会泄露到外部。
5. **减少幻觉**:通过提供真实文档作为上下文,显著降低 LLM 生成错误信息的概率。
“`
可以看到,AI 成功从知识库里检索到了相关内容,给出了准确、专业的回答。
## 总结
这篇文章演示了如何用 Python 搭建一个完整的 RAG 系统。核心思路很清晰:先把文档向量化存到数据库,用户提问时检索相关文档,然后把文档和问题一起发给 LLM。
RAG 相比直接让 LLM 回答有这几个明显优势:能用到最新的私有数据,不用每次变动都去微调模型,用户能看到答案的参考来源,回答更可信。
落地时需要关注的点:文档预处理质量直接影响检索效果;嵌入模型的选择要在效果和成本之间权衡;提示词设计很重要,好的提示词能让答案质量提升明显。
现在 RAG 已经成为企业构建智能客服、知识库系统的标配技术。学会这套方案,对 AI 应用开发很有帮助。