跳转到内容

文件格式

如果你想确切知道 omem ingest 都能读哪些东西、每种格式归哪个引擎管、图片和 OCR 与整理器在各格式下分别怎么表现,那就看这一页。解析链是一个第一等的设计考量,不是事后才补的边角料——所以这一页会把每种格式到底能拿到什么,讲得很具体。

一个文件被怎么处理,由三组互不相干的设置决定:把它转成 Markdown 的解析器(parser)、对里面图片生效的图片策略,以及写出最终 wiki 页的整理器模式(curator mode)。下面是每种格式连同它的默认值:

格式解析库图片默认整理器默认
PDFpymupdf4llm(保留版式)+ RapidOCRocrllm-full
DOCXpython-docxvlmllm-full
PPTXpython-pptxvlmllm-full
XLSX / .xls / .xlsm / .odscalamine(表格)+ openpyxl(图片)vlmllm-full
Markdown原样直通(逐字保留)frontmatter-only
纯文本 / CSV / TSV / JSON原样直通frontmatter-only
HTMLBeautifulSoup + markdownifyllm-full
邮件(.eml / .msg)标准库 email / extract-msgvlm(内联图)(mail kind)
日历(.ics)icalendar(calendar kind)
图片(png/jpeg/gif/webp/tiff/emf)Pillow(EMF/WMF 另加 LibreOffice)vlm

表里有两个开关可以按格式单独调——见配置 schema 里的 parser.images.*curator.mode.*,那里把每个取值都讲全了。第三个开关 ingest.formats.* 是个总闸,管某种格式在所有 source 上的整体开关。这一页给的是逐格式的视角;配置页给的是逐取值的视角。

OMem 跟那种”转成文本、视觉信息全丢光”的工具最大的区别,就是它把图片留下来并描述出来

  • PDF 走 pymupdf4llm,保留版式。嵌进去的图片默认走 OCR(PDF 大多是文字,对每一页都上视觉模型会白烧不少 token、收益却很小);要是某一页几乎抽不出文字,就当它是扫描件,转去走视觉模型。
  • DOCX / PPTX / XLSX 由确定性的 Office 库解析,里面嵌的图片默认走 vlm——视觉模型就地写一段描述。这样一来,PPT 里的图、图表截图、贴进去的屏幕截图都变成了可搜索的文字,而不是凭空消失。

Markdown、文本、数据文件——原样不动

Section titled “Markdown、文本、数据文件——原样不动”

Markdown、纯文本、CSV、TSV、JSON 都是逐字直通——没有任何 LLM 去重写正文。它们本来就结构清晰,所以整理器跑在 frontmatter-only 模式:只写一段摘要和标签,正文逐字节照搬。(这里有个反直觉的好处:逐字保留的正文,把精确的数字和结构都留住了,而一次彻底重写反倒可能把这些抹平。)

邮件和日历不是 file 意义上的”文件”,它们是 mailcalendar 这两个 kind。一整条邮件线程会渲染成单独一页(信头、正文、内联图片),附件则递归地走这同一张总览表——一份作为邮件附件的 PDF,照样按 PDF 的方式处理。日历事件渲染时带上时间、地点、组织者和与会人。

图片——描述出来,EMF 也能搞定

Section titled “图片——描述出来,EMF 也能搞定”

一个独立的图片文件,由视觉模型描述。EMF/WMF(Office 特别爱往里嵌的那种矢量格式)会先转成 PNG——Pillow 先试,LibreOffice 那个无头的 soffice 是更靠得住的兜底——这样这些图就不会变成死胡同。

图片怎么被描述出来:OCR 还是 VLM

Section titled “图片怎么被描述出来:OCR 还是 VLM”

parser.images.<fmt> 设成 vlm,一张图只在值得的时候才送去视觉模型。OMem 会先把装饰性的图筛掉,省得你为描述图标和占位间隔花冤枉钱:

场景在什么条件下送去视觉模型
独立图片文件总是送(除非任意一边 < 100 px)
PowerPoint 幻灯片里的图显示尺寸每边 ≥ 80 px 不是小于 200×200 的小图章
Word 段落图(独占一行)总是送(独占一行的图就是内容)
Word 内联图两边都 ≥ 200 px(更小的算图标)
Excel 单元格图总是送(Excel 里的图很少是装饰)
邮件/日历内联图≥ 5 KB ≥ 100×100 px(跳过追踪像素和签名档美化图)

OCR(PDF 的默认选择)用的是 RapidOCR,它对中英文混排处理得很好。为了在图片密集的文档上把内存控制住,OCR 跑在一个子进程里、每处理 parser.ocr_subprocess_batch 张图就重启一次;另有一个按文档计的上限(parser.max_images_per_doc,默认 200),与其让内存一路膨胀,不如把长尾的那些图跳过——任何被跳过的都会写进日志,绝不会悄没声地丢掉。

想在所有地方都不再摄入某种格式——比如你压根不想给表格建索引:

Terminal window
omem config set ingest.formats.xlsx false

想继续摄入某种格式、但不再描述它里面的图片(比如跳过邮件签名档的美化图):

Terminal window
omem config set parser.images.mail off

两者都在下一次跑的时候生效。已有的页面不会被删——只是那种格式的页面不再被刷新了。

  • 配置 schema —— parser.images.*ingest.formats.*curator.mode.* 这几组字段的完整说明。
  • 摄入生命周期 —— 解析和图片描述在整条流水线里处在哪一环。