【智能体Agent】Action执办法作的核心数据布局

[复制链接]
发表于 2025-10-21 00:23:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Action
  1. from pydantic.v1 import BaseModel, Field
  2. from typing import List, Optional, Dict, Any
  3. class Action(BaseModel):
  4.     name: str = Field(description="Tool name")
  5.     args: Optional[Dict[str, Any]] = Field(description="Tool input arguments, containing arguments names and values")
  6.     def __str__(self):
  7.         ret = f"Action(name={self.name}"
  8.         if self.args:
  9.             for k, v in self.args.items():
  10.                 ret += f", {k}={v}"
  11.         ret += ")"
  12.         return ret
复制代码
Action类及其相干代码的具体分析


一、类布局概览
  1. from pydantic.v1 import BaseModel, Field
  2. from typing import Optional, Dict, Any
  3. class Action(BaseModel):
  4.     name: str = Field(description="工具名称")
  5.     args: Optional[Dict[str, Any]] = Field(description="工具输入参数,包含参数名和值")
  6.     def __str__(self):
  7.         ret = f"Action(name={self.name}"
  8.         if self.args:
  9.             for k, v in self.args.items():
  10.                 ret += f", {k}={v}"
  11.         ret += ")"
  12.         return ret
复制代码

二、核心计划分析

1. 数据建模 (Pydantic)


  • BaseModel继续
    1. from pydantic.v1 import BaseModel
    2. class Action(BaseModel): ...
    复制代码

    • 使用Pydantic v1(注意导入路径)实现数据验证
    • 主动验证字段范例和束缚条件(如name必须为字符串,args必须为字典或None)

  • 字段界说
    1. name: str = Field(description="工具名称")
    2. args: Optional[Dict[str, Any]] = Field(...)
    复制代码

    • name字段:

      • 必须字段:每个动作必须有工具名称
      • 范例束缚:欺压为str范例
      • 元数据:description用于天生API文档或LLM提示

    • args字段:

      • 可选字段:答应None值(某些工具不须要参数)
      • 动态布局:Dict[str, Any]支持恣意参数布局
      • 范例安全:字典键必须为字符串,值可为恣意范例


2. **运行时验证示例
  1. # 合法实例
  2. action1 = Action(name="search", args={"query": "Python"})
  3. action2 = Action(name="finish")  # args为None
  4. # 非法实例(会抛出ValidationError)
  5. Action(name=123)                  # 类型错误(name必须为str)
  6. Action(name="calc", args="x=1")   # 类型错误(args必须为字典)
复制代码

三、字符串体现优化
  1. def __str__(self):
  2.     ret = f"Action(name={self.name}"
  3.     if self.args:
  4.         for k, v in self.args.items():
  5.             ret += f", {k}={v}"
  6.     ret += ")"
  7.     return ret
复制代码

  • 输出示例
    1. print(Action(name="search", args={"query": "AI", "limit": 5}))
    2. # 输出: Action(name=search, query=AI, limit=5)
    复制代码
  • 计划目的

    • 调试友好:在日记或中心步调(如__format_thought_observation)中清晰展示动作内容
    • 可读性:比默认的Action(name='search', args={'query': 'AI'})更轻便


四、在ReAct框架中的作用

1. 动作分析流程

2. 关键交互点


  • 输出分析
    1. # 在ReActAgent.__step()中
    2. json_action = self.__extract_json_action(response)
    3. action = self.robust_parser.parse(json_action)
    复制代码

    • 确保LLM输出的JSON符合Action模子布局

  • 工具实行
    1. # 在ReActAgent.__exec_action()中
    2. tool = self.__find_tool(action.name)
    3. observation = tool.run(action.args)
    复制代码

    • 通过name匹配工具,转达args参数


五、计划亮点与注意事项

1. 版本选择
  1. from pydantic.v1 import ...  # 而非直接import pydantic
复制代码

  • 大概缘故原由

    • 兼容性:项目中其他组件依靠Pydantic v1
    • 迁移资本:v2版本存在庞大变更(如校验逻辑、字段声明方式)

2. 动态参数计划
  1. args: Optional[Dict[str, Any]]  # 而非预定义结构
复制代码

  • 上风

    • 支持恣意工具的参数布局
    • 无需为每个工具创建子类

  • 风险

    • 范例安全需工具自行验证(如tool.run()内部需校验参数)

3. **字段形貌的作用
  1. Field(description="...")
复制代码

  • 实际应用

    • 在LLM提示模板中,通过format_instructions主动天生格式分析:
      1. # ReActAgent.__init_prompt_templates()
      2. format_instructions=self.output_parser.get_format_instructions()
      复制代码
    • 天生的提示示例:
      1. 请按以下格式响应:
      2. ```json
      3. {
      4.     "name": "工具名称",
      5.     "args": {"参数名": "值"}  # 可选字段
      6. }
      复制代码
      1. [/code]
      2. [/list]
      3. [/list][hr][size=3]六、扩展发起[/size]
      4. [size=2]1. [b]参数校验加强[/b][/size]
      5. [code]# 可为特定工具定义参数模型
      6. from pydantic.v1 import validator
      7. class SearchAction(Action):
      8.     @validator('args')
      9.     def validate_args(cls, v):
      10.         if 'query' not in v:
      11.             raise ValueError("搜索工具必须包含query参数")
      12.         return v
      复制代码

      • 实用场景:对关键工具的参数做欺压束缚
      2. 版本迁移预备
      1. # 条件导入示例
      2. try:
      3.     from pydantic.v1 import BaseModel
      4. except ImportError:
      5.     from pydantic import BaseModel
      复制代码

      • 前瞻性:为过渡到Pydantic v2做预备
      3. 日记优化
      1. def __repr__(self):
      2.     return f"Action(name={self.name!r}, args={self.args!r})"
      复制代码

      • 调试加强:区分__str__(用户友好)和__repr__(开辟调试)

      七、范例使用场景

      场景1:LLM天生动作
      1. # LLM输出示例
      2. response = """
      3. 需要搜索AI相关新闻:
      4. ```json
      5. {
      6.     "name": "web_search",
      7.     "args": {"query": "AI news 2023", "max_results": 5}
      8. }
      复制代码
      “”"
      分析结果

      action = Action(name=“web_search”, args={“query”: “AI news 2023”, “max_results”: 5})
      1. #### 场景2:工具执行
      2. ```python
      3. class SearchTool(BaseTool):
      4.     name = "web_search"
      5.    
      6.     def run(self, args):
      7.         query = args["query"]          # 依赖Action的参数结构正确
      8.         max_results = args.get("max_results", 10)
      9.         return search_api(query, max_results)
      复制代码
      场景3:非常处理处罚
      1. # 当LLM返回错误格式时
      2. invalid_json = '{"name": 123}'  # name应为字符串
      3. try:
      4.     action = Action.parse_raw(invalid_json)
      5. except ValidationError as e:
      6.     print(e)
      7.     # 输出: 1 validation error for Action
      8.     #       name -> str type expected
      复制代码

      该Action类的计划充实体现了以下原则:

      • 明确性:通过范例注解明确数据布局
      • 机动性:支持恣意工具的参数格式
      • 可调试性:自界说字符串体现
      • 兼容性:适配LangChain的分析机制
      这些特性使其成为毗连LLM推理与工具实行的核心枢纽,在ReAct框架中起到承上启下的关键作用。

      免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
      继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表