LangGraph 代理式RAG
一句话
使用 LangGraph 构建能够自主决定何时检索 vector store 内容或直接响应用户的检索增强生成(RAG)代理系统。
什么时候翻这页
当你需要构建一个能够自主决定是否检索上下文的智能 RAG 系统时,或者当你需要深入了解 LangGraph 的 Graph API(包括状态、节点、边和条件边)的实际应用时。
核心概念
- Retrieval agents:当需要 LLM 决定是否从 vectorstore 检索上下文或直接响应用户时使用的代理
- Document loaders:用于加载各种格式的文档
- Text splitters:将文档分割成较小的 chunk 以便索引到 vector store
- Embeddings:将文本转换为向量表示,用于语义搜索
- Vector stores:存储和检索文档嵌入的数据库
- LangGraph Graph API:包括状态、节点、边和条件边的图构建框架
- MessagesState:包含消息列表的图状态
怎么做
-
文档预处理:
- 使用
requests和BeautifulSoup获取网页内容 - 使用
RecursiveCharacterTextSplitter.from_tiktoken_encoder将文档分割成 chunk
- 使用
-
创建检索工具:
- 使用
InMemoryVectorStore.from_documents创建内存向量存储 - 使用
OpenAIEmbeddings()创建嵌入 - 使用
@tool装饰器创建检索工具
- 使用
-
构建代理图组件:
- generate_query_or_respond:调用 LLM 生成响应,决定是否使用检索工具
- grade_documents:评估检索文档与问题的相关性
- rewrite_question:当文档不相关时重写用户问题
- generate_answer:基于原始问题和检索上下文生成最终答案
-
组装图:
- 使用
StateGraph创建工作流 - 添加节点和条件边
- 编译图并运行
- 使用
命令 / API 速查
# 安装必要的包
pip install -U langgraph "langchain[openai]" langchain-text-splitters bs4 requests
# 设置API密钥
_set_env("OPENAI_API_KEY")
# 创建向量存储和检索器
vectorstore = InMemoryVectorStore.from_documents(
documents=doc_splits, embedding=OpenAIEmbeddings()
)
retriever = vectorstore.as_retriever()
# 创建检索工具
@tool
def retrieve_blog_posts(query: str) -> str:
"""Search and return information about Lilian Weng blog posts."""
docs = retriever.invoke(query)
return "\n\n".join([doc.page_content for doc in docs])
# 定义节点函数
def generate_query_or_respond(state: MessagesState):
response = response_model.bind_tools([retriever_tool]).invoke(state["messages"])
return {"messages": [response]}
def grade_documents(state: MessagesState) -> Literal["generate_answer", "rewrite_question"]:
# 评估文档相关性的逻辑
...
def rewrite_question(state: MessagesState):
# 重写问题的逻辑
...
def generate_answer(state: MessagesState):
# 生成答案的逻辑
...
# 创建和编译图
workflow = StateGraph(MessagesState)
workflow.add_node(generate_query_or_respond)
workflow.add_node("retrieve", ToolNode([retriever_tool]))
workflow.add_node(rewrite_question)
workflow.add_node(generate_answer)
# 添加边...
graph = workflow.compile()
与 Hello-Agents / LangGraph / 本博客 handbook 索引的联系
本教程中的 Chroma vector store 实现与 handbook 中第6课的 Chroma 索引方法一致,都是使用 embedding 技术将文档转换为向量存储。此外,本教程展示的 LangGraph 工作流构建方法与 Hello-Agents 中记忆与检索章节的内容相呼应,但更进一步实现了代理式决策机制,使系统能够自主决定何时检索信息。
初学者易错点
- 文档分割不当:chunk_size 和 chunk_overlap 的设置会影响检索效果,需要根据具体应用场景调整
- 相关性评估不准确:grade_documents 节点中的评估逻辑可能过于严格或宽松,需要根据实际需求调整
- 工具绑定错误:在 generate_query_or_respond 中忘记使用
.bind_tools()绑定检索工具会导致代理无法调用检索功能 - 状态管理混乱:MessagesState 的消息顺序和内容需要正确维护,否则会影响后续节点的决策