最近又客户问我:用 ChatGPT 来写文章的时候,最经常出现的问题并不是它不能生成内容,而是输出的字数没有办法受到控制。比如你让它写800字,它常常会直接给出1500字;要是你让它压缩到300字,它依然会写出一大段冗长的内容。这是什么原因呢?
归根结底,ChatGPT 之所以总是会超出你要求的字数限制,原因就在于它所依赖的 token 计数方式以及模型自身对篇幅的默认倾向。下面这篇文章我会具体解释这背后的机制,并给出针对性的处理办法。
要处理好这个问题,首先得知道它为什么会这样。ChatGPT 的本质是对下一个词来做预测,它里面并没有内置的“字数计数器”。在生成的整个过程当中,它并不会一边写着一边去统计自己已经写了多少个字。它只能凭借你给出的指令,来大致判断到底是应该写得长一点还是短一点。
还有一个缘由是在训练数据里面,文章通常都是偏长的。要是你只是让它“写一篇有关于 X 的文章”,模型往往会倾向于输出一篇结构完整而且内容足够充分的长文,因为这就是它在训练过程当中最常看到的文章形式。假设字数要求并不明确、也不具体,那么这条要求就很容易被忽略掉。
还有一点细节是需要注意的:中文字数和英文单词数的计算方式并不一样。要是在中文提问当中写了“500 words”,模型可能会依照英文单词的习惯来理解,那么最后生成出来的中文篇幅就会完全不符合你的预期。所以单位必须得表达清楚。
方法一:在指令里面给出明确的数字还有单位。
最直接的做法,就是把具体的字数写进提示词里面,并且把单位也附上。不要只讲“写短一点”,而是可以表达成“写一篇600字左右的中文文章”。加上“中文”以及“字”这2个限定条件,能够很大程度上减少歧义。
同时可以给出上下浮动的范围,比如“600到700字之间”。模型对区间的执行通常会比对单个数字更加稳定,因为它会知道自己是拥有一个可以操作的空间的。
方法二:可以把字数的要求分别安置在指令的开头以及结尾的地方。
模型对于提示词的开头以及结尾部分会更加敏感。要是字数要求只放在中间位置,那就很容易被后面的内容冲淡。一种比较实用的做法是在开头和结尾各说明一次:开头写上“请写一篇500字的中文文章”,结尾再补充一句“全文控制在500字左右,不要超过550字”。
这种重复并不是啰嗦,而是可以让约束条件在生成的整个过程当中持续地发挥作用。
方法三:先让模型提供大纲,之后再依据大纲来对各个部分进行字数的分配工作。
如果一次性让模型去完成整篇文章,字数方面往往是最难把控的。更加理想的做法是把过程拆分成两个步骤。第一步让模型先列出大纲,并且由你来确认整体结构。第二步则是让它按照这份大纲来开展写作工作,同时为每一个部分都分配好具体的字数。
比如,可以对模型提出这样的要求:“按照这个大纲来写,引言部分分配100字,第一部分分配150字,第二部分分配150字,第三部分分配150字,结论部分分配50字,全文总计600字。”采用这种方式之后,每一个段落都会拥有明确的字数指标,整体篇幅自然就得到了有效控制。
方法四:先让模型去完成写作工作,然后再进行压缩处理。
如果模型已经生成了篇幅较长的版本,不需要重新进行生成。可以直接对其提出压缩要求:“把上面的内容压缩到400字,保留核心观点以及关键数据,删去重复表述与铺垫内容。”模型在改写和压缩任务上的表现通常较为出色,因为此时它拥有明确的原文可以作为参照。
可以采用连续两次压缩的方式。第一次先把内容压缩到目标字数的1.2倍,第二次再进行精修,并调整到目标字数。这样处理的效果相比一次性到位会更加稳定。
方法五:借助格式约束来间接控制内容的长度。
内容字数与结构之间存在明确的关联性。如果提出的要求是“用5个要点进行总结,并且每个要点不超过2句话”,那么生成的内容自然就会比较简短。反之,如果要求“针对每一个观点都要配有相应的案例以及一段分析”,那么篇幅也就会相应地自动扩展。
因此,如果对字数存在特定要求,那么可以同时对段落数量、每段所包含的句数以及是否采用列表形式作出规定。这些格式层面的约束会帮助模型把内容长度限定在合理的范围之内。
方法六:明确禁止扩写以及进行补充。
模型有时会自行添加内容,例如,在没有要求撰写背景信息的情况下,反而额外增加一段行业背景。针对这种情况,可以在指令中直接写明:“不要添加额外背景,不要撰写延伸阅读,不要重复已经说明的内容,仅回答所要求的部分。”把禁止项表述清晰,能够节省不少字数。
不同场景下的一些实用提示词模板。
写短文的时候可以运用这样的表述:“用中文写一篇有关于X的说明,字数控制在450到500字之间,分为3个段落,不添加小标题,同时也不使用举例。”
写长文的时候可以运用这样的表述:“写一篇2000字左右的中文文章,内容包含5个小节,每一节的字数控制在350到400字之间,并且每一节都配有一个小标题。”
做摘要的时候可以运用这样的表述:“把下面的内容总结成200字以内的中文段落,只保留其中的结论以及关键数据。”
改写的时候可以运用这样的表述:“把这段话改写成100字以内的版本,保持语气不变,并删掉其中的修饰性内容。”
有几个容易踩的坑。
第一,不要使用“尽量短”或“越短越好”这类模糊表述,模型没有办法对它们进行量化。
第二,不要同时提出多个相互冲突的要求,比如既要求“详细展开”,又要求“控制在300字”,这样一来它会优先执行其中某一个。
第三,处理中文内容时,不要把英文单词数量当作计量单位。第四,调整字数时,最好在同一个对话中完成,这样模型可以读取上文,压缩和扩展都会更加准确。
要借助 ChatGPT 来控制字数,核心在于三点:给出清晰的数字与单位,把相关要求放置在显眼的位置,并且运用结构约束来辅助限制。如果一次没有达到目标,就让它基于现有的内容进行压缩或扩展,而不是重新生成。掌握了这几个方法以后,基本上可以让输出字数稳定地落在需要的范围内,无需再进行反复的手动删改。
