陈昶聿
13 小时以前 5db7759db3fa6792155d72139f9d5d9e56eb3436
smartor/src/main/java/com/smartor/common/DeepSeekApi.java
@@ -19,8 +19,9 @@
    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);
    }
@@ -120,6 +121,35 @@
    }
    /**
     * 判断语音文本最接近哪个选项,返回选项在列表中的下标。
     *
     * @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) {