| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.smartor.common; |
| | | |
| | | ; |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import okhttp3.*; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.*; |
| | | |
| | | @Slf4j |
| | | public class DeepSeekApi { |
| | | // æ¿æ¢ä¸ºä½ èªå·±çkey |
| | | private static final String API_KEY = "sk-4e489637e105411596be6c72e2dacdbd"; |
| | | private static final String API_URL = "https://api.deepseek.com/v1/chat/completions"; |
| | | |
| | | public static void main(String[] args) { |
| | | String questionText = "æ¨å¥½,è¯·é®æ¨æ¯æ£è
æ¬äººè¿æ¯å®¶å±ï¼\n"; |
| | | String voiceText = "æèªå·±"; |
| | | List<String> options = new ArrayList<>(Arrays.asList("æ¬äºº","亲å±","å
¶ä»")); |
| | | Integer resp = matchOptionIndex(questionText, voiceText, options); |
| | | System.out.println("DeepSeekè¿åç»æï¼\n" + resp); |
| | | } |
| | | |
| | | public static String chatCompletion(String systemPrompt, String userPrompt) { |
| | | OkHttpClient client = new OkHttpClient(); |
| | | |
| | | // 1. ç»è£
æ¶æ¯ä½ |
| | | List<Map<String, String>> messages = new ArrayList<>(); |
| | | // ç³»ç»è§è²ï¼å¯éï¼ç¨äºè®¾å®AIèº«ä»½ï¼ |
| | | Map<String, String> sysMsg = new HashMap<>(); |
| | | sysMsg.put("role", "system"); |
| | | sysMsg.put("content", systemPrompt); |
| | | messages.add(sysMsg); |
| | | // ç¨æ·æé® |
| | | Map<String, String> userMsg = new HashMap<>(); |
| | | userMsg.put("role", "user"); |
| | | userMsg.put("content", userPrompt); |
| | | messages.add(userMsg); |
| | | |
| | | // 2. 请æ±åæ° |
| | | Map<String, Object> requestBody = new HashMap<>(); |
| | | requestBody.put("model", "deepseek-chat"); |
| | | requestBody.put("messages", messages); |
| | | requestBody.put("temperature", 0.7); // éæºæ§0~1ï¼è¶ä½è¶ä¸¥è°¨ |
| | | requestBody.put("max_tokens", 1024); |
| | | |
| | | // 3. æå»ºè¯·æ± |
| | | String jsonBody = JSON.toJSONString(requestBody); |
| | | RequestBody body = RequestBody.create(MediaType.parse("application/json"), jsonBody); |
| | | |
| | | Request request = new Request.Builder() |
| | | .url(API_URL) |
| | | .header("Authorization", "Bearer " + API_KEY) |
| | | .header("Content-Type", "application/json") |
| | | .post(body) |
| | | .build(); |
| | | |
| | | // 4. åéè¯·æ± |
| | | try (Response response = client.newCall(request).execute()) { |
| | | if (!response.isSuccessful()) { |
| | | return "请æ±å¤±è´¥ï¼ç¶æç ï¼" + response.code() + "ï¼é误信æ¯ï¼" + response.body().string(); |
| | | } |
| | | String resJson = response.body().string(); |
| | | JSONObject jsonObj = JSON.parseObject(resJson); |
| | | // æåAIåçå
容 |
| | | return jsonObj.getJSONArray("choices") |
| | | .getJSONObject(0) |
| | | .getJSONObject("message") |
| | | .getString("content"); |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | return "æ¥å£è°ç¨å¼å¸¸ï¼" + e.getMessage(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 夿è¯é³ææ¬ææ¥è¿åªä¸ªé项ï¼è¿åé项å¨å表ä¸ç䏿 ã |
| | | * |
| | | * @param voiceText è¯é³è¯å«å¾å°çææ¬ |
| | | * @param options åéé项å表 |
| | | * @return å½ä¸é项ç䏿 ï¼ä» 0 å¼å§ï¼ï¼æ æ³å¹é
ä»»ä¸é项æ¶è¿å {@code -1} |
| | | */ |
| | | public static int matchOptionIndex(String questionText, String voiceText, List<String> options) { |
| | | if (StringUtils.isBlank(voiceText) || options == null || options.isEmpty()) { |
| | | return -1; |
| | | } |
| | | // åªæä¸ä¸ªéé¡¹æ¶æ éè°ç¨æ¨¡å |
| | | if (options.size() == 1) { |
| | | return 0; |
| | | } |
| | | |
| | | StringBuilder optionText = new StringBuilder(); |
| | | for (int i = 0; i < options.size(); i++) { |
| | | optionText.append(i + 1).append(". ").append(options.get(i)).append('\n'); |
| | | } |
| | | |
| | | String systemPrompt = "\"ä½ æ¯ä¸ä¸ªä¸ä¸çè¯é³è¯å«ææ¬è¯ä¹å¹é
婿ãä½ ç任塿¯å¤æç¨æ·çè¯é³ææ¬å¨è¯ä¹ä¸æç¬¦åçé项ãç¨æ·ä¼ç»åºä¸æ®µè¯é³è¯å«ææ¬åè¥å¹²ä¸ªå¸¦ç¼å·çé项ï¼" |
| | | + "è¯·å¤æè¿æ®µææ¬å¨è¯ä¹ä¸ææ¥è¿åªä¸ä¸ªé项ãåªå
许ä»ç»å®é项ä¸éæ©ï¼" |
| | | + "ä¸è¦åä»»ä½è§£éãç´æ¥è¾åºæå¹é
é项çç¼å·æ°åï¼è¥æ²¡æä»»ä½é项䏿æ¬ç¸å
³ï¼åè¾åº 0ã"; |
| | | String userPrompt = "è¯·æ ¹æ®ä»¥ä¸ä¿¡æ¯è¿è¡è¯ä¹å¹é
夿ï¼\n" + |
| | | "- é®é¢ææ¬ï¼" + questionText + "\n\n" |
| | | + "- è¯é³è¯å«ææ¬ï¼" + voiceText + "\n\n" |
| | | + "- é项ï¼\n" + optionText |
| | | + "\n请åªè¾åºä¸ä¸ªæ°åï¼æå¹é
é项çç¼å·ï¼æ²¡æå¹é
åè¾åº 0ï¼ã"; |
| | | |
| | | String content = chatCompletion(systemPrompt, userPrompt); |
| | | if (StringUtils.isBlank(content)) { |
| | | return -1; |
| | | } |
| | | |
| | | Integer number = extractFirstNumber(content); |
| | | if (number == null || number <= 0 || number > options.size()) { |
| | | log.warn("DeepSeek é项å¹é
æªå½ä¸ï¼voiceText={}, options={}, modelReturn={}", voiceText, options, content); |
| | | return -1; |
| | | } |
| | | return number - 1; |
| | | } |
| | | |
| | | /** |
| | | * 仿¨¡ååå¤ä¸æå第ä¸ä¸ªæ´æ°ã模åå¶å°ä¼åå¤ âé项2â â2ãâ ä¹ç±»ï¼å䏿¬¡å
åºè§£æã |
| | | */ |
| | | private static Integer extractFirstNumber(String text) { |
| | | List<Character> digits = new ArrayList<>(); |
| | | for (int i = 0; i < text.length(); i++) { |
| | | char c = text.charAt(i); |
| | | if (c >= '0' && c <= '9') { |
| | | digits.add(c); |
| | | } else if (!digits.isEmpty()) { |
| | | break; |
| | | } |
| | | } |
| | | if (digits.isEmpty()) { |
| | | return null; |
| | | } |
| | | StringBuilder sb = new StringBuilder(); |
| | | for (char c : digits) { |
| | | sb.append(c); |
| | | } |
| | | try { |
| | | return Integer.parseInt(sb.toString()); |
| | | } catch (NumberFormatException e) { |
| | | return null; |
| | | } |
| | | } |
| | | } |