snapcompact 行号锚点提示词全解析:让视觉 LLM 像读文件一样定位位图帧中的答案
snapcompact 行号锚点提示词全解析让视觉 LLM 像读文件一样定位位图帧中的答案【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi导读本文聚焦 oh-my-pi 仓库中 snapcompact 视觉上下文压缩方案的核心研究素材——exp05-qa-image.md 提示词模板。该模板为视觉模型定义了带蓝色行号标尺的位图帧的读取协议先按行号定位答案区域、再窄带精读、最后以N. answer | row≈R的格式输出带行号声明的答案。读完本文你将掌握这套提示词每一句话的设计意图、行号标尺在 exp05_anchors.py 中的像素级渲染实现、row≈声明的解析与诊断指标以及它与对照组、exp04 布局、exp07 两阶段定位等提示词变体的演进关系。背景位图帧压缩为什么需要一套阅读协议snapcompact 的核心思路是用位图帧替代文本摘要来做上下文压缩被丢弃的会话历史被序列化为紧凑文本再用点阵像素字体渲染成密集的 PNG 帧由视觉模型直接读回。整个流程本地且确定性——没有 LLM 调用、没有 API key、除渲染外没有额外延迟见 packages/snapcompact/README.md。但让模型读图并不等于把图丢给模型。位图帧是几百列乘几百行的像素网格一帧容纳数万字符模型若从头到尾逐字转写推理与输出 token 成本即所谓读取税极高且转写本身容易出错。于是研究团队开始系统性地实验如何通过提示词 图像自身的可寻址性让模型只读它需要的窄行带。本文主角 exp05 提示词回答的正是这个问题——在图像左侧画一道十六进制编辑器风格的行号标尺让模型把图像当文件来定位。提示词模板全文exp05-qa-image.md原文档 exp05-qa-image.md 全文如下它是实验条件img-6x10-sent-ruler使用的提示词经load_prompt(exp05-qa-image.md).format(colscols, rowsrows, last_labellast_label)填充占位符后随图片一起发给模型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. The left margin of the image is a row-number ruler, not part of the text: every 5th row is labeled with its row index in blue digits (0, 5, 10, ..., {last_label}). Rows are numbered from 0 at the top. Use the ruler to address regions of the image like line numbers in a file. Questions follow after the image. Do NOT transcribe the image. For each question: 1. Locate the relevant region first (skim for the topic, use the blue ruler to pin down the row range). 2. Read ONLY that narrow band of rows carefully. 3. Answer from what you read there. - Give short extractive answers: a word or phrase copied from the text. - If you cannot read the relevant region well enough to answer, reply exactly UNREADABLE for that question. - Output a numbered list, one line per question, in exactly this form: N. answer | row≈R where R is the ruler row where you found the answer. - No other commentary.三个占位符{cols}、{rows}、{last_label}由实验代码在运行时计算并注入见下文标尺渲染实现使提示词与每一帧的真实几何精确一致。提示词逐段拆解每句话都在约束什么1. 位图格式声明段第一段先建立坐标系monospace pixel font等宽点阵字体、每行{cols}字符、共{rows}行、按从左到右再从上到下的行主序阅读、段落换行已被折叠为空格。这等价于在提示词里声明了文件的行宽与行数模型据此才能把像素位置映射为字符坐标也才能理解后面行号的含义。Original paragraph breaks were collapsed to spaces是对normalize阶段行为的如实描述——渲染前文本的换行符已被折叠见 README.md 中 normalize 的说明。2. 行号标尺声明段第二段是本提示词的核心创新明确告知模型左侧边缘是行号标尺而非正文——每 5 行用蓝色数字标注行索引0, 5, 10, ...,{last_label}行号从 0 开始。关键指令是最后一句Use the ruler to address regions of the image like line numbers in a file——把位图当作可按行寻址的文件这是整个锚点实验的语义支点。3. 三步答题流程第三段给出严格的操作序列与图像的可寻址性配套先定位粗略扫视找主题用蓝色标尺把答案所在的行范围钉死只精读窄带仅仔细读取该行带不读其余部分基于所读内容作答。这与基线提示词如 qa-image.mdAnswer them using ONLY text you can read in the image的被动姿态形成鲜明对比——exp05 主动引导模型进行选择性注意力目标是从机制上削减转写型读取的输出成本。4. 输出契约末尾三条约束定义了严格的输出协议提取式短答答案必须是从文本中复制的单词或短语禁止发挥UNREADABLE 约定读不清就原样回复UNREADABLE给模型一条诚实的退路对应实验中的abstained指标带行号声明的编号列表每行精确为N. answer | row≈R格式其中R是答案所在标尺行号禁止任何其他评论。这条row≈契约不是装饰——它让每一条答案都携带一个可验证的定位声明实验代码正是靠解析它来做诊断见输出解析与行号诊断。实验设计锚点假设与双条件对照exp05_anchors.py 的文档字符串完整记录了实验假设Hypothesis: a hex-editor-style row ruler makes the image addressable, so the model can localize answers instead of transcribing the whole bitmap — cutting the reasoning/output read tax and possibly improving F1.实验设置两个条件两个条件按标尺内容容量 39936 字符分块因此共享完全相同的题目集保证可比性条件常量渲染方式提示词img-6x10-sent-ruler实验组5 列蓝色行号标尺 内容右移exp05-qa-image.md要求输出answer \| row≈Nimg-6x10-sent-noruler对照组261 列基线渲染无标尺exp05-qa-image-ctl.md仅防转写提示无行号要求对照组的关键设计意图在源码注释中写明separates ruler effect from prompt effect——只加防转写提示而不加标尺把标尺带来的可寻址性与提示词本身的约束效果两个变量剥离开。实验还对每个 chunk 采样题目时均匀铺开pos_rel记录答案在 chunk 中的相对位置保证答案落在图像的不同行带便于行号定位的统计分析评分采用官方 SQuAD EM/F1。代码中还硬编码了基线参照BASELINE来自 ctx.md 的img-6x10-sent条件seed 42、qpc 30例如 gpt-5.550 长度下 (f10.850, se0.051, cost0.068)、google/gemini-3.5-flash50 下 (f10.984, se0.012, cost0.018) 等实验汇总时据此计算d_f1与d_cost增量——这些数值是实验代码中的对照基准用于量化标尺带来的收益或代价。标尺渲染实现像素级的可寻址性render_ruler()是标尺条件的核心渲染函数位于 exp05_anchors.py。几个关键参数常量值含义FONTFONTS[6x10]X.org 6x10 点阵字体FontCfg(6x10, 6x10, 6, 10)adv6px、pitch10pxSIZE1568画布边长正方形像素MARGIN_COLS5标尺宽度4 个数字单元格 1 个间隙单元格RULER_STEP5每 5 行标注一次行号RULER_FG(90, 120, 215)中蓝色清晰可读但不会与内容混淆variantsent白底、字形色相按句子循环的渲染变体渲染逻辑对照 bdf.py 的render()理解容量重算ruler_capacity()把cols size // cfg.adv - MARGIN_COLS即从每行字符数里扣除 5 个标尺单元格行数不变——标尺是从行容量里借空间不额外增加画布内容右移正文字形从cell_col MARGIN_COLS col处开始绘制为标尺让出左缘 5 格行号绘制row % RULER_STEP 0的行把 0 基行号右对齐画在前MARGIN_COLS-1个单元格内用RULER_FG中蓝色逐位调用draw_glyph()写像素逐行绘制与bdf.render()相同的行主序流程行号 0 从顶部开始对应提示词中Rows are numbered from 0 at the top。由此渲染出的图像正是提示词描述的样子左侧一列蓝色行号标尺正文整体右移行号每 5 行一跳。last_label取(rows - 1) // RULER_STEP * RULER_STEP即最后一行所在的那条标尺刻度保证提示词声明与实际图像完全一致。渲染走一次渲染、原子发布的缓存路径_ensure_png()先写带 UUID 的临时文件再replace()发布避免多线程竞争下重复渲染或读到半成品PNG 以 chunk 文本的 sha8 哈希命名exp05-ruler-{sha8}.png/exp05-ctl-{sha8}.png重复运行直接命中缓存。输出解析与行号诊断实验最有意思的部分在于把模型的定位声明当作可测数据。parse_answers_rows()用正则\|\s*rows?\s*[≈~:]*\s*(\d)从每行答案中剥离| row≈R后缀得到声称行号而gold_row()根据题目记录的pos_rel近似位置在 chunk 文本里找金标准答案串用i // content_cols换算成渲染网格中的真实行号。两者相减即为定位误差。汇总阶段aggregate()产出四个定位质量指标指标定义row_claimed_frac声称了行号的答案占比模型遵守row≈契约的程度row_mae声称行号与真实行号的平均绝对误差行row_within2误差 ≤ 2 行的比例窄带精读是否真的读对了地方row_within5误差 ≤ 5 行的比例对标尺刻度粒度 5 行同时abstained记录答案含unreadable的比例em/f1是标准 SQuAD 评分。这样一张 records 表就能同时回答三组问题答对了吗EM/F1、读对地方了吗行号误差、遵守协议了吗声称比例与 UNREADABLE 率。成本核算也一并完成aggregate()按in 1.25*cache_w 0.1*cache_r的加权输入价格与输出价格分别计算cost_in_usd/cost_out_usd可对比标尺条件与基线BASELINE中的 cost 字段的 token 与花费差异——这正是read tax假设的直接观测面。运行实验实验脚本是 PEP 723 内联依赖的 Python 脚本仅需 pillow经uv run直接执行# 默认gpt-5.5 google/gemini-3.5-flash长度 50/150双条件qpc 30seed 42 uv run exp05_anchors.py # 指定模型与长度 uv run exp05_anchors.py --models gpt-5.5 --lengths 50 # 只用缓存重出报告不消耗 API uv run exp05_anchors.py --report主要命令行参数参数默认值说明--modelsgpt-5.5,google/gemini-3.5-flash逗号分隔的模型列表--lengths50,150取 SQuAD dev 前 N 个段落的语料前缀--conditionsimg-6x10-sent-ruler,img-6x10-sent-noruler实验/对照两个条件--qpc30每 chunk 采样问题数--seed42采样种子保证可复现--size1568画布边长--workers3并发线程数--max-tokens32768模型输出上限--fresh关绕过 QA 缓存强制重跑--report关只从缓存重出表格不发 API语料为全部 SQuAD v1.1 dev 段落空格连接约 150 万字符按容量分块标尺条件用ruler_capacity()[2] 39936 字符/块1568×1568 画布在 6x10 字体、扣除 5 列标尺后的容量对照条件使用同样的分块以保证题目集一致见 run.py 对 SQuAD 语料与分块策略的说明。所有 QA 响应按 payload 哈希缓存到QA_CACHE中断后可免费续跑。结果输出到results/exp05-anchors/records.jsonl逐条记录、summary.json汇总单元格、matrix.csv模型×长度×条件矩阵。提示词家族的演进脉络exp05 提示词不是孤立产物prompts 目录 里能看到一条清晰的演进线qa-image.md最基础版本——声明位图格式要求只依据图中文字作答、提取式短答、UNREADABLE 兜底、编号列表输出。所有后续版本都继承了这条防幻觉短答底线exp02-qa-image.md引入{extra}占位符为按条件注入额外约束留口exp04-qa-image.md把单列位图升级为报纸式双栏布局{col_w}字符宽、中间留 gutter阅读顺序改为先左栏后右栏探索版面结构对读取的影响exp05本文在版面上加行号标尺把版面可寻址推进到逐行可寻址exp07-locate.md exp07-answer-bands.md更进一步拆成两阶段对话——第一轮只输出rows A-B≤25 行的行带猜测限顶行 1 起、1 基索引第二轮才允许读该行带作答把先定位再精读变成强制的两轮约束。这条演进线共同回答一个核心问题位图帧的版面先验布局、标尺、分栏、行带如何通过提示词注入模型换取更低的读取成本与更高的提取准确率。生产语境提示词之外的可寻址性值得一提的是行号标尺只是研究阶段的可寻址性手段在生产管线 packages/snapcompact 中可寻址性主要由provider 感知的帧形状承担Anthropic 用11on16-bw、Google/OpenAI 用8on22-bwresolveShape({ api, id })按模型 id而非仅按 wire API匹配使经 Vertex/OpenRouter 路由的 Claude 仍保持 Claude 形状。研究目录中的exp05等 SQuAD 召回评估正是这些形状选择的事实依据——README 明确写道Frame shapes are provider-aware, chosen by SQuAD recall evals (seeresearch/) against real provider billing。换句话说本文剖析的提示词模板是支撑生产形状决策的证据链中一环。结语exp05-qa-image.md用十余行提示词定义了位图帧 可寻址文件这一心智模型蓝色行号标尺是坐标系Do NOT transcribe是注意力约束Locate → narrow-band read → answer是操作序列N. answer | row≈R是带自证信息的输出契约。配合 exp05_anchors.py 的渲染与诊断实现这套方案把模型读图从不可观测的黑盒变成了可量化、可诊断、可 A/B 的实验对象——这正是研究型工程的价值所在。【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考