上海网站建设推荐q479185700顶你,北京餐饮设计公司,vs网站界面是什么做的,二级域名做网站域名Spring Boot 集成国内AI#xff0c;包含文心一言、通义千问和讯飞星火平台实战教程 一、项目结构二、添加Maven依赖三、配置API密钥 (application.yml)四、配置类1. AI配置类 (AiProperties.java)2. 启用配置类 (AiConfig.java) 五、服务层实现1. 文心一言服务 (WenxinService… Spring Boot 集成国内AI包含文心一言、通义千问和讯飞星火平台实战教程 一、项目结构二、添加Maven依赖三、配置API密钥 (application.yml)四、配置类1. AI配置类 (AiProperties.java)2. 启用配置类 (AiConfig.java) 五、服务层实现1. 文心一言服务 (WenxinService.java)2. 通义千问服务 (QianwenService.java)3. 讯飞星火服务 (XinghuoService.java) 六、统一控制器 (AiController.java)七、安全增强配置1. 添加API密钥保护自定义Filter2. 添加Rate Limiting使用Resilience4j 八、应用入口 (AiIntegrationApplication.java)九、测试示例十、最佳实践建议 Spring Boot集成国内主流AI平台的详细实现方案包含文心一言、通义千问和讯飞星火的对接代码助力快速构建智能应用。 一、项目结构
ai-integration-demo/
├── src/main/java
│ ├── com/example/ai
│ │ ├── config # 配置类
│ │ ├── controller # API控制器
│ │ ├── service # 服务层
│ │ │ ├── impl # 服务实现
│ │ ├── dto # 数据传输对象
├── resources
│ ├── application.yml # 配置文件二、添加Maven依赖
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- HTTP客户端 --dependencygroupIdcom.squareup.okhttp3/groupIdartifactIdokhttp/artifactIdversion4.11.0/version/dependency!-- JSON处理 --dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactId/dependency!-- 配置处理 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactIdoptionaltrue/optional/dependency
/dependencies三、配置API密钥 (application.yml)
ai:wenxin:api-key: YOUR_WENXIN_API_KEYsecret-key: YOUR_WENXIN_SECRET_KEYapi-url: https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completionsqianwen:api-key: YOUR_QIANWEN_API_KEYapi-url: https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generationxinghuo:api-key: YOUR_XINGHUO_API_KEYsecret: YOUR_XINGHUO_SECRETappid: YOUR_XINGHUO_APPIDapi-url: https://spark-api.xf-yun.com/v3.5/chat四、配置类
1. AI配置类 (AiProperties.java)
ConfigurationProperties(prefix ai)
Data
public class AiProperties {private Wenxin wenxin;private Qianwen qianwen;private Xinghuo xinghuo;Datapublic static class Wenxin {private String apiKey;private String secretKey;private String apiUrl;}Datapublic static class Qianwen {private String apiKey;private String apiUrl;}Datapublic static class Xinghuo {private String apiKey;private String secret;private String appid;private String apiUrl;}
}2. 启用配置类 (AiConfig.java)
Configuration
EnableConfigurationProperties(AiProperties.class)
public class AiConfig {Beanpublic OkHttpClient okHttpClient() {return new OkHttpClient();}
}五、服务层实现
1. 文心一言服务 (WenxinService.java)
Service
RequiredArgsConstructor
public class WenxinService {private final AiProperties aiProperties;private final OkHttpClient okHttpClient;// 获取AccessTokenprivate String getAccessToken() {String url https://aip.baidubce.com/oauth/2.0/token? grant_typeclient_credentials client_id aiProperties.getWenxin().getApiKey() client_secret aiProperties.getWenxin().getSecretKey();Request request new Request.Builder().url(url).get().build();try (Response response okHttpClient.newCall(request).execute()) {String responseBody response.body().string();ObjectMapper objectMapper new ObjectMapper();JsonNode rootNode objectMapper.readTree(responseBody);return rootNode.get(access_token).asText();} catch (Exception e) {throw new RuntimeException(获取文心一言Token失败, e);}}public String chatCompletion(String prompt) {String accessToken getAccessToken();String url aiProperties.getWenxin().getApiUrl() ?access_token accessToken;JSONObject body new JSONObject();body.put(messages, new JSONArray().put(new JSONObject().put(role, user).put(content, prompt)));Request request new Request.Builder().url(url).post(RequestBody.create(body.toString(), MediaType.get(application/json))).build();try (Response response okHttpClient.newCall(request).execute()) {if (!response.isSuccessful()) {throw new RuntimeException(文心一言API请求失败: response);}String responseBody response.body().string();JSONObject jsonResponse new JSONObject(responseBody);return jsonResponse.getJSONObject(result).getString(content);} catch (Exception e) {throw new RuntimeException(调用文心一言API出错, e);}}
}2. 通义千问服务 (QianwenService.java)
Service
RequiredArgsConstructor
public class QianwenService {private final AiProperties aiProperties;private final OkHttpClient okHttpClient;public String generateText(String prompt) {JSONObject body new JSONObject();body.put(model, qwen-turbo);JSONObject input new JSONObject();input.put(prompt, prompt);body.put(input, input);JSONObject parameters new JSONObject();parameters.put(temperature, 0.85);parameters.put(top_p, 0.8);parameters.put(max_tokens, 1500);body.put(parameters, parameters);Request request new Request.Builder().url(aiProperties.getQianwen().getApiUrl()).header(Authorization, Bearer aiProperties.getQianwen().getApiKey()).post(RequestBody.create(body.toString(), MediaType.get(application/json))).build();try (Response response okHttpClient.newCall(request).execute()) {if (!response.isSuccessful()) {throw new RuntimeException(通义千问API请求失败: response);}String responseBody response.body().string();JSONObject jsonResponse new JSONObject(responseBody);return jsonResponse.getJSONObject(output).getString(text);} catch (Exception e) {throw new RuntimeException(调用通义千问API出错, e);}}
}3. 讯飞星火服务 (XinghuoService.java)
Service
RequiredArgsConstructor
public class XinghuoService {private final AiProperties aiProperties;private final OkHttpClient okHttpClient;public String chat(String prompt) {try {// 构造鉴权URLString authUrl generateAuthUrl();// 构造请求体JSONObject body new JSONObject();JSONObject header new JSONObject();header.put(app_id, aiProperties.getXinghuo().getAppid());JSONObject parameter new JSONObject();JSONObject chat new JSONObject();chat.put(domain, generalv3.5);chat.put(temperature, 0.5);chat.put(max_tokens, 4096);parameter.put(chat, chat);JSONObject payload new JSONObject();JSONObject message new JSONObject();JSONArray text new JSONArray();text.put(new JSONObject().put(role, user).put(content, prompt));message.put(text, text);payload.put(message, message);body.put(header, header);body.put(parameter, parameter);body.put(payload, payload);// 发送请求Request request new Request.Builder().url(authUrl).post(RequestBody.create(body.toString(), MediaType.get(application/json))).build();try (Response response okHttpClient.newCall(request).execute()) {if (!response.isSuccessful()) {throw new RuntimeException(讯飞星火API请求失败: response);}String responseBody response.body().string();JSONObject jsonResponse new JSONObject(responseBody);return extractContent(jsonResponse);}} catch (Exception e) {throw new RuntimeException(调用讯飞星火API出错, e);}}// 生成带鉴权信息的URLprivate String generateAuthUrl() throws ParseException, InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {String apiUrl aiProperties.getXinghuo().getApiUrl();String host new URL(apiUrl).getHost();String path new URL(apiUrl).getPath();// 创建日期对象SimpleDateFormat sdf new SimpleDateFormat(EEE, dd MMM yyyy HH:mm:ss z, Locale.US);sdf.setTimeZone(TimeZone.getTimeZone(GMT));String date sdf.format(new Date());// 构造签名String signatureOrigin host: host \n;signatureOrigin date: date \n;signatureOrigin POST path HTTP/1.1;Mac mac Mac.getInstance(hmacsha256);SecretKeySpec secretKeySpec new SecretKeySpec(aiProperties.getXinghuo().getSecret().getBytes(UTF-8), hmacsha256);mac.init(secretKeySpec);byte[] signatureSha mac.doFinal(signatureOrigin.getBytes(UTF-8));String signature Base64.getEncoder().encodeToString(signatureSha);// 构造授权头String authorization String.format(api_key\%s\, algorithm\%s\, headers\%s\, signature\%s\,aiProperties.getXinghuo().getApiKey(), hmac-sha256, host date request-line, signature);return apiUrl ?authorization Base64.getEncoder().encodeToString(authorization.getBytes(UTF-8)) date URLEncoder.encode(date, UTF-8) host URLEncoder.encode(host, UTF-8);}// 提取响应内容private String extractContent(JSONObject response) {JSONObject payload response.getJSONObject(payload);JSONObject message payload.getJSONObject(message);JSONArray text message.getJSONArray(text);StringBuilder result new StringBuilder();for (int i 0; i text.length(); i) {JSONObject textObj text.getJSONObject(i);if (textObj.has(content)) {result.append(textObj.getString(content));}}return result.toString();}
}六、统一控制器 (AiController.java)
RestController
RequestMapping(/api/ai)
RequiredArgsConstructor
public class AiController {private final WenxinService wenxinService;private final QianwenService qianwenService;private final XinghuoService xinghuoService;PostMapping(/wenxin)public ResponseEntityString wenxinChat(RequestBody Valid AiRequest request) {return ResponseEntity.ok(wenxinService.chatCompletion(request.getPrompt()));}PostMapping(/qianwen)public ResponseEntityString qianwenGenerate(RequestBody Valid AiRequest request) {return ResponseEntity.ok(qianwenService.generateText(request.getPrompt()));}PostMapping(/xinghuo)public ResponseEntityString xinghuoChat(RequestBody Valid AiRequest request) {return ResponseEntity.ok(xinghuoService.chat(request.getPrompt()));}Datastatic class AiRequest {NotBlank(message 提示语不能为空)private String prompt;}
}七、安全增强配置
1. 添加API密钥保护自定义Filter
Component
RequiredArgsConstructor
public class ApiKeyFilter extends OncePerRequestFilter {private final AiProperties aiProperties;Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {String clientId request.getHeader(X-API-CLIENT-ID);String clientSecret request.getHeader(X-API-CLIENT-SECRET);// 验证客户端凭证if (!isValidCredentials(clientId, clientSecret)) {response.sendError(HttpStatus.UNAUTHORIZED.value(), 无效的API凭证);return;}filterChain.doFilter(request, response);}private boolean isValidCredentials(String clientId, String clientSecret) {// 这里应该是从数据库或配置中读取验证信息// 简化示例使用配置中的文心API密钥做演示return clientId ! null clientSecret ! null clientId.equals(demo-app) clientSecret.equals(aiProperties.getWenxin().getApiKey());}
}2. 添加Rate Limiting使用Resilience4j
Configuration
public class RateLimiterConfig {Beanpublic RateLimiter wenxinRateLimiter() {return RateLimiter.of(wenxin-limiter, RateLimiterConfig.custom().limitRefreshPeriod(Duration.ofSeconds(10)).limitForPeriod(5).timeoutDuration(Duration.ofSeconds(5)).build());}
}// 在控制器中使用
RestController
RequestMapping(/api/ai)
public class AiController {private final RateLimiter wenxinRateLimiter;PostMapping(/wenxin)RateLimiter(name wenxin-limiter)public ResponseEntityString wenxinChat(RequestBody AiRequest request) {// ...}
}八、应用入口 (AiIntegrationApplication.java)
SpringBootApplication
public class AiIntegrationApplication {public static void main(String[] args) {SpringApplication.run(AiIntegrationApplication.class, args);}
}九、测试示例
使用cURL测试
# 通义千问测试
curl -X POST http://localhost:8080/api/ai/qianwen \-H Content-Type: application/json \-d {prompt: 用100字介绍Spring Boot}# 文心一言测试
curl -X POST http://localhost:8080/api/ai/wenxin \-H Content-Type: application/json \-d {prompt: 用Java写一个快速排序算法}# 讯飞星火测试
curl -X POST http://localhost:8080/api/ai/xinghuo \-H Content-Type: application/json \-d {prompt: 如何做好电商运营}十、最佳实践建议
异步处理使用Async注解异步调用AI接口避免阻塞缓存结果对常见问题的结果进行缓存减少API调用错误重试实现指数退避重试机制处理临时错误流量控制针对不同AI平台设置不同的QPS限制统一接口创建统一的AI门面服务提供平台无关的调用
Service
public class AiFacadeService {private enum AiProvider { WENXIN, QIANWEN, XINGHUO }private final WenxinService wenxinService;private final QianwenService qianwenService;private final XinghuoService xinghuoService;public String unifiedChat(String prompt) {// 简单轮询策略AiProvider[] providers AiProvider.values();AiProvider provider providers[(int)(System.currentTimeMillis() % providers.length)];switch (provider) {case WENXIN: return wenxinService.chatCompletion(prompt);case QIANWEN: return qianwenService.generateText(prompt);case XINGHUO: return xinghuoService.chat(prompt);default: throw new IllegalStateException(未知的AI提供商);}}
}本项目提供了完整的企业级Spring Boot集成国内主流AI平台的实现方案可根据实际需求进行扩展和优化。