微信扫码
添加专属顾问
我要投稿
深入了解企业级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-05-28
AI Agent框架哪家强:Google ADK、Autogen、Langchain与CrewAI
2025-05-27
Langchain创始人最新分享:如何跨越“原型惊艳”到“生产可靠”的鸿沟
2025-05-26
简单实战LangChain多任务应用开发
2025-05-26
二、LangChain提示词工程
2025-05-24
AI Agent技术原理解析 —— LangManus、Deerflow...
2025-05-21
首个落地案例!WEBTOON 用 LangGraph 构建故事理解 Agent,创作者 AI 时代的范式来了?
2025-05-21
一文学会LangChain搭建Agent工具
2025-05-19
新手必看!LangGraph如何轻松搞定多语言模型协同工作
2024-10-10
2024-07-13
2024-06-03
2024-04-08
2024-09-04
2024-04-08
2024-08-18
2024-03-28
2024-06-24
2024-07-10
2025-05-21
2025-05-19
2025-05-08
2025-05-06
2025-04-22
2025-04-18
2025-03-22
2025-03-22