如何使用讯飞星火 API
必备环境
- 讯飞星火账号 https://xinghuo.xfyun.cn/sparkapi
- SDK 依赖 https://github.com/briqt/xunfei-spark4j
- 修改后的源码 https://github.com/lieeew/yubi-backend-fix
引入依赖
▼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 同级目录
读取配置文件:
▼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 具体以官网为准
这个 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
2、Ctrl + R
调用
▼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 具体解释在上面有。
下面是我测试 AI 返回的数据,和我预想的非常一致!
测试代码
▼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个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
AI 热点监控平台项目 VibeCoding 项目
4
耄耋专属AI Loop全自动编码器技术笔记
5
开源我的 Vibe Coding 工作流,已有人靠它把项目做完了
14
🚀 项目完结,AI 闯关学习小程序项目(Python AI 全栈)基于 GitHub Copilot + Claude Code 开发,实战 Taro 小程序框架、Python FastAPI 后端、AI 应用开发、Tavily 联网搜索 Agent、Chroma 向量库 RAG 知识库、AI 生图 + 对象存储。并用 OpenSpec + MCP + Agent Skills 驾驭 AI,最终
6
🎙️面试官说的每一句话,我都想留下来:于是我用 Vibe Coding 做了一个免费的 macOS 面试录音工具
33
作者分享
ARTS 0913: 双栈互补实现队列、CIDR 聚合化解路由膨胀与 AI 作弊串通绝非偶然 Bug
8
微信爆出 P0 级漏洞😱,接到来电就中招,碰都不用碰手机。
怎么中招的? 黑客只需要是你的微信好友,然后给你打一个语音或视频通话,好了已经搞定了,你已经被黑了。
有多离谱? 完全不需要接这个电话。手机锁着屏扔在桌上,你看都没看一眼,只要响了几秒钟,恶意代码就已经在后台跑起来了。
黑客瞬间拿下你整个微信:翻你聊天记录、看你隐私、用你的身份给别人发消息。
更恐怖的是,你的微信紧接着会变成"丧尸",黑客可以自动给通讯录里所有好友挨个打电话,把他们也感染一遍。每个受害者又立刻变成新的传播者,像病毒一样指数级扩散...,不敢想象如果被利用了,理想情况下那需要多久就能扩散到全国的用户呢?30 分钟左右
好消息是这个 bug 微信团队已经知道了这个 bug ,坏消息这个 bug 好像不是微信团队发现的
文章来源:https://calif.io/research/weworm
7
ARTS 0906: 辅助栈记录每层最小值、OSI 模型从未真正落地
6
Git 修改历史 Commit
5
Rails 之父 DHH:我三个月没手写过一行新代码
5

