使用 LangGraph 构建人机协同代理工作流
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
从简单的线性 LLM 提示词 (Prompt) 转向复杂的多步代理工作流 (Agentic Workflows),标志着 AI 应用开发进入了一个全新的阶段。虽然完全自主的智能体是我们的最终目标,但由于目前大语言模型在推理可靠性方面的局限性,一种更为严谨的架构——人机协同 (Human-In-The-Loop, HITL) 变得至关重要。通过在代理循环中引入人工干预,开发者可以确保 AI 的输出更加准确、安全且符合用户意图。本教程将详细介绍如何使用 LangGraph 构建这类高级系统,并利用 n1n.ai 提供的极速 API 为底层智能提供动力。
为什么人机协同 (HITL) 是必不可少的
完全自主的智能体经常会陷入“死循环”或“幻觉级联”,即一个错误的决策会导致后续步骤全面崩溃。HITL 模式通过以下方式降低了这些风险:
- 审批高风险操作:例如执行代码、发起金融转账或发送外部邮件。
- 编辑代理状态:在代理继续执行之前,修正其误解的变量或优化其搜索查询。
- 提供反馈引导:当代理进入不确定状态时,由人类提供关键信息。
为了实现这些模式,你需要一个低延迟、高可靠性的后端支持。使用 n1n.ai 可以确保你的代理在交互过程中保持极速响应,为实时的人机协作提供流畅的体验。
LangGraph 实现 HITL 的核心概念
LangGraph 引入了几个关键原语,使 HITL 的实现变得非常简单:
- 状态管理 (State Management):一个中心化的对象,记录工作流的所有进度。
- 检查点 (Checkpoints):在特定时间点对状态进行的持久化快照。
- 中断 (Interrupts):在特定节点运行前或运行后暂停执行,等待外部输入的能力。
实战指南:构建具有 HITL 功能的研究助理
我们将构建一个研究代理,它会进行网页搜索,但在撰写最终报告之前需要人工审核。
1. 定义状态与图结构
首先,我们定义状态模式 (Schema) 和图中的节点。
from typing import TypedDict, Annotated, List
from langgraph.graph import StateGraph, END
class AgentState(TypedDict):
task: str
research_notes: List[str]
approved: bool
final_report: str
def research_node(state: AgentState):
# 模拟研究逻辑,实际应用中可调用搜索 API
return {"research_notes": ["发现了关于 LLM 延迟的数据", "发现了关于 HITL 模式的数据"]}
def human_review_node(state: AgentState):
# 此节点仅作为人工干预的占位符
pass
def final_report_node(state: AgentState):
return {"final_report": f"基于以下笔记生成的报告: {state['research_notes']}"}
2. 配置中断与持久化
HITL 的核心在于 interrupt_before 参数。它告诉 LangGraph 在运行指定节点之前停止执行,并将状态保存到检查点。使用 n1n.ai 提供的稳定 API,可以确保状态更新过程中的并发处理更加稳健。
from langgraph.checkpoint.memory import MemorySaver
builder = StateGraph(AgentState)
builder.add_node("researcher", research_node)
builder.add_node("reviewer", human_review_node)
builder.add_node("writer", final_report_node)
builder.set_entry_point("researcher")
builder.add_edge("researcher", "reviewer")
builder.add_edge("reviewer", "writer")
builder.add_edge("writer", END)
# 初始化内存以保存状态
memory = MemorySaver()
graph = builder.compile(checkpointer=memory, interrupt_before=["reviewer"])
3. 执行工作流并处理人工输入
当我们运行这个图时,它会执行到 researcher 节点后停止。我们必须在提供输入后手动恢复它。
config = {"configurable": {"thread_id": "session_123"}}
# 初始运行
for event in graph.stream({"task": "分析 HITL 趋势", "approved": False}, config):
print(event)
# 此时图在 'reviewer' 节点前暂停。我们可以检查状态并更新它。
current_state = graph.get_state(config)
print(f"当前笔记内容: {current_state.values['research_notes']}")
# 人工批准并继续
graph.update_state(config, {"approved": True}, as_node="reviewer")
for event in graph.stream(None, config):
print(event)
高级代理工作流的进阶技巧
- 状态编辑与“时光旅行”:LangGraph 允许你“分叉”线程。如果代理犯了错,你可以回溯到之前的检查点,修改状态(例如
state['research_notes'].pop()),然后从该点重新运行。这对于调试复杂的 RAG 管道极其有用。 - 动态路由与置信度阈值:可以使用条件边 (Conditional Edges) 来实现自动化升级。例如,当 LLM 的置信度评分
confidence < 0.8时,自动将任务路由到human_escalation节点。 - API 性能优化:在构建需要多步 LLM 调用的代理时,API 的响应速度决定了用户体验。通过 n1n.ai,你可以一键接入 DeepSeek-V3、Claude 3.5 Sonnet 等顶级模型,其优化的路由算法能显著降低多轮对话的累计延迟。
总结
构建强大的 AI 代理不仅仅是写一段提示词,更需要建立一个结构化的环境,让渡一部分控制权给人类进行干预、修正和引导。借助 LangGraph 的检查点和中断功能,你可以构建出既强大又安全的生产级代理工作流。对于希望扩展这些工作流的企业来说,选择一个可靠的 API 合作伙伴是迈向成功的下一步。
Get a free API key at n1n.ai