主题
12|记忆底座实施方案:百炼记忆机制对标与 mem0 落地(#21)
一句话:对标百炼记忆库(长期记忆 2.0)机制,基于 mem0 + Qdrant + 自建补强 落地企业级记忆底座——事实记忆、用户画像、技能记忆三类记忆 + 异步提取 + 白盒观测审计,闭环"对话 → 提取 → 检索注入 → 更好对话"的数据飞轮。 状态:设计审核稿(2026-10-26),尚未实证;实证计划见第八、九章 前置:10 篇选型(Memory → mem0 + Qdrant);11 篇知识库落地实证(同专栏,复用其模型供应/服务化模式) 生产链路:
Agent → Higress → AuthZ/Credential Broker → Memory Service → mem0/Qdrant。记忆服务不得直接暴露给 Agent;user_id必须由签名身份上下文派生,不能信任请求体自报。详见05-AI基础设施架构审核与生产收敛.md。
一、百炼记忆库机制精读(对标基准,2026-10 官方口径)
百炼记忆库是长期记忆功能的全面升级版,核心叙事四句话:自动提取与持久化、动态更新机制、精细化遗忘控制、白盒化的记忆配置。
1.1 三类记忆(提取产物,非对话原文)
| 记忆类型 | 提取来源 | 存储形态 | 适用场景 | 示例 |
|---|---|---|---|---|
| 事实记忆(observation) | 对话内容自动提取关键事件/信息片段 | 记忆节点(memory_node),内容经模型改写 | 动态事件信息 | "用户每天上午9点需要喝水提醒" |
| 用户画像(user_profile) | 基于自定义模板(profile_schema)提取结构化属性 | 画像模板 × 字段值 | 固定用户属性 | 年龄、职业、爱好 |
| 技能记忆(skill) | 从可复用轨迹(tool_calls)归纳任务方法 | 技能节点(名称/描述/内容) | 相似任务复用 | "如何用 MCP 检索企业知识库" |
关键语义:
AddMemory不把输入原文当存储单元——对话输入被抽取为多条观察型节点,内容经过改写;custom_content输入则保留为一条节点。写入后核对必须以ListMemory返回为准。
1.2 "设置记忆提取" = 记忆规则配置(白盒)
每个记忆库最多 50 条事实记忆规则 + 50 条用户画像规则,预置"默认项目"事实规则(180 天,可编辑不可删):
事实记忆规则:
| 参数 | 说明 |
|---|---|
| 规则名称 | 记忆抽取规则唯一标识 |
| 规则指令 | 定义记忆抽取策略:默认规则指令(推荐)或自定义规则指令 |
| 自动更新 | 开启后模型自动更新已有记忆(内置冲突解决);默认开启 |
| 记忆过期时间 | 7 天 / 30 天 / 180 天 / 永不过期 |
| 记忆抽取策略版本 | Pro(¥0.03/次,开启 Rerank)或 Lite(¥0.018/次) |
用户画像规则(逐字段定义,引导模型提取):
| 参数 | 说明 |
|---|---|
| 字段名称 | 抽取出的画像包含哪些字段(语义化,便于标签提取/聚合) |
| 描述 | 该字段含义的自然语言描述,提示模型提取 |
| 初始值 | 用户尚未提供信息时的默认值 |
| 抽取策略版本 | Pro / Lite |
1.3 提取与检索机制(工程实现基准)
- 提取是异步的:
AddMemoryAsync立即返回event_id,GetEvent轮询终态(PENDING → RUNNING → SUCCEEDED/FAILED);CLI 实测写入 20-35 秒、读取 0.8-0.9 秒——差一个量级,调用侧需区分超时策略 - 检索入参:
SearchMemory用messages(对话记录)做语义检索 +top_k(最大召回)+min_score(Pro 版最小分数阈值,默认 0.3) - 检索优化项(官方 FAQ):相似度阈值建议 0.5~0.7、开启"意图判别召回"、开启"改写"和"排序"、合理设置最大召回数量
- 隔离:百炼以
user_id(记忆实体)为维度隔离,也支持project_id多项目并行抽取(最多 5 个)。这是产品侧记忆实体口径,不能直接当作企业授权:自建时必须在其上增加tenant_id与来源可信校验 - 限流:全部接口 3000 QPM(账号级)/ add 120 QPM / search 300 QPM
- 多模态:
messages[].content支持 text + image_url(多模态项目解析图片) - 技能抽取:仅解析
tool_calls工具消息(OpenAI 格式),用于 skill 抽取,其他抽取类型过滤
1.4 API 面(对标基准)
Base:https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v2/apps/memory/,鉴权 Authorization: Bearer <API_KEY>。
事实记忆(9 接口):AddMemory(POST /add)、AddMemoryAsync(POST /add-async)、GetEvent(GET /events/{id})、ListMemory(GET /memory_nodes)、SearchMemory(POST /memory_nodes/search)、GetMemoryNode(GET /memory_nodes/{id})、GetSkillExport(GET /skill/export/{id})、UpdateMemory(PATCH /memory_nodes/{id})、DeleteMemory(DELETE /memory_nodes/{id})
用户画像(5 接口):CreateProfileSchema(POST /profile_schemas)、ListProfileSchemas(GET)、GetProfileSchema(GET /{id})、UpdateProfileSchema(PATCH /{id})、GetUserProfile(GET /profile_schemas/{id}/user_profile)
另注意:百炼还有长期记忆(旧版)的"记忆片段 + 记忆变量"模型——记忆变量是键值对(权重高于片段,可模型推理或人工输入),用于校准记忆片段的不完整性。新版记忆库未显式保留此概念,但"结构化字段覆盖"的语义由用户画像承接。
二、我们选型与差距判定(#21 基线)
10 篇选型:Memory 层用 mem0(Apache-2.0,官方 mem0-mcp) + Qdrant(向量存储,payload 多租户);进阶 Zep/Graphiti 时序知识图谱(后置)。
机制对标结论(敢说):
| # | 百炼机制 | mem0 落点 | 判定 |
|---|---|---|---|
| M-1 | 事实记忆自动提取(LLM 抽取 + 改写) | mem0 默认提取器(LLM + 事实抽取 prompt) | ✅ 原生对齐 |
| M-2 | 语义检索(min_score 阈值) | mem0 search + Qdrant score 阈值 | ✅ 原生对齐 |
| M-3 | 记忆管理 API(增删改查) | mem0 add/search/update/delete API | ✅ 原生对齐 |
| M-4 | user_id 记忆实体隔离 | mem0 user_id 参数 + Qdrant payload 过滤 | ⚠️ 原生有实体过滤,但 user_id 不能作为鉴权依据;必须由网关签名上下文派生 |
| M-5 | 多项目并行抽取(project_id) | mem0 无原生 → Qdrant payload project_id + 查询过滤 | ⏳ 轻量补强 |
| M-6 | 记忆过期时间(7/30/180 天) | mem0 无原生 TTL → 定时回收任务(Qdrant 按 created_at 清理) | ⏳ 需补(回收器) |
| M-7 | 用户画像(模板 + 字段级提取) | mem0 无原生画像 → 自建 profile_schema 表 + 字段提取 prompt | ❌ 主要补强点 |
| M-8 | 技能记忆(轨迹归纳) | mem0 无原生 → 自建 tool_calls 轨迹抽取(可借 LangMem procedural) | ❌ 主要补强点 |
| M-9 | 记忆变量(键值对,权重高于片段) | mem0 无原生 → Qdrant payload variables 或独立表 | ⏳ 需补 |
| M-10 | 异步提取 + 事件轮询(AddAsync/GetEvent) | mem0 同步调用 → 自建任务队列(NATS)+ 状态表 | ⏳ 工程化 |
| M-11 | 观测/审计(会话↔记忆变更对照、前后快照) | 自建 → 记忆变更表(event + old/new 快照) | ⏳ 需补 |
| M-12 | 白盒规则可视化(记忆规则配置页) | 自建管理面 → 挂 HiMarket 门户皮 | ⏳ 与门户皮一起长 |
| M-13 | Pro/Lite 策略版本(Rerank) | mem0 无原生 → Qdrant 检索后接 reranker(可选) | ⏳ 可选增强 |
补强模块定级:画像(M-7)、技能记忆(M-8) 是能力空白必须自建;异步提取(M-10)、观测审计(M-11)、过期回收(M-6) 是工程化必做;规则可视化(M-12) 挂门户皮。
三、架构设计:记忆服务(对标百炼记忆库)
3.1 部署拓扑
3.2 组件职责
| 组件 | 选型 | 职责 |
|---|---|---|
| 记忆服务 API | FastAPI(复用 emb-service 模式) | 暴露百炼兼容记忆 API 面(add/add-async/events/memory_nodes/profile_schemas/user_profile) |
| 提取队列 | NATS(已有 docker-nats-1)+ 状态表 | 异步任务:提交 → PENDING → RUNNING → SUCCEEDED/FAILED,event_id 轮询 |
| 事实提取器 | mem0 默认提取器 | LLM 从对话抽取观察节点(改写内容,非原文) |
| 画像提取器 | 自建 | 按 profile_schema 字段定义,LLM 结构化提取属性 |
| 技能归纳器 | 自建(+ LangMem procedural) | 从 tool_calls 轨迹归纳技能节点 |
| 身份/授权 | Higress + AuthZ/Credential Broker | 校验 Consumer、订阅、工具白名单;派生 tenant_id/owner_subject_id;不信任请求体 user_id |
| 向量存储 | Qdrant | embedding 存储 + payload 隔离(tenant_id/owner_subject_id/project_id/type/visibility) |
| 元数据 | MySQL | 画像模板、记忆规则、变更审计、事件状态 |
| embedding | 复用 11 篇本地 TEI 服务(bge-m3 1024 维) | 记忆向量化(同一套模型,别起第二套) |
3.3 隔离与信任模型
text
tenant_id > owner_subject_id > project_id > memory_type > visibility- 每一级过滤由 Memory Service 服务端强制注入,客户端只能传“断言”,不能扩大范围;
owner_subject_id来自 OIDC subject 或受控 Agent 委托身份,不等于请求体user_id;visibility只允许private / project / tenant,跨用户共享必须显式授权并记录来源;- 共享记忆、技能记忆与画像的读取分别授权,不能用“能读事实记忆”推导“能读画像/技能”;
- 管理员排障需走审批与审计,不能默认拥有全租户明文读取权限。
四、API 设计(对标百炼 14 接口)
4.1 事实记忆
text
POST /api/v2/memory/add # 同步添加(轻量场景)
POST /api/v2/memory/add-async # 异步提交(推荐,返回 event_id)
GET /api/v2/memory/events/{event_id}# 查询提取任务状态/结果
GET /api/v2/memory/memory_nodes # 分页列出记忆(ListMemory)
POST /api/v2/memory/memory_nodes/search # 语义检索
GET /api/v2/memory/memory_nodes/{id} # 单节点详情
GET /api/v2/memory/skill/export/{id} # 导出技能节点
PATCH /api/v2/memory/memory_nodes/{id} # 更新记忆
DELETE /api/v2/memory/memory_nodes/{id} # 删除记忆4.2 用户画像
text
POST /api/v2/memory/profile_schemas # 创建画像模板
GET /api/v2/memory/profile_schemas # 模板列表
GET /api/v2/memory/profile_schemas/{id}# 模板详情
PATCH /api/v2/memory/profile_schemas/{id}# 更新模板
GET /api/v2/memory/profile_schemas/{id}/user_profile # 获取用户画像4.3 核心请求/响应(对齐百炼语义)
json
// 异步添加记忆(对齐百炼 AddMemoryAsync)
POST /api/v2/memory/add-async
{
// user_id 仅为“断言”,服务端必须与签名上下文一致;不一致直接 403
"user_id": "emp_001",
"project_ids": ["project_kb"],
"messages": [
{"role": "user", "content": "我偏好用中文回复,每周一需要生成周报。"},
{"role": "assistant", "content": "好的,已记录。"}
],
"profile_schema": "schema_emp_basic",
"meta_data": {"dept": "platform"}
}
// 响应:{"event_id": "evt_xxx", "status": "PENDING"}
// 查询事件
GET /api/v2/memory/events/evt_xxx
// {"status": "SUCCEEDED", "result": [{"memory_node_id": "...", "content": "用户偏好中文回复", "event": "ADD"}]}
// 语义检索(对齐百炼 SearchMemory)
POST /api/v2/memory/memory_nodes/search
{
"user_id": "emp_001",
"messages": [{"role": "user", "content": "帮我写这周的周报"}],
"top_k": 5,
"min_score": 0.3
}身份约束:
tenant_id、owner_subject_id、consumer_id一律从已签名上下文派生,不放在请求体、不接受客户端覆盖。请求体中的user_id/project_ids只作一致性断言;Agent 委托场景使用平台签发的委托令牌,不能直接冒用员工user_id。
五、补强模块设计(自建部分)
5.1 用户画像(M-7,核心补强)
sql
-- 画像模板表
CREATE TABLE profile_schema (
id VARCHAR(32) PRIMARY KEY,
tenant_id VARCHAR(64) NOT NULL,
name VARCHAR(64) NOT NULL,
description VARCHAR(256),
extract_scene VARCHAR(16) DEFAULT 'efficient',
visibility VARCHAR(16) NOT NULL DEFAULT 'private', -- private / project / tenant
owner_subject_id VARCHAR(64) NOT NULL,
created_by VARCHAR(64) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_tenant_name (tenant_id, name)
);
-- 画像字段表(逐字段定义,引导模型提取)
CREATE TABLE profile_attribute (
id VARCHAR(32) PRIMARY KEY,
schema_id VARCHAR(32) NOT NULL,
name VARCHAR(64) NOT NULL,
description VARCHAR(256),
init_value VARCHAR(128),
is_reasoning TINYINT DEFAULT 1, -- 是否模型推理自动更新
sort INT DEFAULT 0
);
-- 用户画像值表(user_id × 字段)
CREATE TABLE user_profile (
tenant_id VARCHAR(64) NOT NULL,
schema_id VARCHAR(32) NOT NULL,
subject_type VARCHAR(16) NOT NULL DEFAULT 'human', -- human / agent
subject_id VARCHAR(64) NOT NULL, -- OIDC subject 或受控 Agent 身份
attr_name VARCHAR(64) NOT NULL,
attr_value VARCHAR(256),
updated_by VARCHAR(64) NOT NULL,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (tenant_id, schema_id, subject_type, subject_id, attr_name)
);提取逻辑:add-async 任务中,若请求带 profile_schema,先校验该 schema 属于当前 tenant_id 且调用者有权使用;再由画像提取器按字段定义构造 prompt,异步回填 user_profile。禁止跨租户复用 profile_schema,禁止把 Agent 推断值写成人类 subject_id 的属性;敏感字段需按策略脱敏或拒绝提取。
5.2 技能记忆(M-8,核心补强)
数据源:agentscope / opencode 轨迹中的 tool_calls(OpenAI 格式)+ 任务结果。
| 字段 | 说明 |
|---|---|
| skill_node_id | 技能节点 ID |
| tenant_id / owner_subject_id / project_id | 归属与隔离;租户必须由签名上下文派生 |
| skill_name | 归纳出的技能名称 |
| skill_description | 技能描述 |
| skill_content | 可复用方法/步骤(LLM 归纳) |
| source_trajectory | 来源轨迹引用(可溯源) |
| tags | 标签数组 |
| visibility | private / project / tenant;默认 private,不跨用户共享 |
| trust_level | 来源可信度(人工确认 / 自动归纳 / 外部导入) |
| review_status | draft / pending_review / approved / rejected;发布到市场前必须审核 |
归纳流程:轨迹 → LLM 归纳(任务目标 + 工具调用序列 + 结果 → 技能名称/描述/步骤)→ 冲突与敏感内容检查 → 向量化存 Qdrant(type=skill)→ 人工审核通过后才可发布/导出。技能记忆属于可执行知识,默认不跨用户共享,避免把个人习惯或恶意步骤扩散为组织能力。
5.3 异步提取与事件轮询(M-10)
text
任务状态:PENDING → RUNNING → SUCCEEDED / FAILED
表:memory_task(event_id / tenant_id / owner_subject_id / project_ids / idempotency_key /
messages_ref / status / attempt / next_retry_at / error_code / result_ref / created_at)
队列:NATS JetStream(持久化)+ 消费组;subject "memory.extract"
去重:tenant_id + idempotency_key 唯一约束;重复提交返回同一 event_id必须补齐的工程约束:
- 幂等:同一
idempotency_key只产生一个任务与一组记忆节点;worker 重投递不重复写入; - 可靠投递:业务表写任务与发消息用 outbox(或事务消息);消费失败按指数退避重试,超过上限进入 DLQ 并告警;
- 毒消息隔离:解析失败/超大消息/异常轨迹进入隔离区,不阻塞主队列;人工可重放;
- 成本预算:按租户/项目设置抽取 token 与调用次数预算;超限降级为“只存原文摘要”或拒绝,避免长对话拖垮账单;
- 长对话:按窗口分段抽取并做跨段去重/合并;禁止把整段超长对话一次性塞给模型;
- 调用侧规范:写入类 20-35 秒量级,重试前先
GetEvent确认是否已落库,避免重复抽取产生冗余节点。
5.4 观测审计(M-11)
sql
-- 记忆变更审计(前后快照)
CREATE TABLE memory_audit (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
tenant_id VARCHAR(64) NOT NULL,
owner_subject_id VARCHAR(64) NOT NULL,
actor_id VARCHAR(64) NOT NULL, -- 人类 subject / Agent 委托身份
service_id VARCHAR(64) NOT NULL, -- 调用方工作负载
trace_id VARCHAR(64) NOT NULL,
request_id VARCHAR(64) NOT NULL,
memory_node_id VARCHAR(32),
event VARCHAR(8), -- ADD / UPDATE / DELETE
old_content_hash CHAR(64), -- 原文不落审计表,按合规策略存加密快照
new_content_hash CHAR(64),
source VARCHAR(64), -- conversation / api / connector / admin
reason VARCHAR(256),
created_at DATETIME NOT NULL
);审计约束:
- 审计事件必须可按
tenant_id + owner_subject_id + trace_id关联到一次请求,禁止只记user_id; - 审计表采用只追加模型,应用账号无 UPDATE/DELETE 权限;通过独立归档/对象锁满足不可篡改;
- 审计保留期与业务数据删除策略分开:合规保留可冻结,但必须支持 legal hold 白名单与审批;
- 原文含 PII 时不直接落审计表,存加密快照或哈希;查询面按角色脱敏;
- 观测面:会话 ↔ 记忆变更对照;审计面:变更事件、前后哈希、调用者、来源与原因。
5.5 过期回收(M-6)
text
规则:事实记忆规则配置过期时间(7/30/180/永不过期)
回收器:定时任务扫描 Qdrant(按 type + created_at + rule_ttl)→ 删除过期节点 + 审计记录删除语义(必须按“可验证删除”设计,而不是只删一条向量):
text
状态机:ACTIVE → DELETING → DELETED
└→ LEGAL_HOLD(合规冻结,暂停物理删除)
└→ FAILED(可重试)- 覆盖范围:Qdrant point、MySQL 记忆/画像/任务记录、缓存与派生摘要、检索结果快照、技能导出副本;
- 删除任务必须幂等,记录
delete_task_id / 影响条数 / 各存储结果 / 完成时间,供用户或管理员验证; - 删除完成后再次检索必须为 0 命中;缓存 TTL 不得导致“已删除仍可召回”;
- 备份与归档按保留策略处理:文档需明确“备份中的副本何时失效”,不能宣称立即物理消失;
LEGAL_HOLD只允许合规角色设置,必须记录原因、审批人与解除时间;冻结不等于普通删除失败;- 审计不可篡改与“删除用户内容”并不矛盾:审计存哈希/加密快照,按法规与保留策略处理。
5.6 记忆投毒与 Prompt Injection 防护(生产必补)
| 风险 | 防护 |
|---|---|
| 恶意对话写入虚假事实 | 记录来源与可信度;低可信来源不自动覆盖高可信记忆;冲突进入待确认队列 |
| 外部文档/网页注入指令 | 记忆与检索结果一律视为数据,不作为系统指令;注入检测与内容隔离 |
| 技能记忆被投毒 | 技能默认 private;发布到市场前人工审核;执行前做工具白名单与参数校验 |
| 跨用户污染 | tenant_id/owner_subject_id 强制过滤;共享记忆必须显式授权并标注来源 |
| 敏感信息沉淀 | 写入前 PII/密钥检测;命中策略则脱敏、拒绝或转人工 |
| 记忆无限增长 | TTL、置信度衰减、去重合并、按项目配额;定期离线评估 |
记忆不是“可信系统提示”。检索到的记忆必须带来源、时间与置信度,并在上下文中明确标记为不可信数据;任何来自记忆的工具调用或权限变更都必须重新经过授权链。
六、数据飞轮闭环(叙事主线)
闭环验证指标:跨会话上下文连续(同一用户新会话能引用历史偏好)、画像字段随对话更新、技能复用率(同一任务二次执行命中技能记忆)、审计可追溯。生产还必须同时看负向指标:跨租户越权率=0、删除完成率=100%、重复写入率、抽取失败率、DLQ 积压、单用户/单租户抽取成本、记忆冲突率与人工纠正率。
七、实施路线(P0/P1/P2)
| 优先级 | 里程碑 | 交付物 | 判定 |
|---|---|---|---|
| P0-0 | 网关身份与凭证链 | Higress 路由 + AuthZ/Credential Broker + Consumer 校验 | 伪造 user_id/tenant_id 被拒;无凭证直连被拒 |
| P0-1 | mem0 服务化 + Qdrant 起栈 | 记忆服务 API(add/search/update/delete/list)+ Qdrant | 事实记忆链路(写入→检索→更新→删除)可重复执行 |
| P0-2 | 用户画像补强 | profile_schema 三表 + 画像提取器 | 租户内模板、字段提取、跨租户拒绝 |
| P0-3 | 异步提取工程化 | add-async + GetEvent + NATS JetStream + outbox + DLQ | 幂等、重试、毒消息隔离、成本上限可验证 |
| P0-4 | 隔离与删除闸门 | ACL 过滤 + 删除状态机 + 负向测试集 | 跨租户/跨用户 0 命中;删除后 0 召回 |
| P1-1 | 技能记忆 | 轨迹归纳器 + skill 节点 + 审核流 | 默认 private;发布需审核;工具白名单生效 |
| P1-2 | 观测审计 | memory_audit + 查询面 + 保留策略 | 按 trace 可追溯;审计只追加;PII 脱敏 |
| P1-3 | 投毒防护 | 来源可信度 + 冲突检测 + 注入检测 | 毒文档/恶意记忆不覆盖高可信事实 |
| P2 | 门户皮整合 | 记忆规则配置页 + 观测审计页(HiMarket 管理面) | 白盒可视化(M-12) |
| P2 | HA / 容量 / 灾备 | Qdrant/MySQL/NATS 高可用、备份恢复演练 | 达到 SLO;RPO/RTO 有实测 |
| P2 | 时序图谱(可选) | Zep/Graphiti 接入评估 | 记忆关系/演进分析 |
八、实证计划(计划,不是已通过)
当前状态:未实证。下述步骤完成并留下日志/报告后,才能把状态从“设计”改为“POC 通过”;生产通过还需 05 篇的闸门。
8.1 最小链路
- 环境:Qdrant Docker(6333/6334);复用本地 TEI embedding(9005)+ MySQL + NATS JetStream;
- 记忆服务:
D:\build\mem-service(venv + FastAPI + mem0 + qdrant-client),参考 11 篇 emb-service 模式; - 正向链路:add → add-async/GetEvent → search(带 min_score)→ update/delete → 画像(CreateProfileSchema/GetUserProfile)→ 审计查询;
- 证据沉淀:本专栏 13 篇(记忆底座实证),沿用“curl + 代码 + 可渲染 mermaid”,同时记录失败与限制。
8.2 必须补的负向与工程验证
| 类别 | 用例 | 通过标准 |
|---|---|---|
| 身份防伪 | 请求体伪造 user_id、tenant_id、project_id | 与签名上下文不一致即 403;不产生写入 |
| 跨租户隔离 | 租户 A 的 Consumer 检索租户 B 的记忆 | 0 命中;审计记录拒绝 |
| 跨用户隔离 | 同租户 A 用户读取 B 的私有记忆 | 0 命中;技能默认不可见 |
| 删除验证 | 删除事实/画像/技能后再次 search | 所有存储均 0 召回;删除任务状态可查 |
| 幂等 | 同一 idempotency_key 重复提交/worker 重投 | 只产生一组节点;event_id 一致 |
| 抽取失败 | LLM 超时、限流、返回非法 JSON | 重试/退避/进入 DLQ;不写入半成品 |
| 毒消息 | 超大对话、循环 tool_calls、注入文本 | 隔离且不阻塞主队列;有告警 |
| 投毒 | 恶意记忆尝试覆盖高可信事实 | 冲突进入待确认;高可信事实不被静默覆盖 |
| 成本 | 长对话/高频写入 | 触发预算上限时降级或拒绝;账单可预测 |
| 审计 | 任一写入/删除 | 可按 trace_id 查到 actor/service/source/前后哈希 |
判定:上述任一项未通过,不得宣称“记忆底座可用”;生产上线还需 HA、备份恢复、容量压测与合规评审。
九、与现有资产的关系
| 资产 | 关系 |
|---|---|
| 11 篇本地 TEI embedding(bge-m3) | 记忆向量化复用同一服务,不另起 embedding |
| 10 篇 RAGFlow | 记忆与知识检索并列供给 Agent(10 篇 MEM-1 主线) |
| 04/38 篇 HiMarket MCP 市场 | 记忆以 MCP Server 形态(mem0-mcp)上架,被 Agent 消费(10 篇 MEM-3) |
| 统一入口网关(08 专栏) | 记忆 API 走 Higress(SSO/限流/审计);tenant_id/owner_subject_id 由签名上下文派生,凭证由 AuthZ/Credential Broker 注入;不按请求体 user_id 注入 |
| HiMarket 门户皮 | 记忆规则配置页 / 观测审计页挂管理面(P2) |
生产边界:本方案基于 mem0 社区版(Apache-2.0)+ Qdrant 自托管;画像/技能/审计/删除/投毒防护为自建补强模块。当前仅为设计审核稿,未实证。生产上线前至少需:① Higress + AuthZ/Credential Broker 身份链;②
tenant_id > owner_subject_id > project_id > memory_type > visibility的强制隔离与负向测试;③ 幂等异步提取、DLQ、成本预算;④ 可验证删除与 legal hold 分离;⑤ 不可篡改审计与 PII 脱敏;⑥ 投毒/注入防护;⑦ Qdrant/MySQL/NATS HA、备份恢复与容量压测。百炼记忆库为全托管 SaaS,自托管形态的优势是数据不出域,但不等于自动满足合规。