时思美 发表于 2025-10-24 10:35:01

【原】无脑操作:IDEA + maven + SpringAI + 讯飞星火大模型实现简单智能对话

1、实现效果

 
2、设置pom.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4   <modelVersion>4.0.0</modelVersion>
5   <parent>
6         <groupId>org.springframework.boot</groupId>
7         spring-boot-starter-parent</artifactId>
8         <version>3.4.4</version>
9         <relativePath/>
10   </parent>
11   <groupId>cn.temptation</groupId>
12   studyAI</artifactId>
13   <version>0.0.1-SNAPSHOT</version>
14   <name>studyAI</name>
15   <description>studyAI</description>
16   <url/>
17
18   <properties>
19         <java.version>17</java.version>
20         <spring-ai.version>1.0.3</spring-ai.version>
21   </properties>
22
23   <dependencyManagement>
24         <dependencies>
25             <dependency>
26               <groupId>org.springframework.ai</groupId>
27               spring-ai-bom</artifactId>
28               <version>1.0.3</version>
29               <type>pom</type>
30               <scope>import</scope>
31             </dependency>
32         </dependencies>
33   </dependencyManagement>
34
35   <dependencies>
36         
37         <dependency>
38             <groupId>org.projectlombok</groupId>
39             lombok</artifactId>
40             <version>1.18.22</version>
41         </dependency>
42         
43         <dependency>
44             <groupId>org.springframework.boot</groupId>
45             spring-boot-starter-web</artifactId>
46         </dependency>
47         
48         <dependency>
49             <groupId>org.springframework.boot</groupId>
50             spring-boot-starter-thymeleaf</artifactId>
51         </dependency>
52         
53         <dependency>
54             <groupId>io.github.briqt</groupId>
55             xunfei-spark4j</artifactId>
56             <version>1.3.0</version>
57         </dependency>
58         
59         <dependency>
60             <groupId>org.springframework.boot</groupId>
61             spring-boot-devtools</artifactId>
62             <optional>true</optional>
63         </dependency>
64   </dependencies>
65
66   <build>
67         <plugins>
68             <plugin>
69               <groupId>org.springframework.boot</groupId>
70               spring-boot-maven-plugin</artifactId>
71             </plugin>
72         </plugins>
73   </build>
74
75 </project> 
3、设置application.yaml


1 spring:
2   application:
3   name: iflytek-ai
4   thymeleaf:
5   cache: false
6
7 xunfei:
8   client:
9   appId: 从讯飞开放平台上找到自己的应用的APPID
10   apiSecret: 从讯飞开放平台上找到自己的应用的APISecret
11   apiKey: 从讯飞开放平台上找到自己的应用的APIKey
12
13 server:
14   port: 80 
4、整个程序结构如下图所示:

 
5、编写SparkConfig.java配置类
1 package cn.temptation.config;
2
3 import io.github.briqt.spark4j.SparkClient;
4 import lombok.Data;
5 import org.springframework.boot.context.properties.ConfigurationProperties;
6 import org.springframework.context.annotation.Bean;
7 import org.springframework.context.annotation.Configuration;
8
9 @Configuration
10 @ConfigurationProperties(prefix = "xunfei.client")
11 @Data
12 public class SparkConfig {
13   private String appid;
14   private String apiSecret;
15   private String apiKey;
16
17   @Bean
18   public SparkClient sparkClient() {
19         SparkClient sparkClient = new SparkClient();
20         sparkClient.appid = this.appid;
21         sparkClient.apiSecret = this.apiSecret;
22         sparkClient.apiKey = this.apiKey;
23
24         return sparkClient;
25   }
26 } 
6、使用xunfei-spark4j时,想使用免费的Spark Lite时,有一个坑,因为SparkApiVersion枚举的结构如下:
1 public enum SparkApiVersion {
2   V1_5("v1.1", "https://spark-api.xf-yun.com/v1.1/chat", "general"),
3   V2_0("v2.1", "https://spark-api.xf-yun.com/v2.1/chat", "generalv2"),
4   V3_0("v3.1", "https://spark-api.xf-yun.com/v3.1/chat", "generalv3"),
5   V3_5("v3.5", "https://spark-api.xf-yun.com/v3.5/chat", "generalv3.5"),
6   V4_0("v4.0", "https://spark-api.xf-yun.com/v4.0/chat", "4.0Ultra");
7
8   private final String version;
9   private final String url;
10   private final String domain;
11
12   private SparkApiVersion(String version, String url, String domain) {
13         this.version = version;
14         this.url = url;
15         this.domain = domain;
16   }
17
18   public String getVersion() {
19         return this.version;
20   }
21
22   public String getUrl() {
23         return this.url;
24   }
25
26   public String getDomain() {
27         return this.domain;
28   }
29 }这里找不到免费的Spark Lite,所以需要自己修改。编写EnumReflectionUtil.java反射工具类。
1 public class EnumReflectionUtil {
2   public static void setEnumField(Enum<?> enumConstant, String fieldName, Object newValue) throws Exception {
3         Field field = enumConstant.getClass().getDeclaredField(fieldName);
4         field.setAccessible(true);
5         field.set(enumConstant, newValue);
6   }
7 } 
7、编写聊天处理类ChatWithController.java
1 @Controller
2 public class ChatWithController {
3   // 初始化客户端
4   @Resource
5   private SparkClient sparkClient;
6
7   // 通过反射类,在使用大模型时,指定使用免费的Spark Lite大模型
8   @PostConstruct
9   public void init() throws Exception {
10         // 修改 V1_5 的版本信息
11         EnumReflectionUtil.setEnumField(SparkApiVersion.V1_5, "version", "v1.1");
12         EnumReflectionUtil.setEnumField(SparkApiVersion.V1_5, "url", "https://spark-api.xf-yun.com/v1.1/chat");
13         EnumReflectionUtil.setEnumField(SparkApiVersion.V1_5, "domain", "lite");
14   }
15
16   // AI预设System角色的条件
17   public static final String PRECONDITION = "你是 iflytek";
18
19   // 跳转前端页面
20   @RequestMapping("/")
21   public String index() {
22         return "index";
23   }
24
25   // 和讯飞星火大模型Spark Lite对话
26   @RequestMapping(value = "/chat", produces = "application/json")
27   public ResponseEntity<?> sendHttpToSpark(@RequestBody Map<String, String> map) {
28         // 消息列表
29         List<SparkMessage> messages = new ArrayList<>();
30         // 设置System角色,则使用下句
31 //      messages.add(SparkMessage.systemContent(PRECONDITION));
32         // 获取前端输入的对话内容,设置User角色
33         messages.add(SparkMessage.userContent(map.get("message")));
34
35         // 构造请求
36         SparkRequest sparkRequest = SparkRequest.builder()
37               .messages(messages)
38               .apiVersion(SparkApiVersion.V1_5)
39               .build();
40
41         SparkSyncChatResponse chatResponse = sparkClient.chatSync(sparkRequest);
42
43         String responseContent = chatResponse.getContent();
44
45         Map<String, Object> response = new HashMap<>();
46         response.put("response", responseContent);
47
48         return ResponseEntity.ok(response);
49   }
50 } 
8、编写前端交互页面index.html
1 <!DOCTYPE html>
2 <html lang="zh-CN">
3 <head>
4   <meta charset="UTF-8">
5   <meta name="viewport" content="width=device-width, initial-scale=1.0">
6   <title>AI 智能助手</title>
7   <link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
8   
145 </head>
146 <body>
147
148   <h1 style="margin-bottom: 20px; color: #1e293b;">AI 智能助手 <i class="fas fa-robot"></i></h1>
149
150   
151         
152            
153               <i class="fas fa-robot"></i>
154               您好!我是智能助手,可以回答各种问题...
155            
156         
157
158         
159             <input type="text" id="user-input" placeholder="输入消息...">
160             <button onclick="sendMessage()" id="send-btn">
161               <i class="fas fa-paper-plane"></i> 发送
162             </button>
163         
164   
165
166
167
233 </body>
234 </html> 
本文编写过程中参考了网络上一些大佬的经验,在此一并感谢。
 抛砖引玉,期待更多人研究讯飞星火大模型...

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

馏栩梓 发表于 2025-10-26 00:45:55

感谢发布原创作品,程序园因你更精彩

万妙音 发表于 前天 17:02

感谢分享
页: [1]
查看完整版本: 【原】无脑操作:IDEA + maven + SpringAI + 讯飞星火大模型实现简单智能对话