马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
Action
- from pydantic.v1 import BaseModel, Field
- from typing import List, Optional, Dict, Any
- class Action(BaseModel):
- name: str = Field(description="Tool name")
- args: Optional[Dict[str, Any]] = Field(description="Tool input arguments, containing arguments names and values")
- def __str__(self):
- ret = f"Action(name={self.name}"
- if self.args:
- for k, v in self.args.items():
- ret += f", {k}={v}"
- ret += ")"
- return ret
复制代码 Action类及其相干代码的具体分析
一、类布局概览
- from pydantic.v1 import BaseModel, Field
- from typing import Optional, Dict, Any
- class Action(BaseModel):
- name: str = Field(description="工具名称")
- args: Optional[Dict[str, Any]] = Field(description="工具输入参数,包含参数名和值")
- def __str__(self):
- ret = f"Action(name={self.name}"
- if self.args:
- for k, v in self.args.items():
- ret += f", {k}={v}"
- ret += ")"
- return ret
复制代码 二、核心计划分析
1. 数据建模 (Pydantic)
- BaseModel继续:
- from pydantic.v1 import BaseModel
- class Action(BaseModel): ...
复制代码
- 使用Pydantic v1(注意导入路径)实现数据验证
- 主动验证字段范例和束缚条件(如name必须为字符串,args必须为字典或None)
- 字段界说:
- name: str = Field(description="工具名称")
- args: Optional[Dict[str, Any]] = Field(...)
复制代码
- name字段:
- 必须字段:每个动作必须有工具名称
- 范例束缚:欺压为str范例
- 元数据:description用于天生API文档或LLM提示
- args字段:
- 可选字段:答应None值(某些工具不须要参数)
- 动态布局:Dict[str, Any]支持恣意参数布局
- 范例安全:字典键必须为字符串,值可为恣意范例
2. **运行时验证示例
- # 合法实例
- action1 = Action(name="search", args={"query": "Python"})
- action2 = Action(name="finish") # args为None
- # 非法实例(会抛出ValidationError)
- Action(name=123) # 类型错误(name必须为str)
- Action(name="calc", args="x=1") # 类型错误(args必须为字典)
复制代码 三、字符串体现优化
- def __str__(self):
- ret = f"Action(name={self.name}"
- if self.args:
- for k, v in self.args.items():
- ret += f", {k}={v}"
- ret += ")"
- return ret
复制代码
- 输出示例:
- print(Action(name="search", args={"query": "AI", "limit": 5}))
- # 输出: Action(name=search, query=AI, limit=5)
复制代码 - 计划目的:
- 调试友好:在日记或中心步调(如__format_thought_observation)中清晰展示动作内容
- 可读性:比默认的Action(name='search', args={'query': 'AI'})更轻便
四、在ReAct框架中的作用
1. 动作分析流程
2. 关键交互点
- 输出分析:
- # 在ReActAgent.__step()中
- json_action = self.__extract_json_action(response)
- action = self.robust_parser.parse(json_action)
复制代码
- 工具实行:
- # 在ReActAgent.__exec_action()中
- tool = self.__find_tool(action.name)
- observation = tool.run(action.args)
复制代码
五、计划亮点与注意事项
1. 版本选择
- from pydantic.v1 import ... # 而非直接import pydantic
复制代码
- 大概缘故原由:
- 兼容性:项目中其他组件依靠Pydantic v1
- 迁移资本:v2版本存在庞大变更(如校验逻辑、字段声明方式)
2. 动态参数计划
- args: Optional[Dict[str, Any]] # 而非预定义结构
复制代码
- 上风:
- 风险:
- 范例安全需工具自行验证(如tool.run()内部需校验参数)
3. **字段形貌的作用
- 实际应用:
- 在LLM提示模板中,通过format_instructions主动天生格式分析:
- # ReActAgent.__init_prompt_templates()
- format_instructions=self.output_parser.get_format_instructions()
复制代码 - 天生的提示示例:
- 请按以下格式响应:
- ```json
- {
- "name": "工具名称",
- "args": {"参数名": "值"} # 可选字段
- }
复制代码- [/code]
- [/list]
- [/list][hr][size=3]六、扩展发起[/size]
- [size=2]1. [b]参数校验加强[/b][/size]
- [code]# 可为特定工具定义参数模型
- from pydantic.v1 import validator
- class SearchAction(Action):
- @validator('args')
- def validate_args(cls, v):
- if 'query' not in v:
- raise ValueError("搜索工具必须包含query参数")
- return v
复制代码 2. 版本迁移预备
- # 条件导入示例
- try:
- from pydantic.v1 import BaseModel
- except ImportError:
- from pydantic import BaseModel
复制代码 3. 日记优化
- def __repr__(self):
- return f"Action(name={self.name!r}, args={self.args!r})"
复制代码
- 调试加强:区分__str__(用户友好)和__repr__(开辟调试)
七、范例使用场景
场景1:LLM天生动作
- # LLM输出示例
- response = """
- 需要搜索AI相关新闻:
- ```json
- {
- "name": "web_search",
- "args": {"query": "AI news 2023", "max_results": 5}
- }
复制代码 “”"
分析结果
action = Action(name=“web_search”, args={“query”: “AI news 2023”, “max_results”: 5})- #### 场景2:工具执行
- ```python
- class SearchTool(BaseTool):
- name = "web_search"
-
- def run(self, args):
- query = args["query"] # 依赖Action的参数结构正确
- max_results = args.get("max_results", 10)
- return search_api(query, max_results)
复制代码 场景3:非常处理处罚
- # 当LLM返回错误格式时
- invalid_json = '{"name": 123}' # name应为字符串
- try:
- action = Action.parse_raw(invalid_json)
- except ValidationError as e:
- print(e)
- # 输出: 1 validation error for Action
- # name -> str type expected
复制代码 该Action类的计划充实体现了以下原则:
- 明确性:通过范例注解明确数据布局
- 机动性:支持恣意工具的参数格式
- 可调试性:自界说字符串体现
- 兼容性:适配LangChain的分析机制
这些特性使其成为毗连LLM推理与工具实行的核心枢纽,在ReAct框架中起到承上启下的关键作用。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|