让TeleOCR吐出HTML和LaTeX:提示词模板实测,最稳的写法就这几种

发布时间:2026/10/12 11:37:50
让TeleOCR吐出HTML和LaTeX:提示词模板实测,最稳的写法就这几种 让TeleOCR吐出HTML和LaTeX提示词模板实测最稳的写法就这几种【免费下载链接】TeleOCR项目地址: https://ai.gitcode.com/XingChen-AGI/TeleOCRTeleOCR 这波热度很大程度上是提示词带来的——社区里到处是6行代码跑通三句话让模型输出 HTML/LaTeX的帖子但真正落到生产环境很多人踩的第一个坑就是同样一张图提示词换个说法输出就从表格变成了乱码甚至直接吐一坨 OTSL 标记语言。这不是玄学。TeleOCR 是一个约 1.2B 参数的生成式视觉语言模型基于 Qwen2.5-VL 架构见仓库根目录的 config.json它本质上不是识别器而是生成器给定图片 一句指令模型按自回归方式逐个 token 吐出文本。输出是什么形态几乎完全由提示词决定。本文结合仓库源码与官方 Quick Start把HTML、OTSL、LaTeX 三种输出形态的提示词差异讲透并给出三套经过源码验证的最稳模板以及一套输出校验与兜底解析策略。为什么提示词能决定输出形态先看仓库里官方提供的推理入口 README.md核心函数只有几十行def infer(image: Image.Image, prompt: str) - str: messages [ {role: system, content: You are a helpful assistant.}, {role: user, content: [ {type: image}, {type: text, text: prompt}, ]}, ] chat_prompt processor.apply_chat_template( messages, tokenizeFalse, add_generation_promptTrue, ) inputs processor( text[chat_prompt], images[image.convert(RGB)], paddingTrue, return_tensorspt, ).to(devicemodel.device, dtypemodel.dtype) output_ids model.generate( **inputs, use_cacheTrue, max_new_tokens4096, do_sampleFalse, ) ...两个值得注意的细节图片统一convert(RGB)无论原始 PNG/JPG 都先归一化这是避免模型在 RGBA 通道上读歪的基本功do_sampleFalse强制贪心解码。官方仓库 generation_config.json 里默认写的是temperature: 0.1、top_k: 1、top_p: 0.001、repetition_penalty: 1.05本身就接近确定性采样而 Quick Start 直接覆盖成贪心目的只有一个同一张图 同一句提示词输出必须可复现。社区里代码截图还原的经验帖也反复强调这一点——解析结果要进流水线随机性就是事故源。正因为是生成TeleOCR 的每个子任务都对应一套专门的输出协议纯文本、OTSL表格结构语言、LaTeX、带 bbox 的版面描述。提示词的职责是把模型引导到对应的协议上而不是靠它自由发挥。HTML / OTSL / LaTeX三种形态三种策略表格不要直接要 HTML先要 OTSL这是最容易踩坑的地方。很多第一次用的人会写Please output the table in HTML format结果模型要么直接吐table但是合并单元格rowspan/colspan错漏百出要么中途崩掉开始复述图片内容。TeleOCR 的官方策略是绕开 HTML先让模型输出 OTSL 中间格式。OTSL 只有 6 个特殊 token在 README.md 里定义得明明白白OTSL_NL nl # 换行行分隔 OTSL_FCEL fcel # 首个单元格含文本 OTSL_ECEL ecel # 普通单元格 OTSL_LCEL lcel # 右侧延伸colspan OTSL_UCEL ucel # 向下延伸rowspan OTSL_XCEL xcel # 双向延伸跨行跨列模型只负责用这 6 个 token 描述每个单元格在网格里的位置关系而真正生成td rowspan2 colspan3的工作交给确定性代码完成。这样做的理由很朴素合并单元格的 span 计算是纯逻辑问题交给语言模型想象必然出错交给程序推导则 100% 可验证。社区里用 OTSL 解析复杂合并单元格的教程把这套思路总结为中间格式 确定性转换这是 TeleOCR 在 Table TEDS 上拿到 97.05 的关键工程决策之一。公式直接要 LaTeX但要兜底包裹公式任务最简单也最直接提示词直接要求 LaTeX。但模型偶尔会输出带\[ ... \]定界符的片段或者裸的\frac{...}{...}。官方在post_process里做了统一兜底见 README.mddef post_process(blocks: list[ContentBlock]) - list[ContentBlock]: for block in blocks: if block.type table and block.content: block.content convert_otsl_to_html(block.content) elif block.type equation and block.content: content block.content.strip() content content.removeprefix(\\[).removesuffix(\\]).strip() if not (content.startswith($) and content.endswith($)): content f$${content}$$ block.content content return [block for block in blocks if block.type ! equation_block]逻辑很直白剥掉\[ \]定界符如果还不是$...$包裹的就统一包成$$...$$。这样下游无论接 MathJax、KaTeX 还是渲染服务拿到的都是合法块级公式。文本与版面各自的专用协议纯文本抽取、代码还原、版面分析则是另外三套协议文本直接要求输出文字内容模型按阅读顺序吐文本代码直接要求输出解析结果模型保留缩进与符号版面要求输出带 bbox 与角度的结构化描述模型借助仓库 added_tokens.json 里的专用视觉标记|box_start|、|box_end|、|quad_start|、|quad_end|输出框 内容 旋转角再配合 special_tokens_map.json 注册的 token 序列化。三套实测最稳模板以下模板全部取自仓库官方 Quick StartREADME.md是经过作者在 OmniDocBench 等基准上验证过的出厂级写法。把它们原样抄进infer(image, prompt)即可。模板一纯文本抽取image Image.open(./assets/text.png).convert(RGB) raw_text infer(image, Please output the text content from the image.)适用于正文段落、纯文字页。要点指令里text content明确限定输出域模型不会自作主张加 markdown 语法。模板二表格 → OTSL → HTMLimage Image.open(./assets/table.png).convert(RGB) raw_otsl infer(image, This is the image of a table. Please output the table in OTSL format.) print(convert_otsl_to_html(raw_otsl))最稳的表格链路先要 OTSL再用convert_otsl_to_html转标准 HTML。注意 prompt 里明确写in OTSL format少这三个字模型就可能放飞。模板三公式 → LaTeXimage Image.open(./assets/formula.png).convert(RGB) raw_formula infer(image, Please write out the expression of the formula in the image using LaTeX format.) formula_block ContentBlock(equation, [0.0, 0.0, 1.0, 1.0], contentraw_formula) formula post_process([formula_block])[0].content要点要求using LaTeX format并务必过post_process兜底包裹。仓库内置的ContentBlock数据结构type bbox content就是为了把推理结果装进统一的解析管线。附加代码截图与科学图表同样来自官方 Quick Start可作为模板一/二的变体# 代码截图 → 可运行源码 raw_code infer(image, The image contains a code snippet, please output the parsing result.) # 科学论文图表 → 表格走 OTSL → HTML 链路 raw_scientific_figure infer(image, This is a scientific figure. Please extract the table implied by this figure.) print(convert_otsl_to_html(raw_scientific_figure))输出校验与兜底解析策略模板给出来了但生产环境还要回答一个问题模型偶尔吐歪了怎么办官方源码里其实已经内置了两层防御值得直接抄走。第一层OTSL 转换器的容错README.md 中的convert_otsl_to_html开头就做了两种防御def convert_otsl_to_html(otsl_content: str) - str: if otsl_content.startswith(table) and otsl_content.endswith(/table): return otsl_content tokens, parts _otsl_extract_tokens_and_text(otsl_content) cells, rows _otsl_parse_texts(parts, tokens) if not cells or not rows: return ...防御一如果模型或上游已经给了完整table.../table直接透传不再二次转换防御二解析不出任何单元格/行时返回空字符串而不是抛异常——下游渲染层拿到空串自行降级。更隐蔽的一层在_otsl_parse_texts里短行会被自动补齐到最大列数row.extend([OTSL_ECEL] * (max_cols - len(row)))这意味着模型漏吐几个ecel也不会把整张表打崩程序会按缺位补空单元格处理。第二层公式的定界符归一如前面post_process所示\[ \]→ 剥离裸公式 → 包$$ $$。这套归一逻辑建议无条件保留因为模型在长公式上偶尔会在$包裹上偷懒。第三层解码参数与图像预处理max_new_tokens4096长表格/长代码场景必须给足预算否则尾部被截断do_sampleFalse贪心解码确定性优先图像统一convert(RGB)且交给 processor 时利用 preprocessor_config.json 中的动态分辨率区间min_pixels: 3136、max_pixels: 12845056自动缩放避免大图把显存打爆、小图把细节磨平版面分析类任务官方 Quick Start 会先把图resize((1036, 1036), Image.Resampling.BICUBIC)再推理这是一个针对整页布局场景的性价比预处理可以直接照抄。小结TeleOCR 的提示词工程核心不是写得更花哨而是把模型约束在它最擅长的输出协议内表格走 OTSL 中间格式 确定性 HTML 转换公式直接要 LaTeX 定界符归一文本/代码则用最朴素的指令锁定输出域。配合贪心解码、max_new_tokens预算与 RGB/动态分辨率预处理一套可靠的文档解析流水线就能在几行代码内立起来。仓库 README.md 的 Quick Start 就是现成的参考答案——先抄对再谈优化。【免费下载链接】TeleOCR项目地址: https://ai.gitcode.com/XingChen-AGI/TeleOCR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询