一 背景
LLM Agent是最近比较火的一个概念,其实本质上是一种利用大型语言模型(LLM)作为核心计算引擎的人工智能系统。它不仅需要有文本生成的功能,还需要一定程度的自主行为。自己进行决策,去提高回复的准确性,甚至去完成一个复杂任务。常见设计框架如下,其中大模型LLM扮演了Agent的大脑,提供了推理,规划的能力。Agent中比较著名的的Agent方案是ReAct,接下来我们学习下ReAct。
二 ReAct
1. 技术介绍
"ReAct"一词源于 ReAct: Synergizing Reasoning and Acting in Language Models (react-lm.github.io) , 它由单词“Reason”和“Act”组合而成。ReAct框架是一种协同推理和行动的思维框架,旨在指导大语言模型(LLMs)在任务中生成推理轨迹和操作。该框架结合了推理和行动,使得模型能够系统地执行动态推理来创建、维护和调整操作计划,并支持与外部环境的交互,从而提高了模型的可解释性和可信度。通过代理的作用,模型能够自主判断、调用工具,并决定下一步行动,从而赋予了模型极大的自主性。整体流程如下图所示:
2. demo验证
根据ReAct的思想, Langchain框架提供了一系列"ReAct Agent",其中最简单的就是“Zero-shot ReAct Agent”(零样本代理),我们使用LangChain,绑定通义千问的llm模型,实现代码如下:
llm = Tongyi() @tool def time(text: str) -> str: """Returns todays date, use this for any \ questions related to knowing todays date. \ The input should always be an empty string, \ and this function will always return todays \ date - any date mathmatics should occur \ outside this function.""" return str(date.today()) # 定义工具 tools = load_tools(["llm-math"], llm=llm) + [time] # 创建代理 agent = initialize_agent( tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, handle_parsing_errors=True, verbose=True) print(agent.agent.llm_chain.prompt.template) agent("100除以200是多少?") agent("今天日期是多少") agent("杭州天气怎么样")
demo如上图所示,首先我们创建了一个LLM对象, 接着我们创建了一个工具集tools,该工具集包含了"llm-math"和自定义的tool,最后我们创建了一个代理(agent), 在创建代理时我们将llm 和tools作为参数传递给了代理,同时还设置了代理的类型为AgentType.ZERO_SHOT_REACT_DESCRIPTION,
打印agent的内置prompt模板如下:
在该模板中LLM被告知要使用计算器工具和自定义time工具,并说明了这两个工具的使用场景,然后对完成任务的工作流程进行了介绍。完成了创建代理的工作以后,我们就可以让代理来回答一些数学或者时间问题:
比如测试问题如下
agent("100除以200是多少?")
执行过程如下:
如果换一个不支持的方法,效果如下
agent("杭州天气怎么样")
三 总结
常见的agent架构如上图所示,在LLM赋能的自主agent系统中,LLM充当agent大脑的角色,并与若干关键组件协作:
- 规划(planning)
- 子目标分解:agent将大任务拆分为更小的可管理的子目标,使得可以有效处理复杂任务。
- 反思与完善:agent对历史动作可以自我批评和自我反思,从错误中学习并在后续步骤里完善,从而改善最终结果的质量。
- 记忆(Memory)
- 短期记忆:上下文学习即是利用模型的短期记忆学习
- 长期记忆:为agent提供保留和召回长期信息的能力,通常利用外部向量存储和检索实现
- 工具使用(tool use)
- 对模型权重丢失的信息,agent学习调用外部API获取额外信息,包括当前信息、代码执行能力、专有信息源的访问等等。