古籍 OCR + 大模型:从影像到理解的一体化流水线
古籍 OCR 大模型从影像到理解的一体化流水线一、见证奇迹的时刻古籍扫描件的文字OCR 能认但大模型读不懂古籍数字化工作通常分两步先用 OCR 将扫描件转为文本再用 NLP 工具做分词、标点和理解。但中间有个断裂带——OCR 输出的文本充满错误尤其是古籍中的异体字、避讳字、残缺字。OCR 可能把爲识别成為把因避讳缺笔的玄识别为乱码。这些错误在后端 NLP 处理时被放大导致最终的语义理解出现严重偏差。这个断裂带的核心问题在于OCR 系统和 NLP 系统各自独立设计和训练互不了解对方的需求和能力。OCR 追求字符识别率不在意后续能否被理解NLP 系统假设输入文本是正确的对 OCR 噪声几乎没有容错能力。如果将 OCR 和大模型做成一个端到端的流水线让大模型在理解文本时能够看到原始影像甚至可以参考图像特征来修正 OCR 的识别错误整个流程的鲁棒性和准确率都会有质的提升。二、从离散管道到一体化架构让文本和视觉特征双向流动flowchart TD A[古籍扫描影像] -- B{传统两阶段方案} A -- C{一体化方案} subgraph B_传统方案 B -- B1[OCR 引擎识别] B1 -- B2[文本后处理纠错] B2 -- B3[NLP 分词与标点] B3 -- B4[语义理解输出] B4 -.- B5[断裂点: OCR错误在NLP中不可修复] end subgraph C_一体化方案 C -- C1[视觉编码器提取图像特征] C1 -- C2[OCR识别 置信度] C2 -- C3[多模态大模型融合] C1 -- C3 C3 -- C4[上下文感知纠错] C4 -- C5[结构化理解输出] C5 -.- C6[优势: 图像特征辅助文本纠错] end style B5 fill:#c62828,color:#fff style C6 fill:#2e7d32,color:#fff一体化方案的核心设计视觉编码器使用预训练的 ViT 或 CNN 提取古籍页面的视觉特征包括字形特征、版式特征、残损标记OCR 模块输出识别文本和每个字符的置信度分数低置信度字符标记为待修正多模态融合大模型同时接收 OCR 文本和视觉特征用视觉信息辅助判断低置信度字符的正确识别结果上下文纠错利用古籍的语言模式如对仗、用典、特定文体格式来做全局纠正。三、文本-视觉对齐让大模型看着图片理解古文import torch from transformers import AutoModel, AutoTokenizer, AutoImageProcessor from PIL import Image from typing import List, Tuple class AncientTextPipeline: 古籍 OCR 大模型一体化流水线 设计原因将视觉特征和 OCR 文本同时输入大模型 让模型利用图像信息来修正 OCR 错误 def __init__( self, ocr_model, # OCR 识别模型 vision_encoder, # 视觉编码器如 ViT llm_model, # 大语言模型 llm_tokenizer, ): self.ocr ocr_model self.vision_encoder vision_encoder.cuda().eval() self.llm llm_model.cuda().eval() self.tokenizer llm_tokenizer def extract_vision_features( self, image: Image.Image, ocr_boxes: List[Tuple[int, int, int, int]] ) - torch.Tensor: 提取视觉特征重点关注低置信度 OCR 区域 设计原因不对整张图均匀采样而是聚焦 OCR 输出置信度低的位置 减少视觉 Token 数量提高推理效率 # 设计原因按 OCR 框裁剪图片区域 # 每个字符区域独立编码保留字符间的视觉独立性 region_features [] for box in ocr_boxes: x1, y1, x2, y2 box # 设计原因裁剪区域稍微外扩2px避免裁剪到字符边缘 # 但不过度外扩以免引入邻接字符的干扰 region image.crop((x1-2, y1-2, x22, y22)) region region.resize((32, 32)) with torch.no_grad(): feat self.vision_encoder(region) region_features.append(feat) # 设计原因拼接所有区域特征形成视觉特征序列 # shape: (num_chars, vision_dim) return torch.cat(region_features, dim0) def process_page( self, image: Image.Image, context_pages: List[str] None ) - str: 处理单页古籍 设计原因接收可选的上下文页面文本 利用前后文信息做跨页面的上下文纠错 # Step 1: OCR 识别 ocr_result self.ocr.recognize(image) recognized_text ocr_result.text char_confidences ocr_result.confidences # 每个字符的置信度 ocr_boxes ocr_result.boxes # 每个字符的边界框 # Step 2: 标记低置信度字符 # 设计原因只对置信度低于阈值的字符提取视觉特征 # 高置信度字符的 OCR 结果通常正确不需要视觉辅助 low_conf_indices [ i for i, conf in enumerate(char_confidences) if conf 0.7 ] # Step 3: 提取低置信度字符区域的视觉特征 low_conf_boxes [ocr_boxes[i] for i in low_conf_indices] vision_features self.extract_vision_features(image, low_conf_boxes) # Step 4: 构建多模态 Prompt # 设计原因将 OCR 文本、低置信度标记和视觉特征组织成结构化输入 # 让大模型理解哪些位置可能出错并参考视觉信息做判断 marked_text self._mark_low_confidence(recognized_text, low_conf_indices) context_str if context_pages: context_str 前文参考\n \n.join(context_pages[:2]) \n\n prompt f以下为古籍 OCR 识别结果方括号内字符识别置信度较低请结合上下文修正 {context_str}当前页 OCR 文本[ ]内为低置信度字符 {marked_text} 请输出修正后的完整文本并标注修改处。 # Step 5: 大模型推理含视觉特征 # 设计原因视觉特征作为特殊 Token 插入到 Prompt 中 # 使用 vision-language 交叉注意力机制融合视觉和文本信息 with torch.no_grad(): output self.llm.generate( prompt, vision_featuresvision_features, max_new_tokens2048 ) return output def _mark_low_confidence(self, text: str, indices: List[int]) - str: 标记低置信度字符用 [ ] 包裹 chars list(text) for i in sorted(indices, reverseTrue): if i len(chars): chars[i] f[{chars[i]}] return .join(chars)四、一体化流水线的代价与适用场景端到端流水线带来准确率提升的同时也引入了新的约束计算成本增加视觉编码器的加入使每次推理的计算量增加。对于仅需文本识别的场景如现代印刷体文档 OCR纯文本两阶段方案成本更低、速度更快。一体化方案更适用于古籍、手写体、低质量扫描件等 OCR 误差率较高的场景。视觉特征的利用效率并非所有 OCR 错误都能通过视觉特征修正。形近字如日和曰在低分辨率下视觉特征差异小视觉编码器难以区分。此时需要依赖更强的上下文理解来修正。模型选择的灵活性降低两阶段方案可以自由更换 OCR 引擎和 NLP 模型。一体化方案将视觉编码器和语言模型绑定更换任何一部分都可能破坏整体的特征对齐效果。延迟增加加入视觉编码导致端到端延迟增加 20%~50%。对于实时交互场景如手机拍照翻译延迟成本的代价过高。更适合离线批处理场景如图书馆古籍扫描件的批量处理。五、总结古籍 OCR 与大模型的一体化流水线通过融合视觉特征和文本上下文可以修正传统 OCR 在后端 NLP 处理中无法纠正的识别错误。核心技术包括低置信度区域的视觉特征提取、多模态特征融合和对上下文信息的利用。一体化方案的准确率提升以计算成本和延迟增加为代价更适用于 OCR 误差率较高的场景古籍、手写体、低质量扫描件而现代印刷体文档仍适用两阶段方案。视觉编码器和语言模型的绑定降低了组件替换的灵活性需在系统设计阶段权衡。