结论速递
TinyAgent项目实现了一个简单的Agent智能体,主要是实现了ReAct策略(推理+调用工具的能力),及封装了一个Tool。
项目实现有一定的疏漏。为了正确运行代码,本次对代码Agent部分进行了简单修改(完善ReAct prompt及LLM的多次循环调用)。
前情回顾
目录
1 绪论
1.1 LLM Agent
Agent是人工智能中一个广为人知的概念,指代理人类完成部分工作的AI程序。
LLM Agent是利用LLM构建Agent,比较受到广泛认可的方式是使用LLM作为Agent的大脑,让其自主规划、利用工具来完成人类指定的任务。如下图所示,图片出自The Rise and Potential of Large Language Model Based Agents: A Survey。
关于Agent有很多有名的项目,除了单Agent之外,Multi-agent也是目前一个比较流行的研究方向(simulated agent society)。
1.2 ReAct
ReAct是一种prompt策略,它将CoT(思维链策略)和action(操作工具)结合,使LLM能够实时规划和调整操作工具的策略,从而完成较复杂的任务。下图出自ReAct project。
1.3 如何手搓Agent
之前简单玩过Langchain和CrewAI的agent,都是ReAct策略的agent,简单理解agent是prompt-based的role+tool use,其中tool use借助ReAct实现
所以,手搓Agent需要完成
- 定义Agent的prompt构建:
- 角色
- 任务
- ReAct策略
- tool:
- input处理:把agent的动作处理为API的输入
- 调用API
2 TinyAgent
2.1 项目结构
项目由三大部分构成
- Agent:集成了prompt模板,其中agent的动作的截取也在此实现
- Tool:实现了tool的封装
- LLM:实现LLM的调用
2.2 代码阅读
2.2.1 Agent
代码详见tinyAgent/Agent.py,下为笔记
有两大部分组成
- prompt:分为两块,一块是tool描述的模板,一块是ReAct的模板
- tool描述:由三个部分组成,tool唯一名
name_for_model
,tool描述(name_for_human
工具人类名,description_for_model
工具功能),调用tool所需要生成的格式及参数(JSON
格式,指定parameters
)。
其中tool唯一名 和 调用tool所需要生成的格式及参数 是decode LLM的回复时需要的,tool描述是方便LLM理解这个工具是干什么的(这个在多工具时很重要)
{name_for_model}: Call this tool to interact with the {name_for_human} API. What is the {name_for_human} API useful for? {description_for_model} Parameters: {parameters} Format the arguments as a JSON object.
- ReAct策略:规定了由Question,Thought,Action,Action Input, Observation构成,并且从思考动作到观测这个步骤可以重复多次。这个是ReAct的核心。
- tool描述:由三个部分组成,tool唯一名
- Agent:
- LLM调用:
build_system_input
构建调用LLM所需的prompt,text_completion
调用LLM生成回复。只执行了两次调用 - 工具调用:
parse_latest_plugin_call
解析/解码LLM回复中关于调用工具的部分,确定调用的tool唯一名 和 调用tool的参数;call_plugin
调用工具得到结果。
疑问:parse_latest_plugin_call
没有用正则,而使用的字符串遍历,是出于什么考虑呢?
- LLM调用:
class