oh-my-pi snapcompact 实验 exp08中央凹式两级读取协议与 ZOOM 放大回合提示词设计【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi导读本文深入剖析 oh-my-pi 仓库中 snapcompact 的 SQuAD 召回实验 08exp08_foveate中央凹式两级读取系统先把长文本以 5×8 像素字体压进 1568×1568 的位图档案图让视觉模型第一轮尽可能作答再对读不清的区域按行带切片放大重渲染进入第二轮精确作答。核心是 exp08-zoom.md 这份放大回合提示词——它定义了标签、行带、提取式回答、UNREADABLE 与编号输出这一整套协议。读完本文你将掌握该两级协议的完整数据流、三种提示词变体rows/phrase 定位的差异、行带合并与放大的实现细节以及如何复跑这套实验并解读其成本/精度指标。背景snapcompact 与位图帧上下文压缩snapcompact 的核心理念是与其让 LLM 去总结被丢弃的对话历史不如把历史序列化成紧凑文本再用像素字体渲染成密集 PNG 帧让视觉模型直接读回这些位图。整个过程本地化、确定性执行不消耗 LLM token 也不产生延迟README 明确Rasterization and PNG encoding happen in native code。在 research/ 目录下这一理念被系统化评测以 SQuAD v1.1 dev 全集约 150 万字符见 run.py为语料比较 text、compact、handoff、img-字体-变体 等条件的 QA 召回率。实验 08 就是其中一条重要的压缩路线不再追求一张图装进所有内容而是主动接受第一轮读不清用第二轮按需放大来补齐。exp08 协议总览一图两读按行放大exp08_foveate.py 的模块 docstring 给出了实验全貌第一轮档案图用 5×8 字体渲染档案图。在 1568×1568 画布上capacity计算得到 313 列 × 196 行 61348 字符/页比此前 6×10 最优解40716 字符/页见 run.py密 1.5 倍。模型先读这张尽力而为的图并回答问题。放大请求对读不清的区域模型在答案中回复ZOOM rows A-B这样的命令或带锚点短语的变体。第二轮放大回合harness 从块文本中按行带切片——行 r 覆盖字符区间[(r-1)*cols, r*cols)——用 8×13 舒适字体重新渲染为放大图把放大图 待答问题继续发给模型。合并评分两轮答案合并用官方 SQuAD EM/F1 与成本对比img-6x10-sent基线。整体流程见run_cell_chunkexp08_foveate.pyqa1存档回合 → 解析zoom请求 →merge_bands合并行带 →zoom_renders渲染放大图 →qa2放大回合 → 合并final答案。exp08-zoom.md放大回合的提示词逐条解读exp08-zoom.md 全文六行构成放大回合的全部指令逐条拆解如下。1. 内容定位与标签协议Below are high-resolution re-renderings of the archive row bands you requested. Each image is preceded by a label giving the archive row range it covers; the text inside is identical to those rows, re-flowed to the new line width.要点有二明确告知模型图中的文字与档案图中对应行的文字完全一致只是按新行宽重新排版re-flowed to the new line width。这消除了放大图是不是新内容的歧义也提示模型文本是连续重排的不必按原行号对应回去。标签协议每张放大图前都有一行标签说明该图覆盖的档案行范围。对应到代码里是z_content中的fZoom of archive rows {a}-{b}:文本块exp08_foveate.py。标签是模型把放大内容与我到底在问哪块对齐的锚点。2. 回答范围指令Answer your remaining questions, listed after the images, using the zoomed images plus anything you already read. Keep the same question numbers as before.这是多轮对话语义的关键放大回合不重发所有问题只重发待解决pending的问题代码中pending列表exp08_foveate.py且必须保持原有编号。同时允许结合第一轮已读到的内容plus anything you already read因为放大图可能只覆盖了问题答案所在的一小条带上下文仍需要第一轮的全局信息。3. 提取式答案Give short extractive answers: a word or phrase copied from the text.与第一轮提示词一致exp08-archive.md要求答案是从原文中逐字抄录的词或短语便于squad.parse_numbered提取后与 golden answer 做字符串级 EM/F1 匹配。4. 兜底协议UNREADABLEIf you still cannot read the answer, reply exactly UNREADABLE.即使放大也读不出来就精确回复UNREADABLE。代码在合并阶段用answers2[i] or UNREADABLE兜底exp08_foveate.py并在指标中统计abstained数量。这套弃权机制让模型宁可弃权也不猜把看不清和答错分开计量。5. 输出格式Output a numbered list (original numbering), one answer per line, no commentary.要求按原编号输出、每行一条、不加注释正是为了配合 squad.py 中parse_numbered的正则解析r\s*(\d)[.):]\s*(.*\S)?\s*$逐行提取1. 答案形式的条目未命中则留空。三种协议变体fov / fov2 / fov3 与 zoom 请求格式exp08_foveate.py 中PROTO字典定义了三种提示词组合其差异决定了模型如何表达我要放大哪里变体档案回合提示词放大 padding定位方式特征fovexp08-archive.md2 行行号rows保守策略只有太小/太糊才申请放大紧凑 paddingfov2exp08-archive-eager.md12 行行号rows激进策略不完全确定就申请放大宽 paddingfov3exp08-archive-phrase.md12 行短语phrase激进策略 模型引用半读出的锚点词harness 模糊定位后放大该行带行号定位rows与解析fov/fov2用行号。第一轮提示词要求reply exactly ZOOM rows A-B如ZOOM rows 41-47。解析由三个正则完成exp08_foveate.py_ZOOM_RANGEZOOM rows 41-47、41–47、41 to 47均命中且自动把AB的情况交换为有序区间_ZOOM_SINGLEZOOM rows 41这样的单行请求解析为(41, 41)_ZOOM_PHRASEZOOM anchor words形式的短语请求。短语定位phrase与模糊匹配fov3走锚点短语路线提示词要求模型引用在区域内或紧邻区域能部分辨认出的 3~8 个连续单词harness用 locate_phrase 在块文本里模糊定位先把 chunk 与短语都归一化只留字母数字、以空格连接长度保持对齐先尝试精确子串匹配失败则滑窗打分——窗口大小k max(2*len(p), 8)个词统计与短语词集的命中数分数达到max(2, (len(p)1)//2)才接受命中位置换算回行号span[0] // cols 1。这套设计允许模型读错几个字符提示词明说a few wrong characters are fine把模糊的视觉感知容错地映射到精确的行带。三种变体的完整字面量差异体现在提示词语气上fov是大部分能读个别区域不行的中性描述fov2/fov3则警告this font is rendered BELOW the size you can read reliably... Be skeptical of your own reading并强调Zooming is cheap and encouraged; guessing is penalizedexp08-archive-eager.md。注意所有第一轮提示词都禁止猜测——读不清要么ZOOM要么UNREADABLE。放大回合的工程实现行带合并、切片与重渲染行带合并与 padding模型可能对多个问题分别请求放大这些行带需要合并。merge_bandsexp08_foveate.py做三件事每个 band 向外扩pad行fov 为 2 行fov2/fov3 为 12 行并 clamp 到[1, max_row]——因为模型给的行号是估计值需要余量兜住排序后合并重叠或相邻间隔 ≤1 行的 band避免同一区域渲染两张图输出互不相交的有序区间列表。按字符切片与分页每个 band 在 chunk 文本中的字符区间是[(pa-1)*arch_cols : pb*arch_cols]exp08_foveate.py随后zoom_renders判断若 band 超过一张放大图能容纳的行数由capacity(zcfg, ZOOM_SIZES[-1])[2] // arch_cols计算exp08_foveate.py自动拆成多页。放大尺寸自适应ZOOM_SIZES (520, 784, 1040, 1568) # smallest square that fits the band winsexp08_foveate.py 用 4 档画布尺寸按能容纳这段文本的最小正方形选取避免小 band 也渲染大图造成浪费。渲染函数bdf.render(txt, zcfg, CACHE, size, bw)复用 bdf.py 的位图渲染管线黑白变体8×13 字距。磁盘缓存与原子写放大图以内容哈希命名fexp08-zoom-{ZOOM_FONT}-{size}-{sha8(txt)}.pngexp08_foveate.py命中直接复用写文件走atomic_png——先写临时文件再 rename避免并发任务读到半成品exp08_foveate.py。双轮问答的完整数据流以run_cell_chunk为主线一次 chunk 的完整生命周期如下exp08_foveate.py采样squad.sample_chunk_questions从完全落在 chunk 内的段落中均匀采样至多--qpc默认 30个问题并记录pos_rel段落起点在 chunk 中的相对位置 0~1便于后续按位置四分位分析。渲染档案图render(chunk_text, FONTS[5x8], CACHE, args.size, variant)variant 为bw或sent对应 conditionsfov-5x8-bw、fov-5x8-sent。第一轮 QA消息 档案提示词含{cols}/{rows}格式化 档案图 编号问题块经llm_complete调用providers.py 按模型名自动分派 OpenAI / OpenRouter / Anthropic 三家。结果按 payload 哈希缓存截断stop max_tokens响应不缓存不重放exp08_foveate.py。解析 zoom 请求对每个答案检查是否含zoomfov3优先短语定位失败则回退行号解析。请求了 zoom 但 band 无法解析的该题直接置为UNREADABLE宁可弃权也不猜。放大回合pending问题 放大图组装z_content提示词 exp08-zoom.md 逐图标签 编号问题块作为第二轮 user 消息追加在qa1之后形成完整对话历史。合并与评分answers2覆盖pending项squad.parse_numbered解析exact_match/f1按官方 SQuAD 归一化去标点、去 a/an/the逐题打分squad.py每条记录写入records.jsonl。成本建模与基线对比成本核算在aggregate与_phase_costexp08_foveate.pytoken 分in/out/cache_w/cache_r统计其中缓存写按 1.25×、缓存读按 0.1× 输入单价折算与 run.py 的 Anthropic 定价口径一致放大回合qa2阶段的增量成本单独统计为cost_zoom_usd用于回答按需放大到底贵不贵zoom_rate 申请过放大的问题占比zoom_chunks 实际发生放大回合的 chunk 数。基线定义在 exp08_foveate.pyimg-6x10-sent最优配置的 (f1, se, cost$)。例如gpt-5.5长度 150 的基线是 f10.8218、$0.2452。汇总时每个 cell 输出d_f1、d_cost_usd直接对比两级协议相对单图基线的精度差与成本差。复跑实验CLI 与参数速查实验依赖 uv 与 pillow# /// script头声明requires-python 3.10、dependencies [pillow]在packages/snapcompact/research/目录下运行uv run exp08_foveate.pymain暴露的关键参数exp08_foveate.py参数默认值说明--modelsgpt-5.5,google/gemini-3.5-flash逗号分隔的模型列表OpenAI 模型名以gpt-开头、OpenRouter 模型名含/见 providers.py--lengths50,150使用的语料段落数corpus 前缀--conditionsfov-5x8-bw,fov-5x8-sent实验条件格式为proto-font-variant--qpc30每个 chunk 采样的问题数--seed42采样随机种子可复现--size1568档案图边长像素--workers3并发线程数--max-tokens32768每轮 QA 输出预算--effort无思考力度low/medium/high/xhigh/max等--fresh关闭忽略缓存强制重跑--env~/.env存放OPENAI_API_KEY/OPENROUTER_API_KEY的环境文件最后赋值生效见 providers.py--outexp08-foveate结果子目录名输出三份产物到research/results/out/records.jsonl逐题记录含zoomed、zoom_band、anchor、abstained等字段、summary.json按模型×长度×条件聚合、matrix.csv。模型的输入/输出单价在MODELS字典中显式配置如gpt-5.5: (2.0, 16.0)美元/百万 tokenexp08_foveate.py。所有响应按 (model, tag, payload) 哈希缓存于research/.cache/qa/中断重跑免费续传。从实验到产品位图帧形状的选取依据exp08 这类 SQuAD 召回实验的结论直接指导了 snapcompact 的产品参数。README 明确Frame shapes are provider-aware, chosen by SQuAD recall evals (seeresearch/) against real provider billingREADME并给出各 reader 的默认形状Anthropic11on16-bwX.org 8x13 字形、11px 步进、Google8on22-bw2048、OpenAI8on22-bwdetail: original。也就是说档案 按需放大的实验框架并非孤立研究而是 oh-my-pi 压缩管线compactAPI 的preserveData中持久化图像帧见 README中帧几何选择的方法论来源。相关文件索引放大回合提示词exp08-zoom.md档案回合提示词三变体exp08-archive.md、exp08-archive-eager.md、exp08-archive-phrase.md实验主程序exp08_foveate.py位图渲染基础设施BDF/HEX 解析、capacity、render、variantbdf.py语料与评分SQuAD v1.1 dev、EM/F1、编号解析squad.py模型分派与用量归一化providers.py通用评测框架与字体表run.py产品侧形态选择README结语exp08-zoom.md虽只有六行却是整个中央凹式两级读取协议承上启下的关键一环它用标签对齐 保持原编号 提取式答案 UNREADABLE 兜底 严格输出格式五条指令把第一轮档案图的模糊感知与第二轮放大图的精确阅读无缝衔接。配合 harness 侧的行带合并、自适应分页、模糊短语定位与内容寻址缓存这一协议实现了档案图极致压缩、放大成本按需支付的工程闭环——这也是 oh-my-pi 为视觉上下文压缩寻找最优帧几何时被实际采用的实验方法论。【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考