Skip to content

检索增强生成 (RAG)

RAG (Retrieval-Augmented Generation) 是目前构建特定领域知识问答系统的最主流方法。它让 LLM 能够“查阅”外部数据。

RAG 核心流程

  1. Load (加载): 读取数据源 (PDF, Web, TXT)。
  2. Split (切分): 将长文本切分为适合模型处理的小块 (Chunks)。
  3. Embed (向量化): 将文本块转换为向量 (Vector)。
  4. Store (存储): 将向量存入向量数据库 (Vector Store)。
  5. Retrieve (检索): 根据用户问题检索最相关的文本块。
  6. 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中文文档