logo

实战二: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

公司规定:

  1. 年假:入职满一年有 10 天年假。
  2. 病假:需提供医生证明,全薪。
  3. 报销:餐饮报销上限为每人每餐 $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 按需调用。
AI Agent 开发实战手册
AI Engineer

AI Agent 开发实战手册

从 0 到 1 掌握 AI Agent 开发:涵盖自主计划、工具调用、MCP 协议与多智能体编排实战。

AI Agent 开发实战手册实战二:RAG 知识库助手

实战二:RAG 知识库助手

Agent 不仅要有手脚(Tools),还要有记忆(Knowledge)。 本实验将构建一个 HR 助手,它能根据(伪造的)公司员工手册回答关于请假和报销的问题。

Prompt Lab

把这章的知识,直接变成实战能力

进入交互式实验室,用真实任务练 Prompt,10 分钟快速上手。

进入 Prompt Lab →

#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
bash
pip install langchain langchain-chroma langchain-openai

#3. 准备知识库 (Indexing)

假设我们有一个 handbook.txt

公司规定:

  1. 年假:入职满一年有 10 天年假。
  2. 病假:需提供医生证明,全薪。
  3. 报销:餐饮报销上限为每人每餐 $50,需发票。
python
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 的一种能力。

python
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. 运行与测试

python
response = rag_chain.invoke({"input": "我刚入职,请朋友吃饭花了 80 块,能报销吗?"}) print(response["answer"])

预期回答

不能全额报销。根据公司规定,餐饮报销上限为每人每餐 $50。


#6. 进阶:将 RAG 变成一个 Tool

上面的 RAG Chain 只是一个单纯的问答系统。如果我们要把它集成到更复杂的 Agent 中(比如既能查文档,又能发邮件),我们需要把检索包装成一个 Tool

python
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 按需调用。

常见问题

开发 AI Agent 需要掌握哪些编程语言?
首选 Python 或 TypeScript。Python 是 AI 生态的基石,而 TypeScript 在开发 MCP Server 和网页端交互时效率极高。借助 Cursor 等 AI 原生编辑器,编程门槛已大幅降低。
MCP 协议目前支持哪些模型?
MCP 是开放协议,目前对 Claude 3.5 系列支持最完美。通过 MCP Proxy,GPT-4o 和 Gemini 也可以间接访问 MCP Server 数据源。
AI Agent 会导致程序员失业吗?
不会,但会改变程序员的工作内容。未来的开发者将从“写代码”转向“管理 Agent 团队”,重点在于系统架构设计、复杂逻辑校验和 Agent 的提示词优化。