模型的上下文窗口(Context Window)限制;精简长pdf输入的尝试;
1.模型的上下文窗口(Context Window)限制;
有些pdf太大,OCR转换为文本后,输入模型,模型不能识别全部页的pdf
(1). 文本分段处理 (Chunking)
这是最稳妥的办法。将 OCR 识别出的长文本切分为较小的片段,逐个输入模型,最后再进行汇总。
操作建议: 将文本按章节、页码或固定字符数(如每 5000 字一段)进行切割。
进阶技巧: 采用重叠分段法。在切分时,让后一段的开头包含前一段末尾的 100-200 字,这样可以保持上下文的连贯性,防止模型丢失段落衔接处的信息。
(2). 采用 RAG 架构 (检索增强生成)
如果你不需要模型一次性读完,而是想针对 PDF 内容进行问答,RAG 是最佳方案。
工作流程:
将 PDF 文本切块并转化为向量(Embedding)存入数据库。
当你提问时,系统先从数据库中检索出与问题最相关的几个文本块。
仅将这些相关的“片段”输入模型进行回答。
工具推荐: 可以使用 ChatPDF、Dify 或本地部署的 AnythingLLM。
(3). 优化 OCR 输出质量
有时模型不识别是因为 OCR 产生的乱码或格式错误干扰了理解。
精简冗余: OCR 往往会带入页眉、页脚、页码等重复信息。在输入模型前,利用 Python 脚本或正则表达简单清洗掉这些噪声,能节省大量 Token。
Markdown 格式: 尝试让 OCR 工具输出为 Markdown 格式。模型对带有层级结构(标题、列表、表格)的 Markdown 识别能力远强于纯文本。
(4). 选择超长上下文模型
如果必须一次性处理全文本,请确保你使用的模型版本支持足够的上下文。
2.精简长pdf输入的尝试
pdf超过10页,或者有大量文本内容的pdf,不能OCR提取文本后直接扔给LLM模型。
marker-pdf有行后处理
"line_merge": "marker.processors.line_merge.LineMergeProcessor"
会合并现实生活中文本为一段,而对于机器来说是有多个/n的文本。
于是直接删除有较长行的文本:
def keep_only_metadata_blocks(full_text: str) -> str:
lines = full_text.splitlines()
info_lines = [
l for l in lines
if 5 <= len(l) <= 300 and not l.startswith('#') and not l.startswith('*')
]
return "\n".join(info_lines) + "\n"
浙公网安备 33010602011771号