拆开汉字看结构:让AI画对中文字的评分思路

作者:起个名字好难2026.11.04 02:49浏览量:0

简介:AI生成图像时常画错中文字,根源之一在于奖励信号设计:OCR裁判把汉字当成不可拆分的黑箱,错一笔与错半边同为零分,模型学不到改进方向。本文解析汉字构型的层级特性,剖析OCR裁判与多模态裁判的失效模式,并给出基于部件拆解的细粒度评分思路,帮助读者掌握结构化奖励信号的设计方法。

一、问题背景:文生图的“文字短板”与裁判机制

当前主流的文生图模型在自然场景上表现出色,可一旦画面中需要出现中文文字,就频繁“翻车”:招牌缺笔画、标题偏旁张冠李戴。业界通行的改进做法是在基础模型之上叠加强化学习式的后期训练,让模型反复生成带文字的图像,再由一个“裁判”对结果打分,分数作为奖励信号回传,指导模型朝“画得更对”的方向更新参数。

裁判的选择直接决定训练上限。实践中最常用的裁判是OCR(光学字符识别)模型:把生成图像中的文字区域裁出来识别一遍,将识别结果与目标文字逐字对比,一致则给分,不一致则零分。这套流程在英文场景运转良好,换到中文场景却问题频出。

二、OCR裁判为何失效:汉字不是字母

英文字母是线性的最小书写单位,26个字母横向排列组合成词,词的对错几乎等价于逐字符的对错。汉字则完全不同,它是二维的“积木式”结构:

  • “尬”由“九”与“龙”的变体左右排布而成;
  • “想”由“相”与“心”上下叠放而成;
  • “国”由“囗”包围“玉”构成。

这种由偏旁部首按照左右、上下、包围等空间关系逐级组合而成的结构,通常称为汉字的构型。一个字是否正确,不仅取决于用了哪些部件,还取决于部件之间的相对位置、比例与衔接方式。

OCR面对这类复杂结构时经常力不从心:要么把整个字判成一个“不认识的符号”直接放弃,要么瞎猜一个形近字输出。由此产生一个致命缺陷,AI生成的字无论错一笔还是错半边,只要OCR认不出,裁判一律给零分。

这就像批改一份100道选择题的试卷:学生错1道和错90道,得分完全相同,都是0分。这样的打分无法告诉学生“哪题错了、错在哪”;同理,也无法告诉生成模型该往哪个方向优化。对强化学习而言,奖励信号就是优化方向的来源,没有区分度的奖励等于没有方向。

三、三种裁判的失效模式对比

近期一篇研究给出了直观的对比案例,暴露了三类常见裁判各自的短板:

1. 专用OCR模型:认成形近字,一律零分。 生成图中某个“尬”字的部件结构写错了,OCR老老实实把它识别成另一个形近字,与目标不符,判0分。判0分本身没错,但由于所有错误都同样归零,模型得不到任何关于错误程度的信息,无法形成有效梯度。

2. 多模态大模型:靠语境脑补,产生假阳性。 换用更强大的多模态大模型充当裁判,它结合上下文语境硬是“猜”出了正确答案,判满分。可图上那个字形明明是错的,模型只是凭借语言先验蒙对,这属于典型的假阳性:字形错误却拿满分。假阳性比假阴性更危险,它直接奖励错误行为,会诱导模型固化错误写法。

3. 错字检测类工具:标记异常符号,仍是二元判断。 还有一类专门检测错字的工具,能准确判断该字结构有问题,不会被语境脑补欺骗,可靠性强。但其处理方式是把整个字替换成异常符号”#”,同样打0分,判断更准了,粒度却没变,本质仍是非黑即白。

横向对比可以得出一个关键结论:只要评价粒度停留在“整字对/错”这一层,无论裁判多聪明,都会同时造成两类伤害,错杀(不同程度的错误全部归零,训练没有方向)与错放(语境蒙对拿满分,直接强化错误行为)。

四、核心洞察:汉字的错误有程度之分

问题的根源是评分体系与被评价对象的结构不匹配。汉字的书写错误天然是分层级、分程度的:

  • 程度最轻:个别笔画的长短、角度略有偏差,字仍可辨认;
  • 程度中等:某个部件写错,比如把“九”写成“几”,但整体布局正确;
  • 程度较重:部件都对,空间关系错乱,左右结构写成了上下结构;
  • 程度最重:部件与布局全错,完全不成字。

合理的裁判应当区分这些层级,输出有梯度的分数:错一笔给0.9,错一个部件给0.5,布局错乱给0.3,完全不成字给0。有了梯度,强化学习才有“坡”可爬,模型每一步优化都能知道自己变好了还是变差了。

五、解法:按构型拆字,做结构感知的细粒度评分

顺着这个洞察,解决方案自然浮出水面:不再把汉字当成黑箱,而是按构型把它拆解成“部件+空间关系”的层级结构,逐层比对、加权汇总。可落地的评分流程分四步:

第一步,目标字解析。 把目标汉字拆解成构型树:先拆出部件(偏旁部首或独立笔画块),再记录部件间的空间关系。常用字可离线预解析成结构字典,运行时直接查表。

第二步,生成字解析。 对生成图像中的字形做同样的拆解,可借助字形结构解析算法或视觉检测模型完成部件的定位与识别。

第三步,逐层匹配比对。 将生成字的构型树与目标构型树逐层对齐,分别评估部件集合的相似度(该有的部件有没有、有没有多余或写错的部件)、空间关系的一致性(左右是否写成了上下)、笔画细节的偏差程度。

第四步,加权汇总。 按部件正确性、空间关系正确性、笔画细节分别加权,输出0到1之间的连续分数,替代二元打分。

示意性的评分函数如下(伪代码,仅表达思路):

  1. def glyph_score(target_char, rendered_glyph):
  2. # 构型树解析:如 "尬" -> (["九","龙"], LEFT_RIGHT)
  3. t_tree = lookup_structure(target_char)
  4. g_tree = parse_rendered(rendered_glyph)
  5. # 三个维度分别比对
  6. comp_score = component_match(t_tree, g_tree) # 部件匹配, 0~1
  7. layout_score = spatial_match(t_tree, g_tree) # 空间关系匹配, 0~1
  8. stroke_score = stroke_compare(t_tree, g_tree) # 笔画细节, 0~1
  9. # 加权汇总为连续奖励
  10. return 0.5*comp_score + 0.3*layout_score + 0.2*stroke_score

这样设计后,前文的三种失败模式都能得到修正:

  • “尬”字错了一个部件:部件得分约0.5,布局与笔画得分正常,总分约0.7,模型收到明确信号:布局对了,部件错了,改进方向清晰;
  • 字形写对:各维度得分都接近1,拿满分;
  • 完全不成字:各维度趋近0,总分趋近0;
  • 假阳性被堵死:评分依据是字形本身的结构比对,而非“识别结果是否等于目标文本”,语言先验无法蒙混过关。

六、工程落地的四个要点

把上述思路接入强化学习训练管线,还有几处细节值得注意:

其一,构型解析的可靠性是前提。 构型树解析错了,奖励就错了。建议以通用的汉字部件规范为底表构建结构字典,常用字离线校验后再上线,减少运行时的解析抖动。

其二,结构分数应与识别结果组合使用。 结构比对衡量“写得像不像”,识别一致性衡量“读起来对不对”,二者互补:纯靠识别会有假阳性,纯靠结构可能放过“结构正确但用错字”的正字法问题。可行做法是以结构分数为主、识别一致性为校验项。

其三,控制假阳性优先于控制假阴性。 训练中宁可少给分,不可错给分:奖励缺失只是学得慢,奖励错误则是学得偏,且偏得理直气壮。

其四,按字形复杂度分级处理。 独体字(如“人”“大”)无部件可拆,退化为笔画级比对;多部件复杂字启用完整的构型树比对。评分管线应能自动适配不同复杂度。

七、总结

AI画不好中文字,表面是模型能力问题,深层是奖励信号设计问题。OCR把汉字当成不可拆分的黑箱,二元打分抹平了错误的程度差异,也给语境脑补式假阳性留了后门。汉字构型的层级性天然提供了更细的评价粒度:拆成部件、比对关系、逐层打分、加权汇总。这个案例更普适的启示是:为强化学习设计奖励时,评分粒度应当与被评价对象的结构粒度对齐,只有奖励信号本身携带“哪里错、错多少”的信息,模型才能学会“往哪里改、改多少”。