Skip to content

refactor(rag): introduce doc_service and migrate Document off legacy doc managers#1069

Open
ChenJiahaoST wants to merge 55 commits intoLazyAGI:mainfrom
ChenJiahaoST:cjh/refact-doc-manager
Open

refactor(rag): introduce doc_service and migrate Document off legacy doc managers#1069
ChenJiahaoST wants to merge 55 commits intoLazyAGI:mainfrom
ChenJiahaoST:cjh/refact-doc-manager

Conversation

@ChenJiahaoST
Copy link
Copy Markdown
Collaborator

📌 PR 内容 / PR Description

  • 引入新的 doc_service 主链路,新增 DocServer、新的 DocManager、任务/知识库/文档管理接口,以及对应本地 standalone/mock 示例
  • 重构 Document,去除对旧 DocManager / DocListManager 的主链路依赖,改为对接新的 doc_service / DocumentProcessor
  • 迁移并恢复本地 dataset_path 导入与扫盘能力,支持 enable_path_monitoring
  • 补齐文档上传、删除、取消、重解析、metadata patch、transfer、KB 删除等状态机与回调收口
  • 新增 /v1/chunks 切片查看接口,支持按 kb_id/doc_id/group/algo_id 分页查询,并按 node.number 升序返回
  • 补齐 transfer 的文档管理语义,支持 target_doc_idtarget_filenametarget_file_pathtarget_metadata
  • 补齐 parsing worker 外部拉取任务与 transfer payload 校验
  • 将切片查询链路改为真分页,覆盖 MapStore / OpenSearch / ElasticSearch
  • 调整公开导出与文档入口,legacy DocManager / DocListManager 标记为 deprecated,不再作为主推荐入口
  • 补充并重写 doc_service / Document 相关单元测试,收口到可提 PR 的状态
  • 修复 Document(manager=True/'ui') 启动本地子服务时对已安装旧版 lazyllm 的源码优先级问题,避免 manager='ui' 因导入旧包而报错

✅ 变更类型 / Type of Change

  • 修复 Bug / Bug fix (non-breaking change that fixes an issue)
  • 新功能 / New feature (non-breaking change that adds functionality)
  • 重构 / Refactor (no functionality change, code structure optimized)
  • 重大变更 / Breaking change (fix or feature that would cause existing functionality to change)
  • 文档更新 / Documentation update (changes to docs only)
  • 性能优化 / Performance optimization

🧪 如何测试 / How Has This Been Tested?

  1. 运行核心回归测试:
    conda run -n lazyllm python -m pytest -q \
      tests/basic_tests/RAG/test_doc_service_doc_manager.py \
      tests/basic_tests/RAG/test_doc_service_doc_server.py \
      tests/basic_tests/RAG/test_document.py \
      tests/basic_tests/RAG/test_doc_processor.py
    结果:37 passed, 6 skipped
  2. 运行差异范围内 flake8:
    conda run -n lazyllm python -m flake8 \
      lazyllm/components/deploy/relay/server.py \
      lazyllm/tools/rag/document.py \
      lazyllm/tools/rag/doc_impl.py \
      lazyllm/tools/rag/doc_service/base.py \
      lazyllm/tools/rag/doc_service/doc_manager.py \
      lazyllm/tools/rag/doc_service/doc_server.py \
      lazyllm/tools/rag/parsing_service/base.py \
      lazyllm/tools/rag/parsing_service/impl.py \
      lazyllm/tools/rag/parsing_service/server.py \
      lazyllm/tools/rag/parsing_service/worker.py \
      lazyllm/tools/rag/store/document_store.py \
      lazyllm/tools/rag/store/hybrid/hybrid_store.py \
      lazyllm/tools/rag/store/hybrid/map_store.py \
      lazyllm/tools/rag/store/segment/elasticsearch_store.py \
      lazyllm/tools/rag/store/segment/opensearch_store.py \
      tests/basic_tests/RAG/test_doc_service_doc_manager.py \
      tests/basic_tests/RAG/test_doc_service_doc_server.py \
      tests/basic_tests/RAG/test_document.py \
      tests/basic_tests/RAG/test_doc_processor.py
  3. 运行语法校验与本地联调:
    • python -m py_compile ...
    • 本地验证 /v1/chunkstransfercanceldelete_kb 等链路
    • 验证 Document(manager='ui') 不再因子进程导入旧安装包而初始化报错

📷 截图 / Demo (Optional)

  • 暂无

⚡ 更新后的用法示例 / Usage After Update

from lazyllm.tools.rag import Document
from lazyllm.tools.rag.doc_service import DocServer
from lazyllm.tools.rag.doc_service.base import TransferItem, TransferRequest

# 1. 本地 Document 直接导入目录并开启扫盘
doc = Document(
    dataset_path='./data',
    enable_path_monitoring=True,
)

# 2. 启动带 doc_service 和本地 parsing service 的管理模式
managed_doc = Document(
    dataset_path='./data',
    manager='ui',   # 或 True
)

# 3. 通过 DocServer 查看 chunks
server = managed_doc.manager
chunks = server.list_chunks(
    kb_id='test_kb',
    doc_id='survey-doc-001',
    group='block',
    algo_id='algo1',
    page=1,
    page_size=20,
)

# 4. transfer 到新的 target_doc_id
resp = server.transfer(TransferRequest(items=[
    TransferItem(
        doc_id='source-doc-001',
        source_kb_id='kb-a',
        source_algo_id='algo1',
        target_doc_id='target-doc-001',
        target_kb_id='kb-b',
        target_algo_id='algo1',
        target_filename='copied.txt',
        target_file_path='/tmp/copied.txt',
        target_metadata={'source': 'transfer'},
        mode='copy',
    )
]))

🔄 重构前 / 重构后对比 (仅当 Type 为 Refactor) / Refactor Before & After (only for Refactor)

重构前 / Before:

  • Document 主链路依赖旧 DocManager / DocListManager
  • 本地扫盘能力挂在 legacy DocListManager
  • 文档管理、任务状态、解析回调、切片查看没有统一的新服务入口
  • chunks 查询无完整服务链路,分页能力不完整
  • transfer 更偏 parser 侧任务语义,缺少完整 target 文档管理字段

重构后 / After:

  • Document 主链路切换到 DocImpl + DocumentProcessor + DocServer
  • 本地 dataset_path 导入与扫盘迁移到新架构
  • DocServer 成为新的文档管理主入口
  • chunks 支持从 doc_server -> parsing_service -> store 的完整分页查看链路
  • transfer 支持新的 target 文档管理语义,并保持 parser 协议边界稳定
  • legacy DocManager / DocListManager 保留兼容,但不再作为主推荐入口

⚠️ 注意事项 / Additional Notes

  • 本 PR 不物理删除旧 DocManager / DocListManager 文件,但已将其降级为 legacy / deprecated 入口
  • 当前 transfer 仅支持同一算法内的知识库间转移,不支持跨算法 transfer
  • target_metadata 语义为:继承 source metadata 后按 patch 覆盖,不是整份替换
  • manager='ui' 的初始化链路已修复为优先使用当前工作区源码;如果运行环境仍有问题,更可能是安装/打包环境问题
  • tests/basic_tests/RAG/test_doc_processor.py 中的 6 skipped 为原有 skip,不是本 PR 新引入的问题

@ChenJiahaoST ChenJiahaoST requested review from a team as code owners March 24, 2026 12:08
@gemini-code-assist
Copy link
Copy Markdown

Warning

Gemini encountered an error creating the summary. You can try again by commenting /gemini summary.

Copy link
Copy Markdown
Collaborator Author

@ChenJiahaoST ChenJiahaoST left a comment

Choose a reason for hiding this comment

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

截止到worker.py之前:
当前已提29条评论

@ChenJiahaoST
Copy link
Copy Markdown
Collaborator Author

已重新核对并处理截至 worker.py 之前的 29 条 review comments,对应 thread 已全部 resolve。当前剩余未处理的 review thread 只有今天新增在 lazyllm/tools/rag/parsing_service/worker.py 的那一条,我先保留待下一轮继续修改。

@ChenJiahaoST
Copy link
Copy Markdown
Collaborator Author

补充说明一下这轮收口的两处主线改动:

  1. Document(manager=True) 不再在 __init__ 阶段启动本地 parser / DocServer,现在延迟到 Document.start() 的启动流程里执行。
  2. KbCreateRequest / KbUpdateRequest 已收成同一个 KbRequest model,create_kb 仍在服务端保留 kb_id 必填校验。

其余本轮 unresolved 里,当前 diff 已覆盖的紧凑格式、parser_url 初始化校验、upload form 入参收口、worker callback 过滤、默认 group 常量统一、老单测恢复 / patch-heavy 用例删减等项,我会一并 resolve。

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