Skip to content

feat: collab 批次(可先合)—— Swagger UI / ask trace / index_filter / clippy / /v1 修复 / LLM-judge 基线 - #2

Merged
FPSZ merged 9 commits into
FPSZ:collabfrom
wjs480:feat/clean-batch
Sep 16, 2026
Merged

FPSZ merged 9 commits into
FPSZ:collabfrom
wjs480:feat/clean-batch

Conversation

@wjs480

@wjs480 wjs480 commented Sep 14, 2026

Copy link
Copy Markdown

背景

按评审建议把原 PR 拆开,这是"可以先合"的干净部分(评审原文:这几块独立且干净)。

包含内容(7 个提交)

提交 内容
feat(server): ask 链路补默认级别 trace 事件并关联审计 request-id ask 全链路 trace + request-id 关联
fix: 修复 workspace clippy 警告 parser match 折叠、core format 冗余引用
fix(server): 服务器模式应用 index_filter 索引筛选 对齐桌面端行为
fix(core): 修复 /v1 端点重复拼接与回归探活冷启动假失败 /v1 去重 + 冷启动探活
docs(qa): 新增作答层 LLM-judge 首个基线(126 题实跑) judge 闭环 + 首跑报告
feat(server): 新增 Swagger UI 交互式 API 文档页 离线内置资源,无 CDN 依赖
docs(release): 补齐 1.5.2 release notes 与文档索引 见下

为什么带上 release notes

Cargo.toml / ui/package.json / memori-desktop/tauri.conf.json 三处版本均为 1.5.2,但 docs/release/ 只到 v1.5.0rust-ci.yml 的版本一致性检查因此必然失败(上游 collab 本身也缺这个文件)。本 PR 一并补齐 RELEASE_NOTES_v1.5.2.md,并把 docs/README.md 的 Release 索引补上 v1.5.0 / v1.5.2

不包含

  • OCR 相关改动 → 独立 PR
  • 50k 压测 harness → 独立 PR

验证

  • cargo test --workspace --all-targets 全绿,0 失败
  • 基于 collab 最新 050c690,compare 显示 behind_by=0(不回退既有改动)

Sourcery 总结

强化服务器可观测性和配置处理,同时新增离线 API 文档、答案质量评估以及 1.5.2 版本文档。

新功能:

  • 添加离线 Swagger UI 页面,用于交互式 API 文档。
  • 添加答案层 LLM 评审基线,覆盖 126 个评估问题。

错误修复:

  • 在服务器模式下应用索引过滤,并防止重复的 /v1 URL 前缀。
  • 使嵌入模型健康检查能够容忍本地模型冷启动。
  • 解决工作区 Clippy 警告。

增强功能:

  • 在 ask 处理、追踪和审计事件中传递请求 ID,并添加完成和失败遥测数据。

文档:

  • 添加 1.5.2 版本发布说明,并更新版本发布文档索引。
  • 记录受限环境下的 LLM 评审基线及其结果。

测试:

  • 添加对请求 ID 传递、Swagger UI 资源、索引过滤设置以及 /v1 URL 构建的覆盖。
Original summary in English

Sourcery 总结

改进服务器可观测性和配置处理,同时添加离线 API 文档、答案质量评估,并完善 1.5.2 版本文档。

新功能:

  • 为服务器的 OpenAPI 文档添加离线、可交互的 Swagger UI。
  • 添加答案质量 LLM 评审基线,涵盖 126 个评估问题。

错误修复:

  • 在服务器模式下应用索引过滤,防止重复的 /v1 URL 前缀,并使回归健康探针能够容忍本地嵌入模型冷启动。

增强功能:

  • 在 ask 处理和审计事件中传递请求 ID,并添加完成和失败遥测。
  • 解决工作区 Clippy 警告并简化相关代码。

文档:

  • 记录首个答案层 LLM 评审基线及其受限环境下的结果。
  • 添加 1.5.2 版本说明,并更新版本文档索引。

测试:

  • 添加对请求 ID 注入、Swagger UI 资源、索引过滤设置和 /v1 URL 构造的测试覆盖。
Original summary in English

Summary by Sourcery

Improve server observability and configuration handling while adding offline API documentation, answer-quality evaluation, and complete 1.5.2 release documentation.

New Features:

  • Add an offline, interactive Swagger UI for the server’s OpenAPI documentation.
  • Add an answer-quality LLM judge baseline covering 126 evaluation questions.

Bug Fixes:

  • Apply index filtering in server mode, prevent duplicate /v1 URL prefixes, and make regression health probes tolerate local embedding-model cold starts.

Enhancements:

  • Propagate request IDs through ask handling and audit events, with completion and failure telemetry.
  • Resolve workspace Clippy warnings and simplify related code.

Documentation:

  • Document the first answer-layer LLM judge baseline and its constrained-environment results.
  • Add 1.5.2 release notes and update the release documentation index.

Tests:

  • Add coverage for request ID injection, Swagger UI assets, index-filter settings, and /v1 URL construction.

- ask_handler 完成/失败分别落 info/warn 事件,默认日志级别即可见,
  事件显式携带 request_id 与各阶段耗时(doc_recall/chunk_dense/merge/answer)
- 中间件把 request-id 注入 RequestId 扩展,审计 metadata 增加 request_id 字段
- 新增 extensions 注入端到端测试(http_tests)
- memori-parser: 行结束事件里嵌套 if 折叠为 match guard(行为等价)
- memori-core: format! 参数去掉多余引用(行为等价)
- 修复后 workspace clippy -D warnings 全绿
- AppSettings 新增 index_filter 字段(此前 serde 静默丢弃该配置)
- replace_engine 在 set_indexing_config 后应用筛选配置
- 新增 2 个反序列化单测固定解析行为
- build_openai_url:endpoint 已显式带 /v1(无尾斜杠)时不再追加,
  修复拼成 /v1/v1 导致 404 的问题;新增幂等单测
- 回归 harness 探活:单次 10s 超时改为 3 次重试(每次 20s + 5s 间隔),
  本地模型冷载(实测 12s+)不再被误判为服务不可用
- 报告入库:retrieval_regression_v2_judge_report.json(106 应答题全部判分)
- answer_correct_rate 0.401(受限配置下限:1.5B 作答 + 无 rerank)
- RETRIEVAL_BASELINE_V2.md 新增作答层基线章节,含环境、数字与解读
- GET /api/docs:Swagger UI 页面,数据源 /api/openapi.json
- CSS/JS 静态资源构建期内置(include_str!/include_bytes!),离线可用,
  符合本地优先原则,不引入 utoipa 依赖
- 新增端到端测试:页面 HTML、静态资源 content-type 与非空校验
当前 workspace/UI/Tauri 版本均为 1.5.2,但 docs/release 只有到 v1.5.0,lint job 的版本一致性检查因此必然失败(上游 collab 本身也缺)。补齐 RELEASE_NOTES_v1.5.2.md,覆盖本次工程硬化与 OCR 变更、已知边界与升级说明。

同时把 docs/README.md 的 Release 索引补上 v1.5.0 与 v1.5.2 两条(此前 v1.5.0 也未登记)。
@sourcery-ai

sourcery-ai Bot commented Sep 14, 2026

Copy link
Copy Markdown

审查者指南

本 PR 汇总了一组可独立合并的工程加固改动:增强 ask 链路的 trace/request-id 审计关联,补齐服务器端 index_filter、/v1 URL 和冷启动探活行为,内置离线 Swagger UI,清理 Clippy 警告,并新增 126 题作答层 LLM-judge 基线及 1.5.2 发布文档。

ask tracing 和审计关联的时序图

sequenceDiagram
    participant Client
    participant Middleware
    participant AskHandler
    participant Engine
    participant Audit

    Client->>Middleware: POST /api/ask
    Middleware->>Middleware: request_id_trace_middleware
    Middleware->>AskHandler: Request + RequestId
    AskHandler->>Engine: ask
    Engine-->>AskHandler: response and metrics
    AskHandler->>Audit: append_audit_event(request_id)
    AskHandler-->>Middleware: JSON response
    Middleware-->>Client: Response with x-request-id
Loading

作答层 LLM judge 基线的时序图

sequenceDiagram
    participant Harness
    participant Retrieval
    participant AnswerModel
    participant JudgeModel
    participant Report

    Harness->>Retrieval: Run regression case
    Retrieval-->>Harness: Evidence and context
    Harness->>AnswerModel: Generate answer
    AnswerModel-->>Harness: Answer text
    Harness->>JudgeModel: Judge against target_clues
    JudgeModel-->>Harness: correct, partial, or incorrect
    Harness->>Report: Write per-question reason and metrics
Loading

服务器索引筛选和模型端点修复流程图

flowchart LR
    Settings[AppSettings] --> Filter[index_filter]
    Filter --> Engine[replace_engine]
    Engine --> Indexer[Filtered indexing]
    Endpoint[Configured endpoint] --> URL[build_openai_url]
    URL --> V1[Single /v1 path]
    Probe[Embedding health probe] --> Retry[Up to 3 attempts]
    Retry --> Ready[Cold-start tolerant readiness]
Loading

文件级变更

变更 详情 文件
为服务器 ask 链路补充可观测性和审计关联。
  • 通过中间件生成或透传 request-id,并注入请求 extensions 与 tracing span。
  • 在 ask 成功、失败日志及审计 metadata 中记录 request-id 和阶段耗时指标。
memori-server/src/middleware.rs
memori-server/src/routes/ask.rs
memori-server/src/main.rs
memori-server/src/http_tests.rs
新增离线可交互的 Swagger UI API 文档。
  • 将 Swagger UI HTML、CSS 和 JavaScript 资源编译进服务器二进制。
  • 新增 /api/docs 及静态资源路由,并覆盖页面、资源和 MIME 类型测试。
memori-server/src/routes/swagger_ui.rs
memori-server/src/routes/mod.rs
memori-server/assets/swagger_ui.html
memori-server/assets/swagger-ui.css
memori-server/assets/swagger-ui-bundle.js
memori-server/assets/swagger-ui-bundle.js.LICENSE.txt
memori-server/assets/swagger-ui-standalone-preset.js
memori-server/assets/swagger-ui-standalone-preset.js.LICENSE.txt
memori-server/src/http_tests.rs
使服务器模式正确应用索引筛选配置。
  • 扩展服务器设置 DTO 以反序列化 index_filter。
  • 引擎替换时将启用的筛选规则传入索引配置,保持与桌面端一致。
  • 增加配置存在与缺省场景的反序列化测试。
memori-server/src/dto.rs
memori-server/src/model_runtime.rs
修复 OpenAI 兼容端点的 /v1 URL 拼接和回归探活冷启动误判。
  • 识别已带 /v1 后缀的 endpoint,避免重复追加。
  • 将 embedding 探活改为最多三次、每次 20 秒并带间隔重试。
  • 补充 URL 拼接回归测试。
memori-core/src/model_config.rs
memori-core/examples/retrieval_regression.rs
清理 workspace Clippy 警告并简化代码表达。
  • 折叠 parser 中带条件的 match 分支。
  • 移除 core 格式化中的冗余引用。
memori-parser/src/lib.rs
memori-core/src/retrieval_output.rs
建立作答层 LLM-judge 基线并记录受限环境首跑结果。
  • 通过 --judge 运行真实问答管线,再由 chat 模型依据 target_clues 判定 correct、partial 或 incorrect。
  • 新增 126 题逐题结果 JSON 报告及检索层、作答层指标解读。
docs/qa/RETRIEVAL_BASELINE_V2.md
docs/qa/retrieval_regression_v2_judge_report.json
补齐 1.5.2 发布说明和文档索引。
  • 新增覆盖 OCR、API、CI、性能、评测和已知边界的 1.5.2 release notes。
  • 在文档首页补充 v1.5.0 和 v1.5.2 发布说明链接。
docs/release/RELEASE_NOTES_v1.5.2.md
docs/README.md

提示和命令

与 Sourcery 交互

  • 触发新的审查: 在拉取请求中评论 @sourcery-ai review
  • 继续讨论: 直接回复 Sourcery 的审查评论。
  • 从审查评论生成 GitHub issue: 回复审查评论,请 Sourcery 根据该评论创建 issue。你也可以使用 @sourcery-ai issue 回复审查评论,从中创建 issue。
  • 生成拉取请求标题: 在拉取请求标题的任意位置写入 @sourcery-ai,即可随时生成标题。你也可以在拉取请求中评论 @sourcery-ai title,随时生成或重新生成标题。
  • 生成拉取请求摘要: 在拉取请求正文中你希望插入摘要的位置写入 @sourcery-ai summary,即可随时在该位置生成 PR 摘要。你也可以在拉取请求中评论 @sourcery-ai summary,随时生成或重新生成摘要。
  • 生成审查者指南: 在拉取请求中评论 @sourcery-ai guide,即可随时生成或重新生成审查者指南。
  • 解决所有 Sourcery 评论: 在拉取请求中评论 @sourcery-ai resolve,即可解决所有 Sourcery 评论。如果你已经处理完所有评论且不想再看到它们,这一功能会很有用。
  • 忽略所有 Sourcery 审查: 在拉取请求中评论 @sourcery-ai dismiss,即可忽略所有现有的 Sourcery 审查。如果你想从头开始进行新的审查,这一功能尤其有用——别忘了评论 @sourcery-ai review 以触发新的审查!

自定义你的使用体验

访问你的控制面板以:

  • 启用或禁用审查功能,例如 Sourcery 生成的拉取请求摘要、审查者指南等。
  • 更改审查语言。
  • 添加、删除或编辑自定义审查说明。
  • 调整其他审查设置。

获取帮助

Original review guide in English

Reviewer's Guide

本 PR 汇总了一组可独立合并的工程加固改动:增强 ask 链路的 trace/request-id 审计关联,补齐服务器端 index_filter、/v1 URL 和冷启动探活行为,内置离线 Swagger UI,清理 Clippy 警告,并新增 126 题作答层 LLM-judge 基线及 1.5.2 发布文档。

Sequence diagram for ask tracing and audit correlation

sequenceDiagram
    participant Client
    participant Middleware
    participant AskHandler
    participant Engine
    participant Audit

    Client->>Middleware: POST /api/ask
    Middleware->>Middleware: request_id_trace_middleware
    Middleware->>AskHandler: Request + RequestId
    AskHandler->>Engine: ask
    Engine-->>AskHandler: response and metrics
    AskHandler->>Audit: append_audit_event(request_id)
    AskHandler-->>Middleware: JSON response
    Middleware-->>Client: Response with x-request-id
Loading

Sequence diagram for answer-layer LLM judge baseline

sequenceDiagram
    participant Harness
    participant Retrieval
    participant AnswerModel
    participant JudgeModel
    participant Report

    Harness->>Retrieval: Run regression case
    Retrieval-->>Harness: Evidence and context
    Harness->>AnswerModel: Generate answer
    AnswerModel-->>Harness: Answer text
    Harness->>JudgeModel: Judge against target_clues
    JudgeModel-->>Harness: correct, partial, or incorrect
    Harness->>Report: Write per-question reason and metrics
Loading

Flow diagram for server index filtering and model endpoint fixes

flowchart LR
    Settings[AppSettings] --> Filter[index_filter]
    Filter --> Engine[replace_engine]
    Engine --> Indexer[Filtered indexing]
    Endpoint[Configured endpoint] --> URL[build_openai_url]
    URL --> V1[Single /v1 path]
    Probe[Embedding health probe] --> Retry[Up to 3 attempts]
    Retry --> Ready[Cold-start tolerant readiness]
Loading

File-Level Changes

Change Details Files
为服务器 ask 链路补充可观测性和审计关联。
  • 通过中间件生成或透传 request-id,并注入请求 extensions 与 tracing span。
  • 在 ask 成功、失败日志及审计 metadata 中记录 request-id 和阶段耗时指标。
memori-server/src/middleware.rs
memori-server/src/routes/ask.rs
memori-server/src/main.rs
memori-server/src/http_tests.rs
新增离线可交互的 Swagger UI API 文档。
  • 将 Swagger UI HTML、CSS 和 JavaScript 资源编译进服务器二进制。
  • 新增 /api/docs 及静态资源路由,并覆盖页面、资源和 MIME 类型测试。
memori-server/src/routes/swagger_ui.rs
memori-server/src/routes/mod.rs
memori-server/assets/swagger_ui.html
memori-server/assets/swagger-ui.css
memori-server/assets/swagger-ui-bundle.js
memori-server/assets/swagger-ui-bundle.js.LICENSE.txt
memori-server/assets/swagger-ui-standalone-preset.js
memori-server/assets/swagger-ui-standalone-preset.js.LICENSE.txt
memori-server/src/http_tests.rs
使服务器模式正确应用索引筛选配置。
  • 扩展服务器设置 DTO 以反序列化 index_filter。
  • 引擎替换时将启用的筛选规则传入索引配置,保持与桌面端一致。
  • 增加配置存在与缺省场景的反序列化测试。
memori-server/src/dto.rs
memori-server/src/model_runtime.rs
修复 OpenAI 兼容端点的 /v1 URL 拼接和回归探活冷启动误判。
  • 识别已带 /v1 后缀的 endpoint,避免重复追加。
  • 将 embedding 探活改为最多三次、每次 20 秒并带间隔重试。
  • 补充 URL 拼接回归测试。
memori-core/src/model_config.rs
memori-core/examples/retrieval_regression.rs
清理 workspace Clippy 警告并简化代码表达。
  • 折叠 parser 中带条件的 match 分支。
  • 移除 core 格式化中的冗余引用。
memori-parser/src/lib.rs
memori-core/src/retrieval_output.rs
建立作答层 LLM-judge 基线并记录受限环境首跑结果。
  • 通过 --judge 运行真实问答管线,再由 chat 模型依据 target_clues 判定 correct、partial 或 incorrect。
  • 新增 126 题逐题结果 JSON 报告及检索层、作答层指标解读。
docs/qa/RETRIEVAL_BASELINE_V2.md
docs/qa/retrieval_regression_v2_judge_report.json
补齐 1.5.2 发布说明和文档索引。
  • 新增覆盖 OCR、API、CI、性能、评测和已知边界的 1.5.2 release notes。
  • 在文档首页补充 v1.5.0 和 v1.5.2 发布说明链接。
docs/release/RELEASE_NOTES_v1.5.2.md
docs/README.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

嘿——我发现了 1 个问题

面向 AI 代理的提示
请处理本次代码审查中的评论:

## 个别评论

### 评论 1
<location path="memori-server/src/routes/ask.rs" line_range="84-94" />
<code_context>
                 .failed_requests
                 .fetch_add(1, Ordering::Relaxed);
             state.metrics.ask_failed.fetch_add(1, Ordering::Relaxed);
+            warn!(
+                request_id = %request_id.0,
+                error = %err,
+                elapsed_ms = ask_started_at.elapsed().as_millis() as u64,
+                "ask failed"
+            );
             map_engine_api_error(err)
         })?;

</code_context>
<issue_to_address>
**issue (broader_impact):** 新增的失败跟踪仅在 `engine.ask_structured` 返回错误时发出。对于空查询、会话验证、设置加载、策略验证、引擎初始化缺失以及其他提前返回路径导致的 ask 失败,仍然不会产生默认级别的失败事件,因此这些请求缺少所承诺的 ask 失败跟踪。

**触发条件:** ask 请求在调用 `ask_structured` 之前失败时。

**建议修复:** 在完整的处理程序流程外围发出单个失败事件,或者为每个提前错误返回路径添加等效日志,同时保留请求 ID 和耗时。
</issue_to_address>

Sourcery 评估

需要人工审查。 有 1 个发现需要优先处理;此外,服务器端索引过滤器和 URL 构建变更会改变运行时行为,而不正确的过滤器可能会在回滚后使索引中遗漏文档或包含非预期文档;重新建立索引可以修复该问题。请求 ID 也会持久化在审计记录中,但由此产生的影响是有限且可恢复的,不会造成不可逆的访问权限或策略变更。

阻塞性发现:memori-server/src/routes/ask.rs:94


Sourcery 对开源项目免费提供服务——如果您喜欢我们的审查结果,请考虑分享它们 ✨
Original comment in English

Hey - I've found 1 issue

Prompt for AI Agents
Please address the comments from this code review:

## Individual Comments

### Comment 1
<location path="memori-server/src/routes/ask.rs" line_range="84-94" />
<code_context>
                 .failed_requests
                 .fetch_add(1, Ordering::Relaxed);
             state.metrics.ask_failed.fetch_add(1, Ordering::Relaxed);
+            warn!(
+                request_id = %request_id.0,
+                error = %err,
+                elapsed_ms = ask_started_at.elapsed().as_millis() as u64,
+                "ask failed"
+            );
             map_engine_api_error(err)
         })?;

</code_context>
<issue_to_address>
**issue (broader_impact):** The new failure trace is emitted only when `engine.ask_structured` returns an error. Ask failures from empty queries, session validation, settings loading, policy validation, missing engine initialization, and other early-return paths still produce no default-level failure event, so the promised ask failure trace is absent for those requests.

**Triggers:** When an ask request fails before `ask_structured` is called.

**Suggested fix:** Emit a single failure event around the complete handler flow, or add equivalent logging to every early-error return path while preserving the request id and elapsed time.
</issue_to_address>

Sourcery assessment

Needs a human reviewer. 1 finding to address first, and the server-side index filter and URL-building changes alter runtime behavior, and an incorrect filter can leave omitted or unintended documents in the index after a revert; a reindex can repair that. Request IDs also persist in audit records, but the resulting impact is bounded and recoverable rather than an irreversible access or policy change.

Blocking findings: memori-server/src/routes/ask.rs:94


Sourcery is free for open source - if you like our reviews please consider sharing them ✨

Comment on lines 84 to 94
.failed_requests
.fetch_add(1, Ordering::Relaxed);
state.metrics.ask_failed.fetch_add(1, Ordering::Relaxed);
warn!(
request_id = %request_id.0,
error = %err,
elapsed_ms = ask_started_at.elapsed().as_millis() as u64,
"ask failed"
);
map_engine_api_error(err)
})?;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (broader_impact): 新增的失败跟踪仅在 engine.ask_structured 返回错误时发出。对于空查询、会话验证、设置加载、策略验证、引擎初始化缺失以及其他提前返回路径导致的 ask 失败,仍然不会产生默认级别的失败事件,因此这些请求缺少所承诺的 ask 失败跟踪。

触发条件: ask 请求在调用 ask_structured 之前失败时。

建议修复: 在完整的处理程序流程外围发出单个失败事件,或者为每个提前错误返回路径添加等效日志,同时保留请求 ID 和耗时。

Original comment in English

issue (broader_impact): The new failure trace is emitted only when engine.ask_structured returns an error. Ask failures from empty queries, session validation, settings loading, policy validation, missing engine initialization, and other early-return paths still produce no default-level failure event, so the promised ask failure trace is absent for those requests.

Triggers: When an ask request fails before ask_structured is called.

Suggested fix: Emit a single failure event around the complete handler flow, or add equivalent logging to every early-error return path while preserving the request id and elapsed time.

@FPSZ

FPSZ commented Sep 15, 2026

Copy link
Copy Markdown
Owner

审过了,代码部分可以合

上一轮(#1)我已经逐块核过这批改动,这次又复核了一遍:

  • request-id 的 extension 在 build_router 里挂在最外层,Extension<RequestId> 保证存在,ask 审计事件和完成日志关联正确
  • 服务端 index_filter 的应用语义和桌面端一致
  • build_openai_url/v1 去重正确,尾斜杠、#、大小写都覆盖到了,这次还补了 build_openai_url_does_not_double_v1_suffix 测试
  • Swagger UI 离线资源、路由注册、REST_ROUTE_METHOD_COUNT 同步都没问题

合并前有两件事想请你处理:

1. ⚠️ 请把 RELEASE_NOTES_v1.5.2.md 从这个 PR 摘掉

这份文件在 #2 / #3 / #4 里内容完全相同(md5 一致),而它写了:

1.5.2 is the engineering-hardening and OCR release … adds OCR ingestion for images and scanned documents.

#4 的 OCR 目前还在返工(extract_pdf_images 漏了间接 /Resources/XObject,多数真实扫描件仍然索引不到)。如果这个 PR 先合,仓库就发布了一份宣称 OCR 已可用的 release notes,与实际不符。

建议 release notes 只留在 #4,等 OCR 真正合入时一起发;docs/README.md 那 2 行同理。

2. retrieval_regression_v2_judge_report.json(7223 行)建议不入库

上一轮提过这点。这类逐题明细每跑一次基准就会整体重写,进仓库会让 diff 噪声很大、仓库体积持续膨胀,而且没人会在 code review 里读它。

建议:仓库里只留摘要(RETRIEVAL_BASELINE_V2.md 里那 32 行指标表已经够了),明细走 CI artifact —— #3perf-scale.yml 已经是这个模式,可以直接照搬。

如果确实需要一份可追溯的快照存档,也可以留,但建议在 docs/qa/README 或文件头写清楚它对应哪次 run、什么时候会更新。


这两点处理完就可以合了,代码本身没有需要改的地方。

wjs480 pushed a commit to wjs480/Memori-Vault that referenced this pull request Sep 15, 2026
该 release notes 在 FPSZ#2/FPSZ#3/FPSZ#4 三份 PR 中内容相同,且写明 adds OCR ingestion;若本 PR 先合,仓库会发布与事实不符的说明。按评审统一只保留在 OCR PR。docs/README.md 的两行索引同理一并摘除。
该 release notes 在 FPSZ#2/FPSZ#3/FPSZ#4 三份 PR 中内容相同,且写明 adds OCR ingestion;若本 PR 先合,仓库会发布与事实不符的说明。按评审统一只保留在 OCR PR。docs/README.md 的两行索引同理一并摘除。
retrieval_regression_v2_judge_report.json 有 7223 行,每跑一次基准就整体重写:进仓库会带来巨大 diff 噪声与体积膨胀,且没人会在 review 里读它。按评审建议删除该文件,仓库只保留 RETRIEVAL_BASELINE_V2.md 里的汇总指标;需要可追溯快照时以 CI artifact / 附件形式提供。同步修正文档里对该文件路径的引用。
@FPSZ

FPSZ commented Sep 16, 2026

Copy link
Copy Markdown
Owner

复审通过,可以合了。两点都按意见处理了:

  1. release notes 已摘出 —— RELEASE_NOTES_v1.5.2.mddocs/README.md 都不在这个 PR 里了,不会出现「先合这个 PR 就发布了一份宣称 OCR 可用的说明」的问题。
  2. judge 逐题明细已不入库 —— 7223 行的 JSON 移除,RETRIEVAL_BASELINE_V2.md 里保留汇总指标。整个 PR 从 +7784 行降到 +482 行,diff 现在是可读的。

保留下来的那段汇总质量很高,特别是这两处:

  • 明确标注了首跑是受限配置(1.5B 作答模型、无 rerank、图谱端点不可达),并写明「本数字是受限配置的作答层下限基线,不作为产品能力口径」;
  • 点出了 47 题「top3 已命中但答案判 incorrect」——检索召回 0.877 对答案正确率 0.401,这正是加 judge 的意义所在,一句话说清了检索层指标的盲区。

这种自己给自己设限、不拿有利数字当产品口径的写法,比多跑几个点有价值得多。

代码部分(Swagger UI、ask trace/request-id、index_filter、/v1 去重及其新增测试)前两轮已核过,无新增意见。

@FPSZ
FPSZ merged commit 2cb1025 into FPSZ:collab Sep 16, 2026
1 check passed
FPSZ added a commit to wjs480/Memori-Vault that referenced this pull request Sep 16, 2026
合并 FPSZ#2/FPSZ#3/FPSZ#5 后的 collab,三处冲突均为双方各自新增内容,保留双方:
- README.md「已实现但仍在优化」:50k 压测条目 + OCR 条目
- docs/qa/RETRIEVAL_BASELINE_V2.md:作答层 LLM-judge 基线 + OCR 接入与边界
- memori-server/src/dto.rs:AppSettings 的 index_filter 与 ocr_tesseract_path 两个字段

同时启用 pdf_with_indirect_resources_is_extracted(原 #[ignore]):
手工构造 lopdf::Stream 用结构体字面量会绕过 /Length 写入(lopdf object.rs:602
的 Stream::new 才会 dict.set("Length", ...)),存盘后流长度为 0、load 回来
content 为空,解码拿不到像素,测试因此假失败——与 get_pages() 无关(实测
get_pages()=1、get_page_resources 也正确返回 inherited)。改用 Stream::new 后
测试通过,可作为间接 /Resources + 间接 /XObject 的回归锁。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants