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
BaseModel继承:
from pydantic.v1 import BaseModel
class Action(BaseModel): ...
name
必须为字符串,args
必须为字典或None
)字段定义:
name: str = Field(description="工具名称")
args: Optional[Dict[str, Any]] = Field(...)
name
字段:
str
类型description
用于生成API文档或LLM提示args
字段:
None
值(某些工具不需要参数)Dict[str, Any]
支持任意参数结构# 合法实例
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'})
更简洁输出解析:
# 在ReActAgent.__step()中
json_action = self.__extract_json_action(response)
action = self.robust_parser.parse(json_action)
Action
模型结构工具执行:
# 在ReActAgent.__exec_action()中
tool = self.__find_tool(action.name)
observation = tool.run(action.args)
name
匹配工具,传递args
参数from pydantic.v1 import ... # 而非直接import pydantic
args: Optional[Dict[str, Any]] # 而非预定义结构
优势:
风险:
tool.run()
内部需校验参数)Field(description="...")
format_instructions
自动生成格式说明:# ReActAgent.__init_prompt_templates()
format_instructions=self.output_parser.get_format_instructions()
请按以下格式响应:
```json
{
"name": "工具名称",
"args": {"参数名": "值"} # 可选字段
}
# 可为特定工具定义参数模型
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
# 条件导入示例
try:
from pydantic.v1 import BaseModel
except ImportError:
from pydantic import BaseModel
def __repr__(self):
return f"Action(name={self.name!r}, args={self.args!r})"
__str__
(用户友好)和__repr__
(开发调试)# 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)
# 当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
类的设计充分体现了以下原则:
这些特性使其成为连接LLM推理与工具执行的核心枢纽,在ReAct框架中起到承上启下的关键作用。