TL;DR:
- 我们引入了可教授代理,使用户能够教授他们基于LLM的助手新的事实、偏好和技能。
- 我们展示了可教授代理学习并在后续对话中回忆事实、偏好和技能的示例。
引言
基于LLM的对话助手可以记住与用户的当前对话,并且在对话过程中可以展示用户教授的上下文学习。但是助手的记忆和学习在对话结束时或者当单个对话变得过长以至于LLM无法有效处理时会丢失。然后在后续的对话中,用户被迫一遍又一遍地重复任何必要的指令。
可教授性
通过将用户教授跨越对话边界存储在作为向量数据库实现的长期记忆中来解决这些限制。而不是将所有记忆复制到上下文窗口中,这将占用宝贵的空间,单个记忆(称为备忘录)会根据需要检索到上下文中。这使得用户只需将常用的事实和技能教给可教授代理一次,并在后续对话中回忆起来。
任何继承自ConversableAgent
的实例化agent
都可以通过实例化Teachability
对象并调用其add_to_agent(agent)
方法来使其可教授。
为了对备忘录的存储和检索做出有效 的决策,Teachability
对象调用TextAnalyzerAgent
的一个实例(另一个AutoGen代理)来识别和重组文本,以便记住事实、偏好和技能。请注意,这会增加涉及相对较少数量的令牌的额外LLM调用,这可能会使用户等待每个响应的时间延长几秒钟。
自己运行
AutoGen包含四个使用可教授性
的代码示例。
-
运行chat_with_teachable_agent.py与可教授代理进行对话。
-
运行test_teachable_agent.py对可教授代理进行快速单元测试。
-
使用Jupyter笔记本agentchat_teachability.ipynb逐步执行下面讨论的示例。
-
使用Jupyter笔记本agentchat_teachable_oai_assistants.ipynb通过
GPTAssistantAgent
使任意OpenAI助手可教授。
可教授性的基本用法
- 安装依赖项
在使用可教授性
之前,请先安装带有[teachable]选项的pyautogen。
pip install "pyautogen[teachable]"
- 导入代理
from autogen import UserProxyAgent, config_list_from_json
from autogen.agentchat.contrib.capabilities.teachability import Teachability
from autogen import ConversableAgent # 作为示例
- 创建 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}
- 创建代理
# 首先实例化任何继承自 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")
- 与可教授代理进行对话
# 当用户输入 '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!今天我能帮你什么?
--------------------------------------------------------------------------------