零、概述 Overview
我们要让 LLM 一次性根据我们的提示生成一个应用的所有前端代码或一整篇论文,LLM 一次性输出最终 Token,不修改,显然是较为困难并且效果不佳的。但是,如果使用代理设计流(Agent Workflow),让 LLM 按照编排的工作流,多次提示,每个步骤都有优化任务,不断迭代改进输出,类似人拆解复杂任务、收集信息、改进迭代并最终达到满意结果的过程。
以编写文档为例,工作流大致涉及以下步骤:
- 撰写文档大纲;
- 查询本地知识库或网络收集资料;
- 撰写初稿;
- 检查初稿并修正不合理之处;
- 如此迭代到文档符合要求;
代理设计模式主要包括:
- Reflection Pattern:反思模式,LLM 可以通过反思自己的行为成为更有效的代理;
- Tool Use Pattern:工具使用模式;
- Planning Pattern:规划模式;
- Multi-Agent Pattern:多代理模式;
壹、Reflection Pattern
反思模式类似于我们直接与大模型对话,通过不断提示大模型达到我们想要的输出。代理设计模式中,需要将提供反馈的步骤自动化。
比如可以设计 Prompt 如下:
现有以下任务X:略;以下是用于任务X的代码:略;请你仔细检查代码的正确性、风格和效率,并就如何改进它给出建设性的批评和建议;
然后,将之前生成的代码和检查后的反馈一起作为 Context 输入给 LLM,让 LLM 根据反馈建议修改代码;
一个简单的示意图如下:
当然,实际应用中会涉及多次迭代,以获得更高的精度;
应用:SELF-RAG
SELF-RAG
在检索以及生成的过程中引入了自我反思机制,下图直观呈现了它和传统 RAG
的区别:
贰、Tool Use Pattern
代理通过调用 API 来获取预训练模型权重中缺少的额外信息,比如调用 Web 搜索、访问本地知识库、执行代码等等;
叁、Planning Pattern
前面已经提到,复杂的问题往往需要拆解为多个步骤。我们可以事先就搭建好代理工作流,但是在代理规划模式下,Agent 能动态决定需要采取的步骤。
关于任务的分解,主要有以下几种方式:
Chain of Thought(思维链CoT)
通过“逐步思考”实现复杂推理,
可参考内容
[1] Chain-of-Thought Prompting Elicits Reasoning in Large Language Models, Wei et al. (2022);
Tree of Thought
在前者的基础上进行了扩展,对于每个步骤生成了多个思考,建立树状结构,然后执行 BFS 或 DFS,通过分类器或多数投票进行评估;
肆、Multi-Agent Collaboration
Multi-Agent Collaboration,即多代理协作,顾名思义,对于一个复杂的任务,拆分成不同的任务,并交给不同代理去做。虽然现在 LLM 的上下文限制不断提升,但对于一个复杂的任务,比如开发一个较为复杂的软件系统,单个 LLM 并不一定能达到较好的效果。而如果像游戏公司一样,将不同部分交给专业的人去做,比如策划、客户端开发、服务端开发、TA、QA、美术等等,让不同的 Agent 完成不同的子任务,可能能达到更好的效果。
可参考内容
[1] Communicative Agents for Software Development, Qian et al. (2023);