意图识别 Prompt 最佳实践?
关键要素与最佳实践,覆盖少样本与思维链
原题:在进行大模型意图识别任务时,如何设计有效的prompt模板?请描述prompt设计的关键要素和最佳实践。
Prompt工程 · 百度真题
30 秒回答
- 明确角色定义与任务边界
- 设计结构化输入输出格式
- 运用Few-shot示例增强泛化
- 引入思维链或推理步骤
回答与解析
答案要点
- 明确角色定义与任务边界
- 设计结构化输入输出格式
- 运用Few-shot示例增强泛化
- 引入思维链或推理步骤
- 考虑多轮对话上下文管理
核心设计框架
1. 角色与任务定义
- 明确指定模型身份:"你是意图识别专家,负责将用户输入分类到预定义意图"
- 清晰界定意图类别清单,避免歧义重叠
2. 结构化输入输出
输入:用户query + 可选上下文(历史对话、用户画像)
输出:JSON格式 {"intent": "类别", "confidence": 分数, "slots": 槽位信息}
- 强制结构化降低解析失败率
3. Few-shot示例设计
- 每个意图提供2-3个典型正例+1个边界反例
- 示例覆盖常见变体:口语化、省略主语、同义表达
4. 推理引导(关键)
分析步骤:
1. 提取关键词和实体
2. 匹配最相近的意图定义
3. 检查是否满足该意图的必备槽位
4. 输出结果并给出置信度理由
5. 边界情况处理
- 显式定义"未知意图"兜底类别
- 设置置信度阈值,低置信度触发澄清追问
百度场景的特殊考量
- 搜索场景:需区分信息型vs导航型vs交易型意图
- 多模态输入:支持文本+图片的联合意图理解
- 时效敏感:加入时间上下文感知(如"今天天气"vs"明天天气")
口语版讲法(约4分钟)
- 点出意图识别prompt设计的本质
- 角色定义与结构化输出
- Few-shot与推理引导
- 边界与兜底处理
- 业务场景举例与风险
这道题其实问的是,你怎么让大模型在意图识别这个任务上,既听话又聪明。说白了,就是个引导和控制的问题,模型知道要干什么,也知道怎么输出,遇到边界情况还能处理。我一般会从几个层面来搭这个prompt模板。
先说角色和任务定义。这个不能含糊,你得明确告诉模型你是谁、要干什么。比如我会写‘你是意图识别专家,负责把用户输入分类到以下预定义意图里’,然后把意图清单列清楚,每个意图给个简短描述。这里有个坑:意图之间不能有歧义重叠。比如‘查订单’和‘查物流’,用户说‘我的东西到哪了’其实两个都沾边,你要么合并要么明确边界。
然后是结构化输出。我最常用的是JSON格式,比如 {"intent": "类别", "confidence": 分数, "slots": {}}。为什么强制结构化?因为模型自由输出容易飘,你解析起来也麻烦。结构化输出能大幅降低解析失败率,这在线上服务里特别关键。
再一个就是示例。纯文本描述意图模型可能理解不到位,我会给每个意图配2-3个正例,再加1个边界反例。比如‘查天气’的正例是‘今天北京天气怎么样’,反例是‘明天上海会下雨吗’,这个其实也是查天气,但带着时间地点偏移,算边界。示例要覆盖口语化、省略主语这些常见变体,这样模型泛化能力更强。
说到推理,引导模型走推理步骤特别重要。我通常会在prompt里写一个分析步骤:先提取关键词和实体,再匹配最相近的意图定义,检查槽位是否满足,最后输出结果和置信度理由。这样模型就不是瞎猜,而是有逻辑链条。你可以理解为让模型‘先想再答’,效果比直接输出好很多。
边界情况必须处理。我会显式定义一个‘未知意图’兜底类别,并在prompt里说‘如果都不匹配,输出unknown’。同时设个置信度阈值,比如低于0.6就触发澄清追问。低置信度不硬猜,而是反问用户,这在客服场景里能避免很多错误。
举个例子,在电商客服场景里,用户说‘我买的东西还没到’,这个query可能既属于‘查物流’也属于‘投诉物流慢’。prompt里我会让模型先判断有没有时间敏感词‘还没到’,如果有,优先归到‘投诉’类,同时提取订单号槽位。如果置信度低,就反问‘您是想查物流进度还是反馈配送问题?’。这样的设计能有效区分信息型vs交易型vs投诉型意图。
落地时有个前提:你的意图类别不能太细也不能太粗,太细模型分不清,太粗又没意义。常见失败场景是意图重叠没处理好,或者示例覆盖不全,导致模型在边界上反复横跳。上线我会特别关注低置信度样本的分布,定期补充边界示例。
其实这里还有个延伸点:当意图类别超过20个时,单纯靠prompt里的示例可能不够,我可能会考虑结合 Few-shot 微调或者用 Function Calling 来结构化输出,但代价是维护成本上升。所以我会把prompt设计看成成本与效果的平衡,不是所有场景都适合纯prompt,关键看业务对准确率和覆盖率的容忍度。
关键一句:当意图类别超过20个时,纯prompt可能不够,需结合微调或Function Calling,本质是成本与效果的平衡。
面试官还可能这样问
- 问法 1 · 场景切入
假设你在做客服意图识别,用户说“我想退款”,但不同语境下可能是“申请退款”或“查询退款进度”。你怎么写prompt让模型稳定区分这两种?
- 问法 2 · 层层追问
你平时怎么给大模型写prompt做分类任务?……如果意图有几十种,写一个很长的系统prompt,模型容易忽略中间的类别,你怎么优化?……再进一步,怎么让模型不仅能分对,还能告诉我它为什么这么分?
- 问法 3 · 直球架构
设计一个用于意图识别的prompt模板,要考虑角色定义、结构化输出、few-shot示例和推理引导。你具体怎么组织这些要素?模板长什么样?