Skip to main content

AutoGen的可教授代理

· 26 min read
Ricky Loynd

可教授代理架构

TL;DR:

  • 我们引入了可教授代理,使用户能够教授他们基于LLM的助手新的事实、偏好和技能。
  • 我们展示了可教授代理学习并在后续对话中回忆事实、偏好和技能的示例。

引言

基于LLM的对话助手可以记住与用户的当前对话,并且在对话过程中可以展示用户教授的上下文学习。但是助手的记忆和学习在对话结束时或者当单个对话变得过长以至于LLM无法有效处理时会丢失。然后在后续的对话中,用户被迫一遍又一遍地重复任何必要的指令。

可教授性通过将用户教授跨越对话边界存储在作为向量数据库实现的长期记忆中来解决这些限制。而不是将所有记忆复制到上下文窗口中,这将占用宝贵的空间,单个记忆(称为备忘录)会根据需要检索到上下文中。这使得用户只需将常用的事实和技能教给可教授代理一次,并在后续对话中回忆起来。

任何继承自ConversableAgent的实例化agent都可以通过实例化Teachability对象并调用其add_to_agent(agent)方法来使其可教授。 为了对备忘录的存储和检索做出有效的决策,Teachability对象调用TextAnalyzerAgent的一个实例(另一个AutoGen代理)来识别和重组文本,以便记住事实、偏好和技能。请注意,这会增加涉及相对较少数量的令牌的额外LLM调用,这可能会使用户等待每个响应的时间延长几秒钟。

自己运行

AutoGen包含四个使用可教授性的代码示例。

  1. 运行chat_with_teachable_agent.py与可教授代理进行对话。

  2. 运行test_teachable_agent.py对可教授代理进行快速单元测试。

  3. 使用Jupyter笔记本agentchat_teachability.ipynb逐步执行下面讨论的示例。

  4. 使用Jupyter笔记本agentchat_teachable_oai_assistants.ipynb通过GPTAssistantAgent使任意OpenAI助手可教授。

可教授性的基本用法

  1. 安装依赖项

在使用可教授性之前,请先安装带有[teachable]选项的pyautogen。

pip install "pyautogen[teachable]"
  1. 导入代理
from autogen import UserProxyAgent, config_list_from_json
from autogen.agentchat.contrib.capabilities.teachability import Teachability
from autogen import ConversableAgent # 作为示例
  1. 创建 llm_config
# 从环境变量或文件中加载 LLM 推理端点
# 参见 https://microsoft.github.io/autogen/docs/FAQ#set-your-api-endpoints
# 和 OAI_CONFIG_LIST_sample
filter_dict = {"model": ["gpt-4"]} # GPT-3.5 在从用户反馈中学习方面比 GPT-4 不可靠。
config_list = config_list_from_json(env_or_file="OAI_CONFIG_LIST", filter_dict=filter_dict)
llm_config={"config_list": config_list, "timeout": 120}
  1. 创建代理

# 首先实例化任何继承自 ConversableAgent 的代理,这里我们直接使用它来简化操作。
teachable_agent = ConversableAgent(
name="teachable_agent", # 名称可以是任意的。
llm_config=llm_config
)

# 实例化一个 Teachability 对象,其参数都是可选的。
teachability = Teachability(
reset_db=False, # 使用 True 强制重置记忆数据库,使用 False 使用现有数据库。
path_to_db_dir="./tmp/interactive/teachability_db" # 可以是任何路径,但在群聊中的可教授代理需要唯一的路径。
)

# 现在将 teachability 添加到代理中。
teachability.add_to_agent(teachable_agent)

# 对于这个测试,像往常一样创建一个用户代理。
user = UserProxyAgent("user", human_input_mode="ALWAYS")
  1. 与可教授代理进行对话
# 当用户输入 'exit' 时,该函数将返回。
teachable_agent.initiate_chat(user, message="嗨,我是一个可教授的用户助手!有什么问题吗?")

示例 1 - 学习用户信息

用户可以教导代理关于自己的事实。 (请注意,由于微调的原因,LLM 可能不愿意承认它们知道个人信息。)

从磁盘加载以前的记忆(如果有)。
teachable_agent(对用户):

你好,我是一个可教授的用户助手!你今天有什么问题?

--------------------------------------------------------------------------------
向 teachable_agent 提供反馈。按回车跳过并使用自动回复,或输入 'exit' 结束对话:我的名字是 Ricky
user(对 teachable_agent):

我的名字是 Ricky

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
teachable_agent(对用户):

你好 Ricky!今天我能帮你什么?

--------------------------------------------------------------------------------
向 teachable_agent 提供反馈。按回车跳过并使用自动回复,或输入 'exit' 结束对话:exit

在以后的对话中,用户可以检查可教授代理是否记得他们的名字。(为了易读起见,下面不再重复用户提示和一些已记录的通知。)

--------------------------------------------------------------------------------
user(对 teachable_agent):

我的名字是什么?

--------------------------------------------------------------------------------
teachable_agent(对用户):

嗨 Ricky!今天我能帮你什么?

--------------------------------------------------------------------------------

示例2 - 学习新事实

用户可以教会代理程序更复杂、相关的事实。

--------------------------------------------------------------------------------
用户 (向可教授的代理提问):

什么是Vicuna模型?

--------------------------------------------------------------------------------
可教授的代理 (回复用户):

很抱歉,但是我在当前数据库中没有关于"Vicuna模型"的信息。您能提供一些关于该模型的背景、描述或详细信息吗?这样我可以更好地帮助您。

--------------------------------------------------------------------------------
用户 (向可教授的代理提问):

Vicuna是由Meta发布的一个拥有130亿参数的语言模型。

--------------------------------------------------------------------------------
可教授的代理 (回复用户):

感谢您提供的信息。Vicuna模型是由Meta开发的一个大规模语言模型。它包含1300亿个参数,这使得它能够理解和生成各种主题的类似人类的文本。神经网络中的参数是分配给每个神经元之间连接的权重和偏差,拥有更多的参数使得模型能够学习和捕捉更复杂的数据模式和关系。作为一个AI语言模型,Vicuna可以在各种与语言相关的任务中使用,例如文本补全、翻译、摘要等。

--------------------------------------------------------------------------------
用户 (向可教授的代理提问):

什么是Orca模型?

--------------------------------------------------------------------------------
可教授的代理 (回复用户):

Orca模型是Meta即将发布的一个语言模型,指的是Meta先进语言模型的研究预览API版本。虽然我目前没有关于Orca模型的具体细节,但预计该模型将比其前身Vicuna拥有更多的参数,以进一步增强其功能。

随着AI语言模型的发展,它们通常在理解和生成类似人类文本方面变得更加高效。这使得它们在完成各种任务,包括文本补全、翻译、摘要、问答以及在各种应用中提供更准确、连贯的结果方面更加有效。

--------------------------------------------------------------------------------
用户 (向可教授的代理提问):

Orca是由Microsoft发布的一个拥有130亿参数的语言模型。它在大多数任务上都优于Vicuna。

--------------------------------------------------------------------------------
可教授的代理 (回复用户):

感谢您的澄清。Orca是由Microsoft开发的一个拥有1300亿参数的语言模型。它旨在超越Meta发布的语言模型Vicuna。拥有大量参数使得Orca能够理解和生成各种主题的类似人类的文本,使其在各种应用中非常有用。

Orca的先进功能使其在文本补全、翻译、摘要、问答等任务中表现出色。它相对于Vicuna的性能提升突显了自然语言处理(NLP)研究的快速进展和越来越强大的AI语言模型的发展。

然后在后续的对话中,可教学的代理可以回答关于它所学到的事实的问题。 (记得先通过输入 'exit' 来关闭之前的对话。)

--------------------------------------------------------------------------------
user (to teachable_agent):

维库纳模型和逆戟鲸模型有什么区别?

--------------------------------------------------------------------------------
teachable_agent (to user):

维库纳模型和逆戟鲸模型都是由 Meta 和 Microsoft 分别发布的具有 1300 亿参数的语言模型。在性能方面,据报道逆戟鲸在大多数任务上优于维库纳。然而,如果没有关于具体任务和基准的详细信息,很难提供更全面的比较。总的来说,这两个模型都是先进的语言模型,旨在提供高质量的自然语言理解和生成,但逆戟鲸在整体性能方面似乎更具优势。

--------------------------------------------------------------------------------

示例 3 - 学习用户偏好

用户可以教导代理人他们更喜欢如何完成任务。

请注意,像下面这样的消息不能作为单个消息通过命令行输入,因为它包含换行符。 这样的消息可以在 Jupyter notebook 中输入,或者通过像 ChatGPT 这样的 UI 层输入。

--------------------------------------------------------------------------------
用户(对teachable_agent):

请给这个摘要做个总结。

AutoGen: 通过多智能体对话实现下一代LLM应用
Qingyun Wu, Gagan Bansal, Jieyu Zhang, Yiran Wu, Beibin Li, Erkang Zhu, Li Jiang, Xiaoyun Zhang, Shaokun Zhang, Jiale Liu, Ahmed Hassan Awadallah, Ryen W White, Doug Burger, Chi Wang
AutoGen是一个开源框架,允许开发人员通过多个智能体进行对话来构建LLM应用。AutoGen智能体具有可定制性、可对话性,并且可以在使用LLM、人工输入和工具的各种模式下运行。使用AutoGen,开发人员还可以灵活定义智能体的交互行为。可以使用自然语言和计算机代码来编程不同应用的灵活对话模式。AutoGen作为一个通用基础设施,用于构建各种复杂度和LLM能力的多样化应用。经验研究证明了该框架在许多示例应用中的有效性,领域涵盖数学、编码、问题回答、运筹学、在线决策、娱乐等。

--------------------------------------------------------------------------------
teachable_agent (to user):

AutoGen是一个开源框架,旨在帮助开发人员创建具有多个可定制智能体的LLM应用,这些智能体可以相互对话以完成任务。这些智能体可以使用LLM、人工输入和工具的不同组合进行操作,使开发人员能够灵活定义智能体的交互行为。AutoGen支持使用自然语言和代码编程灵活的对话模式,适用于构建具有不同复杂度和LLM能力的多样化应用。通过经验研究,在数学、编码、运筹学、决策和娱乐等各个领域证明了该框架的有效性。

--------------------------------------------------------------------------------
请给这个摘要做个总结。当我总结一个摘要时,我会尽量让摘要包含三个简短的要点:标题、创新点和关键的经验结果。

AutoGen: 通过多智能体对话实现下一代LLM应用
Qingyun Wu, Gagan Bansal, Jieyu Zhang, Yiran Wu, Beibin Li, Erkang Zhu, Li Jiang, Xiaoyun Zhang, Shaokun Zhang, Jiale Liu, Ahmed Hassan Awadallah, Ryen W White, Doug Burger, Chi Wang
AutoGen是一个开源框架,允许开发人员通过多个智能体进行对话来构建LLM应用。AutoGen智能体具有可定制性、可对话性,并且可以在使用LLM、人工输入和工具的各种模式下运行。使用AutoGen,开发人员还可以灵活定义智能体的交互行为。可以使用自然语言和计算机代码来编程不同应用的灵活对话模式。AutoGen作为一个通用基础设施,用于构建各种复杂度和LLM能力的多样化应用。经验研究证明了该框架在许多示例应用中的有效性,领域涵盖数学、编码、问题回答、运筹学、在线决策、娱乐等。

--------------------------------------------------------------------------------
teachable_agent (to user):

- 标题:AutoGen: 通过多智能体对话实现下一代LLM应用
- 创新点:通过智能体对话构建可定制的LLM应用的开源框架,支持多种模式和交互行为。
- 关键的经验结果:在数学、编码、问题回答等多个领域证明了该框架的有效性。

--------------------------------------------------------------------------------

然后在后续的聊天中,教师不需要重复详细说明他们的偏好。

--------------------------------------------------------------------------------
user (to teachable_agent):

请总结一下这篇摘要。

《人工通用智能的火花:GPT-4的早期实验》
Sébastien Bubeck, Varun Chandrasekaran, Ronen Eldan, Johannes Gehrke, Eric Horvitz, Ece Kamar, Peter Lee, Yin Tat Lee, Yuanzhi Li, Scott Lundberg, Harsha Nori, Hamid Palangi, Marco Tulio Ribeiro, Yi Zhang
人工智能(AI)研究人员一直在开发和改进大型语言模型(LLMs),这些模型在各种领域和任务中展现出了令人瞩目的能力,挑战了我们对学习和认知的理解。OpenAI最新开发的模型GPT-4使用了前所未有的计算和数据规模进行训练。在本文中,我们报告了我们对GPT-4早期版本的调查,当时它还在OpenAI的积极开发中。我们认为(这个早期版本的)GPT-4是一批新的LLMs(例如ChatGPT和Google的PaLM)的一部分,这些模型展现出比以前的AI模型更具普遍智能。我们讨论了这些模型的不断增强的能力和影响。我们证明了除了掌握语言之外,GPT-4还可以解决涉及数学、编码、视觉、医学、法律、心理学等新颖且困难的任务,而无需任何特殊提示。此外,在所有这些任务中,GPT-4的表现与人类水平的表现非常接近,通常远远超过了ChatGPT等先前的模型。鉴于GPT-4的广度和深度能力,我们认为它可以合理地被视为人工通用智能(AGI)系统的早期(但仍不完整)版本。在我们对GPT-4的探索中,我们特别强调发现其局限性,并讨论了朝着更深入和更全面的AGI版本前进的挑战,包括可能需要追求超越下一个单词预测的新范式。最后,我们对最近技术飞跃的社会影响和未来研究方向进行了反思。

--------------------------------------------------------------------------------
teachable_agent (to user):

- 标题:《人工通用智能的火花:GPT-4的早期实验》
- 创新点:GPT-4是一个具有令人瞩目能力的LLM,展现出在数学、编码、视觉、医学、法律和心理学等各个领域的人类水平表现。
- 主要结果:GPT-4显著超越了先前的模型,表明它可能是AGI的早期版本;同时讨论了深入研究AGI所面临的局限性和挑战。

--------------------------------------------------------------------------------

示例4 - 学习新技能

用户可以通过教授可教授代理新的技能来扩展其能力,以完成具有挑战性的任务。通常最好先描述任务,然后(在同一轮中)提供一些提示或建议来解决任务。

AGI的火花论文对GPT-4在以下数学问题上进行了评估,它只能解决32%的问题。我们首先展示一个失败案例,然后教授代理一种策略,将GPT-4的成功率提高到95%以上。

用户(对可教授的代理):

考虑等式: 9 * 4 + 6 * 6 = 72 你能否修改等式左边的一个整数(不多于一个!),使得右边变成99?

  • 让我们一步一步来,先制定一个计划,然后写下你的解答,格式为:“解答是:A * B + C * D”。

步骤1:确定当前等式和右边的目标值。 当前等式:9 * 4 + 6 * 6 = 72 目标值:99

步骤2:确定可以在左边改变的数字。 可改变的数字:9、4、6(第一次出现)和6(第二次出现)

步骤3:评估左边每个数字的改变是否能得到目标值。 9 -> 如果改变,会得到更大的乘积。 4 -> 如果改变,乘积会增加或减少超过达到99所需的量。 6(第一次出现)-> 如果增加到7,则等式变为9 * 4 + 7 * 6 = 94,仍然不是99。 6(第二次出现)-> 如果增加到7,则等式变为9 * 4 + 6 * 7 = 99。

步骤4:写下解答。 解答是:9 * 4 + 6 * 7


用户(对可教授的代理):

考虑等式: 9 * 4 + 6 * 6 = 72 你能否修改等式左边的一个整数(不多于一个!),使得右边变成99?

  • 让我们一步一步来,先制定一个计划,然后写下你的解答,格式为:“解答是:A * B + C * D”。

以下是一些建议,可能会有所帮助:

  1. 用 E 表示右边的原始数字。
  2. 用 F 表示右边的最终数字。
  3. 计算两者之间的差值,G = F - E。
  4. 逐个检查左边的数字,直到找到一个能整除 G 的数字,允许使用负整数。
  5. 计算 J = G / H。这是 H 整除 G 的次数。
  6. 验证 J 是否为整数,以及 H * J 是否等于 G。
  7. 找到左边与 H 相乘的数字,并称其为 K。
  8. 将 K 改为 K + J。
  9. 重新计算左边的值,并验证是否等于 F。 最后,将解答写下来,格式为:“解答是:A * B + C * D”。

可教授的代理(对用户):

步骤1:确定右边的原始数字(E)和最终数字(F)。 E = 72 F = 99

步骤2:计算两者之间的差值,G = F - E。 G = 99 - 72 = 27

步骤3:逐个检查左边的数字,直到找到一个能整除 G 的数字,允许使用负整数。 9(能整除27) 4(不能) 6(第一次出现,不能) 6(第二次出现,不能)

步骤4:计算 J = G / H。这是 H 整除 G 的次数。 H = 9(因为9能整除27) J = 27 / 9 = 3

步骤5:验证 J 是否为整数,以及 H * J 是否等于 G。 H * J = 9 * 3 = 27 J = 3(是整数)

步骤6:找到左边与 H 相乘的数字,并称其为 K。 等式左边与9相乘的数字是4 因此,K = 4

步骤7:将 K 改为 K + J。 K + J = 4 + 3 = 7

步骤8:重新计算左边的值,并验证是否等于 F。 9 * 7 + 6 * 6 = 63 + 36 = 99(与 F 相等)

步骤9:写下解答。 解答是:9 * 7 + 6 * 6


在之后的对话中,用户不需要重复详细的建议。

--------------------------------------------------------------------------------
用户(对 teachable_agent):

考虑以下等式:
8 * 3 + 7 * 9 = 87
你能否修改等式左边的一个整数(不多于一个!),使得右边变成59?
- 让我们一步一步思考,制定一个计划,然后将你的解决方案写成:“解决方案是:A * B + C * D”。

--------------------------------------------------------------------------------
teachable_agent(对用户):

让我们按照建议来修改等式左边的一个整数,使得右边变成59:

1. 用 E 表示原来右边的数字:E = 87。
2. 用 F 表示最终右边的数字:F = 59。
3. 计算两者之间的差值,G = F - E:G = 59 - 87 = -28。
4. 逐个检查左边的数字,找到一个能整除 G 的数字:8、3、7、9。由于7能整除-28,我们将使用7(H = 7)。
5. 计算 J = G / H:J = -28 / 7 = -4。
6. 验证 J 是否为整数,并且 H * J = G:J 是整数,而且 7 * (-4) = -28。
7. 找到左边与 H(7)相乘的数字,并将其称为 K:K = 9。
8. 将 K 改为 K + J:K_new = 9 + (-4) = 5。
9. 重新计算左边的值,并验证其是否等于 F:(8 * 3) + (7 * 5) = 24 + 35 = 59。

解决方案是:8 * 3 + 7 * 5

--------------------------------------------------------------------------------

计划改进

  • 理解分布在多个回合中的用户指令。
  • 从代理的经验中学习,减少对明确的用户教学的依赖。
  • 在之前学到的技能基础上构建学习技能。

结论

“可教性”仍在积极研究和开发中。如果您发现任何问题或有改进的想法,请加入我们在该存储库中的讨论以及我们的 Discord 频道。我们期待看到您和社区的其他成员如何使用和改进 AutoGen 中的可教授代理!