ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

oh-my-pi snapcompact 像素字体位图问答提示解剖:如何让视觉模型从光栅化文本中做抽取式阅读

oh-my-pi snapcompact 像素字体位图问答提示解剖:如何让视觉模型从光栅化文本中做抽取式阅读 oh-my-pi snapcompact 像素字体位图问答提示解剖如何让视觉模型从光栅化文本中做抽取式阅读【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi导读本文围绕 oh-my-pi⌥ Coding agent with the IDE wired in中 Snapcompact 压缩模块的评估提示 exp02-qa-image.md 展开它定义了一套把百科全书段落渲染成等宽像素字体位图、让视觉语言模型VLM只凭图片中的文字做抽取式问答的提示协议。读完本文你将理解该提示中每个约束条款阅读顺序、抽取式回答、UNREADABLE 弃权、编号列表的动机与实现掌握{cols}、{rows}、{extra}占位符与渲染几何的对应关系并看到同一协议如何在 run.py、squad.py 的评估流水线以及生产端 snapcompact.ts 的帧形状选择中被复用。一、提示全文逐条解剖一份光栅化文本阅读协议exp02-qa-image.md 全文只有 8 行但它不是一段普通的 prompt而是一份针对文本被渲染成位图这一非自然形态的结构化阅读协议。逐段拆解如下1. 图像规格声明先告诉模型你看到的是什么The attached image contains encyclopedia passages rendered as a bitmap: monospace pixel font,{cols}characters per row,{rows}rows, read left-to-right then top-to-bottom. Original paragraph breaks were collapsed to spaces.这一句做了三件事载体声明图片内容是百科全书段落渲染成的位图bitmap而不是照片或图表提前消除模型对图片语义的误判几何描述等宽像素字体、每行{cols}个字符、共{rows}行。这两个占位符在运行时被真实渲染几何替换见第二节阅读顺序先从左到右、再从上到下row-major并预告原始段落换行已被折叠为空格——这是渲染器对文本做空格折叠space-joined后的必然结果提示模型不要期待换行结构。2. 信息边界只允许使用图片内可见的文字Questions follow after the image. Answer them using ONLY text you can read in the image.这是本协议的信息边界约束答案不得来自模型预训练知识、不得来自上下文猜测只能来自图片中实际读到的字符。这正是抽取式extractive评估的前提——只有答案确实出现在渲染文本中官方 SQuAD EM/F1 打分才有意义见第三节。3. 输出格式短抽取答案 正常拼写Give short extractive answers: a word or phrase from the text, written in normal full English spelling.约束短a word or phrase是为了让回答贴近 SQuAD 标准答案normal full English spelling则要求把像素字体里可能的缩写、符号还原成规范拼写避免因为字形噪声导致 EM/F1 失分。4. 弃权机制读不清就答 UNREADABLEIf you cannot read the relevant region well enough to answer, reply exactly UNREADABLE for that question.这是评估协议里最重要的质量控制条款它允许模型在无法辨认时显式弃权而不是猜一个看似合理的答案。下游评分时UNREADABLE会被统计为abstained弃权数与答错分开报告——这让研究者能够区分读不清和读错进而判断一个字形变体的失败模式是渲染噪声还是模型缺陷。在 run.py 与 exp04_layout.py 的记录逻辑中均以unreadable in a.lower()判定弃权。5. 结构化输出编号列表每题一行无评论Output a numbered list, one answer per line, no commentary.编号列表1. answer、2. answer…是机器可解析的合约直接对应 squad.py 中的parse_numbered()——该函数用正则\s*(\d)[.):]\s*(.*\S)?\s*$逐行抽取答案缺失项补空字符串保证了每道题都能对齐到对应的 EM/F1 计算。no commentary则避免模型在答案间插入解释性文字而污染解析。二、{cols}、{rows}、{extra}从何而来提示与渲染几何的契约提示里的占位符不是摆设它们在实验脚本中由真实的渲染参数填充{cols}/{rows}由字体配置文件bdf.py 中的FontCfg与帧边长共同决定的网格容量。例如 run.py 中img-6x10条件使用 6x10 字体、1568px 方帧capacity(font, size)返回(cols, rows, capacity)其中TEXT_CHUNK 40716正是img-6x10的单帧字符容量——文本条件text与图像条件按同一容量分块保证对比公平{extra}留给实验脚本附加的补充说明。以 exp02_surprisal.py 为例exp02-qa-image.md被.format(cols..., rows..., extra...)调用而extra承载两条关键的阅读说明SURP_NOTE与DISEMV_NOTESURP_NOTE ( Glyph darkness encodes word informativeness: very common words are printed in lighter gray, rarer / more informative words in darker ink. All words are spelled out in full. ) DISEMV_NOTE ( To fit more text, very common function words (the, of, and, is, ...) were removed, and other common lowercase words are abbreviated by stripping their interior vowels (e.g. qck brwn fx jmpd means quick brown fox jumped; gvrnmnt means government). Proper nouns, capitalized words, numbers, dates, and words adjacent to numbers are kept verbatim. Mentally reconstruct the original ... )也就是说同一份提示骨架通过{extra}参数化后可以服务于多个字形变体实验img-6x10-surp按 wordfreq zipf 频率把常用词印成浅灰、生僻词印成深黑、img-6x10-sent-surp句子色相 亮度随 surprisal 缩放、img-6x10-disemv删除功能词并对常见词去元音以提升密度。{extra}就是提示与渲染策略之间的语义粘合层。三、提示家族的横向对照单图、多图、多栏、定位等变体exp02-qa-image.md属于一个成体系的提示家族全部位于 research/prompts各自针对一种渲染形态提示文件适用渲染形态关键差异使用它的实验qa-image.md单图、row-major 网格基线协议答案要求copied from the textexp01_patchalign.py、exp03_numhard.py、run.pyexp02-qa-image.md单图、surprisal/去元音渲染新增{extra}位承载阅读说明exp02_surprisal.pyqa-image-cols.md报纸式多栏{columns}栏、栏间有竖分割线阅读顺序改为最左栏自上而下读完再进入下一栏占位符变为{columns}/{rows}/{cols}多栏布局实验qa-image-multi.md多张连续图片{k}张声明文本跨图连续流动按图 1→图 k 顺序读bench_gemini.py、bench_kimi.py、diag_kimi_chunked.py 等exp04-qa-image.md双栏报纸页词换行、标题、段落留白阅读顺序为双栏 标题强调exp04_layout.py注意它们的公共骨架高度一致都是图像规格声明 → ONLY text in the image → 短抽取答案 → UNREADABLE 弃权 → 编号列表输出。变化的只是第一段对几何与阅读顺序的描述以及占位符名称。这种共享协议、参数化几何的设计使整个评估矩阵字体 × 变体 × 布局 × 模型共用同一套回答约束与解析逻辑。exp02-qa-image.md的独特价值在于它是家族中唯一引入{extra}语义扩展位的成员当渲染策略不再只是印字而是按信息量染色或去元音压缩时模型必须先理解这些变换规则才能正确重建原文并抽取答案。没有{extra}模型会把浅灰文字当噪声、把qck brwn fx当乱码。四、提示在评估流水线中的位置渲染 → 问答 → 评分从 run.py 的run_chunk()可以看到完整链路采样squad.py 的sample_chunk_questions()从 SQuAD v1.1 dev 段落流中按--qpc均匀抽取问题记录pos_rel问题所在段落相对 chunk 起点的位置 0..1用于后续按图像行带做位置分析跨 chunk 边界的段落被跳过避免答案被切断渲染render(chunk_text, font, CACHE, size, variant)把文本渲染成 PNG用sha8(chunk_text, size)做内容寻址缓存重复运行零成本组装preamble load_prompt(qa-image.md).format(colscols, rowsrows)将占位符替换为真实几何随后拼上图片块与编号问题列表q_block支持--qpb分批次提问且提示词缓存cache_control: ephemeral在--cache on/auto下被启用回答解析squad.parse_numbered(text, len(batch))按提示约定的编号列表解析输出评分squad.exact_match()归一化后全等与squad.f1()token 级精确率/召回率的调和平均abstained统计unreadable回答数——与提示第 4、5 条一一对应。该实验脚本的MODELS、LENGTHS、CONDITIONS都是可配置项运行方式如uv run exp02_surprisal.py依赖 Pillow 与 wordfreqAPI Key 从~/.env读取OPENAI_API_KEY、OPENROUTER_API_KEY。仓库代码中还记录了以img-6x10-sent为基线的对照数值见 exp02_surprisal.py 的BASELINE常量来自results/optimal-*/matrix.csv用于量化每个 surprisal/去元音变体的相对增益。五、从评估提示到生产实现snapcompact 的帧形状与阅读几何这套 QA 提示不只用于研究它验证出的结论直接进入了生产端 snapcompact.ts 的压缩实现。该模块把被丢弃的对话历史序列化为像素字体 PNG 帧让视觉模型像档案管理员看胶片一样直接读回文本全程本地确定、无 LLM 调用源码头注释明确说明。提示中的{cols}/{rows}在生产中对应Frame接口的元数据字段export interface Frame { data: string; // base64-encoded PNG cols: number; // characters per row in the frame grid rows: number; // text rows in the frame grid chars: number; // characters actually printed onto this frame font?: Shape[font]; variant?: Shape[variant]; columns?: number; // 2 on two-column doc frames ... }而提示评估产出的哪种字形最可读结论沉淀为SHAPE_VARIANTS16 种几何变体与按 provider 家族选择的SHAPESAnthropic 系11on16-bw8x13 字形、11px 字距、黑色墨水高分辨率行Opus 4.7 / Fable / Mythos用 1932px 帧Google / OpenAI / 未知8on22-bw8x13 字形、22px 行距Gemini 系固定 2048px 帧因其按media_resolution固定计费大帧不涨价。idealShapeVariant()按模型 id 正则/claude/i、/gemini/i、/gpt|codex/i、/kimi/i、/glm/i等选出评估验证过的理想格式resolveShape()再做 provider 计费兜底。提示里强调的行/列几何影响可读性在这里变成对cellWidth/cellHeight/frameSize的显式调优——评估中6x12 密集格低于 OCR 可读下限、额外字距/行距显著提升 F1这类结论见SHAPES与MODEL_VARIANTS注释中的基准数据就是提示协议测出来的。此外文本含大量 CJK 时会自动切换到内嵌 Silver TrueType 字体的silver16-bw格resolveShapeForTextisCjkHeavyText保证宽字符可渲染。生产端的光栅化与 PNG 编码由原生代码renderSnapcompactPng完成位于crates/pi-natives/src/snapcompact.rs帧以 base64 持久化在压缩条目的preserveData中每次上下文重建时重新附加到压缩摘要消息上。六、可复用的提示设计清单综合 exp02-qa-image.md 及其家族可提炼出面向位图化文本 VLM场景的通用提示设计要点先声明载体与几何明确图片是文本位图、给出cols × rows网格与阅读顺序row-major 还是逐栏并预告排版变换换行折叠、去元音、灰度染色等限定信息边界用ONLY text you can read in the image把模型拉回纯抽取式路径防止知识污染答案显式弃权优于乱猜UNREADABLE保留字让读不清与读错在指标上可分离机器可解析的输出合约编号列表、每题一行、无评论直接对接正则解析器用占位符参数化几何{cols}/{rows}/{extra}让同一协议服务整个字体 × 变体 × 布局评估矩阵也让渲染策略变化通过{extra}注入阅读说明。七、深入阅读指引提示家族packages/snapcompact/research/promptsexp02-qa-image.md、qa-image.md、qa-image-cols.md、qa-image-multi.md、exp04-qa-image.md等评估入口run.py、exp02_surprisal.py、exp04_layout.py数据与评分squad.py官方 EM/F1、parse_numbered生产实现snapcompact.tsSHAPE_VARIANTS、SHAPES、Frame、原生渲染 crates/pi-natives/src/snapcompact.rs【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表