codex多模态输入超长需主动截断:ocr文本超4000字节即风险,推荐模板中用truncate(5000,true,'[内容已截断]')安全裁剪,并预处理缩放图片、过滤控制字符、提取关键段落,同时关闭自动压缩、启用tokens截断策略。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

当你把一张高分辨率截图或带大量文字的PDF扫描页丢进Codex多模态工作流,OCR识别后生成的文本动辄上万字符,模型直接报错context_length_exceeded,连推理都不启动——这不是模型不行,是输入没做长度控制。
识别图片OCR文本是否超长
先确认问题根源:不是所有图片都危险,但以下三类极易触发截断——含表格的财报截图、带注释的架构图、双栏排版的学术论文PDF扫描件。用wc -c命令检查OCR输出文件字节数,超过4000字节就要警惕;若原始图片分辨率>300dpi且尺寸>A4,基本默认需处理。
这一步不能跳过,因为Codex对多模态输入的token估算基于字节数(APPROX_BYTES_PER_TOKEN = 4),而OCR结果中空格、换行、乱码字符会显著拉高实际byte count,单纯看“多少个汉字”会误判。
模板内嵌截断逻辑(推荐)
在工作流引擎的模板节点中,直接对OCR变量做字符级裁剪:
{% if imgText %}#图片OCR结果: {{imgText|truncate(5000,True,'[内容已截断]')}}{% endif %}
【5000是安全阈值】——它预留了1200字符给系统指令和后续prompt结构,实测适配abab6.5t等主流多模态模型的context窗口下限。
注意:truncate函数第二个参数True表示启用省略号,第三个参数必须带明确提示语,否则模型可能把截断标记当成真实内容解析。
预处理阶段主动压缩
方法一:用Python脚本在OCR前缩放图片
通过本地 Codex 或 OpenClaw OAuth 凭证直接调用 ChatGPT/Codex Responses 的 image_generation 工具来生成或编辑光栅图像,然后保存
将原始图片用PIL降采样至宽度≤1200px,再调用Tesseract识别。实测可使OCR文本体积减少37%~52%,且关键文字仍清晰可辨。
方法二:OCR后过滤无意义字符
运行sed -E 's/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]+//g' ocr_out.txt | tr -s '[:space:]' '\n' | awk 'NF' > clean.txt,清除控制字符、多余空白行和单字符行。这步能剔除OCR引擎误识的噪点,平均再减18%字符量。
方法三:保留关键段落,丢弃格式冗余
① 提取所有以“第X条”“1.”“•”开头的行;
② 保留含数字+单位组合的行(如“¥2,345.67”“2026年6月”);
③ 删除纯分隔线、页眉页脚、重复标题;
④ 合并连续空行,每段间只留一个换行符。
避免二次截断的配置要点
关闭Codex自动压缩功能:在CLI中设置--no-auto-compact参数。否则系统会在你手动截断后,再按最旧消息优先策略删掉刚塞进去的关键OCR片段。
强制使用Tokens截断策略而非Bytes:在truncate.rs中指定TruncationPolicy::Tokens(5000),避开UTF-8边界错误导致的乱码截断——字节截断可能在中文字符中间硬切,生成非法序列。










