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

作者:php是最好的2026.11.04 01:02浏览量:0

简介:AI生成图片里的中文常常“差之毫厘”:少一笔、错半边、结构颠倒,而常用作裁判的OCR只会给出“对/错”的二值分数,既无法定位错误,也无法度量程度。本文围绕“把汉字拆成部件与空间结构、逐项打分”的细粒度评估思路展开,解析连续奖励为何能让强化学习更快收敛,并梳理工程落地的关键要点。

一、背景:图像生成模型的“中文之痛”

文生图模型近两年进步显著,画面质量、构图控制都已相当成熟,但“图里的文字”始终是块短板,而中文又是短板中的短板。常见症状包括:笔画缺漏、部首变形、部件位置颠倒、比例失衡,甚至凭空造出一个字典里不存在的“伪汉字”。

根源在于:生成模型本身并没有“字”的概念,它学习的是像素的分布规律。要让模型主动写对字,业界通行做法是在基础训练之后叠加后训练环节(尤其是强化学习),让模型在“生成—打分—修正”的闭环中逐步逼近正确字形。而这个闭环的效率,几乎完全取决于打分者——“裁判”——的水平。

二、裁判模型:强化学习后训练的指挥棒

先交代这个“裁判”在训练流程中的位置。一个典型的后训练闭环如下:

  1. 策略模型(即被优化的生图模型)根据提示词生成含文字的图像;
  2. 裁判模型将图像中的文字与目标文字比对,输出分数;
  3. 分数作为奖励信号回传,通过强化学习算法更新策略;
  4. 循环迭代,模型逐步学会“写对字”。

对裁判有两个基本要求:一是判断准确,不能把错的判成对的;二是信号丰富,至少要能区分“比较好”和“比较差”。OCR(光学字符识别,即让机器“认字”、把图片文字转换为计算机可读文本的技术)因为成熟、成本低、可大规模并行,成了最常被选用的裁判。

三、OCR裁判的打分逻辑:非黑即白

OCR裁判的打分方式简单直接:从生成图中裁出文字区域,识别一遍,将识别结果与目标文字逐字符对比——相等给分,不相等不给分。

问题恰恰出在这个“对就给分、错就不给分”上。打个比方:你在批改一份一百道选择题的试卷,但无论学生错一道题还是错九十道题,你给的分都一样,统统零分。这样的打分无法告诉学生“哪里需要改进”——对人类如此,对模型同样如此。在强化学习语境下,这叫奖励信号稀疏且无梯度方向:策略每次尝试得到的反馈都是同一个0,训练便容易陷入低效的随机试错。

而汉字,把这一缺陷放大到了极致。

四、汉字的本质:二维的积木结构

英文字母本身是最小书写单位,二十六个字母按一维序列排列成词。汉字则不同,它是一种二维组合结构:偏旁部首按照左右、上下、包围等空间关系拼装成字。举例来说,“尬”由“九”和一个“龙”的变体左右排布而成;“想”由“相”与“心”上下叠放而成。这种由部件按空间关系组合的规律,通常称为汉字的构型。

组合结构意味着汉字的错误天然是分层的:

  • 笔画级:多一笔、少一笔、笔画形态变形;
  • 部件级:某个偏旁写错,或用成了形近的另一个部件;
  • 结构级:部件齐全,但空间关系错了——左右结构写成上下结构、位置互换;
  • 整字级:完全不成字,属于“凭空造字”。

一套只输出0或1的评价体系,等于把上述四个层次的信息全部压平成单个比特。而OCR面对复杂构型时,经常要么硬猜一个形近字,要么直接放弃——无论AI生成的字是错了一笔还是错了半边,只要最终识别不出,得分一律为零。

五、三类裁判的失效现场

那篇论文给了一个很直观的案例:生成图中有个“尬”字,结构写错了。让三类裁判分别评判:

  1. 专用OCR模型:老老实实把它认成了另一个长得像的字,与目标不符,判0分。错半边与错一笔得到完全相同的惩罚。
  2. 多模态大模型:结合上下文语境,硬是“猜”出了正确答案,给了1分。但这其实是假阳性——图上字形明明是错的,模型只是凭借语言先验蒙对了。用作训练信号时,这种“脑补式通过”反而更危险:它会把字形错误但语境通顺的样本标记为正例,系统性污染奖励。
  3. 专用错字检测工具:能准确判断这个字结构有问题,但处理方式是把整个字标记成异常符号,直接打0分。它不会被语言模型的“脑补”骗到,却依然非黑即白:对,或者错,中间没有灰色地带。

三条路径殊途同归:没有一个裁判能回答“这个字错到什么程度”。

六、核心思路:拆开汉字,逐项给分

论文的关键洞察正如其主题所言——既然汉字是“部件+空间关系”的积木,评分就应该在同一粒度上进行。把这套思路抽象出来,大致分四步:

  1. 结构解析:借助汉字构型知识(部件表、结构类型标注等规范化资源),把目标字分解为部件序列与布局描述;
  2. 部件检测:在渲染出的字形图像中定位并识别各个部件,相当于一次小规模的检测加分类;
  3. 逐项比对:部件是否齐全、每个部件的字形是否正确、部件间位置是否符合布局约束;
  4. 分数融合:将各项局部得分加权融合,输出0到1之间的连续分数,完整保留“错误程度”信息。

示意性伪代码如下:

  1. def score_glyph(rendered_img, target_char):
  2. # 1. 目标侧:拆字
  3. target = decompose(target_char)
  4. # 例:"尬" -> components=["九", "龙*"], layout="left-right"
  5. # 2. 生成侧:部件检测与布局分析
  6. detected = detect_components(rendered_img)
  7. # 3. 局部得分:部件命中率 + 结构正确性
  8. s_comp = match_components(target.components, detected)
  9. s_layout = verify_layout(target.layout, detected.layout)
  10. # 4. 融合为连续分数
  11. return alpha * s_comp + beta * s_layout

效果上:部件全对但位置放错的字,得到中等分数;只写对一半部件的字,得到低分;全部正确得满分。灰色地带回来了,“批改老师”终于能说出“你错在右半边”这样的话。

七、为什么“有程度的分数”对强化学习至关重要

  • 密集奖励:强化学习依赖奖励的差异提供学习信号。连续分数让模型的每一点微小改进(比如从缺三笔修正为缺一笔)都能被“看见”,避免长期停在零分高原上盲目试错。
  • 信用分配:细粒度分数隐含了“哪一类错误被修复了”的信息,策略更新因此能定位到具体改进方向,而不是笼统的“还是不行”。
  • 训练稳定性:若初期错字率高、奖励几乎全为0,训练信号近乎消失,学习难以启动;分级奖励保证了训练早期也存在可爬的坡度。
  • 抑制假阳性:相比依赖语境猜测的多模态裁判,部件级比对聚焦字形本身,大幅减少“蒙对”样本对训练数据的污染。

八、工程落地的几个要点

  • 构型资源建设:部件拆分依赖规范化的汉字构型数据库。业界通用的文字识别能力(如百度智能云等云厂商提供的文字识别服务)可作为整字识别环节的成熟组件,结构化评分则在其之上充当“解释层”,二者互补而非替代。
  • 部件检测的鲁棒性:生成图像中的字形常带风格化、艺术化变形。部件检测需要容忍风格差异、同时严控结构差异——容忍“写得潦草”,拒绝“拼错积木”——这是整套方案最难的一环。
  • 可扩展性:这套“拆结构再打分”的思路天然适用于整个CJK文字家族,日文汉字、韩文谚文同样具备组合式结构,方法可直接迁移。
  • 更广的应用面:细粒度评分不只服务于强化学习,还可以做成独立的“文字保真度”评测基准,用于横向比较不同生图模型;也可用于设计稿校对、字体质量抽检,甚至书法教学中的结构纠错反馈。

九、结语

把汉字从“不可拆分的黑箱”还原为“可拼装的积木”,评价粒度从整字下沉到部件与结构,奖励信号从一位比特扩展为连续刻度——这既是让AI写对中文的关键一步,也揭示了评估体系设计的一条普遍规律:想让模型学会改进,先得让裁判有能力说清楚“差在哪里、差多少”。对任何做生成模型后训练的团队而言,这个思路都值得纳入自己的奖励设计工具箱。