news 2026/9/12 7:15:45

oh-my-pi snapcompact 实验研究:位图帧提取式问答提示词协议(exp09-qa)的设计与验证

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
oh-my-pi snapcompact 实验研究:位图帧提取式问答提示词协议(exp09-qa)的设计与验证

oh-my-pi snapcompact 实验研究:位图帧提取式问答提示词协议(exp09-qa)的设计与验证

【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi

本篇文章围绕 exp09-qa.md 这份实验提示词展开:它是 oh-my-pi 压缩子系统 snapcompact 研究基线中,用于"让视觉模型从像素字体 PNG 参考页里抽取答案"的问答协议。读者将理解这份只有六行的提示词如何定义证据边界、可解析输出契约与不可读哨兵值,并看到它在exp09_cacheappend实验中如何与位图渲染栈、SQuAD 评分管线和提示缓存成本模型协同工作。

为什么需要一份"位图参考页"专用的问答提示词

oh-my-pi 的压缩管线(见 packages/snapcompact/README.md)采用了一种非 LLM 的上下文压缩思路:把被丢弃的会话历史序列化、规整化后,用像素字体(如 X.org 8x13、6x10 等点阵字)渲染成密集的 PNG 帧,再让视觉模型直接"读图"回填信息。整个过程本地、确定性,不需要一次额外的 LLM 摘要调用。

在这种范式下,衡量压缩质量的核心指标变成了"视觉模型能否准确读回位图页中的原文"。为此,snapcompact 的研究代码(packages/snapcompact/research)围绕 SQuAD v1.1 dev 集构建了 QA 召回评估:把参考材料以文本、摘要、位图等不同形式喂给模型,再对每一段材料抽题、要求模型作答,最后用官方 SQuAD 的 EM/F1 打分。

而每一次"作答"都依赖一份问答提示词来约束模型的输出行为。exp09-qa.md 正是其中的核心协议,专门服务于"参考材料以位图页(bitmap image pages)形式出现"的实验条件。

提示词全文与四条输出契约

exp09-qa.md的完整内容如下(packages/snapcompact/research/prompts/exp09-qa.md):

Answer the following questions using ONLY text you can read in the reference pages above. - 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 answer per line, no commentary. {questions}

这份模板被 exp09_cacheappend.py 以load_prompt("exp09-qa.md").format(questions=q_block)的方式实例化(见run_model中 Regime A 的 QA 调用),{questions}占位符会被替换为按步骤抽样的题目块。它虽然简短,却明确了四条不可违背的输出契约:

  1. 证据边界:只能使用参考页(即上面的位图 PNG 帧)中能读到的文本作答,禁止依赖外部知识或凭印象发挥。这与评估目标一致——测的是"位图读回能力"而不是"模型先验知识"。
  2. 短抽取式答案:答案必须是原文中复制出来的单词或短语("a word or phrase copied from the text"),不允许改写、概括或自由发挥,从而与 SQuAD 的 extractive 评分方式天然对齐。
  3. 不可读哨兵值:如果某个区域读不清,必须原样输出UNREADABLE。这个哨兵把"模型读不懂"和"模型答错"区分开,在结果统计中被记为abstained(弃权),而不是当作错误答案混入 F1 计算。
  4. 机器可解析的编号列表:一行一个答案、按题目序号对齐、不允许任何注释。这份严格格式直接对接了后续的答案解析与评分管线。

输出契约为何是"编号列表":与评分管线的对接

编号列表的输出格式并非排版偏好,而是为了能被 squad.py 中的解析器稳定消费。研究代码在parse_numbered中(squad.py)用正则\s*(\d+)[.):]\s*(.*\S)?\s*$逐行抽取:

  • 行首匹配1.1:1)等编号形式,序号减一作为数组下标;
  • 每个题目只接受第一个非空答案;
  • 缺失的条目补空串"",后续会被判为错误答案而非崩溃。

随后 squad.py 的exact_matchf1使用 SQuAD 官方归一化逻辑(小写、去标点、去停用词 a/an/the)打分。而 exp09_cacheappend.py 的score_records把解析出的答案逐条与 golds 比对,产出emf1abstained(当答案包含 "unreadable" 时置真)三个字段写入records.jsonl

换句话说,exp09-qa.md第 4 行"numbered list, one answer per line, no commentary"是整条评估链路能够自动化的前提:模型一旦跑题输出解释文字,parse_numbered就会把它丢弃,实验的 F1 立刻反映这种协议违反。

位图参考页是怎么来的:帧提示词与渲染栈

exp09-qa.md开头所说的 "reference pages above" 并不是普通文本,而是由配套的帧提示词声明、再由本地渲染栈生成的 PNG 页面。实验在第 k 步会先通过prefix_messages(exp09_cacheappend.py)构建一个"append-only"前缀:首帧使用 exp09-frame.md 声明材料格式:

Reference material for this session arrives as bitmap image pages: monospace pixel font, {cols} characters per row, up to {rows} rows per page, read left-to-right then top-to-bottom. Original paragraph breaks were collapsed to spaces; the text flows continuously across pages. More pages may be appended later in this session. I will ask questions about the material later. Here is page 1.

后续每页使用 exp09-page.md 的极简提示Here is page {page}, continuing the reference material.,配合模型回执ACK("Noted. I have read the passages and will keep them in mind.",定义于 final.py)构成轮次。帧提示词里的{cols}{rows}来自渲染栈 bdf.py 的capacity():按字体 pitch/advance 计算 1568×1568 画布能容纳的列数、行数与字符数。

render()(bdf.py)负责真正把文本画成图。exp09 使用的配置是FONT="6x10"VARIANT="sent"(exp09_cacheappend.py),即 6×10 像素点阵字体、按句子循环色相的渲染变体。该实验还验证了渲染的确定性:同一段文本连续渲染两次,比较 PNG 字节流的 SHA-256 是否一致(render_pages中的deterministic字段,exp09_cacheappend.py)。确定性是"同一字节 PNG 页跨步骤复用"这一设计成立的前提——只有字节完全一致的图片才能命中供应商的提示缓存。

实验上下文:两种压缩体制与提示缓存经济学

exp09-qa.md直接服务于 exp09_cacheappend.py 的核心问题:对同一份持续增长的会话历史,append-only 位图页与反复重写摘要相比,谁在提示缓存与成本上更优。实验模拟一个逐步增长的会话(SQuAD 流程,150 段文本 → 3 页 6x10 位图),在每一步对"到目前为止的所有页"抽题,并对比两种体制:

  • Regime A(append-optical):前缀 = 固定帧提示 + k 个字节完全一致的 PNG 页(渲染一次、反复复用),QA 消息最后压上exp09-qa.md。写路径零 LLM 调用;前缀 append-only 增长,供应商提示缓存应把旧页按折扣价(0.1×)重新计费。
  • Regime B(rewrite-compact):每一步都用 agent 的compaction-summary.md提示对整个历史文本重新做一次 LLM 摘要(每次新调用都是写路径成本),再对新鲜摘要做 QA。摘要重写会使任何提示缓存前缀失效。

成本核算函数usd()(exp09_cacheappend.py)把缓存读取 token(cache_r)按输入的 0.1 倍计费:

def usd(u, p_in, p_out): return (u.get("in", 0) + 0.1 * u.get("cache_r", 0)) / 1e6 * p_in + u.get("out", 0) / 1e6 * p_out

(价格假设来自 final.py 中的模型价格表注释:缓存读取按 0.1× 输入计费;这些价格是研究配置,可自行编辑后以--report重算。)

实验还专门设计了缓存探针:把同一多图前缀原样发送三次(用调用序号区分载荷以绕过磁盘缓存),读取每次的cache_r,回答"图片输入 token 在 OpenAI Responses 与 OpenRouter/Gemini 上是否真的命中前缀缓存"(exp09_cacheappend.py)。探针消息的结尾是一个标准控制指令PROBE_TAIL = "Reply with exactly the word OK and nothing else."

运行方式与输出

exp09_cacheappend.py是一个 PEP 723 内联依赖脚本(pillow),可用uv直接运行(参考 run.py 的用法约定):

# 默认模型集(gpt-5.5、google/gemini-3.5-flash)完整跑一遍 uv run exp09_cacheappend.py # 指定模型、题目数、随机种子与页面尺寸 uv run exp09_cacheappend.py --models gpt-5.5 --qpc 10 --seed 42 --size 1568 # 跳过磁盘缓存,强制重新调用 API uv run exp09_cacheappend.py --fresh

命令行参数(exp09_cacheappend.py):--models(默认gpt-5.5,google/gemini-3.5-flash)、--qpc(每步抽样题目数,默认 10)、--seed(默认 42)、--size(页面边长,默认 1568)、--max-tokens(默认 32768)、--fresh(绕过响应缓存)、--env(API 密钥文件,默认~/.env)。密钥通过 providers.py 的load_env_key读取OPENAI_API_KEYOPENROUTER_API_KEY

输出写入results/exp09-cacheappend/(exp09_cacheappend.py):

  • records.jsonl:逐题目记录(模型、体制、步骤、位置、问题、答案、golds、EM/F1、是否弃权);
  • steps.csv:逐步骤的成本与质量明细(qa_inqa_cache_rwrite_coststep_costcum_costf1);
  • matrix.csv:按 模型 × 体制 汇总的单元结果(含final_step_f1final_step_em);
  • summary.json:参数、页清单、渲染确定性、缓存探针与 Regime B 摘要稳定性等元数据。

其中b_step_stability(相邻两步摘要的共同前缀长度)与b_determinism(同一载荷两次摘要是否字节一致)直接量化了"rewrite-compact 体制为什么让提示缓存失效"。

从实验到产品:与 snapcompact 生产实现的关联

实验提示词验证的"位图帧读回"能力,正是生产包@oh-my-pi/snapcompact的核心机制。按 packages/snapcompact/README.md 的说明,生产管线是serializeConversation(序列化历史并施加每工具结果、每参数字符上限)→normalize(去 ANSI、折叠空白、折叠换行、把制表/兼容符号转 ASCII、emoji 折叠或丢弃)→render/renderMany(把规整后的文本栅格化为 PNG 帧)。帧形状是 provider-aware 的,由 SQuAD 召回评估针对真实计费方式选定(Anthropic 用11on16-bw,Google/OpenAI 用8on22-bw)。

需要说明的边界:实验代码中的6x10字体、sent变体与 1568px 页面是研究配置,用于在可控条件下测量读回质量与缓存行为;生产端的帧形状与字体选择在 src 中另行定义(resolveShape按模型 ID 而非仅按 API 匹配)。两者共享同一个思想:用确定性渲染的位图页替代 LLM 摘要,把压缩成本从"每次重写都要付费的 token"挪到"渲染一次、复用多次的图片"上——而exp09-qa.md正是度量这条路径读回质量的那把尺子。

小结

exp09-qa.md以六行之姿承载了 snapcompact 位图读回评估的全部关键约定:证据边界(只读参考页)、抽取式答案(原文复制)、不可读哨兵UNREADABLE与弃权统计)、机器可解析输出(编号列表对接parse_numbered与 SQuAD EM/F1)。在 exp09 的 append-only 光学页 vs 重写压缩对比中,它作为 Regime A 的 QA 协议,与确定性渲染、字节复用、提示缓存探针共同回答了"图片前缀到底能不能吃到缓存折扣"这一成本经济学问题。对于想复现或扩展该评估的开发者,建议从 exp09_cacheappend.py 的run_model与 squad.py 的评分函数入手,再结合 prompts 目录下各实验变体(如qa-text.md的纯文本对照、exp07-*的定位/分带读取、exp08-zoom.md的高清重渲染)理解协议在不同读取策略下的演进。

【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 7:15:10

RetroArch 在 Android TV 上的控制器配置完整指南

RetroArch 在 Android TV 上的控制器配置完整指南 【免费下载链接】RetroArch Cross-platform, sophisticated frontend for the libretro API. Licensed GPLv3. 项目地址: https://gitcode.com/GitHub_Trending/re/RetroArch 如果你刚把手柄接到电视盒子上,…

作者头像 李华
网站建设 2026/9/12 7:15:06

Midscene 完整指南:3 步让 AI 听懂人话、替你操作浏览器

Midscene 完整指南:3 步让 AI 听懂人话、替你操作浏览器 【免费下载链接】midscene GUI Agent for E2E Testing 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 以前写浏览器自动化,第一件事是找选择器——页面一改版,脚…

作者头像 李华
网站建设 2026/9/12 7:12:50

Playnite 启动参数怎么用:让游戏库快起来、不卡死的 8 个开关

Playnite 启动参数怎么用:让游戏库快起来、不卡死的 8 个开关 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目地…

作者头像 李华
网站建设 2026/9/12 7:12:40

华为 MetaERP 资产模块的数据一致性,不是靠“人工对账补平”,而是靠“单一事实源 + 事务封闭 + 子分类账转换 + 期间锁 + 自动对账 + 分布式事务补偿”六层机制叠出来的。下面按“为什么

华为 MetaERP 资产模块的数据一致性,不是靠“人工对账补平”,而是靠“单一事实源 事务封闭 子分类账转换 期间锁 自动对账 分布式事务补偿”六层机制叠出来的。 下面按“为什么不会乱 → 怎么保证不乱 → 乱了怎么发现”来讲。 一、先定边界&#…

作者头像 李华
网站建设 2026/9/12 7:10:45

国产MCU替代必看:Pin-to-Pin兼容背后的5个隐藏坑与验证流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 7:06:58

MATLAB微电网多阶段鲁棒优化调度实践

1. 项目概述:微电网鲁棒调度挑战与MATLAB解决方案微电网作为整合分布式能源的关键载体,其运行优化一直是能源领域的核心课题。这个MATLAB项目要解决的是含高比例可再生能源和储能的区域微电网在不确定性条件下的多阶段调度问题——简单说就是让风光发电这…

作者头像 李华