如何使用讯飞星火 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
作者分享
IP 数据库体积缩小 31%,关键竟然是合并重复子树
2
提到用 Rust 重写项目,很多人的第一反应往往是性能提升。以 Bun 为例,它最初主要采用 Zig 开发,后来在 2026 年发布的 v1.4 版本中将核心代码迁移到了 Rust。用 Rust 重写,性能、安全性往往是大家想要的,但是有没有想过用 Rust 重写还能发现 bug 呢? pgrust 这个项就是,他用 Rust 重新实现 PostgreSQL,保持通信协议和 SQL 方言兼容。为了确认新系统的行为和原版一致,开发者需要对着 PostgreSQL 的实际返回逐个比对。结果查着查着,有些异常不是新代码的锅,PostgreSQL 自己就是这样的。pgrust 开发者 Michael Malis 把其中几个报告给了 PostgreSQL 社区。 大概的问题: 1)SP-GiST 空间索引里有个函数判断点的方位,代码认为上、下、同一水平线三种情况已经穷尽了,末尾放了句「impossible case」兜底。结果在特定浮点边界附近,三种判断同时不成立,程序真走进了这个「不可能」的分支 2)日期格式缓存复用时,一个解析模式的标记没重置,导致同一条 JSONPath 查询在同一个会话里,换个执行顺序结果就不一样。 3)pgcrypto 的 crypt() 在某些输入下截断了多字节字符,返回的文本编码不合法。能存进去,但 pg_dump 导出时就炸了。 一个用 Rust 重写的新项目,测着测着,把运行了几十年的 PostgreSQL 里埋着的东西翻了出来。Rust 重写的价值,不一定只在跑得更快、更安全这一件事上。为了做到真正的兼容,开发者得把前人没怎么碰过的边界全走一遍,这个过程本身就在帮原版排雷。
4
ARTS 1025: 唯一字符与同构字符串、省词可能增加阅读负担与重新估算软件的实现成本
5
🎉 1024 程序员节快乐! 祝编程导航里的每一位程序员:offer 多多,薪资翻倍,面试顺利,早日拿下心仪 offer!💻
17
AST:从 Java 代码理解抽象语法树
5
下载 APP