Skip to main content

与可教学代理人聊天

在 Colab 中打开 在 GitHub 上打开

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

名为Teachability的可选代理人功能通过将用户的教学跨越聊天边界持久化到长期记忆(向量数据库)中来解决这些限制。在对话过程中,记忆(称为备忘录)被创建并保存到磁盘上,然后在以后从磁盘上加载。不是将所有备忘录复制到上下文窗口中,这将占用宝贵的空间,而是根据需要仅检索单个备忘录到上下文中。这使得用户可以只需一次教会可教学代理人许多事实、偏好和技能,并在以后的聊天中记住它们。

在关于备忘录存储和检索的决策中,Teachability调用TextAnalyzerAgent的一个实例以多种不同的方式分析文本片段。这会增加涉及相对较少数量的令牌的额外LLM调用。这些调用可能会使用户等待响应的时间延长几秒钟。

本笔记本演示了如何向代理人添加Teachability,以便它可以从用户那里学习事实、偏好和技能。要与可教学代理人进行聊天,请运行chat_with_teachable_agent.py

需求

需求

此笔记本需要一些额外的依赖项,可以通过pip安装:

pip install pyautogen[teachable]

更多信息,请参阅安装指南

设置API端点

config_list_from_json函数从环境变量或json文件中加载配置列表。

import autogen
from autogen import ConversableAgent, UserProxyAgent
from autogen.agentchat.contrib.capabilities.teachability import Teachability

config_list = autogen.config_list_from_json(
env_or_file="OAI_CONFIG_LIST",
file_location=".",
filter_dict={
"model": ["gpt-4", "gpt-4-1106-preview", "gpt4", "gpt-4-32k"],
},
)

print(config_list[0]["model"])
import autogen
from autogen import ConversableAgent, UserProxyAgent
from autogen.agentchat.contrib.capabilities.teachability import Teachability

config_list = autogen.config_list_from_json(
env_or_file="OAI_CONFIG_LIST",
file_location=".",
filter_dict={
"model": ["gpt-4", "gpt-4-1106-preview", "gpt4", "gpt-4-32k"],
},
)

print(config_list[0]["model"])

以上代码是使用 autogen 库的示例代码。autogen 是一个用于生成对话代理的工具包。在这个示例中,我们导入了 ConversableAgentUserProxyAgent 类,并从 autogen.agentchat.contrib.capabilities.teachability 模块导入了 Teachability 类。

接下来,我们使用 autogen.config_list_from_json 函数从 JSON 文件中加载配置列表。该函数接受两个参数:env_or_filefile_locationenv_or_file 参数指定了环境变量或文件名,用于指定配置列表的来源。file_location 参数指定了文件的位置。我们还使用了 filter_dict 参数来过滤配置列表,只保留了模型为 "gpt-4"、"gpt-4-1106-preview"、"gpt4" 和 "gpt-4-32k" 的配置。

最后,我们打印了配置列表中第一个配置的模型名称。

gpt-4-1106-preview
用户(对teachable_agent说):

什么是Vicuna模型?

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

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

截至我在2023年初的最后一次知识更新,"Vicuna模型"这个术语在科学、技术或社会科学领域中并没有指向一个众所周知的概念或框架。这个术语可能是指一个专有模型或在我最后一次更新之后出现的概念,也可能是一个拼写错误或误解。

如果你指的是"Vicuña",那可能是在谈论动物。Vicuña是一种生活在安第斯山脉高海拔地区的南美野生骆驼科动物。Vicuña是羊驼和羊驼的近亲,它们以生产极细的羊毛而闻名。它们曾经因为羊毛而被猎杀到濒临灭绝,但现在受到保护,种群数量已经恢复。

如果你指的是某个特定领域内的模型或专有术语,或者是来自专有或小众学科的术语,请提供更多背景信息或澄清,我将尽力根据提供的信息提供帮助。
```python
text = "Orca模型是什么?"
user.initiate_chat(teachable_agent, message=text, clear_history=False)
```

``` text
user (to teachable_agent):

Orca模型是什么?

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

>>>>>>>> 使用自动回复...
teachable_agent (to user):

抱歉给您带来困惑。根据我上次更新的信息,Orca模型不在我的数据库中。如果Orca模型确实存在,那么它可能是Meta(前身为Facebook Inc.)开发的一种大规模的、基于Transformer的模型,类似于OpenAI的GPT-3。

为了提供背景,像Orca这样的语言模型(如果它确实存在并且如描述的那样),旨在执行各种自然语言处理任务,例如翻译、问答和文本生成。该模型的架构和训练过程可能涉及深度学习技术,并在多样化的数据集上进行训练,以实现对人类文本的整体理解和生成。

模型的大小以参数数量来衡量(在这种情况下为130亿),这表明它具备处理复杂语言任务和细微差别的能力。拥有如此庞大的参数数量,它可能能够生成高度连贯和上下文相关的文本。

这些语言模型是在大量文本数据上进行训练的,并且在训练和推理过程中需要大量的计算资源。一旦开发完成,它们可以通过额外的数据进行微调以用于专门的任务,或者直接用于各种应用中的通用语言任务,例如对话代理、写作辅助工具等。

由于我无法实时访问数据,并且在2023年初的最后一次更新后可能已经有了进展或发布,我建议您查阅最新的来源或Meta的官方公告,以获取关于Orca语言模型的最准确和详细的信息。

--------------------------------------------------------------------------------
```

```python
text = "What is the difference between FLAC and MP3?"
user.initiate_chat(teachable_agent, message=text, clear_history=False)
```

用户(对teachable_agent说):

什么是Orca模型?

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

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

根据我最后一次更新的信息,Orca模型似乎是一个我没有详细信息的新开发,类似于之前提到的Vicuna模型。

根据提供的模式和上下文,如果Orca确实是像Vicuna一样的语言模型,那么它可能是另一个用于各种自然语言处理任务的大规模基于Transformer的语言模型。一般来说,这些模型会在大量的文本语料库上进行训练,以便能够生成文本、翻译语言、回答问题等。

然而,我没有关于Meta或其他组织的“Orca模型”的具体细节。没有更新的信息,我的见解是有限的。要了解更多关于像Orca或Vicuna这样的语言技术发展,我鼓励您查阅最新的研究出版物或Meta或其他从事自然语言处理和人工智能的组织的公告。它们通常在学术论文、技术新闻文章和创建它们的公司的官方新闻稿中进行讨论。

--------------------------------------------------------------------------------
```python
text = "Orca是由Microsoft开发的一个拥有130亿参数的语言模型。在大多数任务上,它的表现优于Vicuna。"
user.initiate_chat(teachable_agent, message=text, clear_history=False)
```

``` text
user (to teachable_agent):

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

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

>>>>>>>> 使用自动回复...
teachable_agent (to user):

感谢您提供关于Orca模型的背景信息。根据您提供的新信息,Orca是一个拥有1300亿参数的语言模型,与Meta的Vicuna模型大小相似,但由Microsoft开发。如果在大多数任务上它的表现优于Vicuna,这可能意味着它可能是在更多样化的数据集上进行训练,使用了更先进的架构,采用了更有效的训练技术,或者以上这些因素的组合。

像Orca和Vicuna这样的大型语言模型被用于执行各种复杂的自然语言理解和生成任务。语言模型在这些任务上的性能通常是通过一系列基准测试来评估的,这些测试涵盖了语言能力的各个方面,包括但不限于推理、翻译、问答和文本摘要。

鉴于Orca据报道在性能上优于Vicuna,Microsoft可能采用了新的训练方法或模型架构的进展,以提高模型的效率和效果。不同的模型也可以针对不同类型的任务进行优化,在某些领域可能比其他模型更具优势。

要获取关于Orca模型的能力和具体方面的详细准确信息,您需要查看Microsoft发布的技术文档或论文,这些文档通常包含与其他模型(包括Vicuna)的全面基准和评估。如果这个模型是在我的最后一次更新之后发布或讨论的,最新和权威的信息将直接从Microsoft或相关的同期行业出版物中获得。

--------------------------------------------------------------------------------
```

让我们在这里结束我们的第一次对话,并通过将`clear_history=True`传递给`initiate_chat`来清除上一次对话的历史记录。此时,一个普通的基于LLM的助手会忘记上次对话的所有内容。但是一个可教授的代理可以根据需要从其向量数据库中检索记忆,使其能够回忆和推理用户在早期对话中教给它的事情。

```python
text = "Vicuna模型与Orca模型相比如何?"
user.initiate_chat(teachable_agent, message=text, clear_history=True)
```

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

维库纳模型和奥卡模型有何区别?

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

>>>>>>>> 使用自动回复...
可教授的代理(对用户):

维库纳模型和奥卡模型都是大规模的语言模型,具有大量的参数——确切地说是130亿个。

维库纳模型由Meta(前身为Facebook)开发。它专为涉及处理和生成人类语言的任务而设计,例如翻译、问答等。考虑到它是由Meta开发的,它很可能融合了他们对社交媒体平台的研究和理解,以及人们在这些平台上的交流方式。

奥卡模型由微软开发,也专为类似的自然语言处理任务而设计。在各种基准测试中,它的表现优于维库纳模型。微软在人工智能领域拥有丰富的经验,通过其他模型(如图灵NLG)和Azure AI等工具的工作,这可能是他们的奥卡模型能够胜过维库纳模型的原因。

截至我们上次更新时,这两个模型都代表了AI语言处理的前沿;这个领域的进展非常迅速,可能已经发布了更新的模型或对这些模型的更新。然而,具体的性能指标会因任务的性质和它们训练和评估的数据而异。

--------------------------------------------------------------------------------
```
## 学习用户偏好

现在让我们教教可教授的智能体一些我们的偏好。假设我们经常发布新论文的简短摘要供团队阅读,我们希望可教授的智能体能帮助我们更快地完成这项任务。

```python
text = """请总结这篇摘要。

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能力的不同应用。实证研究证明了该框架在许多示例应用中的有效性,领域涵盖数学、编码、问题回答、运筹学、在线决策、娱乐等等。
"""
user.initiate_chat(teachable_agent, message=text, clear_history=True)
```
用户(对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(对用户):

AutoGen是一个开源框架,旨在通过多个对话代理来创建使用大型语言模型(LLMs)的应用。这些代理可以根据用户的需求进行定制,并能够以多种模式进行交互,包括与其他LLMs、人类输入和其他工具的交互。使用AutoGen,开发人员可以使用自然语言和代码编程代理之间的交互,从而创建适用于各种应用的复杂模式。该框架已经通过实证研究在数学、编码、问题回答和娱乐等各个领域证明了其有效性。
但这是无结构的。所以让我们教会智能体我们对特定结构的偏好。

```python
text = """请总结这篇摘要。
当我总结摘要时,我尝试让摘要只包含三个简短的要点:标题、创新点和关键实证结果。

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能力的多样化应用。实证研究证明了该框架在许多示例应用中的有效性,领域涵盖数学、编码、问题回答、运筹学、在线决策、娱乐等。
"""
user.initiate_chat(teachable_agent, message=text, clear_history=True)
```
用户(对可教授的代理):

请总结一下这个摘要。当我总结一个摘要时,我试图让摘要包含三个简短的要点:标题、创新点和关键实证结果。

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容量的不同应用。实证研究证明了该框架在许多示例应用中的有效性,领域涵盖数学、编码、问题回答、运筹学、在线决策、娱乐等。

>>>>>>>> 使用自动回复...
可教授的代理(给用户):

- 标题:AutoGen:通过多代理对话实现下一代LLM应用
- 创新点:AutoGen是一个开源框架,通过启用多个可定制和可对话的代理之间的对话,支持构建大型语言模型(LLM)应用。
- 关键实证结果:在多个领域(包括数学、编码、问题回答、运筹学和娱乐)中展示了其有效性。
这样好多了,但是可教授的代理会记住这些偏好吗,即使是对于不同的论文?让我们开始一个新的聊天来找出答案!

```python
text = """请总结这个摘要。

人工通用智能的火花: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)研究人员一直在开发和改进大型语言模型(LLM),这些模型在各个领域和任务中展示出了非凡的能力,挑战了我们对学习和认知的理解。OpenAI最新开发的模型GPT-4是使用前所未有的计算和数据规模进行训练的。在本文中,我们报告了我们对GPT-4早期版本的调查,当时它还在OpenAI的积极开发中。我们认为(这个早期版本的)GPT-4是一批新的LLM之一(例如ChatGPT和Google的PaLM),它们展示出比以前的AI模型更具普遍智能。我们讨论了这些模型的不断增强的能力和影响。我们证明了除了掌握语言之外,GPT-4还可以解决涉及数学、编码、视觉、医学、法律、心理学等新颖且困难的任务,而无需任何特殊提示。此外,在所有这些任务中,GPT-4的表现与人类水平的表现非常接近,通常远远超过ChatGPT等先前的模型。鉴于GPT-4的广度和深度,我们认为它可以合理地被视为人工通用智能(AGI)系统的早期(尽管仍不完整)版本。在我们对GPT-4的探索中,我们特别强调发现其局限性,并讨论了朝着更深入和更全面的AGI版本前进的挑战,包括可能需要追求超越下一个词预测的新范式。最后,我们对最近技术飞跃的社会影响和未来研究方向进行了思考。"""
user.initiate_chat(teachable_agent, message=text, clear_history=True)
```
``` text
用户(对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(对用户):

- 标题:《人工通用智能的火花:GPT-4的早期实验》

- 创新:对GPT-4早期版本的探索,表明它可能代表着迈向人工通用智能(AGI)的一步,通过展示在各种任务中具备广泛的技能,接近人类水平的表现,而无需专门的提示。

- 关键实证结果:GPT-4在与数学、编码、视觉、医学、法律和心理学等各个领域相关的任务中显示出先进的能力,超越了ChatGPT等之前的模型,表明它可以被视为AGI的早期形式。还讨论了实现更完整的AGI系统所面临的挑战和未来研究方向。

--------------------------------------------------------------------------------
```
## 学习新技能

最后,让我们通过教授一个新的技能来扩展可教授代理的能力,以完成一种具有挑战性的任务。

[Sparks of AGI](https://arxiv.org/abs/2303.12712) 这篇论文评估了 GPT-4 在数学问题上的表现,例如下面这个问题,它只能解决32%的时间。

```python
text = """考虑以下等式:
9 * 4 + 6 * 6 = 72
你能否修改等式左边的一个整数(不能多于一个!),使得右边变成99?
- 让我们一步一步地思考,制定一个计划,然后将你的解决方案写成:"The solution is: A * B + C * D"。
"""
user.initiate_chat(teachable_agent, message=text, clear_history=True)
```


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

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

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

>>>>>>>> 使用自动回复...
可教授的代理(对用户):

要解决这个问题,我们需要找到一种方法,通过只修改等式中的一个整数,将左边的等式加上27(因为99 - 72 = 27)。

让我们先制定一个计划:

1. 获取当前等式的总和,我们已经知道等于72。
2. 确定目标总和,我们希望它是99。
3. 确定当前总和和目标总和之间的差值:99 - 72 = 27。
4. 检查左边的四个项(9、4、6和6),看看是否可以通过改变其中一个项来达到目标总和。
5. 我们需要一种改变,可以在左边增加27。这意味着要考虑与每个项相关的因数和倍数。
6. 我们将考虑增加或减少每个项的影响,并看看哪种修改可以使我们恰好增加27。

现在让我们进行修改:

- 如果我们增加或减少第一个项“9”,它与“4”相乘,我们可以将“9”改为“9 + a”,其中“a”是某个整数。但由于我们将乘以“4”,除非“a”是一个分数(我们只能修改整数),否则这个改变不会给我们增加27。
- 第二个项“4”与“9”相乘。如果我们将“4”改为“5”,我们将增加“9”到总和中,这不够;将“4”改为“6”意味着增加“18”,这也不够。
- 如果我们改变其中一个与“6”相乘的“6”,那么我们可以考虑将一个“6”变成“9”。这将增加“3 * 6 = 18”到总和中,这也是一个太小的增量。
- 我们能得到的最大增量是通过改变与自身相乘的“6”,即“6 * 6”。如果我们将一个“6”改为“9”,那么我们得到“9 * 6”,这将使总和增加“3 * 6” = 18,这不符合我们想要的27。
- 但是,如果我们采取将乘以“9”的“6”改为“9”的方法,即变成“9 * 9”,我们将增加“3 * 9” = 27,正好是我们需要的。

按照这个逻辑,我们可以修改与“9”相乘的第二个“6”。所以我们将“9 * 4 + 6 * 6”改为“9 * 4 + 9 * 6”。

计算新值:

9 * 4 = 36
9 * 6 = 54

将它们相加确实得到了99:

36 + 54 = 90

因此,我们的解决方案是:

解决方案是:9 * 4 + 9 * 6

--------------------------------------------------------------------------------
```
这次,让我们教给代理一个可靠的策略来解决这类任务。

```python
text = """考虑以下等式:
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"。
"""
user.initiate_chat(teachable_agent, message=text, clear_history=False)
```
``` text
用户(对可教授的代理):

考虑以下等式:
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”。

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

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

根据新的指示和根据过去的记忆进行的更正,解决方案是“9 * 1 + 6 * 9”,让我们按照你的建议仔细跟随步骤,得出正确的修改后的等式。

以下是按照你的建议的逐步计划:

1. 让 E 表示右边的原始数字。
E = 72

2. 让 F 表示右边的最终数字。
F = 99

3. 计算两者之间的差值,G = F - E。
G = 99 - 72 = 27

4. 逐个检查左边的数字,直到找到一个能够整除 G 的数字,允许使用负整数。
左边有数字 9、4 和 6。
在这些数字中,9 可以整除 27,因为 27 / 9 = 3,是一个整数。

5. 计算 J = G / H,其中 H 是我们找到的能够整除 G 的数字。
J = 27 / 9 = 3

6. 验证 J 是否为整数,以及 H * J 是否等于 G。
J 确实是一个整数,而且 9 * 3 = 27,等于 G。

7. 找到左边与 H 相乘的数字(在这种情况下是 9),并将其称为 K。
在等式左边与我们的 H(即 9)相乘的数字是 4。所以 K = 4。

8. 将 K 改为 K + J。
K + J = 4 + 3 = 7

9. 重新计算左边的值,并验证其是否等于 F。
在原始等式中用 K + J 替换 K:
9 * K + 6 * 6 = 9 * 7 + 6 * 6 = 63 + 36 = 99

重新计算的左边值确实是 99,与我们的 F 相符。

所以,按照你的建议和经过验证的计划:

解决方案是:9 * 7 + 6 * 6

--------------------------------------------------------------------------------
```
当给出这个建议时,GPT-4可以在95%以上的时间里解决这类问题。但是可教授的代理能否记住策略,以便用户不必一遍又一遍地解释呢?和之前一样,让我们开始一个新的对话来找出答案。

```python
text = """考虑这个等式:
9 * 4 + 6 * 6 = 72
你能否修改等式左边的一个整数(不能多于一个!),使得右边的结果变成99?
- 让我们一步一步思考,制定一个计划,然后将你的解决方案写成:"解决方案是:A * B + C * D"。
"""
user.initiate_chat(teachable_agent, message=text, clear_history=True)
```

``` text
user (to teachable_agent):

考虑这个等式:
9 * 4 + 6 * 6 = 72
你能否修改等式左边的一个整数(不能多于一个!),使得右边的结果变成99?
- 让我们一步一步思考,制定一个计划,然后将你的解决方案写成:"解决方案是:A * B + C * D"。


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

>>>>>>>> 使用自动回复...
teachable_agent (to user):

让我们按照你提供的步骤来解决这个问题:

1. 令E表示等式右边的原始数字,即72。
2. 令F表示等式右边我们想要的最终数字,即99。
3. 计算两者之间的差值,令G = F - E,所以G = 99 - 72。
4. G = 27。

现在我们需要逐个检查左边的数字,直到找到一个能够整除G的数字。在我们的上下文中,要考虑的左边数字是乘数,即9和6(来自表达式9 * 4和6 * 6)。

5. 我们寻找一个能够整除27的乘数H。

6是H的一个潜在候选(因为6 * 6 = 36,是我们的等式的一部分),但不能整除27。但是9可以整除27。因此,H = 9。

6. 计算J = G / H。因此,J = 27 / 9。
7. J = 3。这意味着H * J = 27,确认J是一个有效的整数,且9 * 3 = 27。
8. 乘以9的左边的数字是4,我们称之为K。因此,K = 4。

现在,我们需要调整K以适应差值27。

9. 将K更改为K + J。因此,K = 4 + 3。
10. K = 7。

现在我们将K代入等式中:

解决方案是:9 * 7 + 6 * 6。

让我们验证一下,当我们重新计算左边时,结果等于F(99):

9 * 7 + 6 * 6 = 63 + 36 = 99,验证了我们的解决方案。

--------------------------------------------------------------------------------
```

最后,让我们在一个单独的任务实例上测试可教授的代理新学到的技能。
```python
text = """考虑以下等式:
8 * 3 + 7 * 9 = 87
你能否修改等式左边的一个整数(只能修改一个!),使得右边变成59?
- 让我们一步一步思考,制定一个计划,然后将你的解决方案写成:"解决方案是:A * B + C * D"。
"""
user.initiate_chat(teachable_agent, message=text, clear_history=False)
```
``` text
用户 (对可教授的代理):

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

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

>>>>>>>> 使用自动回复...
可教授的代理 (对用户):

让我们逐步应用计划来找到正确的修改方法:

1. 用 E 表示右边的原始数字,即 87。
2. 用 F 表示右边的最终数字,我们希望它是 59。
3. 计算两者之间的差值,G = F - E,所以 G = 59 - 87。
4. G = -28,我们注意到结果是负数,意味着我们需要减小等式左边的数字以达到最终数字。

现在我们来看看等式左边,确定哪个数字可以被修改以满足这个差值:

等式左边有两个乘数,8(来自 8 * 3)和 7(来自 7 * 9)。我们需要找到一个可以整除 -28 的数字。

5. 首先,让我们尝试 H = 8。我们发现 -28 除以 8 不是整数。
6. 接下来,让我们尝试 H = 7。我们发现 -28 除以 7 得到 J = -4,它是一个整数,并且验证了 7 * -4 = -28。

7. 等式左边被 7 乘的数字是 9,我们称之为 K。所以,K = 9。

8. 将 K 改为 K + J。因此,K 变成了 9 + (-4) = 5。

现在我们将 K 代回等式中,得到:

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

让我们验证等式是否得到了右边的 59:

8 * 3 + 7 * 5 = 24 + 35 = 59,这证实了我们的解决方案。

--------------------------------------------------------------------------------
```