智能BI项目-调用硅基流动的DeepSeek
今天开始快速突击一下智能BI项目,为了找工作还真的是一刻都不能休息呢😂。
硅基流动提供了API接口来给我们调用里面的模型,这个是参考文档,通过官方文档的介绍,可以看到调用的api是/chat/completions,是一个post请求:
其中请求参数中model和messages这两个参数是必须的,model参数很明显是填我们想要调用的模型,messages参数如图所示有role和content参数:
其中role表示消息的角色,通常有以下几种:system:系统角色,用于设置 AI 的行为或背景。user:用户角色,表示用户输入的内容。assistant:助手角色,表示 AI 的回复。content表示消息的具体内容。messages的例子:[{"role": "user","content": "xxx"}]。为了能让ds按照我们想要的格式返回结果,也需要给system角色提供prompt。接口的返回值像最上面那副图那样,我们要的结果在choices的message对象的content值中。
基于文档的例子写了个DeepseekAiManager来执行api的调用:
▼java复制代码@Service public class DeepseekAiManager { @Value("${siliconflow.apiKey}") private String apiKey; private final static String API_URL = "https://api.siliconflow.cn/v1/chat/completions"; public String doChat(String message) { JSONObject requestBody = new JSONObject(); requestBody.set("model", CommonConstant.DEEPSEEK_MODEL); JSONArray messages = new JSONArray(); String systemPrompt = "\"你是一个数据分析师和前端开发专家,接下来我会按照以下固定格式给你提供内容:\\n\" +\n" + " \"分析需求:\\n\" +\n" + " \"{数据分析的需求或者目标}\\n\" +\n" + " \"原始数据:\\n\" +\n" + " \"{csv格式的原始数据,用,作为分隔符}\\n\" +\n" + " \"请根据这两部分内容,按照以下指定格式生成内容(此外不要输出任何多余的开头、结尾、注释)\\n\" +\n" + " \"【【【【【\\n\" +\n" + " \"{前端 Echarts V5 的 option 配置对象的json代码,合理地将数据进行可视化,不要生成任何多余的内容,比如注释}\\n\" +\n" + " \"【【【【【\\n\" +\n" + " \"{明确的数据分析结论、越详细越好,不要生成多余的注释}\""; messages.add(new JSONObject().set("role", "system").set("content", systemPrompt)); messages.add(new JSONObject().set("role", "user").set("content", message)); requestBody.set("messages",messages); // requestBody.set("temperature", 0.7); // requestBody.set("top_p", 0.9); HttpResponse response = HttpRequest.post(API_URL) .header("Authorization", "Bearer " + apiKey) .header("Content-Type", "application/json") .body(requestBody.toString()) .execute(); if (response.getStatus() != 200){ throw new BusinessException(ErrorCode.SYSTEM_ERROR, response.getStatus()+ " AI 响应错误,"+response.body()); } JSONObject responseJson = JSONUtil.parseObj(response.body()); JSONArray choices = responseJson.getJSONArray("choices"); if (choices.isEmpty()) { throw new BusinessException(ErrorCode.OPERATION_ERROR,"API返回结果为空"); } // 提取生成的文本 return choices.getJSONObject(0) .getJSONObject("message") .getStr("content"); } }
CommonConstant.DEEPSEEK_MODEL是我定义在通用常量类里的一个常量,想要调用哪个模型直接修改常量的值即可。
但是目前有个问题,就是Deepseek的api还是不稳定,我在多次调用R1和V3模型时见了多次504、503,直到写这篇文章为止我都没能成功调用其api,一直显示5开头的状态码,后面我去用deepseek-ai/DeepSeek-R1-Distill-Llama-8B这个模型,试了好多次它也不能给我返回正确的结果,看到下图血压直接高了:
仿佛我的prompt跟没有一样,然后我想着吧,换成qwen的对中文的理解会更好一点,于是我换成了deepseek-ai/DeepSeek-R1-Distill-Qwen-7B,好了它格式终于对了,但是它返回的json代码在echarts中是错误的,控制台给我报了Cannot use 'in' operator to search for 'x'的错误,问了gpt发现qwen的给我返回的代码中它自创了一些x和y轴没有的属性导致不能应用在图表上,到这其实我有点崩溃了已经,报着最后一丝希望我重新回去调用一下V3模型deepseek-ai/DeepSeek-V3,终于它成功的返回正确的结果了,它终于能读懂我的prompt,终于能不自创属性了:
虽然成功了一次,但我觉得明天再重新试的时候可能又会不行了,感觉Deepseek的api现在还没能稳定下来(毕竟经常服务器繁忙),希望他们能加油让它稳定下来吧。
