微信扫码
添加专属顾问
我要投稿
深入了解企业级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-07-13
“你问我答”,LangChain 是怎么帮 AI 变聪明的?
2025-07-05
一文看懂 LangChain:为什么火?核心模块都干啥?
2025-07-04
上下文工程:LangGraph四大高效调度策略,Agent告别“记忆过载”!
2025-07-04
LangChain教程——提示词模板
2025-07-03
继提示词工程、RAG技术浪潮后,LangChain领域中上下文工程正成为新的热门方向!
2025-07-01
LangChain教程——LangChain基本使用
2025-06-26
LangChain的OpenAI和ChatOpenAI,到底应该调用哪个?
2025-06-26
开发AI Agent到底用什么框架——LangGraph VS. LlamaIndex
2025-05-06
2025-05-08
2025-06-05
2025-04-18
2025-05-28
2025-05-19
2025-04-18
2025-05-28
2025-04-25
2025-06-26
2025-07-13
2025-07-05
2025-06-26
2025-06-13
2025-05-21
2025-05-19
2025-05-08
2025-05-06