当前位置: 首页 > news >正文

深度智能体-人机回环

     1.概述

        与图和智能体一样,在深度智能体中也需要对一些有潜在风险的工具调用进行检查和确认,可以在创建深度智能体时通过interrupt_on来对不同的工具配置不同的检查策略。对于工具—策略键值对,如果策略为True,则允许所有的策略(approve, edit, reject),如果策略为False,则不允许工具有中断,策略为allowed:{},则可以更细粒度控制策略。本文将对深度智能体的人机回环进行详细介绍。

    2.实现人机回环

       1)定义两个工具

        如下示例代码中有两个工具,get_enterprise_info从store查询企业信息,save_enterprise_info把企业信息保存到store中:

from langchain.tools import tool, ToolRuntime
from typing import Any

@tool
def get_enterprise_info(uniscid: str, runtime: ToolRuntime) -> dict[str, Any]:
"""Look up enterprise info."""
store = runtime.store
enterprise_info = store.get(("enterprises",), uniscid)
return enterprise_info if enterprise_info else "Unknown enterprise"

@tool
def save_enterprise_info(uniscid: str, enterprise_info: dict[str, Any], runtime: ToolRuntime) -> str:
"""Save enterprise info."""
store = runtime.store
store.put(("enterprises",), uniscid, enterprise_info)
return "Successfully saved enterprise info."

        2)创建大模型实例

from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model = 'qwen-plus',
api_key = "sk-*",
base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1")

        3)创建智能体设置中断

from langgraph.checkpoint.memory import InMemorySaver
from langgraph.store.memory import InMemoryStore
from deepagents import create_deep_agent
saver = InMemorySaver() #必须有检查点,才能支持用户回环
store = InMemoryStore()
agent = create_deep_agent(
model=llm,
tools=[get_enterprise_info, save_enterprise_info],
interrupt_on={
"get_enterprise_info": False,   # No interrupts needed
"save_enterprise_info": {"allowed_decisions": ["approve", "edit", "reject"]}, 
},
checkpointer=saver,
store=store
)

        4)处理中断

        允许工具调用:

if result.get("__interrupt__"):
# Extract interrupt information
interrupts = result["__interrupt__"][0].value
action_requests = interrupts["action_requests"]
review_configs = interrupts["review_configs"]

    # Create a lookup map from tool name to review config
config_map = {cfg["action_name"]: cfg for cfg in review_configs}

    # Display the pending actions to the user
for action in action_requests:
review_config = config_map[action["name"]]
print(f"Tool: {action['name']}")
print(f"Arguments: {action['args']}")
print(f"Allowed decisions: {review_config['allowed_decisions']}")

    # Get user decisions (one per action_request, in order)
decisions = [
{"type": "approve"}  # User approved the deletion
]

    # Resume execution with decisions
result = agent.invoke(
Command(resume={"decisions": decisions}),
config=config  # Must use the same config!
)

# Process final result
print(result["messages"][-1].content)

        拒绝工具调用,仅修改decisions即可:

 #以上同上  

  decisions = [
{"type": "approve"}  # User approved the deletion
]

#以下同上

        对调用参数进行修改,仅修改decisions即可,其中传入修改后的参数:

     "decisions": [
{
"type": "edit",
# 修改后的数据
"edited_action": {
# 工具名
"name": "save_enterprise_info",
# 调用工具时的参数.
"args": {
'uniscid': '51234569876543210', 
'enterprise_info':{
"name": "东邪西毒文化娱乐有限公司",

                                "legal": "黄老邪",

                                "type": "内资企业"
}
},
}
}
]

      3.多工具调用

         当调用多个工具产生中断时,所有的中断会打包在一起,在恢复中断时,需要按照顺序分别提供恢复策略:

decisions = [

    {"type": "approve"}, # 对于第一个中断,采取同意操作

    {"type": "reject"} # 对于第二个中断,采取拒绝操作

]

      4.子智能体中断处理

        子智能体可以有自己的中断,如下代码说明:

agent = create_deep_agent(

    model = llm,
tools=[get_enterprise_info, save_enterprise_info],
interrupt_on={
"get_enterprise_info": True,
"save_enterprise_info": False,
},
subagents=[{
"name": "enterprise-info-manager",
"description": "Manages enterprise information operations",
"system_prompt": "You are a file enterprise management assistant.",
"tools": [get_enterprise_info, save_enterprise_info],
"interrupt_on": {
# 在子智能体中覆盖主智能体中的策略
"get_enterprise_info": True,
"save_enterprise_info": True,  # 与主智能体不同
}
}],
checkpointer=checkpointer
)

http://www.dtcms.com/a/609591.html

相关文章:

  • ASC学习笔记0013:添加一个新的属性集(初始化为默认值)
  • SpringIOC-注解
  • 关闭网站跳转代码wordpress 图片云存储
  • Java练习——数组练习
  • 导航仪企业网站源码那个网站做拍手比较好
  • 离别的十字路口: 是否还记得曾经追求的梦想
  • 3D地球可视化教程 - 第4篇:第5篇:星空背景与粒子系统
  • Unity Shader Graph 3D 实例 - 一个简单的红外线扫描全身效果
  • 【Mastergo】Mastergo总览
  • steam安装游戏为什么磁盘写入错误?磁盘写入错误怎么办?,同样问题解决方案
  • Unity官方文档 Asset Workflow:Importing Assets 阅读笔记
  • UD动作游戏开发读书笔记--. D游戏所需要的数学知识
  • 网站多语切换怎么做网站跳出率多少合适
  • MySQL数据类型全面解析:从数值精度到字符串优化的最佳实践
  • 太阳光模拟器应用:汽车太阳能天窗的发电效能动态测试
  • ES踩了一坑 script查询与float类型的精度
  • ASC学习笔记0015:此能力系统组件是否具有此属性?
  • 如何基于DSL脚本进行elasticsearch向量检索示例
  • 如何利用大语言模型(LLM)实现自动标注与内容增强
  • h5网站有哪些网页设计公司的目标客户有哪些
  • 做网站推广合同做标志的网站
  • 【ZeroRange WebRTC】Amazon Kinesis Video Streams WebRTC Data Plane REST API 深度解析
  • 2025从部署到迭代:Deepseek知识库部署服务商如何护航企业知识管理?
  • 检索增强微调(RAFT)如何重塑慢病健康管理?——从技术原理到落地实践
  • 网站开发 工作量评估关于建设网站安全性合同
  • 学Java第四十四天——可变参数、Collections工具类
  • XQuery FLWOR + HTML:深入理解与实际应用
  • 风丘助力优化ADAS测试:多路雷达、视频及车辆总线数据的集成处
  • LeetCode 152. 乘积最大子数组
  • XTDIC-SPARK高速3D测量系统在电子产品跌落测试中的动态变形与可靠性评估