codefuse-chatbot/sources/readme_docs/multi-agent.md

113 lines
7.5 KiB
Markdown
Raw Normal View History

2023-12-27 17:40:54 +08:00
## 📜 目录
- [简介](#简介)
- [模块介绍](#模块介绍)
- [快速使用](#快速使用)
## 简介
为了提高大型模型在推理准确性方面的表现,业界出现了多种创新的大型语言模型(LLM)玩法。从最早的CoT、ToT到GoT这些方法不断拓展了LLM的能力边界。在处理复杂问题时我们可以通过ReAct过程来选择、调用和执行工具反馈同时实现多轮工具使用和多步骤执行。
但对于更复杂的场景例如复杂代码的开发单一功能的LLM Agent显然难以胜任。因此社区开始发展出多Agent的组合玩法比如专注于metaGPT、GPT-Engineer、chatDev等开发领域的项目以及专注于自动化构建Agent和Agent对话的AutoGen项目。
经过对这些框架的深入分析发现大多数的Agent框架整体耦合度较高其易用性和可扩展性较差。在预设场景中实现特定场景但想要进行场景扩展却困难重重。
因此我们希望构建一个可扩展、易于使用的Multi-Agent框架以支持ChatBot在获取知识库信息的同时能够辅助完成日常办公、数据分析、开发运维等各种通用任务。
本项目的Mutli-Agent框架汲取兼容了多个框架的优秀设计比如metaGPT中的消息池message pool、autogen中的代理选择器agent selector等。
<div align=center>
<img src="../docs_imgs/luban.png" alt="图片">
</div>
以下模块将从5个方面介绍Multi Agent框架所需要素
- Agent Communication在Multi Agent框架中确保Agent可以有效地进行信息交流对于管理上下文以及提高问答效率至关重要。
a. 遵循简洁直观易于理解的链式对话原则将Agent以线性方式排列串连成一个执行链路。
b. 借鉴metaGPT中的Message Pool框架允许Agent对Message Pool进行推送和订阅使链路更加灵活。有利于精细化Prompt工程的场景但难以把握复杂链路的关系分析。
- Standard Operation ProcessSOP对LLM的生成结果进行标准化解析和处理。
a. 定义Agent的 Input 和 Output 范围能够组装和解析相关Action和Status保证框架运行的稳定性
b. 封装多种基础Action执行模块如Tool Using、Planning、Coding、Direct Answering、final answer等SOP标识以满足Agent的基本工作需求。
- Plan and Executor增加LLM的Tool使用、Agent调度、代码的生成。设置了几种基本链路例如
a. 单轮问答也可以扩展到CoT、ToT、GoT等形式。
b. ReAct基础的响应决策过程模型设置SOP 状态以终止循环
c. TaskPlaning - Executor任务完成即可结束
- Long-short term memory ManagementMulti-Agent与单Agent的关键区别在于Multi-Agent需要处理大量的交流信息类似人类团队协作的过程。增加一个专门负责内容总结类似于会议助理的Agent对长期记忆进行总结并提更有效信息传递给下一位Agent而非传递所有内容给下一位Agent。
- Human-agent interaction面对复杂场景时需要人类介入Agent交互过程并提供反馈。通过上述 Long-short term memory Management 和 Agent Communication 过程使LLM能准确理解人类的意图从而更有效地完成任务。
总的来说这五个要素共同构建了一个Multi Agent框架确保Agent之间的协作更加紧密和高效同时也能够适应更复杂的任务需求和更多样的交互场景。通过组合多个Agent链路来实现一个完整且复杂的项目上线场景Dev Phase如Demand ChainCEO、Product Arguement ChainCPO、CFO、CTO、Engineer Group ChainSelector、Developer1~N、QA Engineer ChainDeveloper、Tester、Deploy ChainDeveloper、Deploer
## 模块介绍
为了便于大家理解整个Multi-Agent的链路我们采取 Flow 的形式来详细介绍如何通过配置构建
<div align=center>
<img src="../docs_imgs/agent-flow.png" alt="图片">
</div>
<br>下面,我们先介绍相关的模块<br>
### Agent
在Agent设计层面我们提供了四种基本的Agent类型对这些Agent进行Role的基础设定可满足多种通用场景的交互和使用
1. BaseAgent提供基础问答、工具使用、代码执行的功能根据Prompt格式实现 输入 => 输出
2. ExecutorAgent对任务清单进行顺序执行根据 User 或 上一个Agent编排的计划完成相关任务
3. ReactAgent提供标准React的功能根据问题实现当前任务
4. SelectorAgent提供选择Agent的功能根据User 或 上一个 Agent的问题选择合适的Agent来进行回答.
输出后将 message push 到 memory pool 之中后续通过Memory Manager进行管理
### Chain
基础链路BaseChain串联agent的交互完成相关message和memory的管理
### Phase
基础场景BasePhase串联chain的交互完成相关message和memory的管理
### Prompt Manager
Mutli-Agent链路中每一个agent的prompt创建
1. 通过对promtp_input_keys和promtp_output_keys对的简单设定可以沿用预设 Prompt Context 创建逻辑从而实现agent prompt快速配置
2. 也可以对prompt manager模块进行新的 key-context 设计,实现个性化的 Agent Prompt
Memory Manager
主要用于 chat history 的管理,暂未完成
● 将chat history在数据库进行读写管理包括user input、 llm output、doc retrieval、code retrieval、search retrieval
● 对 chat history 进行关键信息总结 summary context作为 prompt context
● 提供检索功能,检索 chat history 或者 summary context 中与问题相关信息,辅助问答
### Role Config
|Config Key Name| Type| Description|
| ------------------ | ---------- | ---------- |
|role_prompt| String |角色描述|
|role_type |String |Enum: assistant|
|role_name |String |角色名称用于后续prompt context的组装和筛选|
|agent_type |String |EnumBaseAgent、SelectorAgent、ExecutorAgent、ReactAgent 也可以继承以上几种Agent然后去构造相关的Agent|
|focus_agents |List[String] |metagpt的逻辑关注哪些agent生成的message可选值范围为role_name
|focus_message_keys |List[String]| 额外增加的逻辑关注message里面具体的 key 信息可选值范围为agent 的 output_keys|
|promtp_input_keys |List[String] |Enum|
|promtp_output_keys |List[String] |Enum|
|chat_turn |int |只针对ReactAgent有效|
### Chain Config
|Config Key Name| Type |Description|
| ------------------ | ---------- | ---------- |
|chain_prompt |String| chain的描述|
|chain_name| String |角色名称用于后续prompt context的组装和筛选|
|chain_type| String| EnumBaseChain 也可以继承以上Chain构造相关的Chain
|agents |List[String] |chain当中存在的agent以及agent的执行顺序|
|chat_turn |int agent之间的交互轮数|
### Phase Config
|Config Key Name |Type |Description|
| ------------------ | ---------- | ---------- |
|phase_name| String| 场景名称|
|phase_type |String |EnumBasePhase 也可以继承以上Phase自定义构造相关的Phase|
|chains |List[String] |phase当中存在的chain以及chain的执行顺序|
|do_doc_retrieval |bool |在场景执行开始判断是否需要补充额外信息|
|do_code_retrieval| bool |在场景执行开始判断是否需要补充额外信息|
|do_tool_retrieval |bool |在场景执行开始判断是否需要补充额外信息|
## 快速使用
Comming soon