同一段文字既想让 WeLM 抽字段、又想让它润色,通常两边都不稳:抽取要的是照抄原文、键名固定,改写要的是重写句子、语气统一,这两类约束对输出的方向相反,混在一个提示里会互相抢注意力。可行的路子是拆成两个提示、各自单独跑,用同一批样本分别压输入长度和输出格式,先看清哪一类任务在什么长度、什么格式要求下开始出错,再把判不准的部分写成明确规则,不交给模型。
判断方向:中文抽取与改写建议分两次调用,不要合并成一个提示。抽取侧固定字段名和输出结构,重点查漏抽与串字段;改写侧固定语气和长度上限,重点查是否自行扩写。两类任务用同一批样本、各自记录输入长度和失败表现,再对照确定边界。输入超过模型可处理长度时先切分,输出格式不满足时优先改提示或加解析校验,而不是先放宽字段约束。
把抽取和改写分成两个提示,各自单独跑
两个提示只共用一个“原文”变量,其余部分不共享。抽取提示只保留四块:任务声明、字段名清单、输出结构、原文;删掉语气、字数、“润色/自然/流畅”这类词,也删掉任何示例改写句。改写提示只保留五块:任务声明、语气要求、长度上限、不得新增事实的约束、原文;删掉字段名清单和结构化输出要求。
执行顺序建议是先跑抽取、把原文和抽取结果一起落盘,再拿原文去跑改写。不建议把抽取的输出直接当作改写的唯一输入,否则抽取阶段的漏抽会直接变成改写阶段的事实缺口,后面很难判断到底卡在哪一步。
# 抽取提示(通用骨架,替换 {字段名} 与 {原文})
任务:从下面的原文中抽取指定字段。
字段名:{字段名1}、{字段名2}、{字段名3}
规则:只输出字段名和对应值;原文中未出现的字段,值写 null;不要解释,不要补充原文没有的信息。
输出格式:每行一条,写成 字段名: 值
原文:
{原文}
# 改写提示(通用骨架)
任务:在保持原文事实不变的前提下,改写下面的中文。
语气:{中性书面 / 口语 / 客服口吻}
长度:不超过 {N} 字,或不超过原文同等长度
规则:不得新增原文没有的人名、机构、数字、时间和因果关系;不得删掉原文的关键限定词(如“可能”“暂定”“部分”)。
只输出改写后的文本。
原文:
{原文}
验证方式很朴素:同一批样本分别跑这两个提示,记录每次的输入字符数、输出是否可解析(抽取)、输出是否超出长度上限(改写)。这些都能从调用日志或页面返回里直接看到,不需要额外造指标。
在抽取任务里固定字段名,检查漏抽和串字段
字段名固定是抽取能稳住的前提:输出的键名必须和你要的一字不差,值才允许和原文措辞不同。如果字段名本身含糊(比如“信息”“内容”),或者两个字段语义相邻(“公司名”和“品牌名”、“金额”和“金额单位”),串字段的概率会明显上升。可以在提示里给每个字段补一句边界说明,但输出键名仍然只写固定名。
字段名(输出必须使用这些键名):
- contact_name:联系人姓名,不含职务
- company_name:公司全称,不含品牌简称
- amount:金额数字,不含币种
- currency:币种,只写三位代码或中文简称
核对清单按四列记,一次调用一行:
| 应抽字段 | 实抽字段 | 是否串位 | 原文出处 |
|---|---|---|---|
| contact_name | contact_name | 否 | 原句片段 |
| currency | 空 | 否 | 原句片段 |
| company_name | 值出现在 amount | 是 | 原句片段 |
怎么读这张表:实抽字段为空,先看该字段在原文里是不是用了别称或简称,再看它是否被折进了长句里;实抽字段的值跑到另一个字段下,通常是字段边界说明不够,先补边界说明,别急着加字段数;实抽字段有值但原文出处对不上,属于编造,需要收紧“原文未出现即 null”的规则。“原文出处”直接抄原句片段,不要写“第三段”这类无法复核的定位。
在改写任务里固定语气和长度,检查是否自行扩写
改写失控多半来自两个缺口:语气没写成可判断的描述,长度没给上限。语气用能落地判断的词,比如“中性书面,不用感叹句、不用网络用语、不用排比”;长度写成明确上限,“不超过原文同等长度”或“不超过 N 字”,比“简洁一点”可靠得多。输入本身较长时,长度上限和输入长度要在同一次调用里都写清楚,否则模型容易用删减换语气、或用扩写换通顺。
判定是否自行扩写用对照法,不用感觉。逐句比对,只看不一致的位置:
- 新增实体:改后文本出现原文没有的人名、机构、产品、地名。
- 新增数字:出现原文没有的时间、金额、比例、数量。
- 新增因果:原文是并列或顺承,改后变成“因为……所以……”“从而”“因此”。
- 新增评价:原文只陈述事实,改后出现“优秀”“领先”“值得信赖”。
- 限定词丢失:原文的“可能”“暂定”“部分”在改后消失,这属于改写偏差,同样要退回。
对照表两列就够:原文短语、改后短语,只填不一致的地方。凡是新增项落进上面几类,就判为自行扩写,退回并收紧提示,不要人工逐句删——人工删得越多,下一批样本还会犯同样的错。
把两类任务的失败样本放进同一张表对比
分开跑之后,失败原因往往还是混在一起,说不清是任务本身不适合,还是原文太长。统一记录四个字段就能分开看:任务类型、输入长度、失败表现、原文位置。
| 任务类型 | 输入长度 | 失败表现 | 原文位置 |
|---|---|---|---|
| 抽取 | 按字符数记 | 漏抽 / 串位 / 编造 | 原句片段 |
| 改写 | 按字符数记 | 超长 / 自行扩写 / 限定词丢失 | 原句片段 |
同一条原文分别跑抽取和改写,就记成两行。对比时按这三条看:
- 同一长度下抽取失败、改写正常,或反过来,更可能是任务类型带来的边界。
- 同一任务在某个长度以上开始集中出现漏抽或截断,更可能是输入长度带来的边界。
- 两类任务在同一长度都失败,优先怀疑输入特征——结构混乱、字段散落在长句里、中英混排,而不是模型的整体能力。
长度先用字符数,保持全程同一口径;接口若返回其他计量单位,也另开一列,别中途换单位导致对比失真。
根据对比结果定下不交给模型的场景
边界要写成能执行的规则,而不是“效果不好就不做”。判断依据来自上一张表:同一类失败在同一长度区间反复出现,且改过提示后仍然存在,就列入不可交付。
- 字段需要跨段推理或整段语义归纳才能确定——依据:同一长度下反复串位或漏抽。
- 原文长度超出自己记录到的稳定区间,且无法按段落切分——依据:该区间之后漏抽与截断集中出现。
- 改写同时要求多种互斥风格或严格字数,而原文本身已接近长度上限——依据:超长与自行扩写同时出现。
- 输出要作为机器可解析结构,但字段允许自由文本——依据:解析失败重复出现。
- 编号、金额、日期必须逐字符一致的场景——依据:对照时出现改写后数字或编号变化。
留在模型侧的:短输入、字段边界清晰、允许人工复核的抽取;以及允许轻微措辞变化、长度有明确上限的改写。分流动作可以写在调用之前:先算输入长度,超过记录的稳定区间就先切分;字段多到提示里写不清就先拆任务;输出要进下游系统的,解析失败直接拒绝,不做兜底猜字段。这样定规则的好处是判断依据可复核——出现争议时回到同一张表,看问题出在任务类型还是输入长度。