实战二:RAG 知识库助手
Agent 不仅要有手脚(Tools),还要有记忆(Knowledge)。 本实验将构建一个 HR 助手,它能根据(伪造的)公司员工手册回答关于请假和报销的问题。
[PROMPT_LAB_BANNER]
1. RAG 工作流
sequenceDiagram
participant User
participant Agent (Chain)
participant Retriever
participant VectorDB
participant LLM
User->>Agent: "能报销请客吃饭吗?"
Agent->>Retriever: Invoke
Retriever->>VectorDB: 语义搜索 (Similarity Search)
VectorDB-->>Retriever: 返回文档片段 (Context)
Retriever-->>Agent: Context
Agent->>LLM: Prompt + Context + Question
LLM-->>Agent: "根据规定,上限 $50..."
Agent-->>User: 最终回答
2. 技术栈
- LangChain: 编排框架
- ChromaDB: 本地向量数据库(无需 API Key)
- OpenAI / Gemini / Claude: LLM
pip install langchain langchain-chroma langchain-openai
3. 准备知识库 (Indexing)
假设我们有一个 handbook.txt:
公司规定:
- 年假:入职满一年有 10 天年假。
- 病假:需提供医生证明,全薪。
- 报销:餐饮报销上限为每人每餐 $50,需发票。
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
# 1. 加载文档
loader = TextLoader("./handbook.txt")
documents = loader.load()
# 2. 切分 (Chunking)
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
# 3. 存入向量数据库
db = Chroma.from_documents(docs, OpenAIEmbeddings())
4. 构建检索链 (Retrieval Chain)
现在我们要把“检索”变成 Agent 的一种能力。
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o")
# 定义 Prompt,告诉 Agent 必须基于 Context 回答
prompt = ChatPromptTemplate.from_template("""
你是一个 HR 助手。请基于下面的 Context 回答用户问题。
如果你不知道,就说不知道。
Context:
{context}
Question:
{input}
""")
# 创建 "文档合并链" (把检索到的片段塞进 Prompt)
combine_docs_chain = create_stuff_documents_chain(llm, prompt)
# 创建 "检索链" (连接 DB 和 LLM)
retriever = db.as_retriever()
rag_chain = create_retrieval_chain(retriever, combine_docs_chain)
5. 运行与测试
response = rag_chain.invoke({"input": "我刚入职,请朋友吃饭花了 80 块,能报销吗?"})
print(response["answer"])
预期回答:
不能全额报销。根据公司规定,餐饮报销上限为每人每餐 $50。
6. 进阶:将 RAG 变成一个 Tool
上面的 RAG Chain 只是一个单纯的问答系统。如果我们要把它集成到更复杂的 Agent 中(比如既能查文档,又能发邮件),我们需要把检索包装成一个 Tool。
from langchain.tools.retriever import create_retriever_tool
retriever_tool = create_retriever_tool(
retriever,
"search_company_policy",
"搜素公司关于请假、报销等行政规定的政策文档"
)
# 现在这个 tool 可以和其他 tool 一起给 Agent 使用了
tools = [retriever_tool, send_email_tool, ...]
小结
- Indexing: 知识入库(切片 -> 向量化 -> 存储)。
- Retrieval: 语义搜索,找到最相关的片段。
- Generation: LLM 基于片段生成答案。
- Toolification: 将 RAG 封装为工具,让 Agent 按需调用。