ARTICLE DETAIL

资讯详情

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

基于 Hindsight AI SDK 构建个人饮食助手:单 Bank 多用户记忆架构与三种 Agent 记忆集成实战

基于 Hindsight AI SDK 构建个人饮食助手:单 Bank 多用户记忆架构与三种 Agent 记忆集成实战 基于 Hindsight AI SDK 构建个人饮食助手单 Bank 多用户记忆架构与三种 Agent 记忆集成实战【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight本文围绕 hindsight-docs/src/pages/cookbook/applications/taste-ai.md 中完整的 Personal Chef个人厨师示例应用展开讲解如何用 Hindsight AI SDK 与 Vercel AI SDK v6 为 AI Agent 赋予长期记忆通过单 Bank 用户标签的隔离架构、recall/reflect 记忆检索与反思、自动刷新的 Mental Model 以及优先级 Directive让应用实现个性化膳食推荐、目标进度追踪与多语言一致性输出。读完本文你将掌握这四类 Hindsight 记忆原语在真实应用中的组合用法并了解其在开源仓库中的底层实现。示例应用定位一个完整可运行的记忆增强应用taste-ai是 Hindsight Cookbook 中一个完整、可独立运行的示例应用它的定位是一个个人饮食助手Personal Chef。与大多数只演示单个 API 调用的代码片段不同这个示例通过 Vercel AI SDK v6 的 agent 式工具调用把 Hindsight 的核心记忆能力整合进同一条产品链路中用来回答三类真实问题膳食建议结合用户的口味偏好、忌口和近期饮食记录生成个性化推荐目标进度跟踪用户如减重、增肌目标的完成情况并随每次记录自动更新语言一致性无论模型默认输出什么语言都强制以用户指定的语言作答。该示例同时演示了三种 Hindsight 集成能力recall检索记忆、reflect基于记忆反思、Mental Model自动维护的归纳结论与 Directive硬性规则注入。在开源仓库中与本示例直接对应的集成层代码位于 hindsight-integrations/ai-sdk而底层的记忆客户端方法如createDirective、createMentalModel实现在 hindsight-clients/typescript/src/index.ts。架构总览单 Bank 用户标签Single Bank with User Tags示例采用了一个值得借鉴的多租户设计决策所有用户共享同一个 Hindsight Bank用标签区分数据归属。// All users share the same bank const BANK_ID taste-ai; // Each memory is tagged with the user await hindsightTools.retain.execute({ bankId: BANK_ID, content: userData, tags: [user:${username}], });其中retain负责把信息写入长期记忆对应 AI SDK 工具封装中的retain工具见 hindsight-integrations/ai-sdk/src/tools/index.tstags参数在底层会被原样透传给 Hindsight 服务端客户端retain方法签名支持timestamp、context、metadata、documentId、tags、async等选项。这种单 Bank 标签架构带来的收益文档中总结为三点也是多用户记忆应用最常见的取舍按用户查询查询时用user:alice过滤即可得到仅属于 Alice 的个性化结果实现记忆的软隔离跨用户聚合洞察不做标签过滤直接查询就能在所有用户的数据上做聚合分析例如找出最受欢迎的食谱、统计共性的饮食模式——这是每用户一个 Bank方案难以做到的运维简化只需维护一个 Bank而不是为每个用户创建并管理独立的 Bank。从测试用例看工具封装会强制使用构造时传入的bankId见 hindsight-integrations/ai-sdk/src/tools/index.test.ts 的bankId enforcement分组也就是说 Bank 的选择属于基建关注点由应用代码在创建工具时锁定Agent 只控制语义输入内容、查询、名称、时间戳这进一步保障了多用户场景下数据不会串库。集成一膳食建议 —— recall 与 reflect 的组合拳第一个集成利用 AI SDK 的 agent 式方法把recall和reflect两个工具同时注册给模型让模型自主决定何时检索、何时反思最终汇总出个性化上下文。const contextResult await generateText({ model: llmModel, tools: { recall: hindsightTools.recall, reflect: hindsightTools.reflect, }, toolChoice: auto, prompt: You are gathering context for personalized ${mealType} recipe suggestions. Use the recall tool to search for the users food preferences, dislikes, and recent meals. Then use the reflect tool to analyze their dietary patterns and restrictions. After gathering context, summarize their preferences and recent eating patterns., });toolChoice: auto把工具调用的决策权完全交给模型。按照 prompt 的引导Agent 会自主完成三类动作检索记忆中关于菜系偏好与饮食限制的事实分析近期蛋白质摄入情况为食谱推荐提供多样性依据避免连续推荐同类食材识别需要规避的食物过敏原、忌口等。在 SDK 封装层recall与reflect各自的职责被清晰定义见 hindsight-integrations/ai-sdk/src/tools/index.tsrecallSearch memory for relevant information把记忆中的事实检索出来是查档案reflectAnalyze memories to form insights and generate contextual answers基于记忆做推理与综合是做分析。两者的处理深度都由budget控制取值来自BudgetSchema z.enum([low, mid, high])默认mid——low偏向低延迟、high偏向更深度的处理详见测试中 budget defaults 对三种取值的验证。recall还可通过types限定事实类型world/experience/observation、通过maxTokens限制返回规模、通过includeEntities/includeChunks带回实体观测与原始片段这些参数对控制上下文长度与召回质量至关重要。集成二目标进度追踪 —— 自动刷新的 Mental Model第二个集成解决每次都要重新检索推理的低效问题。Mental Model 是 Hindsight 中沉淀结论的机制创建时给它一个sourceQuery源查询服务端会在后台基于记忆执行 reflect把结论固化成一份持续维护的洞察之后直接读取即可无需每次从头推理。// Create a mental model that auto-refreshes after new meals await hindsightTools.createMentalModel.execute({ bankId: BANK_ID, mentalModelId: getMentalModelId(username, goals), name: ${username}s Goal Progress, sourceQuery: Analyze ${username}s dietary goals and eating patterns. Describe their progress towards their stated goals (weight loss, muscle gain, etc.)., tags: [user:${username}], autoRefresh: true, // Refreshes automatically after consolidation }); // Query the mental model for current insights const result await hindsightTools.queryMentalModel.execute({ bankId: BANK_ID, mentalModelId: mentalModelId, });Mental Model 的价值在于被动更新、主动可用自动跟踪用户向饮食目标减重、增肌等的进展每当用户记录一餐新饮食模型在 consolidation记忆合并完成后自动刷新无需手动触发刷新随时查询都能拿到新鲜洞察。底层实现上autoRefresh对应客户端createMentalModel的trigger参数中的refreshAfterConsolidation字段。在 hindsight-clients/typescript/src/index.ts 中可以看到完整的MentalModelTriggerOptions类型除refreshAfterConsolidation外还支持配置项说明mode: full \| deltafull每次刷新从头重新生成内容delta在现有内容上原地增量编辑更省 tokenrefreshCronUTC 5 字段 Cron 表达式定时刷新与refreshAfterConsolidation互斥传null移除调度minRefreshIntervalSeconds自动刷新的最小间隔下限秒触发过于频繁时任务会被排队/合并一次批量写入只算一次刷新0表示对该模型禁用下限factTypes刷新时检索的事实类型省略则检索全部excludeMentalModels/excludeMentalModelIds刷新时是否跳过对兄弟 Mental Model 的反思tagsMatch/tagGroups刷新时如何用模型标签过滤源记忆如all_strict、any等responseSchema结构化输出 JSON Schema与 markdown 内容一并存储keepTrace在reflect_response.trace中记录每次刷新的推导过程注意toTriggerBody的实现细节所有未提及的字段会被序列化为undefined并在 JSON 中丢弃从而保持局部更新语义——只 patch 调用方显式声明的字段不会静默重置服务端已存储的其他触发配置源码注释中特别指出了这一设计动机见 hindsight-clients/typescript/src/index.ts。集成三语言强制 —— 优先级 Directive第三个集成解决 Agent 输出的语言漂移问题。Directive 是 Hindsight 中的硬性规则会在 Mental Model 生成洞察时被自动注入确保所有交互保持一致的语言。await hindsightClient.createDirective(BANK_ID, { name: ${username}s Language Preference, content: Always respond in ${language}. All suggestions must be in ${language}., priority: 100, tags: [user:${username}, directive:language], });关键点在于priority: 100。在客户端实现中createDirective的priority默认值为0、isActive默认值为true见 hindsight-clients/typescript/src/index.ts服务端会按优先级决定规则的生效顺序高优先级的 Directive 拥有更强的约束力。Directive 的注入链路是自动的当 Mental Model 生成洞察本质上是后台执行 reflect时命中的 Directive 会作为based_on.directives一并参与生成——从 reflect 的返回类型可以看到ReflectBasedOn结构同时包含memories、mental_models与directives三类支撑材料见 hindsight-integrations/ai-sdk/src/tools/index.ts测试用例也验证了这三类材料能够同时透传见 hindsight-integrations/ai-sdk/src/tools/index.test.ts。因此即使用户 A 偏好法语、用户 B 偏好日语同一条生成链路也能各自输出正确的语言。源码纵深createHindsightTools 是如何封装记忆能力的示例中反复出现的hindsightTools来自 AI SDK 集成包其核心工厂函数createHindsightTools位于 hindsight-integrations/ai-sdk/src/tools/index.ts并在 hindsight-integrations/ai-sdk/src/index.ts 中对外导出。它有以下几个值得关注的设计1. 五个原生 AI SDK 工具除示例用到的retain、recall、reflect、createMentalModel、queryMentalModel之外封装层还提供了getMentalModel与getDocument形成完整的记忆操作面getMentalModel直接按 ID 取回已固化的洞察比重新检索原始记忆更快、更省 tokengetDocument则按文档 ID 精确取回结构化数据如应用状态、用户画像。2. 输入 Schema 只暴露语义参数每个工具都用 Zod 定义了inputSchema刻意只保留 Agent 需要控制的参数retain只暴露content、documentId、timestamp、contextrecall只暴露query、queryTimestamp。而bankId、budget、tags、async等基建参数在构造时固化见 hindsight-integrations/ai-sdk/src/tools/index.ts这与上面提到的bankId enforcement测试相互印证Agent 永远不会接触到数据隔离与基础设施层面的旋钮。3. 构造级选项统一生效HindsightToolsOptions允许在创建时为每个工具预设默认行为例如const tools createHindsightTools({ client: hindsightClient, bankId: userId, recall: { budget: high, includeEntities: true }, retain: { async: true, tags: [env:prod] }, });测试覆盖了这些组合构造级tags/metadata/async会与 Agent 传入的内容合并后调用客户端见 hindsight-integrations/ai-sdk/src/tools/index.test.ts构造级budget/maxTokens/includeEntities会覆盖默认值见 hindsight-integrations/ai-sdk/src/tools/index.test.ts。4. 容错与空值兜底reflect在返回空文本时兜底为No insights available yet.getMentalModel在无内容时兜底为No content available yet.见 hindsight-integrations/ai-sdk/src/tools/index.ts避免 Agent 拿到undefined后产生幻觉。运行 Demo 与环境要求按文档给出的步骤即可本地运行npm install npm run dev运行前提Hindsight 服务端默认运行在http://localhost:8888也可通过环境变量HINDSIGHT_URL覆盖指向其他地址例如远程实例或 Docker 部署Node.js 18示例基于 Vercel AI SDK v6 与原生fetch需要较新的 Node 运行时需要在代码中提供 LLM 模型实例示例中的llmModel如 OpenAI / Anthropic / 本地模型均可只要支持工具调用。关于本地 Hindsight 服务端的启动可参考 AI SDK 集成包的 README使用嵌入式模式可免去额外配置例如uvx hindsight-embedlatest -p myapp daemon start默认 API 地址为http://localhost:8000与示例默认端口 8888 不同请以实际部署配置为准并通过HINDSIGHT_URL对齐。从 Demo 到生产可复用的设计要点标签即租户user:${username}是一套可演进的隔离约定。示例中 Directive 还使用了directive:language这类类型标签说明标签可以同时承载归属维度谁的数据与类型维度什么数据为后续listMentalModels({ tags })、listDirectives({ tags })等按标签查询留出空间。结论与原料分层膳食建议走recallreflect实时检索推理目标进度走 Mental Model预计算结论语言规则走 Directive硬约束注入。三者分别对应查、算、管三类诉求混用而不是互相替代。聚合分析是额外红利因为所有用户共用一个 Bank跨用户查询天然可行——热门食谱、共性饮食模式等产品功能无需迁移数据即可实现。基建参数固化在构造层把bankId、budget、tags等固定在createHindsightTools创建时让 Agent 只碰语义参数是降低多用户记忆应用出错面的关键实践这一点在 SDK 测试中已被作为不变量验证。参考阅读示例应用完整说明hindsight-docs/src/pages/cookbook/applications/taste-ai.mdAI SDK 集成包工具封装与导出hindsight-integrations/ai-sdk/src/tools/index.ts、hindsight-integrations/ai-sdk/src/index.ts工具封装单元测试hindsight-integrations/ai-sdk/src/tools/index.test.tsTypeScript 客户端Directive / Mental Model 方法实现hindsight-clients/typescript/src/index.tsAI SDK 集成快速上手hindsight-integrations/ai-sdk/README.md【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表