如何使用讯飞星火 API

必备环境

引入依赖

xml
复制代码
<!--修改version为最新稳定版--> <dependency> <groupId>io.github.briqt</groupId> <artifactId>xunfei-spark4j</artifactId> <version>1.3.0</version> </dependency>

然后刷新 maven 就安装成功

配置

YML
复制代码
## 讯飞 AI 配置 xun-fei: client: appId: apiSecret: apiKey:

注意这个是和 spring 同级目录

image.png

读取配置文件:

JAVA
复制代码
package com.yupi.yubi.config; import io.github.briqt.spark4j.SparkClient; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author leikooo * @Description 星火 AI 配置类 */ @Configuration @ConfigurationProperties(prefix = "xun-fei.client") @Data public class XingHuoConfig { private String appId; private String apiSecret; private String apiKey; @Bean public SparkClient sparkClient() { SparkClient sparkClient = new SparkClient(); sparkClient.apiKey = apiKey; sparkClient.apiSecret = apiSecret; sparkClient.appid = appId; return sparkClient; } }

下面配置,写在 resource/META-INF/additional-spring-configuration-metadata.json

作用是不让星火配置文件变黄

JSON
复制代码
{ "properties": [ { "name": "xun-fei.client.appId", "type": "java.lang.String" }, { "name": "xun-fei.client.apiSecret", "type": "java.lang.String" }, { "name": "xun-fei.client.apiKey", "type": "java.lang.String" } ] }

调用

确认版本

注意自己 API 的版本,最近免费领的绝大部分都是 3.5 版本,好像是又换了名称但是问题不大,具体对应关系:

https://www.xfyun.cn/doc/spark/Web.html#_1-%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E 具体以官网为准

image-20240912173946804

这个 wss://spark-api.xf-yun.com/v3.5/chat 或者是 wss://spark-api.xf-yun.com/v4.0/chat 中间的 v3.5 、v4.0 这个就是 sendMsgToXingHuo 这个方法里面 apiVersion 的值,看看自己是 v3.5 还是 v4.0

java
复制代码
SparkRequest sparkRequest = SparkRequest.builder() // 消息列表 .messages(messages) // 模型回答的tokens的最大长度,非必传,取值为[1,4096],默认为2048 .maxTokens(2048) // 核采样阈值。用于决定结果随机性,取值越高随机性越强即相同的问题得到的不同答案的可能性越高 非必传,取值为[0,1],默认为0.5 .temperature(0.6) // 指定请求版本 // 具体版本看官方文档 https://www.xfyun.cn/doc/spark/Web.html#_1-%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E // todo 重点修改 .apiVersion(SparkApiVersion.V4_0) .build();

优化 Promote

生成的内容不符合自己的预期?试试我的 promote

text
复制代码
请严格按照下面的输出格式生成结果,且不得添加任何多余内容(例如无关文字、注释、代码块标记或反引号): '【【【【' { 生成 Echarts V5 的 option 配置对象 JSON 代码,要求为合法 JSON 格式且不含任何额外内容(如注释或多余字符) } '【【【【' 结论: { 提供对数据的详细分析结论,内容应尽可能准确、详细,不允许添加其他无关文字或注释 } 示例: 输入: 分析需求: 分析网站用户增长情况,请使用柱状图展示 原始数据: 日期,用户数 1号,10 2号,20 3号,30 期望输出: '【【【【' { "title": { "text": "分析网站用户增长情况" }, "xAxis": { "type": "category", "data": ["1号", "2号", "3号"] }, "yAxis": { "type": "value" }, "series": [ { "name": "用户数", "type": "bar", "data": [10, 20, 30] } ] } '【【【【' 结论: 从数据看,网站用户数由1号的10人增长到2号的20人,再到3号的30人,呈现出明显的上升趋势。这表明在这段时间内网站用户吸引力增强,可能与推广活动、内容更新或其他外部因素有关。

但是直接这样写程序可能会报错,问题就是分割符从 【【【【【 变成了 '【【【【'

鱼皮源码

主要修改 com.yupi.springbootinit.controller 里面的

1、Ctrl + F

image-20240912183237208

2、Ctrl + R

image.png

调用

java
复制代码
@Service @Slf4j public class AiManager { @Resource private SparkClient sparkClient; /** * 向 AI 发送请求 * * @param isNeedTemplate 是否使用模板,进行 AI 生成; true 使用 、false 不使用 ,false 的情况是只想用 AI 不只是生成前端代码 * @param content 内容 * 分析需求: * 分析网站用户的增长情况 * 原始数据: * 日期,用户数 * 1号,10 * 2号,20 * 3号,30 * @return AI 返回的内容 * '【【【【' * <p> * '【【【【' */ public String sendMsgToXingHuo(boolean isNeedTemplate, String content) { List<SparkMessage> messages = new ArrayList<>(); if (isNeedTemplate) { // AI 生成问题的预设条件 String predefinedInformation = "请严格按照下面的输出格式生成结果,且不得添加任何多余内容(例如无关文字、注释、代码块标记或反引号):\n" + "\n" + "'【【【【'" + "{ 生成 Echarts V5 的 option 配置对象 JSON 代码,要求为合法 JSON 格式且不含任何额外内容(如注释或多余字符) } '【【【【' 结论: {\n" + "提供对数据的详细分析结论,内容应尽可能准确、详细,不允许添加其他无关文字或注释 }\n" + "\n" + "示例: 输入: 分析需求: 分析网站用户增长情况,请使用柱状图展示 原始数据: 日期,用户数 1号,10 2号,20 3号,30\n" + "\n" + "期望输出: '【【【【' { \"title\": { \"text\": \"分析网站用户增长情况\" }, \"xAxis\": { \"type\": \"category\", \"data\": [\"1号\", \"2号\", \"3号\"] }, \"yAxis\": { \"type\": \"value\" }, \"series\": [ { \"name\": \"用户数\", \"type\": \"bar\", \"data\": [10, 20, 30] } ] } '【【【【' 结论: 从数据看,网站用户数由1号的10人增长到2号的20人,再到3号的30人,呈现出明显的上升趋势。这表明在这段时间内网站用户吸引力增强,可能与推广活动、内容更新或其他外部因素有关。"; messages.add(SparkMessage.systemContent(predefinedInformation + "\n" + "----------------------------------")); } messages.add(SparkMessage.userContent(content)); // 构造请求 SparkRequest sparkRequest = SparkRequest.builder() // 消息列表 .messages(messages) // 模型回答的tokens的最大长度,非必传,取值为[1,4096],默认为2048 .maxTokens(2048) // 核采样阈值。用于决定结果随机性,取值越高随机性越强即相同的问题得到的不同答案的可能性越高 非必传,取值为[0,1],默认为0.5 .temperature(0.6) // 指定请求版本 .apiVersion(SparkApiVersion.V4_0) .build(); // 同步调用 String responseContent = sparkClient.chatSync(sparkRequest).getContent().trim(); if (!isNeedTemplate) { return responseContent; } log.info("星火 AI 返回的结果 {}", responseContent); AtomicInteger atomicInteger = new AtomicInteger(1); while (responseContent.split("'【【【【'").length < 3) { responseContent = sparkClient.chatSync(sparkRequest).getContent().trim(); if (atomicInteger.incrementAndGet() >= 4) { throw new BusinessException(ErrorCode.SYSTEM_ERROR, "星火 AI 生成失败"); } } return responseContent; } }

如何使用?

直接替换 controller 里面的 doChat 方法变成 sendMsgToXingHuo ,其他的都不用动!把第一个参数改成 true 具体解释在上面有。

image.png

下面是我测试 AI 返回的数据,和我预想的非常一致!

image.png

测试代码

java
复制代码
/** * @author <a href="https://github.com/lieeew">leikooo</a> * @date 2024/9/12 * @description */ @SpringBootTest(classes = MainApplication.class) public class TestJava { @Resource private AIManager aiManager; // import org.junit.jupiter.api.Test; @Test public void test() { String c = "分析需求:\n" + "分析网站用户的增长情况 \n" + "请使用 柱状图 \n" + "原始数据:\n" + "日期,用户数\n" + "1号,10\n" + " 2号,20\n" + " 3号,30"; String s = aiManager.sendMsgToXingHuo(true, c); System.out.println("s = " + s); } }

相关专栏

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
leikooo
下载 APP