J'Blog

8 课 · 实战

语义检索

基于 Chroma 向量库,与 Workspace 知识库分离。用自然语言描述你想查的内容。 非管理员每人每天可检索 5 次(消耗站点 AI 配额)。

LangGraph 代理式RAG

原文:LangGraph Agentic 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:包含消息列表的图状态

怎么做

  1. 文档预处理

    • 使用 requestsBeautifulSoup 获取网页内容
    • 使用 RecursiveCharacterTextSplitter.from_tiktoken_encoder 将文档分割成 chunk
  2. 创建检索工具

    • 使用 InMemoryVectorStore.from_documents 创建内存向量存储
    • 使用 OpenAIEmbeddings() 创建嵌入
    • 使用 @tool 装饰器创建检索工具
  3. 构建代理图组件

    • generate_query_or_respond:调用 LLM 生成响应,决定是否使用检索工具
    • grade_documents:评估检索文档与问题的相关性
    • rewrite_question:当文档不相关时重写用户问题
    • generate_answer:基于原始问题和检索上下文生成最终答案
  4. 组装图

    • 使用 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 中记忆与检索章节的内容相呼应,但更进一步实现了代理式决策机制,使系统能够自主决定何时检索信息。

初学者易错点

  1. 文档分割不当:chunk_size 和 chunk_overlap 的设置会影响检索效果,需要根据具体应用场景调整
  2. 相关性评估不准确:grade_documents 节点中的评估逻辑可能过于严格或宽松,需要根据实际需求调整
  3. 工具绑定错误:在 generate_query_or_respond 中忘记使用 .bind_tools() 绑定检索工具会导致代理无法调用检索功能
  4. 状态管理混乱:MessagesState 的消息顺序和内容需要正确维护,否则会影响后续节点的决策

相关词条

官方原文:https://docs.langchain.com/oss/python/langgraph/agentic-rag