这一课完成什么
让 CLI 保留指定开头,输出稳定的四句五言或七言。这里需要把模型的文字选择与程序的格式约束明确分开,才能知道到底验收了哪种能力。
外形由程序安排,用字交给模型
四句五言或七言在这个项目中是明确的程序约束。把句尾标点与汉字位置分开处理,便于验收;押韵、平仄还没有因此自动保证。
用文字逐步读这张图
- 选择行长:五言 = 5 个汉字;七言 = 7 个汉字
- 保留指定开头:用户先写“春”;不让模型改掉
- 汉字位置:GPT 提供候选分数;采样得到一个字
- 标点位置:程序写逗号或句号;不让模型自由猜
- 四句齐全:共 4 × 行长 个汉字;外加四个标点
- 再读内容:主题、语义、重复;另作检查
字数正确是否证明学会格律?
没有。字数是程序限定的,严格押韵、平仄和对仗还需要另外实现和验证。
指定开头怎样实现
程序把你输入的开头原样放入正文前缀,再从它后面继续生成。输入“明月”,五言第一句还要补三个汉字。开头最长不能超过一句的字数,必须是字表支持的汉字;繁体输入会按同一套规则转为简体。
./poet write --start 春 --form five
./poet write --start 明月 --form seven
./poet write --start 春江花月夜 --form five第三条已给满第一句的五个字,程序接上逗号后继续后面三句。指定开头不等于藏头诗:藏头诗要求每一行的开头分别受控,属于后续扩展。
字数和标点由规则决定
五言每句五字加一个标点,四句共 24 个位置。七言每句七字加标点,四句共 32 个位置。在应该放汉字的地方,程序只在字表中的允许汉字范围采样;在标点位置,程序放入指定的逗号或句号。
五言:汉 汉 汉 汉 汉 ,
汉 汉 汉 汉 汉 。
汉 汉 汉 汉 汉 ,
汉 汉 汉 汉 汉 。./poet lesson 21
./poet write --start 春 --form five --json输出 JSON 包含正文、四行、格式、关键词线索得分和重复检查状态。你可以用 lines 检查每行长度是 6 或 8,最后一个字符是标点。字数校验不能据此证明平仄、押韵或词语搭配正确。
检查失败输入
./poet write --start 春江花月夜山 --form five
./poet write --start abc --form five两条命令都应给出中文提示并以非零退出码结束。第一条开头过长;第二条不符合汉字要求。程序不会悄悄截断用户的开头,也不会把输入失败当作随机写一首。
为什么不能在最后随意截字
如果先自由生成一大段,再按五字切开,词组可能被截断,句子之间也失去关系。当前程序在生成的每一步就知道标点与条件,它的下一个字会利用已经形成的句子。即使如此,语义质量仍取决于训练与采样,需要人工阅读。
验收与排错
- 结果正文以归一化后的指定开头开始。
- 恰好四行,每行汉字数为 5 或 7,标点顺序为“,。,。”。
- 输出中没有
<bos>、<正文>等内部标记。 - 未收录字明确提示,不能悄悄替换成其他字。
先检查外形,再读懂诗意
下面使用交付模型重新执行首字写诗,固定 seed=2026、device=cpu。图里的每个字保留原样,便于看清“格式正确”和“表达自然”是两项不同的验收。

交付效果:指定“春”字开头
- 先看哪里
- 核对第一字为“春”,四行各有五个汉字,末尾交替使用逗号、句号。
- 这说明什么
- 开头与外形由程序保证,其余字来自模型。本例仍有“春来一日来”等重复、不自然表达;外形正确只是第一项检查。
- 你接着做
- 换一个常见开头,检查字数之后再用自己的话复述诗意;如果难以复述,就记为语义问题。
小练习与答案
输入“明月”后,输出以“明月”开头,能说明模型自己学会遵守首字指令吗?
查看答案
不能这样归因。程序直接保留了指定开头,模型负责续写剩余部分。产品行为是符合需求的,但要研究模型是否理解自然语言指令,需要另造带指令的训练材料并单独评估。本课程训练的是条件接字模型。