微信扫码
添加专属顾问
我要投稿
深入了解企业级Agent系统的关键挑战和解决方案。 核心内容: 1. HITL在企业级场景中的必要性与常见模式 2. LangGraph框架下HITL的核心机制与应用 3. HITL工具调用模式与远程协作策略
HITL的必要性与常见模式
HITL基础应用:核心机制(LangGraph)
from langgraph.types import interrupt, Command
...
#这是一个Agent的某个人工参与的节点
def human_review_node(state: State):
# 暂停执行,输出需人工审核的数据
review_data = {"question": "请审核以下内容:", "output": state["llm_output"]}
decision = interrupt(review_data)
# 恢复后将根据人工决策更新状态或跳转
if decision == "approve":
return Command(goto="approved_node")
else:
return Command(goto="rejected_node")
...
...调用agent客户端程序...
result = graph.invoke(initial_state, config) #调用Agent启动工作流
interrupt_info = result['__interrupt__'][0].value
...显示中断信息,人类交互与反馈...
# 假设 thread_id 标识此次任务,再次调用invoke恢复运行即可
user_decision = "approve" # 这里模拟用户最后的反馈
result = graph.invoke(Command(resume=user_decision), config={"configurable": {"thread_id": thread_id}})
...
...
# 初始化 PostgreSQL 检查点保存器
with PostgresSaver.from_conn_string("postgresql://postgres:yourpassword@localhost/postgres?sslmode=disable") as checkpointer:
checkpointer.setup()
graph = builder.compile(checkpointer=checkpointer)
HITL基础应用:原理解析与注意点
HITL下的工具调用:两种管控模式
工具(Tools)使用是Agent最普遍的模式。当Agent准备调用外部工具或执行关键操作时,引入人工确认可以避免错误或高风险行为(特别是在MCP后大量共享工具的出现)。尽管在大的方法上和普通的审批没有质的不同,但在细节上有一些更灵活的控制要求。一个最常见的问题是
在哪里拦截工具调用的意图?如何更方便的管控工具是否需要审核?
def human_approval_node(state: State):
.....从历史消息或者状态获得工具调用消息:tool_calls.....
tool_calls_info = []
# 获取工具调用信息(这里暂时只取第一个演示)
tc = tool_calls[0]
tool_id = tc.get("id", "未知工具ID")
tool_name = tc.get("name", "未知工具")
tool_args = tc.get("args", {})
tool_calls_info.append(f"{tool_name}({tool_args})")
# 非高风险工具自动批准
if tool_name not in HIGH_RISK_TOOLS:
return {"human_approved": True}
tool_calls_str = "\n - ".join(tool_calls_info)
# 高风险工具:中断并等待人工审批
value = interrupt({
"tool_calls": tool_calls_str,
"message": "请输入 'ok' 批准工具使用,或输入 'reject' 拒绝"
})
...
这种模式有一个细节问题:当工具被拒绝时,你不能简单的将请求路由回原节点。由于一些LLM要求在出现Tool_calls的AI消息后,必须有对应的工具结果(LangGraph中ToolMessage类型的消息),否则会导致API错误。因此,这里你可以人为的修改State,添加一条表明工具被拒绝的ToolMessage。
async def tavily_search(query: str, search_depth: Optional[str] = "basic"):
...
# 中断执行,等待人工审核
response = interrupt({
"tool": "tavily_search",
"args": {
"query": query,
"search_depth": search_depth
},
"message": f"准备使用Tavily搜索:\n- 查询内容: {query}\n- 搜索深度: {search_depth}\n\n是否允许继续?\n输入 'yes' 接受,'no' 拒绝,或 'edit' 修改查询关键词",
})
# 处理人工响应
if response["type"] == "accept":
pass
elif response["type"] == "edit":
query = response["args"]["query"]
else:
returnf"该工具被拒绝使用,请尝试其他方法或拒绝回答问题。"
...开始执行真正的工具逻辑...
@human_in_the_loop()
def tavily_search(query: str, search_depth: str = "basic"):
"""使用Tavily进行网络搜索"""
try:
......
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2025-08-27
从LangChain到LangGraph:AI智能体提示词工程的系统化学习
2025-08-25
Agent实战教程:LangGraph相关概念介绍以及快速入门
2025-08-23
企业级复杂任务智能体构建:解锁LangChain新品Deep Agents及其UI利器
2025-08-20
使用LLamaIndex Workflow来打造水墨风格图片生成工作流
2025-08-19
让 LangChain 知识图谱抽取更聪明:BAML 模糊解析助力升级
2025-08-17
Manus、LangChain一手经验:先别给Multi Agent判死刑,是你不会管理上下文
2025-08-16
关于Langchain/Langgraph框架的流式与非流式返回——invoke/ainvoke/stream/astream
2025-08-12
LangChain+BAML:打造99.4%成功率的知识图谱构建方案
2025-06-05
2025-07-14
2025-06-26
2025-07-14
2025-05-30
2025-07-16
2025-06-16
2025-08-19
2025-05-30
2025-06-26
2025-07-14
2025-07-13
2025-07-05
2025-06-26
2025-06-13
2025-05-21
2025-05-19
2025-05-08