欢迎来到《Python + AI Agent 实战开发完全指南》专栏!
在上一讲中,我们为Agent构建了短期记忆系统,让它能够记住当前对话的历史。然而,当面对专业领域的复杂问题时,仅靠记忆是不够的。Agent需要能够实时检索和利用外部知识。
在这一讲中,我们将深入学习RAG(Retrieval-Augmented Generation)技术,构建一个能够从外部知识库中检索信息并生成精准回答的智能问答系统。我们将采用最优雅的LangChain原生写法,彻底告别繁琐的依赖配置。
一、RAG技术核心原理
1.1 什么是RAG?
RAG(检索增强生成)是一种将信息检索与语言生成相结合的技术架构。它的工作流程分为三个阶段:
1.2 RAG的优势
- 知识实时性:可以接入最新的外部数据,不受模型训练数据时效限制
- 可解释性:回答基于具体检索到的文档,便于溯源
- 领域适配:轻松适配专业领域,无需重新训练模型
- 成本效益:相比微调,RAG的实施成本更低
附录:依赖安装
pip install langchain langchain-openai langchain-core langchain-text-splitters
注:无需安装chromadb等额外依赖,完全使用LangChain官方内置组件。
二、核心组件解析
2.1 文档处理流程
2.1.1 文档加载
from langchain_core.documents import Document
# 创建文档对象
doc = Document(page_content="佛罗里达全年阳光充足,平均气温25度,非常适合度假。")
2.1.2 文本切分
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 初始化文本切分器
splitter = RecursiveCharacterTextSplitter(
chunk_size=300, # 每块文本的大小
chunk_overlap=50 # 块之间的重叠部分
)
# 切分文档
splits = splitter.split_documents([doc])
2.2 向量嵌入与存储
2.2.1 阿里云专用嵌入模型
from langchain_openai import OpenAIEmbeddings
embedding = OpenAIEmbeddings(
api_key=API_KEY,
base_url=BASE_URL,
model="text-embedding-v4",
check_embedding_ctx_length=False
)
2.2.2 官方内置向量库
from langchain_core.vectorstores import InMemoryVectorStore
# 创建向量存储
vector_store = InMemoryVectorStore.from_documents(splits, embedding)
# 创建检索器
retriever = vector_store.as_retriever()
2.3 RAG链构建
2.3.1 提示词模板
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("""根据资料回答问题:
资料:{context}
问题:{question}
""")
2.3.2 构建RAG链
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
三、完整实现代码
import os
os.environ["PYTHONUTF8"] = "1"
# 配置信息
API_KEY = "sk-XXXXXXXXXXXXXXXXXXXXXXXXXX"
BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"
MODEL = "qwen-turbo"
# 初始化大模型
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
api_key=API_KEY,
base_url=BASE_URL,
model=MODEL
)
# 文档处理
from langchain_openai import OpenAIEmbeddings
from langchain_core.documents import Document
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 1. 创建文档
doc = Document(page_content="佛罗里达全年阳光充足,平均气温25度,非常适合度假。")
# 2. 切分文档
splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50)
splits = splitter.split_documents([doc])
# 3. 初始化嵌入模型
embedding = OpenAIEmbeddings(
api_key=API_KEY,
base_url=BASE_URL,
model="text-embedding-v4",
check_embedding_ctx_length=False
)
# 4. 创建向量存储
from langchain_core.vectorstores import InMemoryVectorStore
vector_store = InMemoryVectorStore.from_documents(splits, embedding)
retriever = vector_store.as_retriever()
# 5. 构建RAG链
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
prompt = ChatPromptTemplate.from_template("""根据资料回答问题:
资料:{context}
问题:{question}
""")
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 测试运行
print(rag_chain.invoke("佛罗里达天气怎么样?"))
四、关键优势分析
4.1 架构优势
- 零外部依赖:使用LangChain官方内置的InMemoryVectorStore,无需安装额外数据库
- 开箱即用:完整的RAG流程在50行代码内完成
- 高度可扩展:易于替换为其他数据源或向量数据库
4.2 性能特点
- 实时检索:每次查询都基于最新知识库
- 精准匹配:通过向量化检索确保相关性
- 自然生成:大模型生成流畅自然的回答
五、扩展应用场景
5.1 多文档处理
# 可以轻松处理多个文档
documents = [
Document(page_content="文档1内容"),
Document(page_content="文档2内容"),
# …
]
splits = splitter.split_documents(documents)
5.2 不同数据源
- PDF文档:使用PyPDFLoader加载PDF
- 网页内容:使用WebBaseLoader抓取网页
- 数据库:从SQL数据库加载结构化数据
5.3 高级检索策略
- 相似度搜索:调整k参数控制返回结果数量
- 元数据过滤:基于文档元数据进行精准过滤
- 混合检索:结合关键词检索和向量检索
六、工程最佳实践
6.1 错误处理
try:
result = rag_chain.invoke("问题")
except Exception as e:
print(f"检索失败:{e}")
6.2 性能优化
- 批量处理:对大量文档进行批量嵌入
- 缓存机制:缓存常用的检索结果
- 异步处理:使用异步API提升吞吐量
6.3 监控与调试
- 日志记录:记录检索过程和结果
- 性能监控:监控检索耗时和准确率
- 人工审核:定期审核系统回答质量
七、本讲小结
今天我们构建了一个完整的RAG系统,掌握了以下核心技能:
核心价值:通过RAG技术,我们让Agent具备了实时获取和利用外部知识的能力,大大提升了系统的实用性和专业性。
下一讲预告:在第8讲中,我们将把RAG系统与记忆管理相结合,构建一个既具备长期记忆又能够实时检索知识的超级智能助手。




