在智能对话系统中,意图识别和槽位填充是两个核心任务。意图识别类似于文本分类,旨在确定用户输入的语义意图;而槽位填充则类似于序列标注,用于提取用户输入中的关键信息。
废话不多说,上代码
package xyz.wbsite.ai;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
public class 意图识别槽位填充 {
record Entity(
String intent,
String city,
String date,
String timeOfDay
) {
}
interface Assistant {
@SystemMessage("""
你是一个自然语言理解(NLU)引擎。
给定一个用户话语,你必须以一个可JSON序列化的对象形式输出意图名称和每个槽值。
识别的意图必须是以下之一:获取天气信息、未知。
已识别插槽有:城市、日期、时间。
如果某个插槽不存在,则将其值设置为空。
使用此类作为输出:WeatherIntentResult(intent, city, date, timeOfDay)
""")
@UserMessage("User query: \"{{input}}\"")
Entity chat(@V("input") String input);
}
public static void main(String[] args) {
OpenAiChatModel chatModel = Helper.getChatModel();
Assistant assistant = AiServices.builder(Assistant.class)
.chatModel(chatModel)
.build();
Entity entity = assistant.chat("帮我查一下深圳明天下午的天气");
System.out.println("解析结果:");
System.out.println("意图 = " + entity.intent());
System.out.println("城市 = " + entity.city());
System.out.println("日期 = " + entity.date());
System.out.println("时间段 = " + entity.timeOfDay());
}
}
运行结果
解析结果:
意图 = 获取天气信息
城市 = 深圳
日期 = 明天
时间段 = 下午
此处博主使用的是本地部署的ollama qwen2.5:1.5b,看出来模型参数虽小,识别效果还是可以的。