Dify做意图识别
Dify中的意图识别采用"规则+LLM分类+结构化输出"的组合方案:优先通过关键词/正则快速拦截高频意图,再用LLM根据候选意图列表进行分类,并输出结构化结果(包含意图名称、置信度和槽位)。系统提供两种实现方式:推荐使用内置的「问题分类器」节点实现零代码配置,或通过「LLM节点+自定义提示词」实现更灵活的意图识别与槽位提取。下游可通过分支标记法或意图回溯法判断来源,常见问题多与分支条件判断或节点配
·
在 Dify 里,意图识别本质是“规则+LLM分类+结构化输出”的组合,不是训练好的专用模型,而是用节点和提示词把大模型当分类器来用。下面从原理、两种实现方式、配置步骤和常见问题四方面讲清楚。
一、核心原理(一句话版)
Dify 没有内置“训练好的意图模型”,而是:
- 优先规则:关键词/正则快速拦截高频意图(快、省成本);
- LLM 兜底分类:用提示词把候选意图列出来,让大模型选最匹配的一个;
- 结构化输出:让模型固定返回
intent、confidence、slots,方便下游分支判断。
二、两种实现方式(你常用的)
方式1:用「问题分类器」节点(推荐,零代码)
Dify 自带节点,专门做意图/问题分类,本质是封装好的 LLM 分类模板。
配置步骤
-
工作流拖入 问题分类器(Question Classifier);
-
输入变量:选
sys.query(用户问题); -
模型:选推理强的(如 GPT-4o-mini、DeepSeek),温度设 0.2–0.3(确定性高);
-
添加意图标签+描述+关键词:
- 意图1:查交期 → 描述:用户问交货时间、多久能好 → 关键词:交期、多久、什么时候到;
- 意图2:查库存 → 描述:用户问有没有货、库存多少 → 关键词:库存、有货吗、剩多少;
- 意图3:其他 → 兜底。
-
输出:节点会输出
category(意图名称),下游用条件分支按category走不同流程。
方式2:用「LLM 节点+自定义提示词」(灵活,适合复杂意图)
自己写提示词,让模型输出结构化意图结果,适合需要槽位提取(如工厂、数量)的场景。
标准提示词模板(直接复制)
你是意图识别器,只做分类和提取。
候选意图:
1. query_delivery:查交期(关键词:交期、交货、多久、什么时候)
2. query_stock:查库存(关键词:库存、有货、剩多少)
3. create_order:下单(关键词:买、订、下单、来一份)
4. other:其他问题
用户输入:{{sys.query}}
输出JSON(严格):
{
"intent": "意图名称",
"confidence": 0.xx,
"slots": {
"factory": "工厂(有就填,没有null)",
"qty": "数量(数字,没有0)"
}
}
配置
- 拖入 LLM 节点,粘贴上面提示词;
- 开启结构化输出,JSON Schema 如下:
{
"type": "object",
"properties": {
"intent": {"type": "string"},
"confidence": {"type": "number", "minimum": 0, "maximum": 1},
"slots": {
"type": "object",
"properties": {
"factory": {"type": ["string", "null"]},
"qty": {"type": "number", "minimum": 0}
}
}
},
"required": ["intent", "confidence", "slots"]
}
- 下游用条件分支判断:
- 若
intent == "query_delivery"→ 走查交期分支; - 若
intent == "query_stock"→ 走查库存分支; - 兜底走其他分支。
- 若
三、意图识别怎么判断“来自哪个分支”
你之前问“节点怎么判断来自哪个分支”,结合意图识别,答案是:
-
分支标记法(最常用)
- 每个条件分支出口,加一个赋值节点,设置变量
from_branch = "查交期分支"; - 下游节点直接读取
from_branch,就能知道来自哪个分支。
- 每个条件分支出口,加一个赋值节点,设置变量
-
意图回溯法
- 意图识别结果
intent就是“来源”:intent = "query_delivery"→ 来自查交期分支;intent = "create_order"→ 来自下单分支。
- 意图识别结果
四、常见问题(你遇到的)
1. 为什么上面分支能走完,下面不行、不报错?
- 大概率是条件分支判断不严谨:下面分支的条件没触发(如意图识别结果和分支条件不匹配);
- 或下游节点有必填字段没传(如工厂编码为空),但节点没报错,直接静默终止。
2. 为什么走完“直接回复16”就不往下走了?
- “直接回复16”是终止节点(如「回复用户」且勾选「结束流程」);
- 把该节点的结束流程关掉,或移到流程最后,就能继续往下走。
五、最佳实践(直接能用)
- 简单意图:用问题分类器节点(零代码、快);
- 复杂意图+槽位:用LLM节点+结构化输出(灵活、能提参数);
- 分支判断:用赋值节点打标记,下游读标记判断来源;
- 模型参数:温度 0.2–0.3,减少随机性,提高意图准确率。
更多推荐


所有评论(0)