| | |
| | | public static void main(String[] args) { |
| | | String questionText = "您好,请问您是患者本人还是家属?\n"; |
| | | String voiceText = "我自己"; |
| | | List<String> options = new ArrayList<>(Arrays.asList("本人","亲属","其他")); |
| | | Integer resp = matchOptionIndex(questionText, voiceText, options); |
| | | // List<String> options = new ArrayList<>(Arrays.asList("本人","亲属","其他")); |
| | | String optionText = "亲属"; |
| | | Integer resp = matchQuestionAnswer(questionText, voiceText, optionText); |
| | | System.out.println("DeepSeek返回结果:\n" + resp); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 判断语音文本最接近哪个选项,返回选项在列表中的下标。 |
| | | * |
| | | * @param questionText 语音识别得到的文本 |
| | | * @param answerText 答案文本 |
| | | * @param optionText 选项文本 |
| | | * @return 命中选项的下标(从 0 开始);无法匹配任一选项时返回 {@code -1} |
| | | */ |
| | | public static int matchQuestionAnswer(String questionText, String answerText, String optionText) { |
| | | if (StringUtils.isBlank(questionText) || StringUtils.isBlank(answerText) || StringUtils.isBlank(optionText)) { |
| | | return -1; |
| | | } |
| | | |
| | | String systemPrompt = "\"你是一个专业的语音识别文本语义匹配助手。你的任务是判断用户的语音文本在语义上最符合的选项。用户会给出一段语音识别文本和选项文本," |
| | | + "请判断这段文本在语义上是否匹配选项, 匹配则输出 1,没有匹配则输出 0, 只允许输出1或者0," |
| | | + "不要做任何解释。直接输出最匹配选项的编号数字;若没有任何选项与文本相关,则输出 0。"; |
| | | String userPrompt = "请根据以下信息进行语义匹配判断:\n" + |
| | | "- 问题文本:" + questionText + "\n\n" |
| | | + "- 语言识别文本:" + answerText + "\n\n" |
| | | + "- 选项文本:" + optionText + "\n\n" |
| | | + "\n请只输出一个数字(匹配则输出 1,没有匹配则输出 0,只允许输出1或者0)。"; |
| | | |
| | | String content = chatCompletion(systemPrompt, userPrompt); |
| | | if (StringUtils.isBlank(content)) { |
| | | return -1; |
| | | } |
| | | return extractFirstNumber(content); |
| | | } |
| | | |
| | | /** |
| | | * 从模型回复中提取第一个整数。模型偶尔会回复 “选项2” “2。” 之类,做一次兜底解析。 |
| | | */ |
| | | private static Integer extractFirstNumber(String text) { |