ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

AutoGen 任务中心记忆(Task-Centric Memory)实战指南:让 Agent 学会跨会话快速学习

AutoGen 任务中心记忆(Task-Centric Memory)实战指南:让 Agent 学会跨会话快速学习 AutoGen 任务中心记忆Task-Centric Memory实战指南让 Agent 学会跨会话快速学习【免费下载链接】autogenA programming framework for agentic AI项目地址: https://gitcode.com/GitHub_Trending/au/autogenAutoGen 的任务中心记忆Task-Centric Memory是一套处于实验研究阶段的记忆子系统它让 Agent 不必改动自身代码即可获得快速、持久、类记忆式的学习能力——既能把用户在某次会话中给出的建议、纠正、示范沉淀下来也能从自身的试错经验中学习并在下一次会话开始时自动检索、复用这些经验。本文以仓库中python/samples/task_centric_memory目录下的完整样例代码与配置为骨架系统讲解其安装、五种学习场景的用法、YAML 配置项语义并结合 memory_controller.py 与 MemoryBank 实现 的源码说明其底层存储与检索原理帮助读者把这一能力接入自己的 AutoGen 应用。任务中心记忆解决什么问题大模型 Agent 的记忆天然受限于上下文窗口一次会话结束后用户教给它的偏好、修正过的错误、示范过的解题过程都会丢失而把海量历史记录全部塞进上下文既不经济检索效率也低。任务中心记忆Task-Centric Memory的出发点是让 Agent 在不依赖上下文窗口的前提下持续、快速地学习具体能力包括直接进行记忆的存储与检索直接读写 task–insight 记忆对从用户的建议与纠正中学习从用户的操作示范中学习从Agent 自身经验试错中学习在遇到与历史任务相似的新任务时避免重蹈覆辙。这些样例代码位于仓库的 python/samples/task_centric_memory 目录每个样例都连接了一个可选择的 Agent默认AssistantAgent也可切换为MagenticOneGroupChat且无需修改 Agent 自身任何代码。每个样例是独立的 Python 脚本通过 YAML 数据文件与配置文件驱动方便按需修改。⚠️ 状态说明该目录与底层实现模块均明确标注EXPERIMENTAL, RESEARCH IN PROGRESS见 样例 README 与 模块 README属于进行中的研究性功能接口与行为可能随版本演进而调整。核心架构与组件为了让下文各样例更好理解先给出整体组件划分模块级 README 中的架构示意任务中心记忆系统由以下部分构成Memory Controller记忆控制器实现各种快速学习方法管理信息与记忆库Memory Bank之间的流动负责记忆的创建、存储、检索与校验。Memory Bank记忆库底层是一个向量数据库vector DB及相关结构用于持久化保存记忆memo。源码见 _memory_bank.py。Agent or Team被加持的 Agent/团队如样例中默认的AssistantAgent或可选的MagenticOneGroupChat团队。Apprentice / App / Service负责实例化 Agent 与记忆控制器、并在两者之间路由信息的应用层代码。Apprentice学徒这个名字意在表明记忆 Agent 的组合像学徒一样在工作中快速学习。仓库在 utils/apprentice.py 中提供了一个最小参考实现Apprentice类仅供演示与测试大多数生产应用会用自己的代码替代它。值得强调的是接入方式有两种侵入式像模块 README 的 Quickstart 那样在自定义的RoutedAgent里直接调用memory_controller.retrieve_relevant_memos()把检索到的记忆手工拼进发给模型的消息里非侵入式样例采用通过 Teachability 这一实现了autogen_core.memory.Memory接口的封装把它作为AssistantAgent(memory[...])的 memory 参数挂载即可在不改 Agent 代码的前提下获得可教能力。安装与环境准备样例目录内没有任何独立的requirements.txt安装依赖即安装 AutoGen 本体与对应的扩展包pip install -U autogen-agentchat autogen-ext[openai] autogen-ext[task-centric-memory]其中autogen-agentchat提供AssistantAgent、Console等高层 AgentChat APIautogen-ext[openai]提供OpenAIChatCompletionClient等 OpenAI 模型客户端扩展autogen-ext[task-centric-memory]安装实验性的任务中心记忆模块即autogen_ext.experimental.task_centric_memory包。随后把 OpenAI 密钥写入环境变量export OPENAI_API_KEYsk-...若你使用的是其他模型或非 OpenAI 后端可修改样例目录下的 utils.py其中的create_oai_client()封装了OpenAIChatCompletionClient的创建参数直接取自 YAML 配置的client区块以及各脚本中OpenAIChatCompletionClient(model...)一行按需换成其他客户端实现。样例全景与运行方法五个样例按复杂度递增排列运行前请先在终端切换到python/samples/task_centric_memory目录再执行命令场景脚本配置文件学习形式让 AssistantAgent 可教交互式演示chat_with_teachable_agent.py无参数在脚本内用户建议/教导的跨会话复用直接记忆存储与检索评测eval_retrieval.pyconfigs/retrieval.yaml直接读写 task–insight 记忆从用户建议与纠正中学习eval_teachability.pyconfigs/teachability.yaml用户教导从用户示范中学习eval_learning_from_demonstration.pyconfigs/demonstration.yaml一次示范从自身经验中学习自教eval_self_teaching.pyconfigs/self_teaching.yaml后台试错学习循环运行每个评测脚本的典型命令形式为python eval_retrieval.py configs/retrieval.yaml python eval_teachability.py configs/teachability.yaml python eval_learning_from_demonstration.py configs/demonstration.yaml python eval_self_teaching.py configs/self_teaching.yaml注意脚本统一按python script path to *.yaml file的方式接收配置文件路径参数见各脚本__main__段对sys.argv的解析漏传配置会打印用法提示后退出。由于模型输出具有非确定性每次运行结果会有波动README 中给出的接近 100%通常成功等结论是经验性描述而非保证值。配置与数据文件结构所有评测样例都由PageLogger 配置 → 模型客户端参数 → Apprentice/MemoryController/MemoryBank 参数 → test 数据与超参四层 YAML 驱动。以一个典型的teachability.yaml内容取自 configs/teachability.yaml为例PageLogger: level: DEBUG # DEBUG, INFO, WARNING, ERROR, CRITICAL, or NONE. path: ./pagelogs/teachability client: model: gpt-4o-2024-08-06 temperature: 0.8 max_completion_tokens: 4096 presence_penalty: 0.0 frequency_penalty: 0.0 top_p: 1.0 max_retries: 65535 Apprentice: name_of_agent_or_team: AssistantAgent # AssistantAgent or MagenticOneGroupChat disable_prefix_caching: 1 # If true, prepends a small random string to the context, to decorrelate repeated runs. MemoryController: max_train_trials: 10 max_test_trials: 3 MemoryBank: path: ./memory_bank/teachability relevance_conversion_threshold: 1.7 n_results: 25 distance_threshold: 100 test: task_file: data_files/tasks/autogen_package.yaml # The task being tested. insight_file: data_files/insights/add_topic.yaml # Advice provided to help solve the task.PageLogger 区块任务中心记忆运行时会输出详细的页面化日志。level取值为DEBUG、INFO、WARNING、ERROR、CRITICAL或NONENONE表示完全关闭日志path指定 HTML 页面日志的输出目录如./pagelogs/teachability。运行后可在浏览器打开该目录下生成的页面例如./pagelogs/teachability/0 Call Tree.html实时观察一次运行中记忆是如何被创建、检索与注入上下文的。该日志类实现在 utils/page_logger.py。client 区块模型客户端参数。各参数被 utils.py 的create_oai_client()逐项读出并传给OpenAIChatCompletionClient参数说明model使用的模型名如gpt-4o-2024-08-06temperature采样温度默认 0.8max_completion_tokens生成上限样例默认 4096传入时作为max_tokenspresence_penalty/frequency_penalty存在/频率惩罚默认 0.0top_p核采样默认 1.0max_retries请求最大重试次数样例默认 65535极高值便于研究型长时任务Apprentice / MemoryController / MemoryBank 区块Apprentice下检索样例中则是顶层的MemoryController主要包含两层配置name_of_agent_or_team选择把记忆挂到哪个目标上注释明确给出两个合法值AssistantAgent或MagenticOneGroupChat。AssistantAgent使用一套固定的多步系统提示词。disable_prefix_caching置 1真时会在上下文前拼接一小段随机字符串使多次重复运行的结果去相关便于评测。MemoryController与MemoryBank的可配置项与源码中的默认值对照如下参见 memory_controller.py 与 _memory_bank.py配置路径参数源码默认值作用MemoryControllergeneralize_taskTrue是否把任务改写为更一般化的表述MemoryControllerrevise_generalized_taskTrue是否先批判再改写一般化后的任务MemoryControllergenerate_topicsTrue检索是基于任务本身还是基于从任务提取的话题topicMemoryControllervalidate_memosTrue是否对检索到的候选 memo 做最后的 LLM 校验MemoryControllermax_memos_to_retrieve10retrieve_relevant_memos()返回 memo 的最大数量MemoryControllermax_train_trials10对一个任务训练时最多尝试的学习迭代次数MemoryControllermax_test_trials3判断任务失败时最多尝试的总次数MemoryController.MemoryBankpath./memory_bank/default记忆库目录MemoryController.MemoryBankrelevance_conversion_threshold1.7相关度归一化阈值MemoryController.MemoryBankn_results25对任一给定话题最多返回的相关结果数MemoryController.MemoryBankdistance_threshold100一条 memo 能被检索到所需的最大字符串距离持久化机制源码事实MemoryBank会把向量/字符串相似度映射存到path/string_map目录把 memo 字典以 pickle 形式存到path/uid_memo_dict.pkl构造时若resetFalse且 pkl 已存在会从磁盘加载既有 memo日志会输出LOADING MEMOS FROM DISK与N MEMOS LOADED若resetTrue则清空后重建。记忆原子单元是Memo数据类仅含两个字段task任务描述可为空与insight提示、方案、计划等任意有助于解决相似任务的文本。test 区块各评测各不相同每个评测脚本的test区块承载各自的输入数据与超参其语义分别见对应小节。数据本体统一放在data_files/下tasks/目录中的 YAML 含task_description与expected_answer两个字段expected_answer供Grader用模型核对答案是否正确insights/目录中的 YAML 则含一条insight文本。例如 data_files/tasks/autogen_package.yaml 的任务是能否在 autogen 下新建一个基于 autogen 的 copilot 扩展 Agent 的包其配套建议 data_files/insights/add_topic.yaml 则是放在独立 repo 并打上 autogen-extension topic 标签这类需要人类常识才答得对的建议——这正是评测从教导中学习的素材。场景一让 AssistantAgent 可教交互式演示chat_with_teachable_agent.py 是最短、最直观的入门样例核心代码如下from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.ui import Console from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_ext.experimental.task_centric_memory import MemoryController from autogen_ext.experimental.task_centric_memory.utils import Teachability async def main(): # Create a client client OpenAIChatCompletionClient(modelgpt-4o-2024-08-06, ) # Create an instance of Task-Centric Memory, passing minimal parameters for this simple example memory_controller MemoryController(resetFalse, clientclient) # Wrap the memory controller in a Teachability instance teachability Teachability(memory_controllermemory_controller) # Create an AssistantAgent, and attach teachability as its memory assistant_agent AssistantAgent( nameteachable_agent, system_message You are a helpful AI assistant, with the special ability to remember user teachings from prior conversations., model_clientclient, memory[teachability], ) # Enter a loop to chat with the teachable agent print(Now chatting with a teachable agent. Please enter your first message. Type exit or quit to quit.) while True: user_input input(\nYou: ) if user_input.lower() in [exit, quit]: break await Console(assistant_agent.run_stream(taskuser_input)) # Close the connection to the client await client.close()它演示了三步接驳的关键模式这也是将任务中心记忆挂接到任何 Agent 的标准姿势创建MemoryController(resetFalse, clientclient)——resetFalse表示保留磁盘上已有的记忆库若希望从空记忆开始可在首次运行前删除memory_bank目录用Teachability(memory_controller...)把控制器包装成实现了autogen_core.memory.Memory接口的封装把该实例以memory[teachability]的形式作为AssistantAgent的memory参数传入。Teachability之所以是非侵入的关键在于它实现了Memory接口的update_context()每次对话轮次它都会检查最近一条用户消息把其中的教导性文本抽取出来经模型处理存入记忆库同时把检索到的相关记忆以Potentially relevant memories:开头的内容追加进模型上下文见 utils/teachability.pyAgent 自身代码因此完全不需要改动。运行与演示README 实录跨两次会话展示记忆生效# 首次运行前清掉可能存在的旧记忆库 rm -r memory_bank python chat_with_teachable_agent.py Now chatting with a teachable agent. Please enter your first message. Type exit or quit to quit. You: How many items should be put in research summaries? ---------- user ---------- How many items should be put in research summaries? ---------- teachable_agent ---------- generates a long discussion You: Whenever asked to prepare a research summary, try to cover just the 5 top items. ---------- user ---------- Whenever asked to prepare a research summary, try to cover just the 5 top items. ---------- teachable_agent ---------- discusses the advice You: quit # 第二次启动同一记忆库Agent 已记住上一条教导 python chat_with_teachable_agent.py Now chatting with a teachable agent. Please enter your first message. Type exit or quit to quit. You: How many items should be put in research summaries? ---------- user ---------- How many items should be put in research summaries? ---------- teachable_agent ---------- [MemoryContent(contentWhenever asked to prepare a research summary, try to cover just the 5 top items., mime_typeMemoryMimeType.TEXT, metadata{})] ---------- teachable_agent ---------- generates a more appropriate answer第二次会话中Agent 在回答前先检索并注入了记忆输出中的MemoryContent(...)正是从记忆库检索到的命中项随后给出了符合教导的答案。这直观地展示了学习发生在一次会话内复用跨越了会话边界全程依赖持久化的记忆库而非上下文窗口。若需清空记忆重来删除对应memory_bank目录即可。场景二直接记忆存储与检索评测精度与召回eval_retrieval.py 完全不涉及 Agent是理解任务中心记忆数据模型的最小样例。它演示应用如何直接调用MemoryControllertask任务应用可能交给 Agent 的任意文本指令insight洞见有助于 Agent 完成此类任务的任意文本提示、建议、示范或计划memo记忆一条 task–insight 组合是存储与检索的原子单位。典型应用按某种交错顺序执行三步反复调用add_memo()存储若干 task–insight 记忆对反复调用retrieve_relevant_memos()为某个新任务检索相关记忆把检索到的 insight 塞进 Agent 的上下文窗口第三步在 memory_controller.py 的 docstring 快速示例以及模块 README 的MemoryEnabledAgent示例中都有体现——后者演示了把formatted_memos作为一条额外的UserMessage拼入模型输入。该脚本的评测逻辑eval_retrieval.pyreset_memory()清空记忆库依据 configs/retrieval.yaml 中的task_insight_relevance矩阵对标记为2互相相关且应存入记忆的 task–insight 对调用add_memo()入库对每个任务调用retrieve_relevant_memos()把检索结果与真实相关集合比对累计命中数后计算并打印 precision精确率与 recall召回率。retrieval.yaml的评测矩阵以行列对应任务与洞察其中2表示该对互相相关且已存储1表示互相相关但未存储0表示互不相关test: tasks: - data_files/tasks/10_liars.yaml - data_files/tasks/100_vampires.yaml - data_files/tasks/autogen_package.yaml - data_files/tasks/cell_towers_1.yaml - data_files/tasks/cell_towers_2.yaml insights: - data_files/insights/add_topic.yaml - data_files/insights/cell_towers_2_demo.yaml - data_files/insights/liar_advice.yaml task_insight_relevance: # Rows and columns represent (respectively) the tasks and insights listed above. - [0, 0, 2] # 2 denotes a mutually relevant task-insight pair, stored in memory. - [0, 0, 1] # 1 denotes a mutually relevant task-insight pair, not stored in memory. - [2, 0, 0] # 0 denotes a mutually irrelevant task-insight pair. - [0, 1, 0] - [0, 2, 0]运行命令与经验性结果python eval_retrieval.py configs/retrieval.yamlREADME 指出该样例的 precision 与 recall 通常接近 100%这是对样例规模的描述性结论非产品指标承诺。场景三从用户建议与纠正中学习eval_teachability.py 评测可教性用脚本模拟三段对话借此说明先失败 → 给予建议清空上下文→ 靠记忆成功的完整闭环清空记忆后向 Agent 抛出任务task_description预期 Agent 因缺少该知识而答错上下文窗口清空后把insight作为用户消息喂给 Agent——此刻 Agent 学到了新知识Apprentice会在后台把教导存入记忆库再次清空上下文并重问任务看 Agent 能否靠检索记忆而不是靠同窗口内的上下文来作答。正确性由Grader模型评分器见 utils/grader.py对照expected_answer判定。若改写为评价脚本之外的自定义应用utils/apprentice.py 的Apprentice.handle_user_message()可被复用也可完全换成自己的路由代码。配套配置与数据configs/teachability.yamltest: task_file: data_files/tasks/autogen_package.yaml # The task being tested. insight_file: data_files/insights/add_topic.yaml # Advice provided to help solve the task.运行python eval_teachability.py configs/teachability.yamlREADME 的经验性结论借助记忆该样例通常成功即教导前答错、教导后答对。场景四从用户示范中学习eval_learning_from_demonstration.py配置见 configs/demonstration.yaml检验的是举一反三能力让 Agent 连续 10 次执行一个它通常失败的推理任务main_task_file例如cell_towers_1上下文清空后给 Agent 一次对相似但不同任务demo_task_file例如cell_towers_2的完整解题示范demo_solution_file例如cell_towers_2_demo清空上下文后再对原任务测 10 次观察 Agent 能否把示范迁移应用到原始任务上。test: main_task_file: data_files/tasks/cell_towers_1.yaml # The task being tested. demo_task_file: data_files/tasks/cell_towers_2.yaml # A similar but different task. demo_solution_file: data_files/insights/cell_towers_2_demo.yaml # A demonstration of solving the second task. num_trials: 10运行python eval_learning_from_demonstration.py configs/demonstration.yamlREADME 的经验性结论示范存入记忆后Agent 的成功率往往有可测量的提升。这里体现了task 与 demonstration 一并作为 insight 存储、用于解决相似但不同任务的设计——示范不是被当作死记硬背的答案而是被当作可迁移的解题模式。场景五从自身经验中学习自教学习循环eval_self_teaching.py配置见 configs/self_teaching.yaml演示最复杂的自教self-teachingAgent 不依赖任何用户输入只凭自动的成功/失败反馈在后台学习循环中自己找到解法并存入记忆。关键前提是任务必须可验证且对环境无副作用side-effect free这样脚本才能用自动反馈代替人工评判。其流程可概括为结合模块级 README 的 Memory Creation and Storage 描述对任务做若干次测试以发现失败一旦发现失败让模型分析 Agent 的响应执行诊断推理或信息缺失的原因 → 把原因措辞成一句老师对学生式的泛化建议 → 把建议临时拼到任务描述上 → 回到第 1 步的迭代当某条建议能连续多次帮助 Agent 解题时就把它作为 insight 写入记忆对每条待存的 insight提示 LLM 生成一组自由形式、多词的话题再对每个话题做向量嵌入存入映射话题 → 相关 insight的向量库。self_teaching.yaml的test区块进一步定义了训练与泛化测试的规模test: task_file_1: data_files/tasks/10_liars.yaml # Train and test on this task. task_file_2: data_files/tasks/100_vampires.yaml # Test generalization on this different, similar task. num_loops: 10 num_final_test_trials: 3脚本逻辑eval_self_teaching.py先以空记忆库开始重复num_loops次用任务 1 训练 → 在任务 1 上以use_memoryTrue测num_final_test_trials次 → 在相似但不同的任务 2 上同样测试的外循环分别累计两个任务的成功率最后报告各自的总成功率。运行python eval_self_teaching.py configs/self_teaching.yamlREADME 的经验性结论借助记忆Agent 在第二轮记忆已存在的测试中通常能同时成功完成两个任务——任务 2 的成绩正是对泛化能力的检验证明学到的不是针对单一问题的死答案。记忆的写入与读取流水线源码级原理综合模块 README 与源码可以归纳任务中心记忆在单次交互背后的完整流水线这也是它区别于简单把整段对话存起来再全文检索的关键写入Memory Creation and Storage依据学习类型产出 insight用户建议被模型提取后作为 insight用户示范与其 task 一并存储自教循环则由后台学习循环产出建议对每条 insightLLM 生成多个自由形式的多词话题每个话题被嵌入为定长向量连同其指向的 insight 一起存进向量库string_map目录 uid_memo_dict.pkl。读取Memory Retrieval and Usage先由 LLM 把新任务改写为更一般化的形式generalize_task/revise_generalized_task从一般化任务生成一组多词查询话题从向量库中为每个查询话题取回最相似的一批历史话题及其映射的 insightn_results上限依据候选话题相对查询话题的聚合相似度过滤候选 memodistance_threshold/relevance_conversion_threshold控制归一化与阈值最后一轮过滤中用 LLM 校验那些看起来可能有助于当前任务的 insightvalidate_memos。通过校验的 insight 会以类似Important insights that may help solve tasks like this的标题列在任务描述之前随任务一起交给 Agent 处理。上下文注入以 Teachability 为例utils/teachability.py 在每次轮次更新上下文时会取最近一条用户文本调用query()做记忆检索将命中结果以Potentially relevant memories:的编号列表追加到模型上下文同时把该条用户消息中的教导抽取出来转成可供add_memo()使用的记忆。检索-注入-沉淀三件事在每轮自动发生使 Agent 无需改一行代码就同时具备用得上旧记忆与存得下新教导两种能力。观测、调试与常见操作可视化观测运行评测前请留意配置顶部PageLogger.level与path。设为DEBUG时任务中心记忆会把函数的进入/离开、内存加载、检索计数、评测结果等全部写入path下的 HTML 页面如./pagelogs/teachability/0 Call Tree.html可用浏览器打开实时追踪一条建议是如何被存下、又是如何被检索并注入的若想完全关闭日志把level设为NONE。清空记忆MemoryController(resetTrue, ...)或脚本里的reset_memory()会在启动/评测前清空记忆库对持久化目录memory_bank/以及为单个评测生成的memory_bank/场景名子目录可直接删除下次运行从空记忆开始。重复运行的变量控制disable_prefix_caching: 1会在上下文前置入随机前缀以去相关而由于模型输出本身非确定同一评测多次运行的结果仍会波动做对比时应取多轮均值。切换目标 Agent/团队将各配置中Apprentice.name_of_agent_or_team从AssistantAgent改为MagenticOneGroupChat即可把同样的记忆能力挂到多 Agent 群聊团队上样例代码无需改动。小结与扩展阅读任务中心记忆把记忆从被动塞入上下文的做法升级为一套任务/话题驱动的快速学习机制MemoryController负责四种学习形式的写入与检索MemoryBank用向量库做持久化Teachability等封装把能力以Memory接口形式零侵入挂到 AutoGen Agent 上。五个样例分别覆盖了直接存储检索、用户教导、用户示范、自教学习与跨会话复用配合PageLogger的页面日志可逐帧观察记忆生命周期。进一步深入可参考样例目录入口python/samples/task_centric_memory/README.md交互式可教 Agentchat_with_teachable_agent.py全部 YAML 配置与数据configs、data_files记忆控制器实现配置项与默认值memory_controller.py记忆库与 Memo 数据模型memory_bank.pyMemory 接口封装与应用参考代码utils/teachability.py、utils/apprentice.py模块级设计文档与最小可用示例task_centric_memory/README.md需要再次强调的是该功能标注为EXPERIMENTAL, RESEARCH IN PROGRESS本文所涉配置项、接口与行为均以当前仓库gpt-4o-2024-08-06等模型配置、YAML 结构、源码默认值为准接入生产系统前请务必结合你所用的 AutoGen 版本核对 API 兼容性。【免费下载链接】autogenA programming framework for agentic AI项目地址: https://gitcode.com/GitHub_Trending/au/autogen创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表