检索增强生成 (RAG)
RAG (Retrieval-Augmented Generation) 是目前构建特定领域知识问答系统的最主流方法。它让 LLM 能够“查阅”外部数据。
RAG 核心流程
- Load (加载): 读取数据源 (PDF, Web, TXT)。
- Split (切分): 将长文本切分为适合模型处理的小块 (Chunks)。
- Embed (向量化): 将文本块转换为向量 (Vector)。
- Store (存储): 将向量存入向量数据库 (Vector Store)。
- Retrieve (检索): 根据用户问题检索最相关的文本块。
- Generate (生成): 将检索到的文本块作为上下文传给 LLM 生成答案。
实战代码
以下是一个最小化的 RAG 示例。
准备工作
需安装: langchain-openai, langchain-chroma, bs4
代码实现
python
import bs4
from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters 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
# 1. 加载与切分
loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
# 2. 向量化与存储 (创建检索器)
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())
retriever = vectorstore.as_retriever()
# 3. 构建 RAG 链
template = """基于以下上下文回答问题:
{context}
问题: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
llm = ChatOpenAI(model="gpt-3.5-turbo")
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 4. 提问
response = rag_chain.invoke("什么是 LLM Agent?")
print(response)关键点解析
- RecursiveCharacterTextSplitter: 智能地按段落、句子切分,尽量保持语义完整。
- retriever | format_docs: 这是 LCEL 的强大之处。检索出来的文档列表(List[Document])会自动流向
format_docs函数,转换为纯文本字符串,填充到 prompt 的{context}变量中。
中级教程到此结束!准备好挑战更复杂的场景了吗?进入 高级教程:智能体与生产。
LangChain中文文档