没有不值得去解决的问题,也没有不值得去学习的技术!

WordPress 历史文章自动化遇到 GLM 1301:从 HTTP 400 到 ChatGPT 人工兜底完成

图 5:文章最终已经 completed,但原来的 excerpt_generation_failed、HTTP 400 和人工完成记录同时保留。

作者:

WordPress AI 翻译工程实战

WordPress 经典编辑器代码块无损迁移:批量转换 SyntaxHighlighter 短代码为 Gutenberg 区块

(1) WordPress 经典编辑器代码块无损迁移:批量转换 SyntaxHighlighter 短代码为 Gutenberg 区块

点击翻译按钮后,遇到一个弹窗“神秘”闪退问题及解决方法

(2) 点击翻译按钮后,遇到一个弹窗“神秘”闪退问题及解决方法

图5:DeepL API 注册页面,国家或地区列表中没有中国大陆

(3) 中国大陆 WordPress 博客想提升英文翻译质量,为什么这么麻烦?一次 Polylang + AutoPoly + DeepL API 排查复盘

图5:DeepSeek 的评分结果截图

(4) Chrome Built-in AI、Yandex Translate、ChatGPT Plus 翻译质量对比:我为什么决定重点英文文章改用 ChatGPT Plus

[截图 2:浏览器 Network 中直接请求 translate.yandex.net]

(5) 从 AutoPoly 到 Yandex 网页版:一次 WordPress 英文自动翻译质量验证

【图1:AutoPoly Free 与 Pro 功能对比截图】

(6) AutoPoly Pro + OpenAI API 能否自动化 WordPress 英文翻译?一次从技术到支付的可行性分析

【图2:点击“立即试用”后,ChatGPT 输入框中出现“代理模式”】

(7) ChatGPT Agent 能否替代 ChatGPT Plus 完成 WordPress 英文重译?

【图 7,SlyTranslate 显示翻译完成并创建文章 19426】

(8) SlyTranslate + 智谱 GLM-5.2 长文翻译排障:从 600 秒超时到完整生成英文 WordPress 文章

【图 5,54 个代码块精确匹配、差异数量为 0】

(9) WordPress SlyTranslate + GLM-5.2 长文单次翻译实战:排查 invalid_translation_runaway_output 假失败

【图 2,SlyTranslate 的 Additional Instructions 保持为空】

(10) SlyTranslate + GLM-5.2 翻译质量继续优化:从关闭随机采样、内置提示词到深度思考与模型 A/B 测试

【图6,终端中的完整测试结果】

(11) 在 GLM 5.2 之后测试 DeepSeek:一次面向 WordPress 长文翻译的模型对比与取舍

【图 4,“英文博客翻译质量优化”项目中已经整理完成的会话列表】

(12) 为英文博客翻译质量优化建立独立 ChatGPT 项目:整理历史会话并统一后续评测标准

【图3:Gemini 3.5 Flash 首次成功调用结果】

(13) 暂缓 OpenAI 后,我在本地测试了 Gemini:与 GLM 5.2 的 WordPress 技术文章翻译对比

图3:清理英文 Host 下的对象与术语关系缓存后,英文文章重新显示 SEO Tools、Yoast SEO 和 Blog SEO Log

(14) 为 SlyTranslate 的 GLM 5.2 整篇翻译补上 Plaintext 智能处理,并修复 Code Block Pro 区块失效

图5:英文文章发布后,前台特色图片、分类、标签和 Series 顺序均正常

(15) SlyTranslate + GLM-5.2 翻译 WordPress 长文章后,分类、标签、Series 与特色图片同步问题排查

图1:Codex 输出 Token 校验诊断结果

(16) SlyTranslate 全文翻译报错排查:完善 GLM 5.2 的段落与占位符约束

图1:创建 wordpress-ai-translation-pipeline 私有 GitHub 仓库

(17) 将 WordPress AI 翻译优化项目提交到 GitHub:一次阶段性的收尾

图1:文章列表中因摘要为空而重复出现两个 Post Views

(18) 从空摘要、历史格式混杂到重新翻译:我如何规划 WordPress AI 翻译工程的下一阶段

图4:最终批处理输出 42/42 完成、待处理 0、异常状态 0。

(19) 从只读审计到 42/42 完成:用 GLM 与 SlyTranslate 安全补全 WordPress 历史文章摘要

图3:GitHub 已正确识别仓库的 MIT License。

(20) 将 WordPress AI 翻译优化仓库从私有切换为公共:从敏感信息审计到最小改动发布

图1:仓库显示所有历史批次已经完成,并允许创建下一批。

(21) 每天批量处理 20 篇 WordPress 历史文章:代码块迁移、摘要补全与英文覆盖翻译完整 SOP

图 2:复杂 Classic 一次转换成多个 Gutenberg 区块

(22) 每天批量处理 20 篇 Mixed WordPress 历史文章:Classic 转 Gutenberg、SyntaxHighlighter 迁移、摘要补全与英文覆盖翻译完整 SOP

GLM-5.2 整篇翻译再次出现 Protected Token 校验失败:从尾部 Token 丢失到 Plaintext 结构重排的完整排查记录

(23) GLM-5.2 整篇翻译再次出现 Protected Token 校验失败:从尾部 Token 丢失到 Plaintext 结构重排的完整排查记录

图 1:历史文章 4652 在 GLM-5.2 整篇翻译时返回 HTTP 400 安全检测错误

(24) GLM-5.2 整篇翻译持续返回 HTTP 400:从安全检测拦截到 Plaintext 载荷缩减的完整排查与修复

图 1:历史文章批处理返回 HTTP 400,并提示内容安全检查未通过。

(25) GLM-5.2 整篇翻译返回 400:一次内容安全误拦截的逐步定位与恢复记录

图 5:文章最终已经 completed,但原来的 excerpt_generation_failed、HTTP 400 和人工完成记录同时保留。

(26) WordPress 历史文章自动化遇到 GLM 1301:从 HTTP 400 到 ChatGPT 人工兜底完成

最近一段时间,我一直按照 目前主要参考的 WordPress 历史文章处理 SOP 继续处理剩余的历史文章。

这套 SOP 已经经历过多轮真实批次验证。现在的日常流程大致包括固定批次、Gutenberg 规范化、生产只读验证、中文摘要生成、英文覆盖翻译、失败恢复以及最终的 completed 状态确认。

更早一阶段的流程,则记录在 每天批量处理 20 篇 WordPress 历史文章:代码块迁移、摘要补全与英文覆盖翻译完整 SOP 中。

随着后续历史文章继续推进,我现在实际操作时主要参考的是 7 月 30 日更新后的 SOP,而不是重新从最早的流程开始。

前几天其实已经遇到过一次自动处理无法正常完成、最后改成人工处理的情况。当时我选择让 ChatGPT 接手所需内容,再人工完成 WordPress 中的文章处理。那次过程已经记录在 前几天人工处理的一篇历史文章 中。

今天继续处理新的 20 篇固定批次时,又遇到了一个更适合正式补进 SOP 的异常场景:

自动流程甚至还没有进入英文覆盖翻译阶段,就在生成中文摘要时持续收到 GLM HTTP 400。

经过多次真实重试、execution evidence 检查和离线分析以后,最终确认这并不是普通的网络波动,而是 GLM 明确触发了内容安全过滤。

这一次,我没有为了让模型审核通过而修改原来的历史文章,而是进一步完善了现有的人工兜底流程:

Plaintext
自动模型确定性拒绝
→ 停止无意义重试
→ ChatGPT 人工生成中文摘要
→ ChatGPT 人工完成英文标题、摘要和正文
→ 人工写回 WordPress
→ mark-manual-completed 生产只读验收
→ 保留原始失败 evidence
→ coordination state 安全收敛到 completed

最终,这一批仍然实现了 20 / 20 全部完成


一、20 篇只剩最后一篇,但摘要生成持续 HTTP 400

这次处理的是批次:

Plaintext
mixed-syntaxhighlighter-20260814-03

整批共 20 篇,其中 19 篇已经正常完成,只剩:

Plaintext
zh=7756
en=10072

对应中文文章标题为:

通过 ARB 跨链,将 USDT 从欧易转出至 MEXC 的流程

这是一篇历史操作记录,正文包含 MEXC、欧易、USDT、Arbitrum One、充值地址、提币网络、手续费和到账记录等内容。

这次失败发生得比英文翻译还早。

execution evidence 显示:

Plaintext
status: excerpt_generation_failed
error: HTTP request failed with status 400

如果只看到 HTTP 400,其实还很难判断究竟属于:

Plaintext
请求参数异常
输入内容问题
模型服务异常
网络波动
内容审核

因此继续查看保存下来的结构化 GLM 响应。

真正关键的信息终于出现:

Plaintext
error.code = 1301

同时还有:

Plaintext
contentFilter:
role = assistant
level = 1

模型返回的信息也明确指向了内容安全过滤。

图 1:文章 7756 在中文摘要生成阶段返回 HTTP 400,进一步检查 GLM 响应后确认存在 1301 内容过滤结果。
图 1:文章 7756 在中文摘要生成阶段返回 HTTP 400,进一步检查 GLM 响应后确认存在 1301 内容过滤结果。

到这里,问题已经不应该继续简单按照“网络错误”处理。


二、一次 TimeoutError 并不能解释反复出现的 HTTP 400

这次排查中间确实还出现过一次:

Plaintext
TimeoutError

因此最开始也存在一个疑问:

会不会只是 GLM 服务当时不稳定?

但是把整个失败顺序放在一起以后,就比较清楚了:

Plaintext
HTTP 400
→ HTTP 400
→ HTTP 400
→ recover
→ TimeoutError
→ recover
→ HTTP 400

中间那次 TimeoutError 可以单独视为一次暂时性的网络请求异常。

但是前后稳定重复出现的 HTTP 400,显然不能都用网络波动解释。

后续代码也进一步增强了诊断信息,让 HTTP 状态、结构化错误响应以及 GLM 请求尺寸能够进入 execution evidence。

这样以后再遇到类似错误,不需要只盯着一长串 Python traceback。


三、离线检查以后,基本排除了输入长度问题

为了进一步确认原因,我把生产中文源只读拉到本地,并确认 SHA-256 与程序保存的生产源摘要完全一致。

然后使用生产代码中的:

Plaintext
extract_excerpt_source()

重新生成真正送给 GLM 的摘要输入。

结果为:

Plaintext
原始正文:
8228 chars
10234 bytes

清洗后正文:
892 chars
2024 bytes

完整 GLM payload:
3427 bytes

也就是说,这篇文章送给 GLM 的实际内容并不长。

当前摘要提取逻辑本身允许远大于这个规模的输入,因此没有证据表明 HTTP 400 是因为正文过长或者请求体过大造成的。

真正比较特殊的是,经过 Gutenberg 注释、HTML 标签等内容清洗以后,剩余正文仍然连续包含:

Plaintext
USDT
Arbitrum One
MEXC
欧易
充值
提现
链上网络
完整地址
转账金额
手续费
到账记录

这些内容组合起来,很可能触发了模型侧的内容审核。

不过现有 evidence 只能证明:

GLM 1301 内容过滤是这次 HTTP 400 的直接原因。

至于究竟是哪一句话、哪一个地址或者哪一类词触发,现有证据还不足以精确判断。


四、我不准备为了让模型通过审核去修改历史文章

确认模型内容过滤以后,其实还有一种处理办法。

可以不断修改中文源:

Plaintext
删除可能敏感的词
→ 删除地址
→ 简化金额描述
→ 修改转账步骤
→ 再请求 GLM
→ 直到模型接受

但我最终没有选择这个方向。

这次历史文章处理的本来目标是:

Plaintext
规范历史格式
补齐中文摘要
重新完成英文翻译

而不是:

Plaintext
为了适应某一家模型当下的审核规则
反过来修改原文章内容

尤其这篇文章记录的是一次真实的历史操作过程。

如果为了模型审核,把网络、金额、地址或者操作过程删掉,最终反而破坏了这篇历史记录本身。

所以当确定 HTTP 400 属于模型内容过滤以后,我认为继续盲目调用 GLM 已经没有太大意义。

更合理的方案是:

Plaintext
保留自动失败事实
→ 停止自动重试
→ 转入人工兜底

五、前几天已经验证过 ChatGPT 人工处理路线

这并不是我第一次考虑人工接管。

前几天处理另一篇异常历史文章时,自动流程同样无法顺利完成,最后已经尝试通过 ChatGPT 完成人工处理。

相关过程记录在:

前几天人工处理的一篇历史文章

那次实践至少验证了一件事情:

自动流程遇到少数无法继续推进的文章时,没有必要让整个批次都停在那里。

可以把这篇文章单独转入人工处理。

不过今天 7756 又暴露出了一个新的边界。

前面的人工完成机制主要考虑的是:

Plaintext
translation_failed
blocked

而 7756 停在:

Plaintext
excerpt_failed

也就是说:

这次连中文摘要都还没有生成成功。

因此,原来的人工完成入口还不能直接安全覆盖这种情况。


六、原来的 mark-manual-completed 还不支持 excerpt_failed

仓库本来已经存在一个专门用于外部人工完成后的命令:

Bash
python3 bin/history-migration.py mark-manual-completed \
    --post-id 文章ID

正式确认则是:

Bash
python3 bin/history-migration.py mark-manual-completed \
    --post-id 文章ID \
    --confirmed

这个设计本身非常适合 ChatGPT 人工兜底。

问题在于,原来的允许状态主要是:

Plaintext
translation_failed
blocked

而当前文章是:

Plaintext
excerpt_failed

这两种情况不能简单等价。

如果是 translation_failed,通常意味着:

Plaintext
中文摘要已经生成
→ 中文摘要已经写入
→ 英文覆盖翻译阶段失败

但是 excerpt_failed 意味着:

Plaintext
中文摘要都还没有成功生成

如果只是把:

Plaintext
excerpt_failed

加入允许状态,而不增加额外检查,就可能出现:

Plaintext
中文摘要仍然为空
→ 英文旧文章本来就有内容
→ mark-manual-completed 误认为人工工作已经完成
→ workflow_status = completed

这显然是不安全的。


七、为 excerpt_failed 增加更严格的人工完成检查

因此这次对 mark-manual-completed 做了一个很小但非常重要的扩展。

excerpt_failed 现在可以进入人工完成检查,但是必须同时满足:

Plaintext
中文文章 ID 正确
中文文章 status = publish
中文 post_excerpt 非空

英文文章 ID 正确
英文文章 status = publish
英文 title 非空
英文 content 非空

Polylang 中英文关系双向正确

其中真正新增的关键检查就是:

Plaintext
Chinese excerpt is not empty

而且这个条件只针对:

Plaintext
excerpt_failed

原来的:

Plaintext
translation_failed
blocked

行为没有因此被无条件放宽。


八、第一次 Preview 正确阻止了人工完成

代码修改并通过测试以后,我没有马上开始改 WordPress。

先直接拿当前真实文章 7756 做了一次 Preview:

Bash
cd ~/code/wordpress-ai-excerpt-backfill

python3 bin/history-migration.py mark-manual-completed \
    --post-id 7756

当时中文摘要仍然为空。

程序输出:

Plaintext
模式: preview
文章: zh=7756 en=10072
当前状态: excerpt_failed
只读检查: post ID、publish、Polylang、英文标题和正文(excerpt_failed 另检中文摘要)
允许人工完成: 否
写入操作: 否
阻断原因: Chinese excerpt is empty

这个结果正是我希望看到的。

它证明程序没有因为英文历史文章原本就有标题和正文,就错误地把这篇文章认定为“已经人工处理完成”。

必须先真正补齐中文摘要。


九、由 ChatGPT 人工生成中文摘要

随后,我直接从 WordPress 编辑器中复制出文章标题和完整 Gutenberg 正文,交给 ChatGPT。

ChatGPT 根据完整原文重新生成中文摘要:

本文记录一次通过 Arbitrum One 网络将 USDT 从欧易转入 MEXC 的实际过程,包括在 MEXC 生成充值地址、在欧易选择 USDT 和对应提币网络、核对地址与网络、完成邮箱和手机验证、查看提币状态,并通过小额测试及后续转账确认到账情况。过程中还记录了平台风险提示、手续费和账户余额变化,重点提醒跨平台转账时必须保证充币与提币使用同一网络,并仔细核对地址,避免因网络或地址选择错误造成资产损失。

然后人工填写到 WordPress 中文文章的摘要字段。

图 2:GLM 自动摘要持续失败以后,改由 ChatGPT 根据完整正文生成中文摘要,再人工保存回 WordPress。
图 2:GLM 自动摘要持续失败以后,改由 ChatGPT 根据完整正文生成中文摘要,再人工保存回 WordPress。

这里没有为了避开审核修改中文正文。

真正新增的只是原来缺失的 post_excerpt


十、ChatGPT 同时重新完成英文文章

既然这篇文章已经进入人工兜底,我最终也没有再让自动翻译管线继续承担后面的英文覆盖翻译。

而是直接让 ChatGPT 完成:

Plaintext
英文标题
英文摘要
完整英文正文
图片 alt
Figure caption

最终英文标题为:

Plaintext
Transferring USDT from OKX to MEXC via Arbitrum: The Process

正文继续保留原有 Gutenberg 结构:

Plaintext
段落顺序不变
图片区块不变
图片 ID 不变
媒体 URL 不变
完整地址不变

只重新翻译自然语言内容。

图 3:ChatGPT 人工完成英文标题、正文和摘要后,保存回原来的英文 WordPress 文章。
图 3:ChatGPT 人工完成英文标题、正文和摘要后,保存回原来的英文 WordPress 文章。

这样一来,生产环境中的真正内容已经达到了人工完成要求。

但是此时我仍然没有手工修改 state JSON。


十一、重新 Preview 后,程序才允许人工完成

人工保存中文摘要和英文内容以后,再执行相同的 Preview:

Bash
cd ~/code/wordpress-ai-excerpt-backfill

python3 bin/history-migration.py mark-manual-completed \
    --post-id 7756

这一次结果变为:

Plaintext
模式: preview
文章: zh=7756 en=10072
当前状态: excerpt_failed
只读检查: post ID、publish、Polylang、英文标题和正文(excerpt_failed 另检中文摘要)
允许人工完成: 是
写入操作: 否

这意味着程序已经通过生产只读查询确认:

Plaintext
中文摘要已经存在
中文文章正常 publish

英文标题存在
英文正文存在
英文文章正常 publish

Polylang 中英文对应关系正常

只有生产环境中的真实内容满足要求以后,才允许进入下一步。

这一点比直接修改本地:

Plaintext
workflow_status = completed

可靠得多。


十二、最后执行 –confirmed

Preview 确认:

Plaintext
允许人工完成: 是

以后,才正式执行:

Bash
cd ~/code/wordpress-ai-excerpt-backfill

python3 bin/history-migration.py mark-manual-completed \
    --post-id 7756 \
    --confirmed

真实输出为:

Plaintext
模式: confirmed
文章: zh=7756 en=10072
当前状态: excerpt_failed
只读检查: post ID、publish、Polylang、英文标题和正文(excerpt_failed 另检中文摘要)
允许人工完成: 是
写入操作: 是
图 4:生产只读检查确认中文摘要、英文文章和 Polylang 均正常以后,才允许正式确认人工完成。
图 4:生产只读检查确认中文摘要、英文文章和 Polylang 均正常以后,才允许正式确认人工完成。

需要特别说明的是,这里的:

Plaintext
写入操作: 是

并不是再次修改 WordPress。

WordPress 中的内容已经由我人工保存完成。

这一条命令写入的是本地 coordination state。

最终增加:

JSON
"manual_completion": {
    "status": "confirmed",
    "method": "manual_external"
}

并把:

Plaintext
workflow_status

更新为:

Plaintext
completed

十三、completed 并没有把原来的自动失败伪装成成功

这次我特别在意一个问题:

既然后来已经人工完成,原来的 GLM 失败 evidence 应该怎么办?

我的选择是:

不改。

最终文章状态已经是:

Plaintext
workflow_status: completed

但是 execution evidence 仍然明确记录:

Plaintext
status: excerpt_generation_failed

最后一次自动失败也继续保留:

Plaintext
HTTP request failed with status 400
reason: http_client_error

与此同时,新增:

Plaintext
manual_completion:
method: manual_external
status: confirmed
图 5:文章最终已经 completed,但原来的 excerpt_generation_failed、HTTP 400 和人工完成记录同时保留。
图 5:文章最终已经 completed,但原来的 excerpt_generation_failed、HTTP 400 和人工完成记录同时保留。

我觉得这种状态比直接把 execution evidence 改成:

Plaintext
success

更加符合事实。

真实发生的是:

Plaintext
自动摘要失败
+
人工外部完成
=
最终业务目标完成

这三件事情完全可以同时成立。

completed 表示的是:

当前历史文章迁移任务已经完成。

并不意味着:

以前的自动执行从来没有失败过。


十四、整批最终恢复为 20 / 20 completed

最后重新检查整个批次:

Bash
cd ~/code/wordpress-ai-excerpt-backfill

echo "========== FINAL RESULT =========="

python3 bin/history-migration.py summary \
    | grep -E \
    'mixed-syntaxhighlighter-20260814-03|最新未完成批次|建议创建下一批|建议:'

最终输出:

Plaintext
mixed-syntaxhighlighter-20260814-03:
total=20
completed=20
remaining=0

最新未完成批次: 无
建议创建下一批: True
建议: all batches complete
图 6:最后一篇通过 ChatGPT 人工兜底以后,整个批次重新达到 completed=20、remaining=0,可以继续创建下一批。
图 6:最后一篇通过 ChatGPT 人工兜底以后,整个批次重新达到 completed=20remaining=0,可以继续创建下一批。

这意味着:

一篇文章被模型拒绝,并没有让整个历史文章迁移批次长期卡死。


十五、现在 SOP 中多了一条正式的人工兜底路径

正常情况下,日常主流程仍然没有变化:

Plaintext
创建固定批次
→ 人工检查 / Gutenberg 规范化
→ mark-converted
→ 生产只读验证
→ run-ready --execute
→ completed

正式执行阶段发生普通单篇失败以后,仍然优先:

Plaintext
recover --post-id
→ 程序判断恢复策略
→ recover --execute

例如程序可以根据 production source、pre-write baseline 和 execution evidence 自动判断:

Plaintext
resume
restart_from_current
blocked
none

前几天的人工处理已经证明:

极少数异常文章可以由 ChatGPT 单独接管。

而今天 7756 进一步把这条路线正式补进了状态机。

现在遇到类似的确定性模型拒绝,可以按照:

Plaintext
GLM 摘要持续失败
→ recover / execution evidence 确认真实原因
→ 确认属于模型内容过滤等确定性失败
→ 停止盲目重试

→ ChatGPT 生成中文摘要
→ ChatGPT 生成英文标题、摘要和完整正文
→ 人工保存 WordPress

→ mark-manual-completed Preview
→ 生产只读检查
→ 确认允许人工完成

→ mark-manual-completed --confirmed
→ workflow_status = completed

整个过程中:

Plaintext
不删除 state
不清空 evidence
不手工伪造 completed
不修改原失败记录

这条路径也已经补进目前主要使用的 WordPress 历史文章处理 SOP

以后再遇到类似问题,就不需要重新回忆:

Plaintext
人工翻译完成以后应该执行什么命令?
是不是需要改 JSON?
怎样才能让这篇文章进入 completed?

直接走:

Plaintext
mark-manual-completed

即可。


十六、为什么我觉得这次补的不是一条命令,而是一种状态设计

历史文章自动化处理到后面,绝大多数普通文章其实已经越来越稳定。

真正消耗时间的通常都是少数异常。

例如目前实际遇到过:

Plaintext
SSH timeout
REST 认证异常
GLM TimeoutError
Protected Token 校验失败
WordPress HTTP 500
Ctrl+C 中断
execution evidence 与 workflow 不一致
模型内容过滤

如果每出现一种异常,都通过:

Plaintext
删除 state
清空 evidence
修改 JSON
强制 completed

来解决,那么随着项目越来越长,本地状态最终反而越来越不可信。

我现在更希望保持一个比较明确的原则:

自动失败就保存自动失败。

人工完成就记录人工完成。

最终 workflow state 只表达当前任务是否已经完成。

这样以后重新查看某篇历史文章时,仍然能够回答:

Plaintext
它当时为什么失败?
自动流程执行到了哪里?
真实错误是什么?
后来有没有修改生产内容?
最终是谁完成的?
是否经过生产检查?
为什么最终允许进入 completed?

这比只看到:

Plaintext
completed

一个结果更有价值。


十七、后续还要继续观察不同大模型的内容审核尺度

这次 GLM 1301 也让我开始重新考虑历史文章自动化过程中模型的选择。

对于普通技术内容,目前 GLM 在大量历史文章上的自动摘要和翻译整体已经能够正常工作。

但是这篇文章比较特殊。

它连续涉及:

Plaintext
数字资产
充值
提现
链上地址
网络选择
金额
手续费
账户余额
到账记录

即使原文章本身只是记录一次正常操作过程,也仍然可能被模型侧的内容审核拦截。

后续我准备继续实际测试国内不同大模型在这类文章上的审核尺度。

重点观察几个因素:

Plaintext
中文理解与生成质量
API 稳定性
调用成本
长文本能力
结构化输出能力
内容误拦截情况

看看是否存在审核尺度相对更适合技术博客历史内容处理的国内模型。

从我目前实际使用不同模型的体验来看,一些海外大模型在处理这类正常技术记录时,出现类似误拦截的情况相对少一些。

不过,这个观察还不能简单归纳为:

Plaintext
国内模型都会严格审核
海外模型完全不审核

不同厂商、不同模型甚至不同时间的安全策略都可能变化。

因此后续还是需要通过真实 API 调用继续验证。

我也不准备为了适配某一家模型的内容审核规则,去长期修改自己的历史文章。

更希望后续工作流能够继续朝这个方向发展:

Plaintext
模型 A 正常完成
→ completed

模型 A 暂时性失败
→ 有限重试

模型 A 确定性拒绝
→ 停止无意义重试
→ 尝试模型 B

模型 B 仍无法处理
→ ChatGPT / 人工兜底
→ 生产验收
→ manual completion
→ completed

如果以后这类案例继续出现,下一阶段甚至可以考虑把现在的:

Plaintext
人工 ChatGPT fallback

进一步发展成:

Plaintext
多模型自动 fallback

这样能够把人工介入继续压缩到极少数真正需要人工判断的文章。


总结

今天最开始只是一次很普通的批处理异常。

20 篇文章中:

Plaintext
19 篇正常完成
1 篇中文摘要生成失败

最开始看到的只是:

Plaintext
HTTP 400

继续检查以后,最终确认:

Plaintext
HTTP 400
→ GLM error.code = 1301
→ contentFilter
→ 内容安全过滤

随后又通过真实中文源和生产摘要提取逻辑确认:

Plaintext
cleaned_content = 892 chars
payload = 3427 bytes

没有证据表明问题来自输入长度。

当确定继续反复请求 GLM 已经没有意义以后,我没有选择修改历史正文去迎合模型,而是转入:

Plaintext
ChatGPT 生成中文摘要
→ ChatGPT 完成英文标题、摘要和正文
→ 人工保存 WordPress

同时又给原有:

Plaintext
mark-manual-completed

增加了 excerpt_failed 的安全支持。

如果文章停在:

Plaintext
excerpt_failed

程序现在必须额外确认:

Plaintext
Chinese excerpt is not empty

并同时检查:

Plaintext
post ID
publish
英文标题
英文正文
Polylang

真正通过生产只读检查以后,才允许:

Bash
python3 bin/history-migration.py mark-manual-completed \
    --post-id 文章ID \
    --confirmed

最终文章同时保留:

Plaintext
execution_evidence = excerpt_generation_failed
last_failure = HTTP 400
manual_completion = manual_external
workflow_status = completed

整个批次最终恢复为:

Plaintext
total=20
completed=20
remaining=0

最新未完成批次: 无
建议创建下一批: True
建议: all batches complete

所以这次真正解决的已经不仅仅是:

“一篇文章 HTTP 400 怎么办?”

而是进一步回答了另一个更重要的问题:

当自动模型明确拒绝处理某篇文章时,整个自动化工作流怎样在不篡改历史 evidence、不修改原文迎合模型、也不手工伪造状态的情况下,继续安全地完成这篇文章。

目前的答案就是:

自动模型可以失败,但整个历史文章迁移工作流必须保留一条可验证、可审计、能够安全收敛到 completed 的人工兜底路径。

GLM-5.2 整篇翻译持续返回 HTTP 400:从安全检测拦截到 Plaintext 载荷缩减的完整排查与修复

需要长期技术维护或远程问题排查?

我是拥有 15+ 年经验的 PHP / Go 后端工程师,长期关注已有系统维护、Bug 修复、性能优化、服务器排查、WordPress 网站维护和小功能迭代。

如果你的项目遇到以下情况,可以先从一次小问题排查开始合作:

  • ✅ PHP / Laravel / Yii2 老项目无人维护
  • ✅ Go / Gin 后端接口需要排查或优化
  • ✅ WordPress 网站访问慢、报错或插件冲突
  • ✅ Nginx / MySQL / Redis / Linux 服务器异常
  • ✅ CDN / Cloudflare / DNS / HTTPS 配置问题
  • ✅ 需要长期远程技术支持或兼职维护

更多介绍请查看:关于我 & 合作

微信:13980074657
邮箱:shuijingwanwq@gmail.com
Telegram:@shuijingwan
GitHub:https://github.com/shuijingwan

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理