已开启
feat: harden RAM-A-MEM validation and observability #18
feat: harden RAM-A-MEM validation and observability #18
已开启
DoraA_Mengjie创建于 11 天前
DoraA_Mengjie
DoraA_Mengjie成员
11 天前

概述

完善 RAM-A-MEM 的输入参数和运行时配置约束,增强 Pipeline 与存储故障的可观测性,并补充记忆摄入、检索、幂等、Rerank 和日志行为的自动化验收用例。
更新补齐记忆摄入管线的模型兼容配置和 GLM Coding Plan 验证说明;

主要变更

  • 为 MCP 记忆摄入和检索接口的会话标识、消息标识、说话人、案例库、查询文本及集合大小增加 Unicode 字符数和 Schema 约束。
  • 补充记忆摄入幂等性边界覆盖,包括 Principal/会话范围隔离、消息元数据变更冲突、缓存命中及仅上下文消息请求。
  • 覆盖记忆类型和语气类型枚举、Evidence span 精确匹配、candidate Evidence 要求、Grounding 结果、超长记忆隔离及 fail_fast 行为。
  • 为 HTTP 限制、Session Admission、Pipeline、检索模式和权重、Rerank、Provider、认证、图检索、案例库及持久化存储路径增加明确的运行时边界与关联配置校验。
  • 保留 Provider 和 Pipeline 的原始错误位置,在 MCP 失败响应中返回请求关联标识,并区分 Embedding、幂等存储、SQLite、向量持久化、Rerank、Extract 和 Ground 等主要故障。
  • 通过 RAM_A_LOG_FORMAT 支持 jsoncompact 日志格式,通过 RAM_A_LOG_SOURCE 控制源码位置输出;补充七阶段 Pipeline 事件、稳定诊断字段及敏感内容脱敏。
  • 明确 Rerank 重试分类与 fail_open 行为;仅在显式启用 fail_open 时,Rerank 失败才返回 Rerank 前的 Hybrid 排序结果。
  • 补充 RAM-A-MEM 完整配置、Pipeline/检索输入输出、日志设计及 RPM/Agent 自测流程文档。
  • 新增 reasoning_effortenable_thinkingsend_temperatureoutput_token_parameterstructured_outputreasoning_only_retryjson_repair_attempts 等配置。
  • reasoning_content 只用于响应分类,不作为业务 JSON;如果只有 reasoning、没有最终 content,可按配置最多纠正重试一次。
  • Extract/Ground 支持 prompt_onlyjson_objectjson_schema 三种结构化输出模式。
  • 增加 Extract/Ground 输出 token 上限、可选 context window 预算和 reasoning reserve;Extract 超预算会先裁剪非候选上下文。
  • 增加一次 JSON repair 重试,修复后仍必须经过 Validate/Ground,不绕过质量门。
  • ARM64 GLM 配置、验证脚本、配置参考、管线文档和模型兼容说明已同步更新。

兼容性与安全性

  • 默认日志格式仍为 JSON,默认不输出源码位置。
  • 已有合法配置继续使用文档中定义的默认值;非法或相互矛盾的运行时配置会在服务启动校验阶段失败。
  • 日志不会记录 Bearer Token、API Key、消息正文、Evidence quote 或完整记忆正文。
  • 本次提交不包含内部测试跟踪材料和本地执行产物。

验证结果

  • cargo test -p memory-mcp:146 个测试通过。
  • cargo test -p memory-pipeline:40 个测试通过。
  • cargo check --workspace:通过。
  • cargo clippy -p memory-mcp --all-targets -- -D warnings -A clippy::field-reassign-with-default -A clippy::items-after-test-module:通过。
  • 修改涉及的 Rust 源文件通过 rustfmt --edition 2021 --check
  • git diff --check:通过。

当前分支基于最新的 upstream/master,领先 7 个提交,没有仅存在于上游的新增提交。

likedislike
合并受阻
DoraA_MengjieDoraA_Mengjie成员
11 天前 创建了 pull request,commit 6d7f674a
atomgit-bot
atomgit-bot
11 天前 评论:

🤖 正在生成合并请求摘要,请稍候…

likedislike
atomgit-bot
atomgit-bot
11 天前 评论:

🤖 AI 代码检视正在进行中,请稍候…

likedislike
openeuler-ci-botopeneuler-ci-bot成员
11 天前 将lyhu,huzhengce,liumiao27,fromhsc,gogoxiaoxiao,wqianli,leon-wang2021,kaitiandu设为审查人
openeuler-ci-botopeneuler-ci-bot成员
11 天前 添加了label:sig/sig-intelligence
此处折叠了47条消息 查看更多
chantsztung
chantsztung成员1 天前进行代码检视1
ram-a-mem/crates/memory-pipeline/src/client.rs
@@ -68,0 +195,4 @@
195+ usage: response.usage,
196+ });
197+ }
198+ if response.has_reasoning {
chantsztung
chantsztung1 天前评论:

[提问] 语义重试成功时首次调用的 usage 被丢弃

语义修复重试成功后只记录了最后一次响应的 usage,首次调用的 token 消耗没有累加,长期用量统计会系统性偏低。

建议:跨尝试累加 usage 后再上报。

likedislike
chantsztung
chantsztung成员1 天前进行代码检视1
deploy/arm64/Dockerfile
@@ -0,0 +8,4 @@
8+WORKDIR /opt/RAM-A
9+RUN git init . \
10+ && git remote add upstream https://atomgit.com/openeuler/RAM-A.git \
11+ && git fetch --depth 1 upstream refs/merge-requests/18/head \
chantsztung
chantsztung1 天前评论:

[阻塞] 拉取可变 MR ref,构建不可复现

refs/merge-requests/18/head 是随时可变的 MR 头,同一 Dockerfile 两次构建可能对应不同 commit;--depth 1 又丢失了基线信息,事后只有 /tmp/ram-a-commit 的记录而无校验。

建议:合并后改为固定 tag / commit pin(git fetch upstream <sha> && git checkout <sha>),或在 CI 中注入期望 sha 并校验后再构建。

likedislike
chantsztung
chantsztung成员1 天前进行代码检视1
deploy/arm64/scripts/rebuild-ram-a.sh
@@ -0,0 +2,4 @@
2+set -euo pipefail
3+ 
4+cd /opt/RAM-A
5+git fetch upstream refs/merge-requests/18/head
chantsztung
chantsztung1 天前评论:

[阻塞] 已部署环境的重建同样拉取可变 ref

与 Dockerfile 构建阶段同源的问题,但这条路径发生在已部署容器内,等于给运行环境留了一个"每次重建都可能拉到不同代码"的供应链入口。

建议:改用 /opt/metadata/ram-a-commit 记录的 sha 做固定 fetch,并在构建产物前校验 commit 一致。

likedislike
chantsztung
chantsztung成员1 天前进行代码检视1
deploy/arm64/Dockerfile
@@ -0,0 +49,4 @@
49+ install -d /opt/metadata; \
50+ cp /tmp/xiaoo.rpm /opt/metadata/xiaoo.rpm; \
51+ rpm -q xiaoO >/opt/metadata/xiaoo-nevra; \
52+ sha256sum /tmp/xiaoo.rpm >/opt/metadata/xiaoo.sha256; \
chantsztung
chantsztung1 天前评论:

[阻塞] sha256 只记录、不校验

sha256sum 只是把"当前下载到的文件"的哈希写进 /opt/metadata,没有与任何可信预期值比对——且下载源是"动态取最新版"的 URL,这条链路没有真正的完整性保障。

建议:pin 具体 RPM 版本号 + 期望 sha256,下载后 echo "<expected> /tmp/xiaoo.rpm" | sha256sum -c 通过再安装。

likedislike
chantsztung
chantsztung成员
1 天前 评论:

PR #18 评审总结

对照 merge-base 74879b1 与 PR head c2745ea 的完整 diff 做了一轮评审,主要问题已逐条发为行内评论。结论:存在 5 个建议合并前必须处理的阻塞项(集中在 deploy/arm64 镜像构建与服务端错误语义)

阻塞项(5)

  1. deploy/arm64/Dockerfile:28 — GLM/OpenRouter 密钥经 ARG→ENV 固化进镜像,docker history 可读;
  2. Dockerfile:11 — 构建拉取可变 refs/merge-requests/18/head,构建不可复现;
  3. scripts/rebuild-ram-a.sh:5 — 已部署环境的重建同样拉可变 ref;
  4. Dockerfile:52 — xiaoo RPM 的 sha256 只记录不校验,无完整性保障;
  5. memory-mcp service.rs map_pipeline_error — 无条件 retriable: true,永久性错误也被标记可重试。

应修项(7)

VECTOR_PERSIST_FAILED 兜底可重试、PIPELINE_VERIFY_FAILED 改名遗漏、json_repair_attempts == 1 魔法条件、strict json_schema 下 items 定义、reasoning 判定缺 <think> 标签支持、max_body_bytes 默认 1MiB→16MiB、文档错误映射表与代码不符。详见行内评论。

提问项(2)

  • Dockerfile:36 运行时镜像 root + 完整编译工具链的攻击面问题;
  • client.rs:198 语义重试成功时首次调用的 usage 被丢弃。

已排查、无问题

  • auth 配置校验并未 fail-open(AuthConfig::validate 仍强制 principal 检查);
  • SQLITE_READONLY 映射为不可重试,语义正确;
  • 错误码大规模改名与 observability 映射基本一致(仅上述一处遗漏)。

其他(非本 PR 引入 / 低优先级)

  • memory-pipeline/src/client.rs 退避公式 Duration::from_secs((1u64 << attempt.min(6)).min(64)) 三处重复(:287/:305/:367)为既有代码,建议顺手提取函数;
  • rerank 对 decode failed 不再重试已有测试显式断言(rerank.rs:342),理解为有意收窄;仅提示与主 LLM 路径重试策略不一致,确认无碍可忽略。

行号均基于 PR head c2745ea

likedislike