第 18 章:LangGraph 入门:可控的 Agent 工作流

5 阅读2分钟

第 18 章:LangGraph 入门:可控的 Agent 工作流

本章目标

这一章介绍 LangGraph。它适合当你不想让 Agent 完全自由发挥,而是希望流程可控、可观察、可恢复。

为什么需要 LangGraph

简单 Agent 可以用 createAgent。但业务复杂后,你可能希望明确规定:

分析问题 -> 检索知识库 -> 判断是否足够 -> 调用工具 -> 生成答案 -> 质量检查

这时图工作流比自由 Agent 更清晰。

LangChain 官方文档也说明,LangChain Agent 底层构建在 LangGraph 之上。LangGraph 更适合高级编排场景。

图的基本概念

可以把 LangGraph 理解成:

  • State:流程中的共享状态
  • Node:每一步处理逻辑
  • Edge:步骤之间的连接
  • Conditional Edge:根据条件走不同分支

知识库问答工作流

我们可以设计:

start
  -> rewrite_question
  -> retrieve
  -> decide
    -> generate_answer
    -> fallback
  -> end

如果检索结果足够好,就生成答案;否则进入兜底回复。

状态设计

interface RagState {
  messages: Array<{ role: string; content: string }>;
  rewrittenQuestion?: string;
  retrievedDocs?: Array<{
    content: string;
    source: string;
    score: number;
  }>;
  answer?: string;
}

节点示例

async function rewriteQuestion(state: RagState): Promise<Partial<RagState>> {
  const lastMessage = state.messages[state.messages.length - 1];

  return {
    rewrittenQuestion: lastMessage.content
  };
}

async function retrieveDocs(state: RagState): Promise<Partial<RagState>> {
  const docs = await retrieveRelevantChunks(state.rewrittenQuestion ?? "");

  return {
    retrievedDocs: docs.map((item) => ({
      content: item.record.content,
      source: item.record.metadata.source,
      score: item.score
    }))
  };
}

这只是伪代码,正式实现时需要按 LangGraph 当前 API 组织。

什么时候不用 LangGraph

不要为了炫技一开始就上图工作流。

以下情况先不用:

  • 只是一个简单 Chat
  • 只有一个模型调用
  • 没有工具调用
  • 没有复杂分支

以下情况适合用:

  • 多步骤 RAG
  • 多工具 Agent
  • 需要人工确认
  • 需要持久化状态
  • 需要失败恢复
  • 需要观测每个节点

实战任务

完成设计稿即可:

  • 画出 RAG 工作流图
  • 定义 state 类型
  • 写出 4 个节点伪代码
  • 说明哪些分支需要条件判断

常见坑

不要把 LangGraph 当成必须项。它解决复杂流程编排,不是每个 AI 应用都需要。

不要让图节点做太多事。一个节点只负责一个明确步骤。

不要忽略状态结构。State 设计混乱,图会很快失控。

本章小结

LangGraph 让 Agent 流程更可控。下一章会用 LangSmith 观察一次 AI 调用到底发生了什么。