跳转至

文档解析

机体当前的全部文档解析逻辑已经迁移至 thirdparty/doc2md 目录下的 doc2md 库,知识库上传流程直接调用 doc2md::convertFile(path) 将任意输入转换为统一的 Markdown 文本,然后再进入分块与嵌入流程。doc2md 采用纯 C++11 实现,核心依赖 miniz(ZIP 容器解压)、tinyxml2(OpenXML/ODF XML 解析)与 libxls(WPS/BIFF 表格读取),在 Qt 生态内跨平台工作。

  1. 文本 / Markdown / 代码 / HTML
  2. .txt/.log/.json/.ini/.cfg 等直接读取 UTF-8 文本并裁剪空白。
  3. .md/.markdown 通过 markdownToText 去除标题、链接、代码块等装饰,保证知识库纯文本分块的一致性。
  4. .cpp/.py/.js/.ts/.css/.html/.htm 等代码与网页文件会自动包裹为 language ... 代码块或执行 htmlToText,保留语义结构。

  5. Office / OpenXML 模式

  6. .docx/.pptx/.xlsx 使用 miniz 内存解压 word/document.xmlppt/slides/slide*.xmlxl/sharedStrings.xml 等内容,再由 tinyxml2 解析节点,输出带有 ## Heading- bullet、Markdown 表格等结构化文本。
  7. .odt/.odp/.ods 同样依赖 tinyxml2 解析 ODF XML,保留段落/列表/表格结构。

  8. WPS / 旧格式

  9. .doc/.wps 通过 doc2md 内置的 Compound Binary 流阅读器解析 piece-table,自动处理 Unicode 与多种代码页。
  10. .et 优先调用 libxls 解析所有 sheet 并生成 ## Sheet N + Markdown 表格;失败时再回退到 UTF-16 扫描。
  11. .dps 解析 PowerPoint 二进制记录(TextChars/TextBytes/CString),与 .pptx 保持一致的 Markdown 输出。

  12. 知识库集成

  13. Expend::preprocessFiles 会逐个文件调用 doc2md 并收集 result.warnings,在 UI 日志中输出 [doc2md] ...,解析失败则直接跳过该文件。
  14. 获取到的 Markdown 文本继承原始标题、段落、表格与代码块,再经过 tokenizeContent 滑动窗口切分、交叠合并,写入“待嵌入”表格。
  15. 通过统一的 Markdown,后续相似度计算与 SQLite 持久化不再区分格式,减少旧版 docparser 的多分支维护成本。

  16. 测试与回归保障

  17. 单测位于 tests/unit/docs/doc2md_tests.cpp,使用真实的 .doc/.wps/.et/.dps 样例与临时 docx 夹测试 doc2md::convertFile 输出,覆盖主流格式。
  18. doc2md 库本身也保留 thirdparty/doc2md/tests(默认关闭),如需深入排查可单独构建。

得益于 doc2md 的统一接口,知识库上传流程现在可以天然支持上述全部格式,并且当 doc2md 添加新的解析器(如 ODT/ODP/ODS)时,EVA 前端无需再额外扩展分支即可自动继承能力。