给本地文档库做“深度索引”

给本地文档库做"深度索引":当每个文件都有了 AI 摘要

本文分享一次真实实践:如何给一个积累了多年的本地文档库做批量深度索引,让每个文件都附带 AI 生成的摘要,实现"搜索即回忆"。

背景:文档越攒越多,找东西全靠记性

很多人都有这样的经历:电脑里的文档、资料、笔记攒了好几年,目录结构换了一茬又一茬,真正要找一份文件的时候,只能靠"我记得好像放在某个文件夹"这种模糊记忆。

传统方案是全文检索,但有两个痛点:

  1. 扫进去的只是关键字,不知道这份文件到底是讲什么的;
  2. 图片、扫描件、旧格式文件,全文检索根本覆盖不到。

我的思路是:给每个文件生成一份"AI 摘要",把摘要和文件路径存进一个索引 JSON,之后搜索摘要就能定位文件——相当于给文件库配了个"图书管理员"。

方案设计

整体流程分四步:

扫描文件 → 提取文本 → LLM 生成摘要 → 落盘索引

1. 扫描文件

os.walk 递归遍历目录,记录文件路径、扩展名、大小、修改时间。这里有两个小技巧:

  • 按扩展名分类处理:文本类(txt/md/json/csv 等)直接读;Office/PDF 类走专门提取库;媒体类(图片/视频)不做文本提取,标记 [MEDIA] 即可;
  • 跳过隐藏目录和临时文件,避免把缓存、回收站之类的东西也索引进去。

2. 提取文本

文本类文件直接读前 2 万字符(摘要用不到全文),注意用 errors='ignore' 容错,避免个别编码异常的文件中断整个流程。读出来是空的标记 [EMPTY],读不了的标记 [UNREADABLE],不阻塞主流程。

3. LLM 生成摘要

这是核心一步。调用大模型接口,给一个精简的 prompt:

请用 2-3 句话概括这份文档的核心内容,包括主题、主要观点和关键信息。

几个工程细节:

  • 并发控制:用 ThreadPoolExecutor 开多线程并发请求,本地 8000+ 文件、4 个并发线程,一个多小时跑完;
  • 断点续跑:每处理 20 个文件保存一次索引,重启后跳过已索引文件——跑长任务最怕中途断电全白干;
  • 失败重试:单文件请求失败记日志,不阻塞整体;已失败的留到下一轮补索引。

4. 落盘索引

索引结构很简单:

{
  "path": "D:/docs/2024/季度总结.docx",
  "title": "2024 年季度总结",
  "summary": "本文总结了 Q1-Q3 的工作进展……",
  "tags": ["总结", "2024"],
  "size": 245760,
  "mtime": "2024-12-31 18:30:00"
}

之后搜索 = 在摘要字段里做关键字匹配,比全文检索精准得多——因为摘要已经把"这份文件讲了什么"凝练出来了。

效果与收益

  • 搜索体验质变:以前"找那份讲 XX 的资料"要翻半天,现在一秒定位;
  • 发现遗忘资产:索引过程中意外发现很多"以为丢了其实一直躺在角落"的老文件;
  • 为后续 RAG 打底:有了结构化索引,接入检索增强生成(RAG)应用时,文件定位和筛选会顺畅很多。

一些踩坑记录

  1. 编码地狱:老文件什么编码都有,errors='ignore' 不是万能的,个别文件提取出来是乱码——标记 [UNREADABLE] 让后续人工处理,别死磕;
  2. 并发别开太大:线程数开太多容易被限流,4-8 个线程是比较稳的区间;
  3. 摘要长度克制:2-3 句话足够定位用途,太长反而增加存储和检索成本;
  4. 索引文件本身要备份:索引是生成的,坏了重跑一遍又是一两个小时,定期备份它比备份原文更划算。

结尾

这个方案不依赖任何重型框架,一个 Python 脚本 + 一个模型 API 就能跑起来,非常适合个人知识库、小团队资料库这类场景。核心思想很简单:让 AI 先"读"一遍你的文件库,把每个文件的"内容画像"存下来,之后的所有检索都走画像,而不是每次重新翻原文。

如果你也有一个越攒越乱的文件库,值得一试。代码结构不复杂,核心就是"扫描-提取-摘要-落盘"四个函数,改改路径就能用。

posted @ 2026-08-03 09:30  iCe-626  阅读(2)  评论(0)    收藏  举报