
做知识库的人大多踩过这个坑:普通的纯文本、Markdown 或者排版规范的 Word 文档,做 RAG 检索基本不会出大问题。但是一旦遇到扫描件 PDF、销售录音、会议视频,整个检索系统就经常答非所问。
用户搜一个合同条款,系统找不到,因为那是一份拍照倾斜、盖了红章的扫描件;用户搜上周例会里产品经理提的某个需求,系统更找不到,因为视频根本没有被文字化和打标。
过去几个月,我帮两家团队重构了他们的多模态知识库,处理了超过十万页合同扫描件和几百个小时的内部培训视频。今天把这套跑通的落地架构和具体步骤拆开来说。
为什么常规 RAG 处理不了这些文件?
原因很简单:数据模态不匹配。
普通的文本嵌入模型(Embedding Model)只能吃标准字符。扫描件本质上是一张图片,底层全是像素阵列;音视频则是连续的时序信号。如果你用传统的 `PyPDF2` 去读扫描件,读出来的要么是空字符,要么是一堆乱码。
要让大模型能够检索和阅读这些非结构化内容,核心逻辑只有一条:先把多模态数据转化为带有时空坐标的高质量结构化文本,再做混合检索。
第一步:搞定扫描件与复杂 PDF
处理扫描件最容易犯的错误,就是直接丢给一个基础的 OCR 工具,然后把吐出来的字符串一股脑拼在一起切块。这样做有两个致命后果:
1.表格结构完全碎掉:跨行数据混在一起,检索时数值和表头对不上。
2.多栏排版阅读顺序错乱:左右分栏的文章会被横向连着读,语义彻底被破坏。
实战中推荐的标准流程是:先做版面分析(Layout Analysis),再做文字与表格恢复,最后输出为 Markdown。
具体执行步骤如下:
1.预处理与页面过滤:先用 `PyMuPDF` 判断 PDF 是否包含文本层。如果每页可提取字符数小于 50,判定为扫描件,转为 300 DPI 的图像。
2.版面分割:调用版面分析模型,切分出文本块、表格、图片、印章区域。
3.分流解析:普通段落走 OCR;表格区域走专门的表格识别模型,转为 HTML 或者 Markdown 格式;关键图片则调用视觉模型生成一段说明(Caption)。
4.元数据打标:每一个切块必须记录原始字段:`{ “file_name”: “xxx.pdf”, “page”: 12, “bbox”: [x1, y1, x2, y2] }`。
关于解析工具的选型,以下是我们在生产环境中实测的数据对比:
| 工具 / 方案 | 优势 | 劣势 | 核心参数与开销 | 适用场景 |
|---|---|---|---|---|
| MinerU (Magic-PDF) | 版面还原度高,表格与公式解析准确 | 依赖 GPU 资源,模型体积较大 | 单页耗时约 1.5-3 秒(RTX 4090) | 复杂学术论文、财报、精细研报 |
| PaddleOCR (PP-StructureV2) | 部署轻量,中文识别率稳健,开源免费 | 遇到跨页复杂大表格容易错位 | 单页耗时约 0.8 秒(CPU 可跑) | 普通合同、发票、常规公文扫描件 |
| Tesseract OCR | 历史悠久,纯本地 CPU 极速运行 | 无版面分析能力,表格识别极差 | 单页耗时约 0.3 秒 | 纯文字排版规整的单栏旧文档 |
| 视觉大模型直出 (如 Qwen2-VL) | 理解上下文能力好,直接输出 Markdown | API 成本高,长文档容易超时丢字 | 约 0.01-0.03 元/页 | 难以被规则识别的复杂手写单据 |
避坑提示:
•必须保留 Markdown 表格语法。如果模型把表格压平为单行文本,数值检索的召回准确率会直接腰斩。
•保留坐标(BBox)和页码。当大模型生成回答时,把页码和定位框作为引用返回给用户,用户才能一眼核实原文。
第二步:音频的切片与高精度转写
音频检索最大的难点不在转文字,而在时间戳对齐与口语断句。
如果把一段 1 小时的会议录音一股脑转成一整篇没有标点的流水账,检索模型根本无法准确定位某句话出现在第几分第几秒。
标准音频处理流水线:
1.音频标准化:先用 `ffmpeg` 把各类音频格式统一转为 16kHz 采样的单声道 WAV 文件。
2.语音活动检测(VAD):使用 `Silero-VAD` 过滤掉会议中的静音和背景杂音,切出有效的语音片段(Audio Chunks)。
3.语音识别(ASR)带时间戳:调用带时间戳输出的语音识别模型,输出每个词或句子的起始时间(`start`)和结束时间(`end`)。
4.标点与说话人分离:补充标点符号,如果有需求,接一个 `pyannote.audio` 识别“是谁在说话”。
以下是常见语音转写工具的实测对比:
| 方案 | 中文识别率 | 时间戳精度 | 显存与运行速度 | 落地建议 |
|---|---|---|---|---|
| Faster-Whisper (Large-v3) | 良好(极少数幻觉) | 词级别(Word-level)精准 | 显存占用约 4.5GB,RTF 约 0.08 | 首选方案,适合绝大多数私有化部署 |
| FunASR / SenseVoice | 中文与方言表现好 | 句子级别,偶有偏移 | 显存占用低,推理速度极快 | 适合实时转写或算力有限的场景 |
| OpenAI Whisper API | 稳定,几乎无配置成本 | 支持句子级与词级 | 依赖网络,商业数据有出境合规风险 | 适合快速验证原型产品 |
避坑提示:
•音频切块的最小单位必须是完整的一句话。切块长度建议控制在 15 秒到 30 秒 之间,并保留 2 到 3 秒的前后重叠(Overlap)。
•时间戳必须写进切块的元数据。例如检索命中“Q3 预算超标 20%”,直接告诉前端播放器跳转到 `00:14:23`。
第三步:视频的双轨解构策略
很多团队一听到视频检索,就想着把每一秒的画面全抽出来做图像嵌入,这种做法既浪费存储又拖慢检索速度。
更合理的做法是“双轨制”:音频轨走文字检索,画面轨走关键帧语义描述。
具体实施步骤:
1.音画分离:用 `ffmpeg` 把视频的音频流分离出来,直接送入第二步的音频流水线,拿到带有时间戳的完整字幕文本。
2.智能抽帧:不要按固定秒数均匀抽帧。推荐使用 `PySceneDetect` 检测镜头切换点。只有画面内容发生显著变化时,才抽取一张关键帧(I-Frame)。
3.视觉打标:对抽取出来的关键帧,调用轻量级多模态模型(例如 Qwen2-VL-7B)做画面摘要。提示词直接指定:“用一句话描述画面中的核心动作、PPT 标题或展示的产品部件”。
4.时间戳对齐合并:把第 2 分钟抽出的画面描述,与第 2 分钟的语音文本按时间轴拼接成一个统一的切块。
这样一来,哪怕视频里的人嘴上只说了“大家看这个地方”,但画面里展示了“系统拓扑图”,系统依然能通过画面描述检索到该片段。
第四步:构建多模态切块与混合检索体系
把扫描件、音视频都转成结构化数据后,数据形态已经统一变成了:富文本 + 结构化元数据。
1. 统一切块格式
所有入库的数据块,建议统一采用以下 JSON 规范存储:
{
"content": "2024年第三季度由于供应链物料上涨,硬件生产成本提高了12%...",
"modality": "video",
"metadata": {
"source_file": "2024Q3季度复盘.mp4",
"timestamp_start": "00:14:20",
"timestamp_end": "00:14:55",
"visual_summary": "画面展示了各元器件采购价格波动的折线图",
"speaker": "张经理"
}
}
2. 混合检索(Hybrid Search)配置
在多模态知识库里,单靠向量检索经常会漏掉具体的型号、工号或专业术语。
最佳实践是“BM25 关键词检索 + 密集向量检索(Dense Vector)+ 交叉编码重排(Rerank)”:
•向量模型选型:推荐使用支持长文本且多语言表现稳定的模型,如 `bge-m3` 或 `text-embedding-3-large`。
•混合比重:设置初始召回数量为 Top-50,其中 BM25 占比 0.3,向量检索占比 0.7。
•重排过滤:把初步召回的 50 个切块送进重排模型(如 `bge-reranker-v2-m3`),选出相关性评分最高的前 5 个片段送给大模型。
根据我们在两万份混合资料中的测试,增加重排步骤后,冷门实体名与数值检索的准确率改善了近 35%。
第五步:生成回答与溯源引用
最后一步是把检索出来的切块喂给大模型。为了让回答真实可靠,Prompt 必须明确约束引用格式。
给大模型下达指令时,要求它遵守以下规则:
•如果引用来自文档,必须标注文件名称与页码。
•如果引用来自音视频,必须标注具体起止时间戳,格式为 `[mm:ss]`。
当用户看到大模型回答“这款电机的峰值转速是 12000 转”,并且后面附带了一个可以点击跳转到 `03:45` 的视频锚点或者 PDF 第 8 页的高亮定位,知识库的可用性才算真正落地。
搭建这套多模态知识库的关键,从来不是盲目堆砌大模型,而是把前期文件解析的脏活累活做好。把每个模态的时空坐标锚定清楚,后面的检索和问答就会水到渠成。
原创文章,作者:七点互动,如若转载,请注明出处:https://ai.qidianhudong.com/aikonw/4178.html