Files
kplam 51dc8dc4f6 Initial commit: QMDSearch 分层信息检索服务
- FastAPI + Qdrant + Redis + Ollama 技术栈
- L1→L2→L3→chunk 四层分层检索(dense + sparse RRF 融合)
- 文档三级总结与 2.5 级回退
- query 解析路由与分类
- /admin 管理页面
2026-07-29 21:24:40 +08:00

2.5 KiB
Raw Permalink Blame History

Tasks

  • Task 1: QdrantService 管理操作扩展:scroll_l1 分页(仅取 doc_id/title/category/tags/text/level 所需字段)、get_doc_detailL1+L2/L3 节点+chunk 计数)、delete_by_doc_id(四集合过滤删除返回各集合删除数)、count;内存 Qdrant 单测覆盖
    • SubTask 1.1: scroll_l1 与 count 实现 + 单测(分页游标、空集合)
    • SubTask 1.2: get_doc_detail 与 delete_by_doc_id 实现 + 单测(存在/不存在/删除后四层清空)
  • Task 2: 文档管理 APIGET /api/v1/documentslimit/offset 分页)、GET /api/v1/documents/{doc_id}(详情,不存在 code=1004)、DELETE /api/v1/documents/{doc_id}(幂等,返回各集合删除数);沿用统一响应与懒加载单例模式;TestClient 测试(mock QdrantService
  • Task 3: 统计 APIGET /api/v1/knowledge/stats(四层点数 + 类目分布 + uncategorized 数);TestClient 测试
  • Task 4: 管理页面 app/static/admin.html 单文件(内联 CSS/JS,零外部依赖)+ main.py 挂载 /admin:概览/文档管理(列表/详情/删除二次确认)/入库表单/检索测试台/类目列表五区块,统一 code≠0 错误提示;TestClient 存在性测试(200 + 五区块标记 + 无 http(s) 外链资源)
  • Task 5: 单测补全:tests/test_judge.pymock Ollama:正常判定/部分断言不支持/解析失败返回 0.0)、tests/test_response.py、tests/test_ollama_client.pymock httpxgenerate/json_mode/is_available 分支)、tests/test_run_eval.py(门槛判定与格式化纯函数)
  • Task 6: 部署与文档修补:Dockerfile 增加 COPY scripts/ scripts/CLAUDE.md 更新项目结构(scripts/eval、static)、API 清单(documents 管理端点、stats、/admin)与管理页面使用说明
  • Task 7: 集成验证:uv run pytest 全绿 + uv run ruff check app tests scripts 通过;内存 Qdrant 走通 入库→列表→详情→检索→删除→统计 管理闭环冒烟;确认页面 fetch 路径与实际 API 契约一致
  • Task 8: 修复验收发现:CLAUDE.md 项目结构中 tests 目录注释「18 个测试文件」与实际 26 个不符,改为不写死数量防止再次漂移

Task Dependencies

  • [Task 2] depends on [Task 1]
  • [Task 3] depends on [Task 1]
  • [Task 4] depends on [Task 2, Task 3]
  • [Task 7] depends on [Task 4, Task 5, Task 6]

Parallelizable

  • Task 1 / Task 5 / Task 6 互相独立,可并行
  • Task 2 与 Task 3 可并行(Task 1 完成后)