feat/knowledge-retrieval-core
main
在 feat/knowledge-retrieval-core 上交付 RAG Benchmark 检索评测,并落实 PR #9 与 PR #11 两轮评审意见。
BENCHMARK_CAPACITY_EXCEEDED
BENCHMARK_INDEX_INCOMPATIBLE
RunCancelled
BENCHMARK_RUN_FAILED
total_cases
successful_cases
failed_cases
failure_rate
load_dataset
score_threshold
total
items
Last-Event-ID
cd backend && uv run pytest -q → 120 passed
cd backend && uv run pytest -q
🤖 Generated with Claude Code
暂不建议合并。基于提交 3898530,发现 1 个 P1、3 个 P2,均已复现,需要修复后再次审阅。
3898530
位置:backend/app/benchmarks/rag.py:48–57
backend/app/benchmarks/rag.py:48–57
当前检索调用虽然使用 async/await,但 FTS、默认 Embedding 和向量查询内部同步执行,逐样本循环没有实际让出事件循环。
复现:第 1 个样本完成后调度取消回调,直到全部 20 个样本执行完毕,取消回调才获得执行机会。
影响:较大数据集会阻塞其他 API 请求,运行中的取消请求无法及时处理,SSE 进度也无法实时发送。
建议:隔离同步检索计算,并在样本边界让出执行权;增加运行中取消、实时进度和并发请求的回归测试。
位置:backend/app/routes.py:966–977
backend/app/routes.py:966–977
历史回放直接遍历持续追加的事件列表。如果运行在回放期间完成,终止事件会通过历史列表输出;随后进入实时队列,同一终止事件被序号去重跳过,流便永久等待下一条事件。
复现:客户端已经收到 RunCompleted,但事件流仍不结束。
建议:历史回放和实时消费都必须识别终止事件;将订阅后的整个回放与消费过程纳入 try/finally,确保正常结束和断连时均清理订阅。
位置:backend/app/retrieval/engine.py:150–168
backend/app/retrieval/engine.py:150–168
实现丢弃数据库返回的真实总数,只取前 5000 条命中,再计算 total 和分页。默认 score_threshold=0 的普通搜索同样受影响。
复现:建立 5010 个匹配块后,返回 total=5000;请求 offset=5000、limit=10 得到空页,剩余结果无法访问。
建议:无阈值过滤时保留数据库计数与分页;有阈值过滤时实现完整的统计和分页,不应通过固定截断静默丢失结果。
位置:backend/app/benchmarks/rag.py:109–114
backend/app/benchmarks/rag.py:109–114
数据集校验允许只提供 expected_block_ids,但 Hit、Recall 和 MRR 仅使用 expected_note_ids 计算。
复现:第一条结果精确命中期望块,citation_hit=True,其余质量指标仍全部为零,并被计入汇总。
建议:统一校验与评分契约。可以明确要求笔记 ID,或根据期望块解析所属笔记后评分,避免把标注缺失误判为检索失败。
与审阅时最新 main(78e8e3e)存在以下文件冲突,Gitea 当前也显示不可自动合并:
78e8e3e
解决冲突时需要保留 main 已合入的 MCP 功能与文档更新,并重新验证合并后的版本。
请修复上述问题、补充回归测试并解决与 main 的冲突后,再次提交审阅。
No dependencies set.
The note is not visible to the blocked user.
概述
在
feat/knowledge-retrieval-core上交付 RAG Benchmark 检索评测,并落实 PR #9 与 PR #11 两轮评审意见。本轮(PR #11 第二轮评审)修复
BENCHMARK_CAPACITY_EXCEEDEDBENCHMARK_INDEX_INCOMPATIBLE)RunCancelled终止事件;失败分支脱敏(BENCHMARK_RUN_FAILED)total_cases/successful_cases/failed_cases/failure_rateload_dataset按文件名隔离无关损坏文件,顶层非对象拒绝score_threshold先于计数/分页,total与items一致Last-Event-ID游标测试
cd backend && uv run pytest -q→ 120 passed🤖 Generated with Claude Code
审阅结论
暂不建议合并。基于提交
3898530,发现 1 个 P1、3 个 P2,均已复现,需要修复后再次审阅。[P1] Benchmark 阻塞事件循环,运行中取消与实时进度失效
位置:
backend/app/benchmarks/rag.py:48–57当前检索调用虽然使用 async/await,但 FTS、默认 Embedding 和向量查询内部同步执行,逐样本循环没有实际让出事件循环。
复现:第 1 个样本完成后调度取消回调,直到全部 20 个样本执行完毕,取消回调才获得执行机会。
影响:较大数据集会阻塞其他 API 请求,运行中的取消请求无法及时处理,SSE 进度也无法实时发送。
建议:隔离同步检索计算,并在样本边界让出执行权;增加运行中取消、实时进度和并发请求的回归测试。
[P2] SSE 历史回放期间收到终止事件后可能无法关闭
位置:
backend/app/routes.py:966–977历史回放直接遍历持续追加的事件列表。如果运行在回放期间完成,终止事件会通过历史列表输出;随后进入实时队列,同一终止事件被序号去重跳过,流便永久等待下一条事件。
复现:客户端已经收到 RunCompleted,但事件流仍不结束。
建议:历史回放和实时消费都必须识别终止事件;将订阅后的整个回放与消费过程纳入 try/finally,确保正常结束和断连时均清理订阅。
[P2] FTS 搜索结果被新增的 5000 条上限截断
位置:
backend/app/retrieval/engine.py:150–168实现丢弃数据库返回的真实总数,只取前 5000 条命中,再计算 total 和分页。默认 score_threshold=0 的普通搜索同样受影响。
复现:建立 5010 个匹配块后,返回 total=5000;请求 offset=5000、limit=10 得到空页,剩余结果无法访问。
建议:无阈值过滤时保留数据库计数与分页;有阈值过滤时实现完整的统计和分页,不应通过固定截断静默丢失结果。
[P2] 仅标注块 ID 的合法样本被错误计为零分
位置:
backend/app/benchmarks/rag.py:109–114数据集校验允许只提供 expected_block_ids,但 Hit、Recall 和 MRR 仅使用 expected_note_ids 计算。
复现:第一条结果精确命中期望块,citation_hit=True,其余质量指标仍全部为零,并被计入汇总。
建议:统一校验与评分契约。可以明确要求笔记 ID,或根据期望块解析所属笔记后评分,避免把标注缺失误判为检索失败。
合并冲突
与审阅时最新 main(
78e8e3e)存在以下文件冲突,Gitea 当前也显示不可自动合并:解决冲突时需要保留 main 已合入的 MCP 功能与文档更新,并重新验证合并后的版本。
验证情况
请修复上述问题、补充回归测试并解决与 main 的冲突后,再次提交审阅。
Pull request closed