Python 实现 RAG 系统实战:让你的 AI 应用拥有记忆

# 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 应用开发很有帮助。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇