关键词提取是自然语言处理中的经典任务,传统做法依赖TF-IDF、TextRank等统计算法,或者专门训练的序列标注模型。这几年大语言模型普及之后,越来越多的开发者选择直接用提示词来完成这项工作,省去了标注数据和训练模型的过程。但实践中不少人发现,把文本丢给大模型后,得到的关键词要么过于宽泛,要么遗漏了真正重要的实体,输出格式还经常不稳定。问题的根源通常不在模型本身,而在提示词的设计上。这篇文章就来系统讲讲,如何设计一份高质量的关键词提取提示词,让模型稳定输出你要的核心信息。

一、为什么直接提问的效果往往不理想
很多人第一次尝试时,提示词写得非常简单,比如一句话:请从下面的文本中提取关键词。这种写法在短文本上偶尔能碰对,但一旦文本变长、主题变多,输出质量就会明显下滑。原因在于这句话存在大量未定义的空白:什么算关键词?名词短语还是任意词语?提取多少个?要不要去重?输出是列表还是句子?模型只能靠自己的默认理解去补全这些空白,而不同模型、甚至同一模型的不同次调用,默认行为都可能不一致。
另一个常见问题是泛化偏差。大模型在训练中见过海量文本,它倾向于输出高频、通用的词汇。比如一段介绍某款新能源汽车电池技术的文章,模型可能给出"汽车""电池""技术"这类词,虽然字面上确实出现了,但对理解文章核心几乎没有帮助。真正有价值的关键词应该是"磷酸铁锂""CTB底盘一体化""800V高压平台"这类具体、有区分度的表达。
格式不稳定也是让开发者头疼的问题。你期望模型返回JSON数组,它可能返回一段带编号的列表,或者干脆用自然语言描述。下游程序一旦依赖固定格式解析,这种不稳定性就会直接导致流程中断。所以一份合格的提取提示词,必须同时解决语义约束和格式约束两个层面的问题。
二、提示词设计的四个核心要素
1. 明确角色与任务边界
给模型设定一个具体的角色,能有效引导它调用相关知识范围内的判断标准。比如设定为"信息检索领域的标注专家",模型对关键词的筛选标准会更贴近专业理解。同时要把任务边界写清楚:只提取文本中明确出现的内容,还是允许归纳推断;只提取实体名词,还是也包括关键动词短语。这些约束不写明,模型就会自行发挥。
2. 定义关键词的判断标准
这是最容易被忽略但影响最大的一环。建议在提示词中明确告诉模型:关键词应当具备区分度,能体现文本核心主题;优先提取专有名词、技术术语、人名、机构名、产品名;避免泛化词汇和语气助词。必要时可以给出反例,告诉模型哪些类型的词不要输出。
3. 控制数量与输出格式
数量约束建议写成范围而不是定值,比如"提取5到10个",给模型一定的弹性空间。格式约束则要具体到可以直接被程序解析的程度,明确要求只输出JSON,不要附加任何解释文字。
4. 用Few-shot示例锚定行为
给出一到两个输入输出的完整示例,是提升稳定性的最有效手段。模型会模仿示例中的筛选尺度、粒度和格式,输出的方差会大幅降低。
下面是一个综合了上述四个要素的完整提示词模板,可以直接拿去改造使用:
prompt = """你是一名专业的信息抽取专家,擅长从文本中提取核心关键词。
## 任务要求
1. 从给定文本中提取 5-10 个关键词
2. 关键词必须是文中出现或可直接归纳的内容
3. 优先提取:专有名词、技术术语、人名、机构名、产品名、时间地点
4. 不要输出泛化词汇(如"问题""发展""技术"这类无区分度的词)
5. 关键词按重要性从高到低排列
## 输出格式
只输出一个JSON数组,不要输出任何其他内容。示例:
["磷酸铁锂电池", "800V高压平台", "CTB技术"]
## 待处理文本
{text}
"""
result = llm.chat(prompt.format(text=document))
keywords = json.loads(result) # 直接解析,无需清洗三、进阶技巧:分步提取与结果校验
当文本较长或者包含多个主题时,一次性提取的效果会打折扣。这时可以采用两阶段策略:第一阶段让模型先给文本划分主题或生成摘要,第二阶段针对每个主题分别提取关键词,最后合并去重。这种做法相当于把一个复杂任务拆解成模型更擅长的简单任务,准确率通常会有明显提升。代价是多一次调用,需要权衡成本。
另一个实用技巧是在提示词中加入自校验环节。要求模型输出关键词后,逐一检查每个关键词是否确实出现在原文中或者能被原文支撑,把不满足条件的剔除。这在要求严格抽取式输出的场景里特别有用,能显著减少模型"编造"看似合理但原文没有的词。示例写法如下:
verify_prompt = """下面是一段原文和一组候选关键词,请逐一检查每个关键词:
- 是否在原文中明确出现,或能由原文直接归纳得出
- 是否具有区分度,能代表文本的核心主题
删除不满足条件的关键词,输出剩余关键词的JSON数组,不要解释。
原文:{text}
候选关键词:{keywords}
"""如果业务对召回率要求很高,还可以考虑让模型从多个角度分别提取,比如一次只关注实体,一次只关注事件和动作,一次只关注领域术语,最后把三组结果合并。多角度提取的总召回率高于单次提取,再通过去重和重要性排序控制最终数量。这种方式在企业知识库打标签、工单自动分类等场景中效果很稳定。
四、常见失败场景与应对方案
第一种失败是关键词重复或语义相近,比如同时输出"机器学习"和"machine learning",或者"大模型"和"大语言模型"。解决办法是在提示词中明确要求语义去重,同一概念只保留一个表达,并且指定保留中文还是英文。
第二种失败是模型输出额外解释。明明要求只输出JSON,它还是会加上"以下是提取的关键词:"这类前言。可以在提示词末尾强调"你的回复必须以[开头,以]结尾",或者将温度参数调低到0.1以下,都能明显缓解。
第三种失败出现在超长文本上。当文本超过上下文限制或者接近限制时,模型对开头和结尾内容的注意力会下降,中间部分的关键词容易被漏掉。应对办法是分段提取再合并,或者先用TextRank这类传统算法做粗筛,把高分句子拿出来让大模型精提。传统算法和大模型结合,往往比单独使用任何一方效果都好,成本也更可控。
最后提醒一点:提示词没有万能模板,不同领域的关键词判断标准差异很大。法律文书看重案由和条款,医疗文本看重疾病和药品名,社交媒体内容则看重话题和情绪词。建议在自己业务的典型样本上反复测试,把模型犯的错误类型记录下来,针对性地往提示词里补充约束条款,迭代两三轮后,提取质量通常就能达到可上线的水平。