# “你是Agent啊？巧了么不是？我也是！” -- 多代理对话框架AutoGen介绍


前几天我分享了一篇跟Agent研究有关的[文章](https://mp.weixin.qq.com/s/u9crMg2RZobOIIf8UTb9kA)，文章最后说过我还有一篇想要分享的，今天我就给大家带来了，它就是 "AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation"。

我们知道，LLM不仅能够生成文本，还能进行复杂的任务和计算。然而，尽管这些模型具有巨大的潜力，但如何有效地将它们应用于实际问题仍然是一个挑战。这正是这篇论文要解决的问题。

它由多个研究机构的专家共同完成，包括 Microsoft Research 和 Pennsylvania State University。它提出了一个名为 AutoGen 的开源框架，该框架旨在通过多代理对话来构建基于 LLM 的应用。这一创新性的方法不仅提供了一种全新的视角来看待如何利用大型语言模型，而且还展示了一系列令人印象深刻的应用案例。那我们开始看看它到底是个啥吧！
## AutoGen 框架概述
在深入研究 AutoGen 框架之前，我们首先需要了解其背后的核心概念和动机。它是一个专为通过**多代理对话**来构建基于大型语言模型（LLM）的应用而设计的开源框架。这听起来可能有些抽象，但实际上，这一设计解决了当前 LLM 应用开发中的多个关键问题。
![](https://leafw-blog-pic.oss-cn-hangzhou.aliyuncs.com/1698482361607.png)

首先，传统的 LLM 应用通常依赖于单一的、预定义的模型，这限制了其灵活性和可扩展性。与之不同，AutoGen 允许开发者通过**定义多个可对话的代理**来构建更为复杂和灵活的应用。这些代理可以是 LLM、人类输入或其他工具，它们可以在多种模式下工作并相互交互。

其次，AutoGen 引入了“**对话编程**”的概念，这是一种以代理间对话为中心的编程范例。通过这种方式，开发者可以更自然地描述复杂的任务和逻辑流程，而无需编写大量的硬编码规则。这不仅简化了开发过程，还提高了应用的可维护性和可读性。

最后，但同样重要的是，AutoGen 提供了一套**统一的接口和自动回复机制**，使得代理可以轻松地发送和接收消息，以及生成响应。这极大地简化了多代理系统的开发和部署，使得开发者可以更加专注于解决实际问题，而不是处理底层的通信和同步问题。

总体而言，AutoGen 框架通过其独特的多代理对话机制和对话编程范例，为 LLM 应用开发提供了一个全新的、更为灵活和强大的平台。那么我们再继续深入看看它的实现细节吧。
## 实现细节
### 可对话的代理
在 AutoGen 中，可会话式代理是一种具有特定角色的实体，它可以传递信息，与其他可会话式代理之间收发信息，例如开始或继续对话。它根据发送和接收的信息来维护其内部上下文，并可配置为拥有一系列能力，如通过 LLM、工具或人工输入等实现的能力。代理可以按照接下来描述的编程行为模式行事。
![](https://leafw-blog-pic.oss-cn-hangzhou.aliyuncs.com/1698482828919.png)

**由 LLM、人类和工具驱动的代理能力**：在 AutoGen 中，一个“可对话的代理”是一个具有特定角色和功能的实体，它可以发送和接收信息以开始或继续对话。这些代理可以是由**大型语言模型（LLM）、人类输入或其他工具**驱动的。每个代理都可以根据发送和接收的消息维护其内部上下文，这为复杂的对话逻辑和状态管理提供了便利。

**代理定制和合作**：AutoGen 允许开发者通过定义多个可对话的代理来构建更为复杂和灵活的应用。这些代理可以根据应用程序特定的需求进行配置，以显示复杂的多代理对话中的行为。例如，你可以创建一个专门用于处理数学问题的代理，同时还有一个用于进行自然语言查询的代理。这些代理可以相互合作，共同完成更为复杂的任务。
### 对话编程
AutoGen 采用了一种名为“对话编程”的编程范例。该模式考虑了两个概念：第一个概念是计算，即在多代理对话中，代理为计算其响应而采取的行动；第二个概念是控制流，即这些计算发生的顺序（或条件）。

AutoGen 采用以下设计模式，以方便对话编程：
1. **自动代理聊天的统一界面和自动回复机制**。AutoGen 中的代理拥有统一的对话界面，用于执行相应的以对话为中心的计算，包括用于发送/接收消息的发送/接收功能和用于根据接收到的消息采取行动并生成回复的生成回复功能。AutoGen 还引入并默认采用代理自动回复机制来实现对话驱动控制： 一旦一个代理收到另一个代理的消息，除非满足终止条件，否则它会自动调用生成回复并将回复发送回发送方。AutoGen 提供基于 LLM 推断、代码或函数执行或人工输入的内置回复函数。用户还可以注册自定义回复函数，以定制代理的行为模式，例如，在回复发件人代理之前先与其他代理聊天。在这种机制下，一旦注册了回复函数，并初始化了会话，会话流程就会自然而然地产生，因此，无需任何额外的控制平面（即控制会话流程的特殊模块），代理会话就会自然而然地进行。
2. **融合编程和自然语言的控制**。AutoGen 允许在各种控制流管理模式中使用编程和自然语言： 
	1. **通过 LLM 实现自然语言控制**。在 AutoGen 中，人们可以通过用自然语言提示 LLM 支持的代理来控制对话流。例如，AutoGen 内置的助理代理（AssistantAgent）的默认系统消息使用自然语言指示代理修复错误，并在上一次结果显示有错误时重新生成代码。它还引导代理将 LLM 输出限制在特定结构中，使其他工具支持的代理更容易使用。
	2. **编程语言控制**。在 AutoGen 中，Python 代码可用于指定终止条件、人工输入模式和工具执行逻辑，例如自动回复的最大次数。还可以注册编程自动回复函数，用 Python 代码控制对话流。
	3. **自然语言和编程语言之间的控制转换**。AutoGen 还支持自然语言和编程语言之间灵活的控制转换。人们可以通过在自定义回复函数中调用包含特定控制逻辑的 LLM 推理，实现从代码控制到自然语言控制的过渡；也可以通过 LLM 提议的函数调用，实现从自然语言到代码控制的过渡。
## 应用案例分析
在了解了 AutoGen 框架的核心概念和实现细节之后，接下来我们将探讨一些具体的应用案例。这些案例不仅展示了 AutoGen 在实际应用中的强大能力，还提供了关于如何利用这一框架来解决复杂问题的有用见解。论文正文中讲了6个案例，我这里就挑4个讲一下。
### 数学问题解决（A1）
数学问题对于LLM而言是个高难度的技术活，但确实很有使用价值的能力，利用 LLM 辅助数学解题的前景开辟了大量新的应用和探索途径，包括个性化人工智能辅导、人工智能研究辅助等。论文中直接重用 AutoGen 的两个内置代理，构建一个自主数学问题求解系统。包括一个专门用于解决数学问题的代理和一个用于与用户进行自然语言交互的代理。这两个代理可以相互合作，以解决用户提出的复杂数学问题。例如，用户可以通过自然语言查询代理提出一个问题，然后数学代理会解析和解决这个问题，最后再通过自然语言代理将答案返回给用户。
### 检索增强聊天（A2）
检索增强也是一种实用而有效的方法，可以通过整合外部文档来缓解 LLM 的内在局限性，我想这个在平时我们学习大模型过程中可能经常会用到，比如构建一个本地知识库就需要用到这种技术。在这个应用案例中，AutoGen 用于构建一个能够进行智能搜索和信息检索的聊天应用。用户可以通过自然语言查询代理提出问题或请求信息，然后搜索代理会从互联网或其他数据源中检索相关信息，并通过自然语言代理将结果返回给用户。该系统由两个代理组成：一个检索增强用户代理代理和一个检索增强助理代理，这两个代理都是从 AutoGen 的内置代理扩展而来。检索增强用户代理包括一个向量数据库，并使用句子转换器作为上下文检索器。
### 多代理编码（A4）
这是一个更为高级的应用案例，作为程序员我现在是经常使用AI工具辅助编程了，因此这个案例也是非常有意思。它基于 OptiGuide 构建了一个多代理编码系统，涉及到多个代理的协同工作以完成编码任务。例如，一个代理可以负责生成代码框架，而另一个代理则负责填充具体的业务逻辑。这样，开发者可以更加专注于解决实际问题，而不是处理底层的编码和架构问题。
### 动态群聊（A5）
这个案例属于一种比较创新的使用场景了，在这个应用案例中，多个代理可以协同工作以管理和维护一个动态的群聊环境。这些代理可以根据群聊的实际需求和动态进行自适应调整，而不是遵循预定义的顺序，例如添加新的功能或优化现有的交互逻辑。这使得动态群聊非常适合那些不需要严格通信顺序的合作情境。
## 总结
总的来说，AutoGen 框架融合了**可对话代理**和**对话编程**的范式。该库使用适合多代理合作的高级代理。它具有统一的**代理间对话接口**，以及**自动回复机制**，有助于建立一个充分发挥基于聊天优化的LLM（低层模型）广泛能力的代理交互界面，同时还能适应多种应用场景。AutoGen 作为一个通用框架，用于创建和实验能轻松满足各种实际需求的多代理系统，例如重用、自定义和扩展现有代理，以及在它们之间编程对话。

AutoGen 框架的实际应用潜力是巨大的。从智能助手到自动编程，再到复杂的数据分析，其应用场景几乎无处不在。特别是在当前大型语言模型逐渐成为主流的背景下，AutoGen 提供了一种全新的、更为灵活和高效的方式来构建基于这些模型的应用。未来，我们可以期待 AutoGen 在多个方面进行进一步的优化和扩展。例如，更多的自然语言处理功能可以被集成进来，以提供更为丰富和精准的交互体验。同时，随着更多开发者和机构开始使用这一框架，其生态系统也将逐渐成熟，从而推动整个领域的发展。


