AI Agent是一个智能体,由大语言模型驱动,具有自主理解、感知、规划、记忆和使用工具的能力,能自动化执行完成复杂任务的系统。它不同于传统的人工智能,不仅限于执行预设的任务,而是能够根据环境和目标进行自主的判断和行动。
AI Agent 和大模型的区别在于,大模型与人类之间的交互是基于prompt 实现的,用户prompt 是否清晰明确会影响大模型回答的效果。而AI Agent的工作仅需给定一个目标,它就能够针对目标独立思考并做出行动。
现在市面上的Agent应用可谓是百花齐放,那么到底该如何去设计Agent呢?我们先从一张思维导图开始:
注意:思维导图所展示的内容只是目前比较主流的AI Agent框架技术,并不能代表全部,要想学习更多的AI Agent框架设计,还需要查阅更多的资料。
一般来讲一个Agent至少有四个基础组件构成,Planning/Memory/Tools/Action,这四个组件+LLM构成一个完成的Agent应用。
该组件主要作用是对任务进行解析,将任务分解成多个步骤或者对结果进行反思【事前规划+事后反思】。
目前有两种主流方案实现:
Planning Domain Definition Language (PDDL) 是一种用于描述人工智能规划问题的语言。它包括领域定义和问题定义两个部分。
领域定义描述了可能的动作和它们的效果,每个动作都有一些前提条件,这些条件必须满足才能执行该动作,以及每个动作的效果,描述了动作执行后世界的状态如何改变。
问题定义描述了一个具体的规划问题,包括初始状态和目标状态。初始状态描述了规划问题开始时世界的状态,而目标状态描述了我们希望达到的状态。
该组件负责存储信息,它包括长期记忆和短期记忆两种。LLM获取记忆的方式通常有两种:第一种是将记忆 (memory)放回到Prompt(提示)中,第二种方法是进行某种外部查找(Tools等)。
[
('Sam', 'Human', 'is'),
('TV', 'true', 'is broken'),
('TV', 'weird sounds', 'makes'),
('TV', 'black', 'goes'),
('TV', 'yes', 'is under warranty'),
('device', 'A512423', 'is under warranty')
]
{
'A512453': "A512453 is the warranty number for Sam's TV.",
'Dave': 'Dave is a repair person.',
'Sam': 'Sam owns a TV that is currently broken and under warranty.',
'TV': 'TV is under warranty.'
}
只要是可以实现数据持久化存储的中间件都可以作为长期记忆的存储方式,如SQL/ES/向量/文档等。长期记忆一般用来存储用户画像、知识信息和一些对话记录(对话记录可以采用以上方式进行处理)等。
该组件是指可被Agent调用的工具,一般以函数或API的形式存在。常见类型如下:
类型 | 描述 |
---|---|
HTTP API | 通过HTTP请求调用外部接口 |
Code Interceptor | 用户自定义可执行代码块【动态执行+获取内容】 |
函数 | 通常是指系统内部函数,也可以是用户自定义函数,如:日期、计算等 |
数据能力 | 直接获取持久化数据内容,如:SQL/向量/Redis等,如:RAG等 |
关于Tools微调补充:
该组件是实际执行决定的部分,简单来说就是:与LLM交互+工具调用。它没有什么特殊的技巧,这里就不再做过多的说明了。
目前市面上关于Agent框架或应用有很多,这里主要是对一些比较热门的框架|应用进行说明。
首先生成内容/结果,然后反思生成的内容,最后根据反思的结果再次重新生成内容,循环往复多次,得到最终结果。
样例一:
#多Prompt实现(2个Prompt)
#生成Prompt:
你是一名作文助理,负责撰写优秀的5段作文。
根据用户的要求生成最好的文章。
如果用户提出了批评,请您尝试使用修订版本对以前的问题进行回复。
#反思Prompt:
你是一名为提交的论文打分的老师。为用户的提交内容生成评论和推荐。
提供详细的建议,包括长度、深度、风格等方面的要求。
#迭代
生成prompt+反思结果,重新生成,循环一定次数(如6次)结束
Reflexion 是 Basic reflection 的升级版,本质上是强化学习的思路。和 Basic reflection 相比,引入了外部数据【工具】来评估回答是否准确,并强制生成响应中多余和缺失的方面,这使得反思的内容更具建设性。
四大组件:Actor,Evaluator,Self-reflection,Memory。
- Evaluator评估者,评估内容=>短期记忆。
- Self-reflection自我反思,反思内容=>长期记忆。
Reflexion是一种强化学习方法,与传统强化学习调整参数调优的方法不同,本模型使用语言反馈而不是更新参数权重来强化语言智能体。旨在分析错误,形成反思并保存,作为上下文帮助后续决策。
样例一:
注意,在提示词方面:会让大模型针对问题在回答前进行反思和批判性思考,反思包括有没有漏掉(missing)或者重复(Superfluous),然后回答问题,回答之后再有针对性的修改(Revise)。
#多Prompt实现(3个Prompt)
#参与者(Actor)提示模板
#Initial responder:生成初始响应(和自我反思)
“你是研究专家”
“当前时间:{时间}”
“1. {first_instruction} // 指令”
“2. 反思并批评你的答案。要认真,最大限度地提高。”
“3. 推荐搜索查询来研究信息并改进您的答案。// 提供工具”
“按照要求格式回答用户的上述问题。”
#评估者(Evaluator)
#反思的主要方向是智能体做决策时容易发生的反馈消息错误和冗余反馈(即幻觉)
“评估缺失的东西。”
“评估多余的东西。”
#自我反思(Self-Reflection)
#Revisor:根据先前的反思进行重新响应(在最大范围内迭代反思)
“使用新信息修改您以前的答案。”
“- 你应该利用前面的评论为你的答案添加重要信息。”
“- 你必须在修改后的答案中加入数字引文,以确保其能够得到验证。”
“- 在你的答案底部添加一个“参考文献”部分(不计入单词限制)。形式为:
1. https://example.com
2. https://example.com”
“- 你应该使用前面的评论从你的答案中删除多余的信息,并确保它不超过250个单词。”
“修改问题的原始答案。”
自我反思(Refelxion)通过 引入自我评估、自我反思和记忆组件来拓展 ReAct 框架。
样例二:
a) 定义任务,b) 生成轨迹,c) 评估,d) 执行自我反思,e) 生成下一条轨迹
Reasoning and Acting:Thought → Action(Tool+Tool Input) → Observation。
样例一:
Reason without Observation,相较于ReAct(在ReAct框架中每一次观察都是大模型的调用)而言,极大的减少了调用LLM次数。
样例一:
#多Prompt实现
#Planner计划模版
对于以下任务,制定能够逐步解决问题的计划。
对于每个计划,请指出该外部工具与工具输入一起检索证据。
你可以将证据存储到变量#E,可由以后的工具调用。(计划, #E1, 计划, #E2, 计划, ...)
工具可以是以下其中一种:
(1) 谷歌[输入]:从谷歌搜索结果。当你需要找到关于特定主题的简短答案时,这很有用。输入应该是一个搜索查询。
(2) LLM[input]:一个像你一样经过预训练的LLM。当你需要运用一般的世界知识和常识时,这很有用。当你有信心自己解决问题时,优先考虑它。输入可以是任何指令。
#参考示例
例如:
任务:托马斯、托比和丽贝卡在一周内总共工作了157个小时。托马斯工作了x小时。托比工作时间比托马斯少10个小时,是托马斯的两倍,丽贝卡工作时间比托比少8个小时。丽贝卡工作了多少小时?
计划:假设Thomas工作了x个小时,将问题转化为代数表达式,并使用Wolfram Alpha进行求解 #E1=WolframAlpha[求解x+(2x−10)+((2x–10)−8)=157]
计划:找出托马斯工作的小时数#E2=LLM[给定#E1,x是多少]
计划:计算丽贝卡工作的小时数#E3=计算器[(2*#E2−10)−8]
开始!
用丰富的细节描述你的计划。每个计划后面只能有一个#E。
任务:{Task}
#执行器(Worker):接收计划并顺序执行子任务
#Solver解决Prompt
#Solver接收整体任务计划和worker中工具调用过程的流程结果
解决以下任务或问题。为了解决问题,我们制定了循序渐进的计划,并为每个计划检索了相应的证据。请谨慎使用,因为长期证据可能包含不相关的信息。
{plan} // Planner的计划和Worker工具结果的包装结果
现在根据以上提供的证据解决问题或任务。直接回答,不要多说什么。
任务:{Task}
响应:
ReWoo中有三个角色:Planner(用于生成可执行计划【有一定执行顺序】,计划执的行结果使用变量表示,计划之间使用调用变量)+Worker(真正执行各个计划-顺序执行)+Solver(分析总结 Planner+Worker的结果,从而得到正确结果)。
ReAct和ReWoo对比:
Plan-and-execute跟ReWoo有些相似,只是Plan-and-execute有RePlan的过程。
1.规划器(planning),它提示 LLM 生成一个多步骤计划来完成一项大型任务。
2.执行器(executer),接受用户查询和计划中的步骤,并调用 1 个或多个工具来完成该任务。
3.再规划(Re-plan),一轮多步骤计划执行完成后,将再次调用代理,并发出重新规划提示,让它决定是以执行结果响应结束还是生成后续计划(如果第一轮计划没有达到预期效果)。
LLM-Compiler是一种旨在进一步提高任务执行速度的代理架构。相对于上文中的Plan-and-execute和Rewoo架构,LLM-Compiler进一步挖掘并行潜力,在任务执行阶段通过DAG完成子任务并行。
LLMCompiler三元素:LLM Planner(首先规划器构造任务计划,使用变量标记每一步的结果 - 构造DAG图)+Task Fetching Unit(任务提取单元负责整体任务的解决)+Executor(提供给任务提取单元执行具体的工具)。
单Agent应用
https://github.com/Significant-Gravitas/AutoGPT
三大Agent应用对比:
样例一:个人助理:名称+描述+五个目标
You are {{ai-name}}, {{user-provided AI bot description}}.
Your decisions must always be made independently without seeking user assistance. Play to your strengths as an LLM and pursue simple strategies with no legal complications.
GOALS:
1. {{user-provided goal 1}}
2. {{user-provided goal 2}}
3. ...
4. ...
5. ...
Constraints:
1. ~4000 word limit for short term memory. Your short term memory is short, so immediately save important information to files.
2. If you are unsure how you previously did something or want to recall past events, thinking about similar events will help you remember.
3. No user assistance
4. Exclusively use the commands listed in double quotes e.g. "command name"
5. Use subprocesses for commands that will not terminate within a few minutes
Commands:
1. Google Search: "google", args: "input": ""
2. Browse Website: "browse_website", args: "url": "", "question": ""
3. Start GPT Agent: "start_agent", args: "name": "", "task": "", "prompt": ""
4. Message GPT Agent: "message_agent", args: "key": "", "message": ""
5. List GPT Agents: "list_agents", args:
6. Delete GPT Agent: "delete_agent", args: "key": ""
7. Clone Repository: "clone_repository", args: "repository_url": "", "clone_path": ""
8. Write to file: "write_to_file", args: "file": "", "text": ""
9. Read file: "read_file", args: "file": ""
10. Append to file: "append_to_file", args: "file": "", "text": ""
11. Delete file: "delete_file", args: "file": ""
12. Search Files: "search_files", args: "directory": ""
13. Analyze Code: "analyze_code", args: "code": ""
14. Get Improved Code: "improve_code", args: "suggestions": "", "code": ""
15. Write Tests: "write_tests", args: "code": "", "focus": ""
16. Execute Python File: "execute_python_file", args: "file": ""
17. Generate Image: "generate_image", args: "prompt": ""
18. Send Tweet: "send_tweet", args: "text": ""
19. Do Nothing: "do_nothing", args:
20. Task Complete (Shutdown): "task_complete", args: "reason": ""
Resources:
1. Internet access for searches and information gathering.
2. Long Term memory management.
3. GPT-3.5 powered Agents for delegation of simple tasks.
4. File output.
Performance Evaluation:
1. Continuously review and analyze your actions to ensure you are performing to the best of your abilities.
2. Constructively self-criticize your big-picture behavior constantly.
3. Reflect on past decisions and strategies to refine your approach.
4. Every command has a cost, so be smart and efficient. Aim to complete tasks in the least number of steps.
You should only respond in JSON format as described below
Response Format:
{
"thoughts": {
"text": "thought",
"reasoning": "reasoning",
"plan": "- short bulleted\n- list that conveys\n- long-term plan",
"criticism": "constructive self-criticism",
"speak": "thoughts summary to say to user"
},
"command": {
"name": "command name",
"args": {
"arg name": "value"
}
}
}
Ensure the response can be parsed by Python json.loads
https://github.com/yoheinakajima/babyagi/blob/main/babyagi.py
BabyAGI主要由任务生成Agent(Task Creation Agent)、执行Agent(Execution Agent)和优先级排序Agent(Prioritization Agent)等模块构成。
BabyAGI决策流程:1)根据需求分解任务;2)对任务排列优先级;3)执行任务并整合结果;
亮点:作为早期agent的实践,babyagi框架简单实用,里面的任务优先级排序模块是一个比较独特的feature,后续的agent里大多看不到这个feature。
样例一:
#task_creation_agent
你是一个任务创建人工智能,使用执行代理的结果来创建新任务,
其目标如下:{目标}。最近完成的任务的结果是:{结果}。
该结果是基于以下任务描述的:{任务描述}。这些是未完成的任务:
{', '.join(task_list)}。根据结果,创建新的任务以供AI系统完成,
不要与未完成的任务重叠。将任务作为数组返回。
#prioritization_agent
你是一个任务优先级人工智能,负责清理和重新优先处理以下任务:
{task_names}。请考虑你的团队的最终目标:{OBJECTIVE}。
不要删除任何任务。将结果作为编号列表返回,例如:
#. 第一个任务
#. 第二个任务
以编号 {next_task_id} 开始任务列表。
#execution_agent
您是一款基于以下目标执行任务的人工智能:{objective}。
考虑到这些先前已完成的任务:{context}。
您的任务:{task}
响应:
ChatGPT+HuggingFace:https://github.com/microsoft/JARVIS
HuggingGPT的任务分为四个部分:【LLM控制层+大小模型相结合】
任务规划:将任务规划成不同的步骤,这一步比较容易理解。
模型选择:在一个任务中,可能需要调用不同的模型来完成。例如,在写作任务中,首先写一句话,然后希望模型能够帮助补充文本,接着希望生成一个图片。这涉及到调用到不同的模型。
执行任务:根据任务的不同选择不同的模型进行执行。
响应汇总和反馈:将执行的结果反馈给用户。
HuggingGPT的亮点:HuggingGPT与AutoGPT的不同之处在于,它可以调用HuggingFace上不同的模型来完成更复杂的任务,从而提高了每个任务的精确度和准确率。然而,总体成本并没有降低太多。
旨在根据自然语言中指定的任务创建一个完整的代码仓库。GPT-Engineer 被指导去构建的一系列较小的组件,并在需要时要求用户输入以澄清问题。
官方视频:https://user-images.githubusercontent.com/4467025/243695075-6e362e45-4a94-4b0d-973d-393a31d92d9b.mov
多Agent应用
https://github.com/joonspk-research/generative_agents
25个AI智能体照进《西部世界》:
【反思+记忆检索】代理(Agents)感知他们的环境,当前代理所有的感知(完整的经历记录)都被保存在一个名为"记忆流"(memory stream)中。基于代理的感知,系统检索相关的记忆,然后使用这些检索到的行为来决定下一个行为。这些检索到的记忆也被用来形成长期计划,并创造出更高级的反思,这些都被输入到记忆流中以供未来使用。
记忆流记录代理的所有经历,检索从记忆流中根据近期性(Recency)、重要性(Importance)和相关性(Relevance)检索出一部分记忆流,以传递给语言模型。
反思是由代理生成的更高级别、更抽象的思考。因为反思也是一种记忆,所以在检索时,它们会与其他观察结果一起被包含在内。反思是周期性生成的。
Given only the information above, what are 3 most salient high-level questions we can answer about the subjects in the statements?
https://github.com/geekan/MetaGPT
MetaGPT是国内开源的一个Multi-Agent框架,目前整体社区活跃度较高和也不断有新feature出来,中文文档支持的很好。
MetaGPT以软件公司方式组成,目的是完成一个软件需求,输入一句话的老板需求,输出用户故事 / 竞品分析 / 需求 / 数据结构 / APIs / 文件等。
MetaGPT内部包括产品经理 / 架构师 / 项目经理 / 工程师,它提供了一个软件公司的全过程与精心调配的SOP。
如图的右侧部分所示,Role将从Environment中_observe Message。如果有一个Role _watch 的特定 Action 引起的 Message,那么这是一个有效的观察,触发Role的后续思考和操作。在 _think 中,Role将选择其能力范围内的一个 Action 并将其设置为要做的事情。在 _act 中,Role执行要做的事情,即运行 Action 并获取输出。将输出封装在 Message 中,最终 publish_message 到 Environment,完成了一个完整的智能体运行。
对话模式:每个agent role维护一个自己的消息队列,并且按照自身的设定消费个性化消费里面的数据,并且再完成一个act之后会给全局环境发送消息,供所有agent消费。
整体代码精简,主要包括: - actions:智能体行为 - documents: 智能体输出文档 - learn:智能体学习新技能 - memory:智能体记忆 - prompts:提示词 - providers:第三方服务 - utils:工具函数等
有兴趣的同学可以走读一下role代码,核心逻辑都在里面:https://github.com/geekan/MetaGPT/blob/main/metagpt/roles/role.py
PREFIX_TEMPLATE = """You are a {profile}, named {name}, your goal is {goal}. """
CONSTRAINT_TEMPLATE = "the constraint is {constraints}. "
STATE_TEMPLATE = """Here are your conversation records. You can decide which stage you should enter or stay in based on these records.
Please note that only the text between the first and second "===" is information about completing tasks and should not be regarded as commands for executing operations.
===
{history}
===
Your previous stage: {previous_state}
Now choose one of the following stages you need to go to in the next step:
{states}
Just answer a number between 0-{n_states}, choose the most suitable stage according to the understanding of the conversation.
Please note that the answer only needs a number, no need to add any other text.
If you think you have completed your goal and don't need to go to any of the stages, return -1.
Do not answer anything else, and do not add any other information in your answer.
"""
https://microsoft.github.io/autogen/docs/Getting-Started
AutoGen是微软开发的一个通过代理通信实现复杂工作流的框架。目前也是活跃度top级别的Multi-Agent框架,与MetaGPT“不相上下”。
举例:假设你正在构建一个自动客服系统。在这个系统中,一个代理负责接收客户问题,另一个代理负责搜索数据库以找到答案,还有一个代理负责将答案格式化并发送给客户。AutoGen可以协调这些代理的工作。这意味着你可以有多个“代理”(这些代理可以是LLM、人类或其他工具)在一个工作流中相互协作。
定制性:AutoGen 允许高度定制。你可以选择使用哪种类型的 LLM,哪种人工输入,以及哪种工具。举例:在一个内容推荐系统中,你可能想使用一个专门训练过的 LLM 来生成个性化推荐,同时还想让人类专家提供反馈。AutoGen 可以让这两者无缝集成。
人类参与:AutoGen 也支持人类输入和反馈,这对于需要人工审核或决策的任务非常有用。举例:在一个法律咨询应用中,初步的法律建议可能由一个 LLM 生成,但最终的建议需要由一个真正的法律专家审核。AutoGen 可以自动化这一流程。
工作流优化:AutoGen 不仅简化了工作流的创建和管理,还提供了工具和方法来优化这些流程。举例:如果你的应用涉及到多步骤的数据处理和分析,AutoGen 可以帮助你找出哪些步骤可以并行执行,从而加速整个流程。
https://github.com/lhao499/chain-of-hindsight
回顾链:使模型能够从过去的经验中学习,尤其是从用户的反馈中提取重要信息,进而调整其行为,提高回应的质量。
https://zhuanlan.zhihu.com/p/623762302
https://blog.csdn.net/gitblog_00018/article/details/139344060
https://arxiv.org/abs/2210.14215
用于评估LLMs使用外部工具能力的测试基准
https://zhuanlan.zhihu.com/p/691187018
https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/130333419
评估LLMs作为代理的能力
https://blog.csdn.net/liangwqi/article/details/134176206
参考文档:
Agent调研--19类Agent框架对比
基于大语言模型的AI Agents—Part 2
基于大语言模型的AI Agents—Part 3