Hindsight × Google ADK:为 ADK Agent 接入持久化长期记忆的两种实战模式

发布时间:2026/9/15 14:57:43

Hindsight × Google ADK:为 ADK Agent 接入持久化长期记忆的两种实战模式 Hindsight × Google ADK为 ADK Agent 接入持久化长期记忆的两种实战模式【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsightHindsight 为 Google ADKAgent Development KitAgent 提供持久化的长期记忆能力官方集成包hindsight-google-adk通过自动记忆HindsightMemoryService实现 ADK 的BaseMemoryService与显式工具create_hindsight_tools返回hindsight_retain/hindsight_recall/hindsight_reflect三个FunctionTool两种互补模式接入会话生命周期。本文基于仓库中 google-adk 集成文档 与 集成包源码完整讲解安装、配置、Bank ID 推导、标签隔离与生产实践并深入到源码与测试验证底层行为读完即可在项目中落地可跨会话复用的 Agent 记忆。集成原理两种互补的接入模式hindsight-google-adk源码位于 hindsight-integrations/google-adk是 Hindsight 与 Google ADK 之间的桥梁其init.py 对外暴露了核心 API。两种模式解决的是不同层面的问题HindsightMemoryService实现 ADK 的BaseMemoryService。将其传给Runner(memory_service...)后会话结束时由 Runner 自动触发记忆保留Agent 调用search_memory时从 Hindsight 返回匹配结果。适合零侵入、全自动的接入方式。create_hindsight_tools(...)返回一组 ADKFunctionToolhindsight_retain、hindsight_recall、hindsight_reflect由模型在单轮对话内自主决定何时调用。适合需要精细控制记忆写入/读取时机的场景。两种模式可以同时使用Runner(memory_service...)负责会话结束时的自动 retaintoolscreate_hindsight_tools(...)负责轮次中的 Agent 主动 recall只要 Bank ID 对齐两者共享同一个记忆库。安装与环境要求pip install hindsight-google-adk根据 pyproject.toml 声明运行时要求如下要求版本Python3.10支持 3.10 / 3.11 / 3.12google-adk2.0hindsight-client0.4.0仓库内已提供 uv.lock 锁定依赖版本开发组件的测试依赖pytest、pytest-asyncio、ruff定义在pyproject.toml的[dependency-groups]中。模式一自动记忆BaseMemoryService将HindsightMemoryService注入 Runner会话结束后记忆自动落库import asyncio from google.adk.agents import LlmAgent from google.adk.runners import Runner from google.adk.sessions import InMemorySessionService from hindsight_google_adk import HindsightMemoryService memory HindsightMemoryService.from_url( hindsight_api_urlhttps://api.hindsight.vectorize.io, api_keyhsk_..., ) agent LlmAgent(nameassistant, modelgemini-2.0-flash) runner Runner( app_namemy-app, agentagent, session_serviceInMemorySessionService(), memory_servicememory, ) # ... 正常使用 runner.run_async(...)记忆完全自动源码层面的行为验证从 memory.py 可以确认自动记忆的完整链路会话写入add_session_to_memory(session)将会话内所有事件的文本部分按author: text格式逐行拼接_events_to_document见 memory.py并以session.id作为document_id调用aretain写入 Hindsight会话为空或没有文本内容时直接跳过不产生空文档。事件级写入add_events_to_memory(...)支持增量保留单批事件document_id形如{session_id}-{随机8位hex}无 session_id 时前缀为events-并自动附加session:{session_id}标签。记忆条目写入add_memory(...)将 ADK 的MemoryEntry逐条转换为 Hindsight retain 调用author与custom_metadata会并入 metadata。查询映射search_memory(...)调用arecall把返回结果映射为MemoryEntryauthorhindsight、携带timestamp再包装为 ADK 的SearchMemoryResponse返回。关键的设计决策是容错所有add_*与search_memory在 Hindsight 调用失败时只记录 ERROR 日志、绝不向 Runner 抛异常保证记忆后端故障不影响 Agent 主流程见 memory.py。相关行为在 tests/test_memory.pyretain 失败仅记录日志与 tests/test_memory.pyrecall 失败返回空结果中有测试覆盖。Bank ID 推导记忆如何按用户隔离默认情况下每一对(app_name, user_id)拥有独立的 Hindsight Bank{app_name}::{user_id}例如测试用例 test_bank_id_default_template 验证(apple, alice)对应bank_id apple::alice。该模板是HindsightAdkConfig.bank_id_template的默认值见 config.py并通过_bank_id()方法用str.format渲染见 memory.py。可通过bank_id_template覆盖实现不同的隔离粒度# 按用户隔离、跨应用共享 HindsightMemoryService.from_url( hindsight_api_urlhttps://api.hindsight.vectorize.io, api_keyhsk_..., bank_id_templateuser::{user_id}, ) # 静态 Bank全用户共享 HindsightMemoryService.from_url( hindsight_api_urlhttps://api.hindsight.vectorize.io, api_keyhsk_..., bank_id_templatemy-shared-bank, )模板中必须含{app_name}或{user_id}占位符才能动态推导静态字符串则让所有用户/应用落同一个 Bank。模式二显式工具FunctionTool当希望模型在轮次内自主决定读写记忆时使用工具工厂from google.adk.agents import LlmAgent from hindsight_google_adk import create_hindsight_tools tools create_hindsight_tools( bank_iduser-123, hindsight_api_urlhttps://api.hindsight.vectorize.io, api_keyhsk_..., ) agent LlmAgent( nameassistant, modelgemini-2.0-flash, toolstools, )Agent 会获得三个工具可用include_retain/include_recall/include_reflect开关裁剪默认全部开启见 tools.pyhindsight_retain(content)— 将信息存入长期记忆调用aretain成功返回Memory stored successfully.hindsight_recall(query)— 搜索记忆并返回编号列表例如1. ...\n2. ...无结果时返回友好提示No relevant memories found.hindsight_reflect(query)— 基于记忆综合生成连贯答案调用areflect返回response.text。工具实现细节tools.py值得注意三个工具均为异步函数通过FunctionTool(...)包装后可直接传给LlmAgent(tools[...])hindsight_recall支持recall_types事实类型过滤world/experience/observation与recall_include_entities结果附带实体信息hindsight_reflect额外支持reflect_context补充上下文、reflect_response_schemaJSON Schema 约束输出格式、reflect_tags/reflect_tags_match默认回退到recall_tags/recall_tags_match与自动模式不同显式工具在失败时会将底层异常包装为HindsightError抛出见 tools.py让 Agent 感知失败并做出反应。测试见 tests/test_tools.py。全局配置 configure()统一默认值在应用启动时调用一次configure(...)后续所有HindsightMemoryService.from_url()/create_hindsight_tools()都会以全局配置作为回退默认值from hindsight_google_adk import configure configure( hindsight_api_urlhttps://api.hindsight.vectorize.io, api_keyNone, # 未提供时回退到 HINDSIGHT_API_KEY 环境变量 budgetmid, max_tokens4096, bank_id_template{app_name}::{user_id}, )其实现位于 config.pyconfigure()会把参数解析为HindsightAdkConfig存入模块级全局变量api_key为空时读取HINDSIGHT_API_KEY环境变量HindsightMemoryService构造与create_hindsight_tools内部分别通过get_config()回退取值见 memory.py 与 tools.py。测试中还提供了reset_config()用于清理全局状态。注意configure()返回HindsightAdkConfig且全局只保留一份多次调用会覆盖。若同时显式传参如from_url(url..., api_key...)显式参数优先于全局配置。配置参考Configuration Reference完整参数语义如下默认值与文档 google-adk.md 及 config.py 一致参数默认值说明hindsight_api_urlhttps://api.hindsight.vectorize.ioHindsight API 地址默认指向 Cloudapi_keyHINDSIGHT_API_KEY环境变量Hindsight Cloud 的 Bearer Tokenbank_id_template{app_name}::{user_id}由 ADK 的app_name/user_id推导 Bank ID 的格式串budgetmid召回预算等级low/mid/highmax_tokens4096召回结果的最大 token 数tagsNone追加到每条 retain 文档的标签app:name与user:id总是被自动加入recall_tagsNone追加到 recall 查询的标签user:id总是被自动加入recall_tags_matchany标签匹配模式any/all/any_strict/all_strictmissionNone若设置首次使用时以该事实提取使命幂等创建 Bankcontextgoogle-adk附加到 retain 内容的来源标签provenanceverboseFalse是否启用详细日志源码中新增参数客户端解析与超时HindsightMemoryService.from_url()与create_hindsight_tools()共用 resolve_client() 完成客户端解析优先级为显式client 显式 URL/Key 全局配置未配置任何 URL 时抛出HindsightError。客户端还会附带hindsight-google-adk/{版本}的 User-Agent并为不同操作预设了超时retain 15s、recall 10s、reflect 30s、bank 15s、默认 30s见 _client.py。生产实践按环境给记忆打标签HindsightMemoryService.from_url( hindsight_api_urlhttps://api.hindsight.vectorize.io, api_keyhsk_..., tags[env:prod], recall_tags[env:prod], )app:与user:标签总会叠加在自定义标签之上。回忆侧总是附加user:id从而天然隔离不同用户——测试 test_user_tag_added_to_recall 验证了 recall 时user:alice与env:prod同时出现在标签中。自托管 HindsightSelf-hostedHindsightMemoryService.from_url( hindsight_api_urlhttp://localhost:8888, )未认证的本地服务无需api_key。自动记忆 显式工具组合runner Runner( app_namemy-app, agentagent, session_serviceInMemorySessionService(), memory_serviceHindsightMemoryService.from_url(...), # 会话结束自动 retain ) # 同时给 Agent 挂上 mid-turn 主动 recall 的工具 tools create_hindsight_tools(bank_idmy-app::user-123, ...)自动 retain 与 Agent 驱动的 mid-turn recall 各司其职只要bank_id_template推导出的 Bank 与工具传入的bank_id一致二者共享同一记忆库。更多细节可参阅集成包自身的 README 与 变更记录。总结hindsight-google-adk为 Google ADK 开发者提供了自动记忆与显式工具两条互补路径前者通过实现BaseMemoryService实现零侵入的会话级记忆持久化与查询后者通过三个FunctionTool让模型在轮次内自主读写记忆。二者共享同一套以bank_id_template驱动的 Bank 隔离机制与app:/user:标签体系既支持开箱即用的 Hindsight Cloud也支持http://localhost:8888的自托管部署且所有自动记忆操作对 Runner 完全容错。结合源码中的超时配置、标签匹配模式与mission幂等建库等细节开发者可以按生产需求精细调整记忆的写入、隔离与检索行为。【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/15 14:57:43

国外主流蜜罐产品深度解析:欺骗诱捕技术的演进与应用

搞安全这么多年,我一直觉得“蜜罐”是个被低估的防御武器。很多人一听到蜜罐,脑子里还是“在服务器上放几个假端口,记录一下扫描流量”,实际上国外主流蜜罐产品这些年已经从单纯的“诱饵”长成了一套完整的欺骗诱捕技术体系。这篇…

2026/9/15 14:57:43

OpenProject 如何用 Docker all-in-one 容器完成首次安装?

OpenProject 如何用 Docker all-in-one 容器完成首次安装? 【免费下载链接】openproject OpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning,…

2026/9/15 14:57:43

V免签详解:个人开发者如何实现免签约收款与自动对账

简介:面向具备PHP基础并希望接入免签约收款能力的开发者,这份基于Thinkphp内核框架的V免签支付系统,集成了支付宝、微信的支付回调与安卓端收款实时监控功能,可直接用于个人网站、变现项目或中小商户的订单管理。资源共297个文件、…

2026/9/15 15:02:44

ERA5数据喂不进WRF?四步打通WPS前处理全链路

1. 为什么WRF用户普遍卡在ERA5数据这一步——不是数据难找,而是“对不上号”WRF(Weather Research and Forecasting Model)跑不起来?气象模拟结果发散、初始场偏移、边界条件震荡?先别急着调参数、改物理方案——我带过…

2026/9/15 15:02:44

前端AI编程工具选型实战指南:聚焦框架语义与工程约束

1. 这不是又一份“AI编程工具排行榜”,而是一份前端工程师写给自己的决策手记2026年,我坐在工位上改第7个Vue3组件的响应式逻辑时,突然意识到:过去三年里,我花在调试ref与reactive边界问题上的时间,已经超过…

2026/9/15 14:57:43

Flutter与鸿蒙原生Swiper组件融合开发实战

1. 项目概述:Flutter与鸿蒙的组件融合实践在跨平台开发领域,Flutter凭借其高效的渲染引擎和丰富的组件库已成为移动开发的重要选择。而鸿蒙系统作为新兴的分布式操作系统,其原生组件在性能体验上具有独特优势。本教程将解决一个具体而迫切的需…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/15 0:01:16

AI英语单词APP开发:自适应学习算法与移动端优化实践

1. 项目概述 作为一名在移动应用开发领域摸爬滚打多年的老手,我最近完成了一个AI英语单词APP的开发项目。这个项目将传统单词记忆方法与现代AI技术相结合,打造了一款能够智能适应不同用户学习习惯的英语学习工具。 市面上大多数单词APP都存在一个通病&a…

2026/9/15 0:01:16

Flutter与OpenHarmony结合开发手语学习APP实战

1. 项目背景与核心价值作为一名同时接触过Flutter和OpenHarmony的开发者,最近我完成了一个基于Flutter for OpenHarmony的手语学习APP实战项目。这个项目最大的特点在于实现了跨平台框架与国产操作系统深度结合的创新实践——用Flutter开发的应用能完美运行在OpenHa…

2026/9/15 0:01:16

六个月成为机器人工程师:从ROS2到SLAM的实战路径

1. 六个月的紧迫感从哪来:先搞清楚你要成为哪种机器人工程师说实话,六个月的期限并不是一个宽松的时间线。市面上任何一本正经的机器人学教材都超过五百页,ROS2的官方文档可以翻到你怀疑人生,再加上ABB、KUKA这些工业机器人厂家动…

2026/9/15 14:22:53

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码