发展脉络
Prompt 工程
通过描述角色技能、任务关键词、任务目标及任务背景,告知大模型需要输出的格式,并调用大模型进行输出。如角色扮演(如摘要助手、翻译官等)、少样本提示和零样本提示。
你现在是一个智能的文本摘要助手,在充分理解文本的情况下,根据文本关键信息对文本进行摘要。你需要遵循以下步骤:首先,整体理解文本的内容并分析出重要内容;其次,根据文本生成摘要,内容需准确、语法结构需连贯顺畅、语言表达需简洁明了;最后,将摘要结果输出,只输出摘要的结果。
你是一名翻译官,将以下语句从中文翻译成英文。你需要遵循以下步骤:首先,整体理解句子的涵义,注意可能包含特殊标记符,翻译时原封不动保留。
你现在是一个排版助手,使用Markdown格式对文本进行排版。你需要遵循以下步骤:首先,理解整体文本的意思;其次,保持文本的内容排版后完全不变。
Prompt 外挂
仅凭 Prompt 工程无法满足大模型需要,比如大模型本身的诸多缺陷,如不能及时更新知识,上下文有限等。所以引入插件方式,比如引入向量数据库,通过额外数据的补充,再提交给大模型做 Prompt 工程。
后续又引入了外挂模式,让大模型调用函数和使用工具。比如:当人们发现大模型的推理能力很差时,调用通用规划器来解决问题规划。
LLM-As-Planner:直接使用LLM,输出结论。
LLM-As-Planner(In-context Learning):上下文学习,提供了一对用自然语言和PDDL描述的问题,作为LLM的上下文。
LLM+P(In-context Learning):
- 大模型输出合适的问题描述(Problem PDDL)作为通用规划器的输入。
- 使用通用规划器解决问题。
- 将规划器的输出转化为自然语言。
思维链
大模型能否像人类一样,一步一步得思考问题?毕竟,人类在解决问题时,也是逐渐构建解决方案,而并非立即给出答案。因此,开始出现了一系列的尝试解法,比如思维链、多思维链、思维树等。
- CoT(Chain of thought)
通过 Prompt 要求 LLM 有将困难任务逐步分解成更小更简单的步骤,赋予了LLM 规划能力;相比直接输出方法,可以显著提升语言模型在数学难题和通用推理任务上的性能。
问题1:罗杰有5个网球,又买了两盒,每盒有3个网球,他现在一共有多少网球?回答:11
问题2:食堂有23个苹果,吃掉20个又买了6个,一共还有多少个?回答:27
实现方式:
少样本输入:一种是示例说明,即通过给定问题和答案的同时,提供思考过程。这样,当询问模型时,模型会模仿此过程,逐渐思考并给出答案。
零样本输入:一种是具体说明,即要求模型详细地、一步步地思考。
- CoT-SC
CoT的集成方案,考虑到CoT有时可能出现错误,所以通过多次采样的方式获得多个CoT的结果,最终返回预测最多次的答案。
问题:每天有16个蛋,每天自己吃3个,朋友用4个,一个蛋买2块,每天可以赚多少钱?CoT回答:14
- ToT****(Tree of Thoughts)
在CoT-SC方案中也有局限性,例如24点问题就不能很好解决。使用ToT方案如下:将问题进行垂直分解,分成三步来做,每一步分解成多个子问题,类似于动态规划的做法,就好像把一个大任务拆解成了三个小的子任务,然后再一步一步地去实现它。
输入:4 9 10 13
输出:使用这四位数进行加减乘除,能否得到24点。
步骤:建立 thought 树,需要一个 thought 生成器和 thought 评估器。
总结:每个步骤都分解为多步,因而得到树形的任务链。通过BFS(广度优先搜索)或 DFS(深度优先搜索)来执行,在节点通过prompt分类器或者投票进行评估决策。
反馈
思维链的功能主要在于任务拆分和组合,缺点在于不能与外界进行互动,所以需要反馈机制。
- ReAct:Synergizing Reasoning and Acting in Language Models
思路:将大任务分解为多个actions组合(与外部工具进行交互,如联网搜索)+思维链。
- Action(动作):就是要采取的外部工具。
- Thought(思考):就是LLM对用户question的思考,文字描述,遇到了什么问题,应该执行什么。
- Observation(观察):Action执行的结果。
比如,询问一个关于科罗拉多造山带的相关问题,它就会去通过搜索工具进行搜索,如果搜索结果没有提到东部地区,它会继续搜索东部地区的数据,然后继续一步一步地思考,根据结果反复思考,直到完成这一项任务。
- Reflexion: Language Agents with Verbal Reinforcement Learning
在ReAct的基础上,希望大模型在完成一次任务后,能够积累经验,所以产生了借鉴强化学习思路的反射机制,能够让大模型记住每次任务的完成情况,无论效果好坏,以供未来参考。
背景:论文提出了一种强化学习方法。传统的调优主要是通过训练调整网络参数,而文中提出的方法则是“分析”错误,形成反思的“文字”并保存,在之后的决策中,将其作为上下文以帮助决策。Reflexion 将环境中的反馈转化为文本摘要,然后将其作为附加上下文添加到下一轮的 LLM 代理中,从以前的错误中学习,以在未来任务中表现更好。
Reflexion 框架流程:
- Actor:首先,LLM基于Query生成文本和动作,这步探索了各种 Actor 模型,包括 COT 和 ReAct,从而丰富了探索空间。
- 评估:用于评估 Actor 输出的质量。将生成的轨迹作为输入,计算在给定任务上下文中的奖励分数。
- Heuristic:计算一个启发函数h,决定是否重启env,开启新实验(当前决策路径无效、冗余等)。
- Self-reflection:自我反思,使用 LLM 实现,用于生成基于语言的反思。将生成轨迹和评估分数生成摘要,作为上下文添加到下一轮。
Agent
Agent = 大语言模型/多模态模型 + 记忆 + 规划 + 工具使用
理论基础
为什么引入Agent? 直接使用LLM有什么限制?
- LLM 知识有限且更新不及时,可以使用Agent获取更新的信息;
- LLM 上下文有限,Agent是LLM context未达到无限之前的有效外置途径;
- LLM 无法同时担任多个角色,在需要协作的任务中无法发挥更好的能力;
大语言模型中发挥认知协同作用:通过多人格自我协作成为任务解决代理 概述:人类智能依赖于认知协同的概念,在不同认知过程之间进行合作和信息整合,相比单独的认知过程,能够产生更优越的结果。尽管大型语言模型(LLMs)在作为通用任务解决代理方面表现出有希望的性能,但它们仍然在需要大量领域知识和复杂推理的任务中遇到困难。在这项工作中,我们提出了“Solo Performance Prompting”(SPP)的概念,它通过与多个人物进行多轮自我协作,将单个LLM转变为认知协同者。认知协同者指的是一种智能代理,它与多个思维合作,结合他们的个体优势和知识,以增强复杂任务中的问题解决和整体性能。通过根据任务输入动态地识别和模拟不同的人物,SPP释放了LLMs中认知协同的潜力。我们发现,在LLMs中分配多个细粒度的人物角色,相比于使用单个或固定数量的人物角色,能够激发更好的问题解决能力。我们在三个具有挑战性的任务上评估了SPP:创意性问答、Codenames协作和逻辑格子谜题,涵盖了知识密集型和推理密集型两种类型。与之前仅增强LLMs推理能力的作品(如Chain-of-Thought)不同,SPP有效地激发了内部知识获取能力,减少了幻觉,并保持了强大的推理能力。
系统组成
一个基于LLM的自主Agent系统的几个关键组成部分:
-
Planning(规划)
- 任务分解:(思维链)代理可以将大型任务分解为更小、更易管理的子目标,从而有效地处理复杂任务。
- 反馈:(反馈机制)代理可以对过去的行为进行自我批评和自我反思,从错误中学习并改进未来的步骤,从而提高最终结果的质量。
-
Memory(记忆)
-
Tool use(工具使用)
- 通过输出指令,来调用额外的API,弥补 LLM确实的信息和能力。当前信息、代码执行能力、对专有信息源的访问等。
Agent案例
1. 演示平台
智谱清言:https://chatglm.cn/main/gdetail/65d2f07bb2c10188f885bd89 (PPT助手)
百度飞浆:https://aistudio.baidu.com/application/center
字节Coze:https://www.coze.com/store/bot
Dify:https://dify.ai/
2. 文案创作助手
使用百度平台:https://ernie-bot-agent.readthedocs.io/zh-cn/latest/
任务:
核心的使用案例代码,包含记忆、大模型和工具的使用
# 记忆
memory = SlidingWindowMemory(max_round=10) # 滑动窗口,最近10轮
# 大模型调用
llm_final = ERNIEBot(model="ernie-4.0", api_type="aistudio", enable_multi_step_tool_call=True)
image_path = '1.jpg'
# 工具使用:获取图片信息工具、文案创作工具
response = await FunctionAgent(llm=llm_final, tools=[GetInformation(llm, image_path),
plan_tool], memory=memory, max_steps=10).run("为1.jpg生成朋友圈文案")
工具代码如下:
class GetPlanInputView(ToolParameterView):
recommendation: str = Field(description="图像信息筛选结果")
class GetPlanOutputView(ToolParameterView):
response: str = Field(description="营销文案生成")
class CatchInformation(Tool):
description: str = "CatchInformation是一款专业且贴心的营销文案生成的工具"
input_type: Type[ToolParameterView] = GetPlanInputView
ouptut_type: Type[ToolParameterView] = GetPlanOutputView
def __init__(self, llm: ERNIEBot):
self.llm = llm
async def __call__(self, recommendation: str) -> Dict[str, str]:
prompt = f"请根据图像信息筛选结果:\n{recommendation}\n输出符合图像信息的营销文案,请一步一步思考后输出结果。"
response = await self.llm.chat([HumanMessage(prompt)])
return {"response": response.content}
SYSTEM_MESSAGE = "你是一个营销文案写作助手,你的任务是根据图像信息筛选结果输出符合图像信息的营销文案。请注意,你只需要输出符合图像信息的营销文案,不要输出多余的解释。"
llm = ERNIEBot(model="ernie-4.0", system=SYSTEM_MESSAGE)
# 将这个工具实例化,等待调用
plan_tool = CatchInformation(llm)
3. Appagent(操作APP)
代码:https://github.com/mnotgod96/AppAgent?tab=readme-ov-file
介绍:通过自主学习和模仿人类的点击和滑动手势,在手机上执行各种任务。如下方发邮件、设置闹钟等。
LLM:使用 gpt-4-vision-preview 或者 qwen-vl-max 多模态大模型。
Action:使用 adb 命令进行截图、当前界面的xml文件;点击、长按、滑动、输入文字等。
Memory:主要是在训练阶段,将训练过程中的任务和执行过程用txt记录下来。
用户输入:打开短信,发送XXX内容给Lihua。
整体流程:
- 图片理解:通过adb获取当前页面截图和xml布局文件,输入给LLM获取截图操作位置的编号。
- 操作指令:通过LLM理解用户输入,并通过 observation--Thought--Action--summary 完成一轮操作。
- 重复上述两步,直到完成用户目标。
4. (Multi Agent)Generative Agents Simulation:生成式Agent
Generative Agents 是一个超级有趣的实验,其中 25 个虚拟角色,每个角色都由 LLM 支持的代理控制,在沙盒环境中生活和交互,其灵感来自《模拟人生》。生成代理为交互式应用程序创建可信的人类行为模拟,可以根据自己的经历、兴趣和目标来规划自己的行为,例如起床、做早餐、去工作、画画、写作、交流、回忆和反思等。
- 为每个AI创建人设
为每个虚拟人物编写人物介绍和社会关系。如药店店员、喜欢帮助别人,家人、邻居和朋友关系等。
- 创建可互动的小镇
智能体将会在这个被称为 SmallVille的小镇里生活。研究人员为小镇配置了很多可以互动的组件,有居民区,Cafe,酒吧,大学,商店,公园。智能体与场景是可以互动的:例如在图书馆看书,在酒吧喝酒。智能体之间也可以互动:例如在Cafe吃饭的时候聊天,在公园相遇的时候一起运动。
- 为每个AI创建记忆流管理系统
记忆(在图中用双层框标注):
- 长期记忆 Memory Stream:把感知到的大量信息存入记忆流
- 瞬时记忆 Retrieved Memories:检索出相关的少量记忆用于做出当前想到的事情,让大语言模型决定接下来要做出的行动
操作(圆角矩形):每一个操作
- 感知 Perceive:智能体获取当前的状态,例如:when, where, who, what
- 检索 Retrieve:根据当下感知到的内容,开始回想相关的记忆
- 行动 Action:根据当前想到的事情,让大语言模型决定接下来的行动
- 环路1:反思 Reflect:对检索出的记忆进行高层次的提炼,处理后再加回 记忆流
- 环路2:计划 Planning:在固定的时刻内制定未来的计划,可以随时修改
参考文献
- https://lilianweng.github.io/posts/2023-06-23-agent/
- https://blog.csdn.net/weixin_43564920/article/details/136004972
- lilianweng.github.io
- https://arxiv.org/abs/2304.11477
- https://arxiv.org/abs/2210.03629
- https://arxiv.org/abs/2304.03442
- https://zhuanlan.zhihu.com/p/647836219
- https://zhuanlan.zhihu.com/p/648376562
- Agent理论介绍