AI 生活场景的意图识别:模糊表达不是靠猜,而是靠分类缩小范围
一、意图识别的常见错误是把模糊表达直接交给模型理解
用户说"帮我整理一下今天的东西"。这句话在生活场景里可能有多种含义:整理日程、整理消费记录、整理灵感笔记、整理语音备忘。如果把这句话直接交给模型理解,模型可能选择它最擅长的一种解释(通常是整理日程),但实际上用户可能想的是整理消费记录。
意图识别不应该靠模型自由理解,而是应该先做粗粒度分类缩小范围,再在范围内做精细处理。分类不是猜测,是把可能的方向列出来让用户选择或让系统根据上下文推断。分类的准确性比猜测高得多——把5种可能性列出来让用户选一个,比模型猜一个的准确率更高。
二、意图识别的两层架构:粗分类加精细理解
意图识别应分为两层。粗分类层用规则或轻量模型把输入归入大类,精细理解层在特定大类里做深度处理。
flowchart TD
A[用户输入:帮我整理一下] –> B[粗分类层:提取关键动作词]
B –> C{动作类型判断}
C –>|整理+日程| D[日程管理模块]
C –>|整理+消费| E[消费分类模块]
C –>|整理+笔记| F[笔记归纳模块]
C –>|无法判断| G[候选列表:让用户选择意图]
D –> H[精细理解层:具体参数提取]
E –> H
F –> H
G –> I[用户选择后进入对应模块]
粗分类层的关键是"整理"这个动作词映射到多个领域。不是让模型猜测"整理"指什么,而是把"整理"在生活场景下的常见含义列出来,让上下文或用户选择来决定。上下文可以是用户最近使用最多的功能——如果用户最近频繁记账,"整理"更可能指消费整理。
三、意图粗分类的实现
type IntentCategory = "schedule" | "expense" | "note" | "health" | "unknown";
type ClassifiedIntent = {
category: IntentCategory;
confidence: number;
alternatives: IntentCategory[];
};
// 动作词到领域的关键词映射
const actionDomainMap: Record<string, IntentCategory[]> = {
"整理": ["expense", "note", "schedule"], // 整理可能指消费、笔记、日程
"提醒": ["schedule", "health"], // 提醒可能指日程或健康
"分析": ["expense", "health"], // 分析可能指消费或健康数据
"记录": ["note", "expense", "health"], // 记录可能指笔记、消费或健康
};
// 最近使用频率权重:用户最近用的功能优先
const recentUsageWeights: Record<IntentCategory, number> = {
expense: 0, // 根据用户近期使用频率动态更新
note: 0,
schedule: 0,
health: 0,
unknown: 0,
};
export function classifyIntent(input: string): ClassifiedIntent {
// 第一步:从输入中提取动作词
const action = extractActionWord(input);
const domains = actionDomainMap[action] ?? [];
if (domains.length === 0) {
return { category: "unknown", confidence: 0, alternatives: [] };
}
if (domains.length === 1) {
// 只有单一匹配领域,置信度高
return { category: domains[0], confidence: 0.9, alternatives: [] };
}
// 多个匹配领域时,用近期使用频率加权排序
const weighted = domains.map((d) => ({
category: d,
score: recentUsageWeights[d] + 0.5, // 基础分0.5 + 使用频率加分
}));
weighted.sort((a, b) => b.score – a.score);
const top = weighted[0];
// 置信度不高时提供候选列表
const confidence = Math.min(top.score / (top.score + weighted[1]?.score ?? 0), 0.8);
return {
category: top.category,
confidence,
alternatives: weighted.slice(1).map((w) => w.category),
};
}
function extractActionWord(input: string): string {
// 提取输入中的主要动作词
const actionWords = ["整理", "提醒", "分析", "记录", "查询", "生成", "总结"];
return actionWords.find((w) => input.includes(w)) ?? "";
}
近期使用频率权重是一个简单但有效的上下文信号。如果用户过去一周70%的操作是记账,"整理"有70%的概率指消费整理。这个信号不需要模型参与,只用使用日志统计就够了。
四、意图分类不能替代用户明确表达
意图分类是辅助工具,不能替代用户自己明确说出想要什么。最好的交互方式是用户一开始就清楚表达意图——"帮我整理一下今天的消费记录"比"帮我整理一下"更容易准确处理。
产品设计应该引导用户明确表达。输入框的提示语可以提供常见意图的示例:"整理消费、记录灵感、查看日程…"。这比让用户自由输入然后系统猜测更高效。
意图分类失败时的兜底方案也很重要。当粗分类无法确定意图时,应该直接问用户,而不是让模型冒险猜测。问的方式要简洁:"你想整理什么?消费/笔记/日程"。三个选项加一个"其他",比长篇解释更方便用户快速选择。
最后要注意意图分类的更新。新功能上线后可能引入新的意图类型。比如健康追踪功能上线后,"整理"可能还包括整理健康数据。动作词映射表需要随功能更新而扩展。定期检查"unknown"类别的输入样本,分析是否有新的意图类型需要添加。
五、总结
AI 生活场景的意图识别应先做粗分类缩小范围再精细理解。动作词映射到多个领域时用近期使用频率加权排序。单一匹配领域直接处理,多个领域提供候选列表让用户确认。置信度不高时直接询问用户而非冒险猜测。产品设计引导用户明确表达意图,输入框提供常见意图示例。映射表随功能上线定期更新,分析unknown类别样本发现新意图类型。



