ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

CrewAI 多 Agent Crew 共享 Hindsight 记忆:共享 Bank 与按 Agent 隔离的作用域设计实战指南

CrewAI 多 Agent Crew 共享 Hindsight 记忆:共享 Bank 与按 Agent 隔离的作用域设计实战指南 CrewAI 多 Agent Crew 共享 Hindsight 记忆共享 Bank 与按 Agent 隔离的作用域设计实战指南【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight本篇技术指南聚焦于一个具体的策略决策当你在 CrewAI 中运行一个多 Agent Crew 时如何为整个 Crew 选择 Hindsight 记忆的作用域——所有角色共享一个记忆 Bank还是每个角色各自持有独立的记忆 Bank。文章将完整讲解HindsightStorage的接入方式、per_agent_banks与bank_resolver的底层实现、记忆在 kickoff 过程中如何在 agent 之间自动流动、以及共享 Bank 私有草稿混合模式的搭建方法并给出可运行的验证步骤与排错清单。读完本文你将能够为自己的 Crew 设计出既保证角色间信息协同、又避免记忆噪声污染的记忆架构。快速结论默认采用一个共享 Crew BankHindsightStorage(bank_idmy-crew)。此时每个 agent 读写的是同一份记忆——研究者Researcher的发现对写作者Writer可见。当各角色应当各自专精、避免吸收彼此的全部细节时切换到per_agent_banksTrue。混合模式保留共享 Bank 用于协调同时给某个 agent 一个私有的HindsightStorage或私有 Bank 的 reflect 工具作为草稿区。验证方法第一轮让 agent A 存入一个事实第二轮让 agent B 能主动召回该事实。为什么 Crew 需要共享记忆一个 Crew 就是一个团队而团队只有在知识不会在交接环节蒸发时才能高效运转。在单次 kickoff 中CrewAI 按顺序执行任务研究者先收集发现写作者再对其总结。在同一轮运行内CrewAI 会把任务输出沿链路传递下去。但跨轮运行——当你第二次、第三次、第十次启动同一个 Crew 时——如果没有某种持久化机制这种连续性就消失了。共享记忆把 Crew 从一次性管道变成持续积累知识的机构。当所有 agent 都写入同一个 Bank 时Crew 会积累起一套每个角色都能调用的共享事实、实体与关系集合。研究者不必重新研究上周已经覆盖过的主题写作者可以直接召回团队此前敲定的语气与结论。这正是研究型、规划型和运营型 Crew 在重复执行同类任务时的天然适配方案。需要强调Hindsight 让共享 Bank 不仅仅是转储记录。在 retain 阶段Hindsight 会从原始任务输出中抽取事实facts、实体entities与关系relationships在 recall 阶段它会依次执行语义搜索、BM25、图遍历与重排序reranking把与当前任务最相关的内容浮出水面。因此一个共享 Crew Bank 的含义不是每个人看到一切而是每个人看到当下最该看到的东西。一个共享 Crew Bank 对比按 Agent 隔离的 Bank选择的本质是你的 agent 是在协作完成同一份交付物还是在各自专精不同的关注点。应当使用一个共享 Crew Bank 的场景Agent 面向同一输出目标工作并且需要彼此的上下文例如研究者向写作者输送素材。你需要机构级或Crew 级的记忆——那些超越任何单一角色的决策、约定与发现。协调coordination比专精specialization更重要。storage HindsightStorage(bank_idresearch-crew) crew Crew(agents[researcher, writer], tasks[...], external_memoryExternalMemory(storagestorage))应当使用按 Agent 隔离的 Bank 的场景每个角色应当只保留自己较窄的记忆而不吸收其他角色的全部细节。混入其他角色的记忆会增加噪声——例如一个事实核查fact-checkingagent 的 Bank 应保持干净不应被写作者的草稿污染。专精比协调更重要。storage HindsightStorage(bank_idresearch-crew, per_agent_banksTrue) # Researcher - research-crew-researcher # Writer - research-crew-writer从源码看per_agent_banksTrue的隔离逻辑实现在HindsightStorage._resolve_bank_id()storage.py当传入 agent 时bank_id 会按f{bank_id}-{sanitized_agent}生成其中 agent 角色名先转小写、再把空格替换为连字符。单元测试 test_storage.py 印证了这一点_resolve_bank_id(Researcher)→crew-researcher_resolve_bank_id(Data Analyst)→crew-data-analyst_resolve_bank_id(None)→crew回退到基础 Bank如果默认命名规则不满足需求可以传入bank_resolver——一个签名为(bank_id, agent) - bank_id的函数实现完全自定义的 Bank 命名。从_resolve_bank_id的实现顺序看bank_resolver的优先级高于per_agent_banks只要提供了bank_resolver就会完全委托给它处理per_agent_banks不再生效。测试 test_storage.py 展示了自定义 resolver 的用法resolver lambda base, agent: fcustom-{agent} if agent else base storage HindsightStorage(bank_idcrew, bank_resolverresolver)共享记忆利于协调隔离记忆利于专精。大多数 Crew 应当从单个共享 Bank 起步只有当某个角色确实需要干净、狭窄的存储空间时才拆分。记忆如何在 agent 之间流动理解记忆流动的细节很重要因为 CrewAI 的自动记忆调用行为可能与你的直觉不同。在一次 kickoff 过程中CrewAI 会在每个任务开始时调用search()在每个任务完成后调用save()。在HindsightStorage中这两个接口被分别映射到 Hindsight 的 recall 与 retain API见 storage.py 的类文档save(value, metadata, agent)→client.retain(bank_id, content)search(query, limit)→client.recall(bank_id, query)reset()→client.delete_bank() 可选重建在单个共享 Bank 下这一过程非常直接每次save()都写入my-crew每次search()都从my-crew读取。研究者的 retain 结果会在写作者任务开始时被 recall 出来记忆由此自动向前流动。save()在写入时会附带一套结构化的元数据storage.py默认的{source: crewai}若传入了 agent 则追加agent字段CrewAI 传入的 metadata 中的键值会被统一转成字符串同时以crewai:task_output:{agent or unknown}作为 retain 的 context。测试 test_storage.py 验证了这些字段确实被传递给了retain调用。search()默认limit10、score_threshold0.5它会调用 recall 并将结果转换为 CrewAI 期望的list[dict]格式键为context、score、metadata。由于 Hindsight 返回的结果已按相关性排序search()会生成递减的合成分数score 1.0 - (i / total)storage.py并截断低于score_threshold的结果每条结果的type、source_context、occurred_start、document_id、tags等字段会被完整保留进 metadata。测试 test_storage.py 验证了这些富元数据会被逐项映射。per_agent_banksTrue下有一个重要的细节CrewAI 的search()方法并不会收到 agent 参数因此任务开始时的自动 recall 查询的是基础 Bank而不是 per-agent Bank——但save()仍然写入 per-agent Banksave()会从调用栈拿到 agent 参数而search()的签名中没有该参数源码中search()始终以agentNone调用_resolve_bank_id见 storage.py。换句话说per-agent 模式隔离了写入但没有隔离自动读取。如果你确实需要 per-agent 的搜索隔离请为每个 agent 单独创建HindsightStorage实例而不是依赖per_agent_banks。如果需要显式、由 agent 控制的记忆流动可以给相关 agent 挂上HindsightReflectTooltools.py。与返回原始 recall 片段不同agent 调用该工具会获得一个基于所有相关记忆、结合 Bank 人格/disposition 的综合式、可推理的答案——当研究者想在开工前确认我们已经知道什么、或写作者想在起草前召回此前结论时非常有用。从源码看reflect 工具名为hindsight_reflect接受bank_id、budget默认mid和可选的reflect_context会调用 Hindsight 客户端的reflectAPI当没有相关记忆时会返回No relevant memories found to reflect on.。由于 reflect 工具持有自己的bank_id你可以在同一个 Crew 里让一个 agent 指向共享 Bank、另一个指向私有 Bank。将 CrewAI 连接到 Hindsight如果尚未安装并接通集成请先完成配置再回来选择作用域策略。完整的接入步骤在配套指南 Guide: Add CrewAI Persistent Memory with Hindsight 中涵盖pip install hindsight-crewai、configure(...)Cloud 或自托管以及把HindsightStorage接入ExternalMemory。连接的基础代码如下对应集成包 README 的 Quick Start见 hindsight-integrations/crewai/README.mdfrom hindsight_crewai import configure, HindsightStorage from crewai.memory.external.external_memory import ExternalMemory from crewai import Agent, Crew, Task # 步骤 1让 CrewAI 指向 Hindsight configure( hindsight_api_urlhttps://api.hindsight.vectorize.io, api_keyhsk_..., # 或设置 HINDSIGHT_API_KEY 环境变量 ) # 步骤 2创建带 Hindsight 记忆的 Crew crew Crew( agents[ Agent(roleResearcher, goalFind information, backstory...), Agent(roleWriter, goalWrite reports, backstory...), ], tasks[ Task(descriptionResearch AI trends, expected_outputReport), ], external_memoryExternalMemory( storageHindsightStorage(bank_idmy-crew) ), ) crew.kickoff()接入之后CrewAI 会自动在每个任务开始时查询记忆、在每个任务完成后把任务输出存入 Hindsight记忆跨 run 持久化Crew 会随时间不断学习。自托管本地开发Hindsight 并不强制要求云服务。如果本地运行着 Hindsight API 服务集成包 README 提到可用本地启动脚本拉起服务只需configure(hindsight_api_urlhttp://localhost:8888)并省略 API key。配置参数速查configure()与HindsightStorage的构造参数共享一套默认值体系见 config.py 与 README.md 的 Configuration Reference参数默认值说明hindsight_api_urlhttps://api.hindsight.vectorize.ioHindsight API 地址api_keyHINDSIGHT_API_KEY环境变量认证密钥budgetmidrecall 预算级别low/mid/highmax_tokens4096recall 结果的最大 token 数tagsNone存储记忆时附加的标签recall_tagsNone检索时用于过滤的标签recall_tags_matchany标签匹配模式any/all/any_strict/all_strictper_agent_banksFalse是否为每个 agent 分配独立 Bankbank_resolverNone自定义(bank_id, agent) - bank_id函数missionNoneBank 使命用于组织记忆verboseFalse是否开启详细日志需要注意构造参数优先于全局配置。HindsightStorage.__init__中显式传入的参数会覆盖configure()设定的全局值未显式传入的参数才回退到全局配置或默认值storage.py。测试 test_storage.py 分别验证了构造覆盖全局与未配置时回退默认值两条路径。此外集成内部通过call_sync_compat.py把所有 Hindsight 客户端调用投递到一个带独立事件循环的专用线程池max_workers2超时 60 秒中执行——这是为了让同步的 hindsight-client 方法与 CrewAI 内部的异步事件循环共存避免 Event loop is closed 与 aiohttp 会话/循环绑定问题。Hindsight 客户端本身也按线程懒加载threading.local保证每个线程的 aiohttp 会话绑定在自己线程的事件循环上。混合模式共享上下文 私有草稿你不必只选一个极端。一个常见的模式是共享 Crew Bank 负责协调加上一个私有 Bank 给需要草稿空间的 agent。共享 Bank 承载 Crew 的机构记忆所有角色都该看到的发现、决策与约定。然后对于会产生大量中间推理、而你又不希望这些推理污染共享存储的 agent——例如一个反复打磨草稿的分析师——可以给它第二个私有的HindsightStorage或指向私有 Bank 的 reflect 工具让它独自写入。# 共享 Crew 记忆所有角色通过这个 Bank 协调 shared HindsightStorage(bank_idresearch-crew, missionTrack research findings and crew decisions.) # 分析师的私有草稿区不进入共享 Bank analyst_scratch HindsightReflectTool(bank_idresearch-crew-analyst-scratch) analyst Agent(roleAnalyst, goal..., backstory..., tools[analyst_scratch]) crew Crew(agents[researcher, analyst, writer], tasks[...], external_memoryExternalMemory(storageshared))Crew 通过ExternalMemory经共享 Bank 协调而分析师通过 reflect 工具在自己的私有 Bank 上推理。为共享 Bank 设置mission能帮助 Hindsight 围绕 Crew 的真实目标组织 retain 的内容。从源码看mission的另一个作用是触发急切的 Bank 创建当HindsightStorage(..., mission...)被实例化时会立即调用client.create_bank(bank_id, namebank_id, missionmission)创建或更新该 Bankstorage.py并通过_created_banks集合保证每个会话内只创建一次创建失败如 Bank 已存在也不会中断流程。reset()同样会利用mission删除 Bank 后按原使命重建storage.py。验证共享记忆是否生效共享记忆的意义在于一个 agent 的输出能在后续轮次出现在另一个 agent 的上下文中。请精确地验证这一点运行一次 Crew让靠前的 agent研究者产出包含一个醒目事实或决策的输出。让本轮运行结束使 CrewAI 的save()把该输出 retain 到共享 Bank。再次启动 Crew将相关任务交给另一个 agent写作者。确认写作者能在没有人工提醒的情况下召回之前的事实。举例第一轮让研究者分析 Rust 的优势并存储结论第二轮把任务改为对比 Rust 与 Go——如果 Crew 能自动带回第一轮的 Rust 分析说明共享记忆正在工作。如果第二轮无法召回第一轮的内容开启verboseTrue确认两轮使用了相同的bank_id并检查 retain 调用是否真的完成。verbose会在 retain/recall 成功或失败时输出详细日志storage.py例如 Stored memory to bank X (agent..., len...) 与 Recalled N memories from bank X for query: ...这是定位问题的最快入口。常见错误误以为 per-agent Bank 也能隔离 recallper_agent_banksTrue只隔离save()的写入而 CrewAI 的自动search()仍查询基础 Bank——因为它不向 storage 传递 agent 参数。真正的 per-agent 搜索隔离请为每个 agent 使用独立的HindsightStorage实例。过早拆分为 per-agent Bank大多数 Crew 首先受益于共享记忆。只有当某个角色的 Bank 确实需要保持干净、狭窄时再隔离——不要默认拆分。在两次运行之间更换 bank_idrecall 只有在两轮运行使用相同bank_id时才能带回早期上下文。用不同的 bank_id 测试第二轮看起来像是召回坏了实际上只是作用域不匹配。mission 过于空泛如果设置了 Bankmission请确保它足够具体以指导抽取。空泛的 mission 会让 Hindsight 几乎没有抓手来组织记忆。一个具体的反面参考是把使命写成类似 Track research findings and crew decisions. 这样明确指向该 Crew 业务目标的表述。FAQ我必须要 Hindsight Cloud 吗不需要。自托管的 Hindsight 服务同样可用——把configure(hindsight_api_url...)指向本地 API例如http://localhost:8888并省略 API key 即可。默认应该让整个 Crew 共享一个 Bank 吗通常是的。先从单个共享 Bank 起步用于协调只有当某个具体角色需要隔离、更窄的记忆时才拆分为 per-agent Bank。一个 agent 的记忆如何到达另一个 agent通过共享 Bank。使用单一bank_id时每个 agent 的save()都写入它、每个任务开始时的search()都从它读取因此发现会自动向前流动。需要显式、由 agent 控制的召回时可添加HindsightReflectTool。可以在一个 Crew 里混用共享与隔离记忆吗可以。通过ExternalMemory使用共享 Bank 负责协调同时给特定 agent 一个私有的HindsightStorage实例或指向私有 Bank 的 reflect 工具作为草稿区。下一步先按 CrewAI 接入指南 完成集成配置再回来确定作用域策略。查阅 hindsight-crewai 集成包 获取安装、Quick Start 与完整配置参考。深入 HindsightStorage 源码 与 单元测试 理解 retain/recall 的精确映射与 per-agent Bank 解析规则。了解 reflect 工具源码掌握 disposition-aware 记忆综合能力的调用方式。【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表