第三章: RAG系统实战
RAG概念
RAG(Retrieval-Augmented Generation)= 检索增强生成
核心思想:
用户问题 → 检索相关文档 → 结合文档回答
优势:
- 知识实时更新(无需重新训练)
- 回答有据可查
- 成本低(vs微调)
快速实战(15分钟)
1. 准备文档
# documents.txt
AI技术正在快速发展。
大语言模型可以理解和生成文本。
RAG系统结合了检索和生成。
2. 构建向量数据库
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
# 加载文档
loader = TextLoader("documents.txt")
documents = loader.load()
# 分割文本
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
# 创建向量数据库
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(docs, embeddings)
3. 构建问答链
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
# 提问
result = qa_chain.invoke({"query": "什么是RAG?"})
print(result["result"])
# 输出:RAG系统结合了检索和生成...
进阶技术
1. 文档分割策略
# 按字符分割
CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
# 按Token分割
TokenTextSplitter(chunk_size=500, chunk_overlap=50)
# 递归分割(推荐)
RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["
", "
", "。", " ", ""]
)
2. 元数据过滤
from langchain.schema import Document
docs = [
Document(page_content="...", metadata={"source": "doc1.pdf", "page": 1}),
Document(page_content="...", metadata={"source": "doc2.pdf", "page": 5}),
]
# 检索时过滤
vectorstore.as_retriever(
search_kwargs={"filter": {"source": "doc1.pdf"}}
)
3. 多查询检索
from langchain.retrievers import MultiQueryRetriever
retriever = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(),
llm=llm
)
# 自动生成多个查询变体,提高召回率
下一章预告:Agent高级模式 - 多Agent协作、工具链设计、错误处理。