Flink Agents 与 AI 流式应用 —— 第 8 章 短期与长期记忆 Flink Agents 与 AI 流式应用 —— 第 8 章 短期与长期记忆章节定位第 7 章的状态让 Agent 记住进行中的事本章让它沉淀已发生过的事。记忆是 Agent 区别于一次性推理的本质——没有记忆的 Agent 每次都是从零开始的新手有记忆的 Agent 是越用越懂车的老司机。本章拆解记忆分层架构对话缓冲/会话摘要/长期知识、摘要压缩的保真策略、Mem0 与向量库两种长期记忆接入、记忆写入时机与质量控制实战随车医生 Agent。版本基线Apache Flink 2.3.0 Flink Agents 0.3.xJDK 17版本提示Flink Agents 0.3.0 新增 Mem0 长期记忆集成API 处于 experimental 阶段具体类名以官方文档为准。章节导读8.1 记忆分层对话缓冲、会话摘要与长期知识8.2 摘要压缩保真与成本的平衡8.3 长期记忆接入Mem0 与向量库8.4 记忆写入策略时机、质量与生命周期8.5 实战随车医生 Agent8.6 本章小结与下章预告8.1 记忆分层对话缓冲、会话摘要与长期知识8.1.1 三层架构┌─────────────────────────────────────────────────────────┐ │ L1 对话缓冲(Working Memory) │ │ 载体: LLM 上下文窗口内的对话历史 │ │ 寿命: 当前 ReAct 循环内 │ │ 特点: 原文保真,成本随长度线性涨(token 计费) │ │ │ │ L2 会话摘要(Session Memory) │ │ 载体: 第 7 章 Keyed State(按 vin) │ │ 寿命: 会话周期,TTL 48h │ │ 特点: 压缩后的要点,是这次排查的病程记录 │ │ │ │ L3 长期知识(Long-term Memory) │ │ 载体: Mem0 / 向量库(Doris ANN,前作资产) │ │ 寿命: 月级~永久,版本化换版 │ │ 特点: 可检索的经验,这辆车的全部病史同类车的处置经验 │ └─────────────────────────────────────────────────────────┘8.1.2 与第 7 章 State 的关系澄清第 7 章 State(会话进度/证据指针) ⊂ L2 会话记忆 ——State 是 L2 的物理载体 L3 与 L2 的流转: 会话终结(CONCLUDED) → 终诊结论提炼 → 写入 L3 新会话开启 → 从 L3 检索该车病史 → 注入 L1 上下文8.1.3 各层成本画像层读取成本写入成本容量保真度L1 对话缓冲每轮 token 计费零自动上下文窗口上限100%L2 会话摘要State 读免费摘要生成 1 次 LLMTTL 48h有损要点级L3 长期知识检索 注入 token提炼 1 次 LLM 索引近乎无限有损经验级8.2 摘要压缩保真与成本的平衡8.2.1 什么时候触发摘要L1 上下文逼近窗口上限 → 必须压缩,否则下一轮塞不下 触发策略(按优先级): ① 阈值触发: 上下文 token 窗口 70% → 压缩最老的一半 ② 阶段触发: ReAct 循环告一段落(如工具调研完成, 进入结论阶段) → 把调研过程压成要点 ③ 会话终结触发: CONCLUDED → 全会话压成病程记录,入 L38.2.2 摘要 Prompt 的保真设计将以下诊断对话压缩为病程要点,要求: 1. 保留: 故障码及标准释义、关键数值(压差mV/温度℃/时间)、 已做决策及置信度、未决疑点。 2. 丢弃: 寒暄、重复确认、被后续证据推翻的中间猜想。 3. 格式: 时间序列表,每行时间|事件|结论|证据来源。 4. 上限: 300 字。压缩三原则: ① 数值不摘要——压差187mV不能写成压差偏高 (数值是复诊判断恶化的依据,丢了等于丢证据) ② 推翻过程可丢,推翻结论必留——曾怀疑线束,已排除 ③ 证据来源带 URI(第 5 章 refs 规范),复诊可回查8.2.3 压缩质量自检自检方法: 抽样 5% 会话,人工对比摘要与原文 □ 关键数值零丢失(压差/温度/时间) □ 已排除假设有记录(防复诊重走弯路) □ 摘要 token 压缩比 ≥ 5:1(否则失去压缩意义) □ 无原文中不存在的脑补内容(压缩幻觉)8.3 长期记忆接入Mem0 与向量库8.3.1 两条路线对比维度Mem00.3.0 集成自建向量库前作 Doris ANN定位专用记忆层自动提炼/去重/遗忘通用语义检索记忆提炼框架内置LLM 抽取记忆点需自己写提炼 Prompt冲突处理内置新记忆覆盖矛盾旧记忆需自己实现基础设施引入 Mem0 服务复用前作 Doris零新增适用对话式 Agent客服 Copilot结构化病程/案例库选型建议: 客服/交互类 Agent → Mem0(对话记忆是它的主场) 诊断/病程类 Agent → Doris ANN(结构可控,审计友好) 两者可并存: 18 章客服 Copilot 用 Mem0, 本章随车医生用 Doris ANN8.3.2 Mem0 接入骨架// 0.3.x 提供的长期记忆集成(概念骨架,以官方 API 为准)LongTermMemorymemoryMem0Memory.builder().endpoint(System.getenv(MEM0_ENDPOINT)).apiKey(System.getenv(MEM0_API_KEY))// envsubst,禁硬编码.userIdExtractor(event-event.vin)// 按车隔离记忆!.build();agent.setLongTermMemory(memory);// 框架托管的行为:// 会话中: 自动将对话要点提炼为记忆点写入 Mem0// 新会话: 按 vin 检索相关记忆,注入系统上下文userIdExtractor 是关键配置记忆按 VIN 隔离A 车的病史绝不出现在 B 车的上下文里——既是效果要求也是数据合规要求。8.3.3 Doris ANN 病程库复用前作资产-- 病程记忆表(前作 15 章向量表规范延续)CREATETABLEai.vehicle_medical_history(vinVARCHAR(17)NOTNULL,session_idVARCHAR(64)NOTNULL,concluded_atDATETIMENOTNULL,-- 秒级格式硬约束summaryVARCHAR(2000),-- 病程摘要summary_vec ARRAYFLOATNOTNULL,-- 摘要向量(前作 embedding)root_causeVARCHAR(200),fix_actionVARCHAR(500),recheck_okTINYINT)UNIQUEKEY(vin,session_id)-- UK MoW 硬约束DISTRIBUTEDBYHASH(vin)PROPERTIES(enable_unique_key_merge_on_writetrue);CREATEINDEXidx_vecONai.vehicle_medical_history(summary_vec)USINGANN PROPERTIES(index_typehnsw,metric_typel2_distance);CREATEINDEXidx_vinONai.vehicle_medical_history(vin)USINGINVERTED;8.3.4 新会话的记忆召回publicStringrecallHistory(Stringvin,StringcurrentSymptom){// ① 本车病史(精确): 近 2 年全部病程ListMedicalRecordowndoris.query(SELECT summary, root_cause, fix_action, recheck_ok FROM ai.vehicle_medical_history WHERE vin ? ORDER BY concluded_at DESC LIMIT 10,vin);// ② 同类车经验(语义): ANN 召回相似病程(前作混合查询)float[]vecembedClient.embed(currentSymptom);ListMedicalRecordsimilardoris.annSearch(ai.vehicle_medical_history,vec,series seriesOf(vin) AND recheck_ok 1,5);// ③ 组装注入(第 9 章上下文工程展开注入位置与预算)returnrender(本车病史,own)render(同类已验证经验,similar);}召回纪律: 本车病史 → 全部注入(精确相关,量可控) 同类经验 → 只召回 recheck_ok1 的(已验证有效的, 失败案例注入会带偏诊断——记忆也有质量门槛)8.4 记忆写入策略时机、质量与生命周期8.4.1 写入时机三选① 会话终结时写(推荐默认): CONCLUDED → 提炼病程 → 写 L3 优点: 信息最全,一次提炼;缺点: 会话中断则丢失 ② 里程碑增量写: 每完成一个诊断阶段写一条 优点: 抗崩溃;缺点: 写入多、后期需合并 ③ 定时批量写: 攒批离线提炼写入 优点: 成本最低;缺点: 时效差,实时召回用不上 生产实践: 主用 ①,对超长会话(24h)叠加 ② 兜底8.4.2 写入质量控制不是什么都值得记住。写入前过三道筛: □ 终局性: 只写 CONCLUDED 会话的结论, 不写中间猜想(猜想被推翻后就是噪声) □ 验证性: recheck_ok 字段如实记录,召回时按它过滤 □ 去重性: 同 vin 同 root_cause 30 天内已有记录 → 更新而非新增(UKMoW 天然支持) 写入的也是 prompt——病程摘要的措辞质量, 直接决定未来召回时的注入质量。8.4.3 生命周期管理记忆会过期、会贬值: □ 软删除: 车辆报废/过户 → 记忆标记失效,不物理删(审计) □ 版本化: 提炼 Prompt 升级 → 批量重提炼,版本号区分(前作换版规范) □ 定期体检: 月度抽样——召回的记忆与当前诊断结论相关性评分, 相关性持续走低说明记忆库需要换版重提炼8.5 实战随车医生 Agent8.5.1 架构总装┌─────────────────────────┐ 告警事件 ────────→│ 随车医生 Agent │ 复检回流 │ │ │ L1 对话缓冲(ReAct 循环) │ │ L2 Keyed State(会话进度)│ ← 第 7 章 │ L3 Doris 病程库 │ ← 本章 └────┬───────────┬────────┘ │ │ 会话开启: 召回病史注入 会话终结: 提炼写入 │ │ ┌────▼───────────▼────────┐ │ ai.vehicle_medical_ │ │ history (Doris UKMoW) │ └─────────────────────────┘8.5.2 核心流程代码Action(listenEventTypes{AlertEvent.EVENT_TYPE})publicEventonAlert(ActionContextctx,AlertEvente)throwsException{DiagnosisSessionsloadOrFresh(e.vin);if(s.isNew()){// ① 会话开启: 召回记忆注入(8.3.4)StringmemoryrecallHistory(e.vin,e.alertText);ctx.appendSystemContext(该车病史与同类经验:\nmemory);s.memoryInjectedtrue;}// ② 走第 6 章 ReAct 诊断 第 7 章状态机DiagnosisResultrdiagnose(s,e);if(isConcluded(r)){// ③ 会话终结: 提炼病程写 L3(8.4 质量控制)StringsummarysummarizeSession(s,r);// 8.2.2 保真摘要doris.upsert(MedicalRecord.of(e.vin,s.sessionId,summary,embedClient.embed(summary),r.diagnosis,r.action,PENDING_RECHECK));s.phaseCONCLUDED;sessionState.update(s);returnfinalize(s,r);}// ... 状态机其余分支同第 7 章}8.5.3 记忆生效的验证实验对照实验(影子模式 2 周): A 组: 记忆关闭——每次告警从零诊断 B 组: 记忆开启——召回病史注入 对比指标: □ 复诊场景诊断一致率: B 应显著高于 A (A 组常见上次判 P2,这次同样症状判 P1的摇摆) □ 平均工具调用数: B 应低于 A(病史里有就不用再查) □ 误诊回溯率: 复检推翻初诊的比例,B 应更低8.5.4 验收清单□ 记忆按 vin 严格隔离,交叉污染测试通过 □ 摘要数值零丢失抽检达标(8.2.3) □ 只写终局结论,中间猜想不入库 □ 同类经验召回强制 recheck_ok1 过滤 □ 记忆注入后单事件 token 增量 ≤ 800(第 9 章预算)8.6 本章小结与下章预告本章小结┌──────────────────────────────────────────────────────────────┐ │ 第 8 章 要点回顾 │ └──────────────────────────────────────────────────────────────┘ ✓ 三层记忆: L1 对话缓冲(保真/贵) → L2 会话摘要 (State 承载/48h) → L3 长期知识(Mem0 或 Doris ANN); 会话终结时 L2→L3 沉淀,会话开启时 L3→L1 注入 ✓ 摘要保真: 数值不摘要、推翻结论必留、证据带 URI; 压缩比 ≥5:1,抽检防压缩幻觉 ✓ 长期记忆两路线: Mem0(对话式,自动提炼) / Doris ANN(结构化病程,复用前作资产,审计友好); 记忆按 vin 隔离是效果与合规双红线 ✓ 写入策略: 终结时写为主、里程碑写兜底; 三道筛(终局/验证/去重);召回只取 recheck_ok1 ✓ 实战: 随车医生 Agent 开启召回病史、终结提炼入库, AB 实验验证一致率提升与工具调用下降下章预告第 9 章 上下文工程让 Agent 看懂车况记忆有了怎么塞进上下文是另一门学问——上下文解剖系统提示/记忆/证据/工具结果各占多少、token 预算分配、动态装配策略、上下文污染防护、多轮对话修剪实战车队巡检 Agent 的上下文保鲜方案。记忆是仓库上下文是货架——本章教你怎么摆货。官方参考资料Flink Agents 0.3 DocumentationMemory / Mem0 集成Mem0: Building Production-Ready AI Agents with Scalable Long-Term MemoryFlink 2.3 Stable Documentation本章实战代码清单序号内容说明1三层记忆架构与成本画像8.12保真摘要 Prompt 与自检清单8.23Mem0 接入骨架按 VIN 隔离8.3.24Doris 病程库 DDLUKMoWANN倒排8.3.35记忆召回与注入实现8.3.46写入时机/质量/生命周期策略8.47随车医生 Agent 总装与 AB 验证8.5