简介:文生图模型常常把中文字画得缺笔少画、部件错位,根源之一在于后训练阶段用OCR当“裁判”:它把汉字当成不可拆分的黑箱,只能给出全对或全错的粗糙信号。本文剖析这一奖励机制为何在汉字上失灵,并系统介绍“部件+构型”的结构化奖励设计思路、示意实现与工程落地要点,帮助读者理解让AI真正写对汉字的完整方法论。
近年来,文生图模型在构图、光影、质感等维度进步显著,但“在图里写字”始终是公认的硬骨头。生成的海报文案中,文字常常出现笔画粘连、部件缺失、部件错位,甚至整字垮塌成谁也不认识的符号。对中文场景而言,这一问题尤其突出——海报、封面、电商物料对“字必须写对”有刚性要求,一个错字就足以让整张图报废。
问题的根源在于:生成模型在预训练阶段学到的是“看起来像字”的像素分布,而不是“结构上成立”的组合规则。汉字类别数以万计,每个字又是一套独立的二维结构,仅靠数据驱动的拟合,很难保证每一笔、每个部件都严丝合缝。因此,业界普遍的做法是引入后训练(post-training)阶段,用强化学习对模型进行针对性“纠偏”。
强化学习需要一个奖励来源,即“裁判”负责给模型的生成结果打分,告诉它好还是不好。这个裁判通常由OCR(Optical Character Recognition,光学字符识别)模型担任——OCR是让机器“认字”的通用技术,把图片中的文字转换为计算机可处理的文本。
打分流程大致如下:
# 伪代码:OCR裁判的典型打分逻辑def ocr_reward(image, target_text):crop = locate_and_crop(image) # 定位并裁出文字区域pred = ocr_model.recognize(crop) # OCR识别裁剪区域return 1.0 if pred == target_text else 0.0 # 对了给分,错了不给分
在英文场景中,这套机制相对够用:英文字母是最小书写单位,26个字母按一维线性顺序拼成单词,识别结果与目标文本逐字符比对即可,错误类型有限,奖励虽然粗糙但方向大体正确。
汉字与拼音文字有本质差异。英文以字母为最小单位做一维排列;汉字则是由部件(偏旁、部首等构件)按照特定空间关系组装而成的二维结构,这种结构在汉字信息处理中通常称为构型。常见的构型类型包括:
| 构型类型 | 示例 |
|---|---|
| 左右结构 | 明(日+月)、尬(尢+介) |
| 左中右结构 | 湖(氵+古+月) |
| 上下结构 | 想(相+心)、花(艹+化) |
| 上中下结构 | 意(立+日+心) |
| 全包围结构 | 困(囗+木) |
| 半包围结构 | 病(疒+丙)、句(勹+口) |
| 品字形/叠架结构 | 森(三个木纵向叠置) |
更重要的是,这种拆解具有层级性:“想”由“相”和“心”上下叠放,而“相”又可继续拆为“木”和“目”的左右组合。同时,部件在组字时还会发生形变与让位:“水”作左偏旁时写作三点水“氵”,“木”在“相”的左侧时末笔捺变为点,“尬”的左侧部件“尢”本身也是“尤”作偏旁时的变形。此外还有“中”“山”“人”等独体字,直接由笔画构成,拆解到部件层面即告终止。
对OCR而言,这意味着识别对象不是一条线性序列,而是一张复杂的二维结构图。面对结构异常的生成图,OCR经常把整个字直接判为“不认识”,要么瞎猜一个形近字,要么干脆放弃输出。
生成一句话时,只要任意一个字出错,整句奖励即归零,奖励方差极大;再叠加文字区域裁剪不准、排版透视等干扰,OCR自身的错误率也会上升,训练信号进一步被噪声淹没。
近期相关研究给出的解法可以概括为一句话:与其问OCR认不认识这个字,不如问这个字的每个部件是否到位、部件间关系是否正确。具体分三步。
以常用字为首批覆盖对象,为每个字建立“部件拆解树 + 空间关系描述”:
想(上下结构)├── 相(上部,约占60%高度;内部为左右结构)│ ├── 木(左,约占50%宽度)│ └── 目(右,约占50%宽度)└── 心(下部,约占40%高度)
知识来源可以是权威字形规范、字典数据,以及通用字库字体的渲染结果——离线渲染标准字形,即可批量导出部件掩码与包围盒,作为结构先验。独体字则退化为笔画级或整字级描述。
在强化学习训练时,用三个子项替代单一整字判定:
# 伪代码:构型化奖励的计算流程def glyph_reward(img, target_char):tree = config_knowledge.decompose(target_char) # 查构型知识库comps = component_detector(img, tree.components) # 部件检测定位s_exist = existence_score(comps, tree) # 部件是否齐全、形态对不对s_layout = layout_score(comps, tree) # 位置比例符不符合构型s_ocr = ocr_score(img, target_char) # 整字识别兜底return 0.4 * s_exist + 0.4 * s_layout + 0.2 * s_ocr
两种裁判的对比一目了然:
| 维度 | OCR整字裁判 | 构型化奖励 |
|---|---|---|
| 信号形态 | 0/1两点分布 | 连续、多维 |
| 可定位性 | 无 | 可定位到具体部件与关系 |
| 与字形质量的对齐度 | 可能脱节 | 直接相关 |
| 额外计算成本 | 低 | 中(需部件检测) |
奖励一旦从“单点判决”变为“可分解、可定位的连续信号”,训练质量就发生了质变:假如“想”字的“心”写歪了,只有与“心”相关的子项被扣分,模型明确知道该改哪里,而不必推倒重来。
这一思路的本质,是把与任务结构脱节的黑箱奖励,替换为与汉字构型对齐的可解释、可分解奖励——让裁判从“认字”升级为“懂字”。同样的方法论还可以迁移到图表生成、UI还原、公式排版等结构化生成任务:把“整体像不像”拆解为“每个结构单元对不对”。
对中文AIGC而言,文字渲染是绕不开的硬指标。拆开汉字看结构,让奖励信号落在每一个部件、每一种空间关系上,正是补齐这块短板、让AI真正“写对中文字”的关键一步。