feat/knowledge-retrieval-core
main
为 Knowledge Core / Retrieval Core 增加一套可复现的 RAG 检索评测能力,量化检索质量并提供可复现基线,为后续检索调优(embedding / reranker / RRF 参数)提供依据。
backend/data/benchmarks/*.json
app.retrieval.engine.search()
/api/benchmarks/*
backend/app/benchmarks/
metrics.py
datasets.py
rag.py
service.py
backend/app/contracts.py
backend/app/routes.py
backend/app/config.py
backend/data/benchmarks/rag-core-v1.json
backend/tests/test_benchmark.py
cd backend pytest tests/test_benchmark.py -v
验收笔记此前被误纳入 benchmark 提交,现摘除跟踪,文件保留在本地磁盘。 Co-Authored-By: Claude Code <noreply@anthropic.com>
本次 PR 已完成 RAG Benchmark 的基础 Dataset、Runner、指标、报告和接口结构,整体模块拆分清晰,现有测试也全部通过。但审阅中发现部分问题会直接影响 Benchmark 指标可信度及接口契约,当前暂不建议合并。
rrf_k、rerank、rerank_candidates 和 score_threshold 目前只写入配置快照,实际执行时仅使用了 top_k。
rrf_k
rerank
rerank_candidates
score_threshold
top_k
这会造成报告记录的配置与真实执行过程不一致,也无法完成以下实验对比:
建议接入统一的 RetrievalProfile;暂未支持的参数应明确拒绝,不能记录后静默忽略。配置快照还需要补充接口契约要求的索引版本。
RetrievalProfile
检索结果是 Block 级别,同一 Note 可能通过多个 Block 重复出现。当前 Recall 逐项计数,重复 Note 会被多次计算。
已复现:
retrieved = ["note-a", "note-a"] expected = {"note-a"} Recall@2 = 2.0
建议改为:
len(set(retrieved[:k]) & expected) / len(expected)
并补充重复 note_id 的单元测试。
note_id
POST /api/benchmarks/rag/runs 会等待整个 Benchmark 执行完成后才返回,因此:
POST /api/benchmarks/rag/runs
completed
queued
建议创建 Run 后立即返回 202 queued,由受管理的后台 Task 执行。Runner 应在 Case 之间检查取消状态,SSE 实时输出进度。
202 queued
当前只跳过无法解析的 JSON,没有校验合法 JSON 的字段结构。例如:
{ "dataset_id": "bad", "kind": "rag", "cases": 42 }
会在 len(cases) 处抛出 TypeError,导致整个 Dataset 列表失败。
len(cases)
TypeError
建议使用统一的 Dataset 元数据模型逐文件校验,并将单个损坏文件隔离处理。
citation_required
当前只要存在 expected_block_ids 就会计入 Citation Hit Rate,即使 Case 设置:
expected_block_ids
{ "citation_required": false }
仓库自带 Dataset 已存在这种情况,会造成引用指标分母不准确。
建议:
citation_required=true
modes
当前允许:
{ "dataset_id": "rag-core-v1", "modes": [] }
运行会直接完成并返回空的 metrics。建议给 modes 添加 min_length=1,同时拒绝重复模式。
metrics
min_length=1
Backend tests: 105 passed Frontend tests: 27 passed TypeScript type-check: passed Frontend production build: passed Python compileall: passed git diff --check: passed Merge conflict check: passed
现有测试均通过,但尚未覆盖上述指标正确性和运行生命周期问题。
Request changes / 暂不建议合并。
建议优先修复三个 P1 问题:
完成后再进行一次合并前审阅。
No dependencies set.
The note is not visible to the blocked user.
概述
为 Knowledge Core / Retrieval Core 增加一套可复现的 RAG 检索评测能力,量化检索质量并提供可复现基线,为后续检索调优(embedding / reranker / RRF 参数)提供依据。
功能点
backend/data/benchmarks/*.json目录注册(dataset_id / kind / version / cases),加载时校验,内容 sha256 哈希保证可复现。app.retrieval.engine.search(),不旁路检索链路;逐 (mode, case, repeat) 采样,按 mode 聚合;单样本失败不中断整体。/api/benchmarks/*共 8 个(数据集列表、RAG 运行、Agent 运行占位、运行列表/详情/取消/事件/报告)。文件清单
backend/app/benchmarks/:metrics.py、datasets.py、rag.py、service.pybackend/app/contracts.py(Benchmark 契约)、backend/app/routes.py(端点)、backend/app/config.py(数据集路径)backend/data/benchmarks/rag-core-v1.json(5 个中文检索 case)backend/tests/test_benchmark.py(13 个测试)测试
本次 PR 已完成 RAG Benchmark 的基础 Dataset、Runner、指标、报告和接口结构,整体模块拆分清晰,现有测试也全部通过。但审阅中发现部分问题会直接影响 Benchmark 指标可信度及接口契约,当前暂不建议合并。
需要修复
rrf_k、rerank、rerank_candidates和score_threshold目前只写入配置快照,实际执行时仅使用了top_k。这会造成报告记录的配置与真实执行过程不一致,也无法完成以下实验对比:
建议接入统一的
RetrievalProfile;暂未支持的参数应明确拒绝,不能记录后静默忽略。配置快照还需要补充接口契约要求的索引版本。检索结果是 Block 级别,同一 Note 可能通过多个 Block 重复出现。当前 Recall 逐项计数,重复 Note 会被多次计算。
已复现:
建议改为:
并补充重复
note_id的单元测试。POST /api/benchmarks/rag/runs会等待整个 Benchmark 执行完成后才返回,因此:completed,不是契约中的queued;建议创建 Run 后立即返回
202 queued,由受管理的后台 Task 执行。Runner 应在 Case 之间检查取消状态,SSE 实时输出进度。当前只跳过无法解析的 JSON,没有校验合法 JSON 的字段结构。例如:
会在
len(cases)处抛出TypeError,导致整个 Dataset 列表失败。建议使用统一的 Dataset 元数据模型逐文件校验,并将单个损坏文件隔离处理。
citation_required未参与 Citation Hit Rate 计算(P2)当前只要存在
expected_block_ids就会计入 Citation Hit Rate,即使 Case 设置:仓库自带 Dataset 已存在这种情况,会造成引用指标分母不准确。
建议:
citation_required判断是否计入指标;citation_required=true时,强制要求存在expected_block_ids。modes会生成无效报告(P2)当前允许:
运行会直接完成并返回空的
metrics。建议给modes添加min_length=1,同时拒绝重复模式。验证结果
现有测试均通过,但尚未覆盖上述指标正确性和运行生命周期问题。
审阅结论
Request changes / 暂不建议合并。
建议优先修复三个 P1 问题:
完成后再进行一次合并前审阅。
Pull request closed