Files
backend/大模型接口更换指导.md
2025-07-28 13:34:47 +08:00

380 lines
9.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 大模型接口更换指导文档
## 概述
当前系统使用Spring AI框架集成OpenAI API本文档详细说明如何更换为其他大模型提供商或自部署模型。
## 当前架构分析
### 现有集成方式
系统在 `ChatService.java:39` 中注入 `ChatClient`通过Spring AI的统一接口调用大模型:
```java
// 当前实现方式
private final ChatClient chatClient;
@Autowired
public ChatService(ChatClient.Builder builder,
ConversationMapper conversationMapper,
MessageMapper messageMapper) {
this.chatClient = builder.build();
// ...
}
```
### 关键调用点
1. **流式调用** (`ChatService.java:71-75`):
```java
Flux<String> flux = chatClient
.prompt()
.user(request.getMessage())
.stream()
.content();
```
2. **普通调用** (`ChatService.java:234-238`):
```java
private String generateAIResponse(ChatRequest request) {
// 目前是模拟实现,需要改为真实调用
return "这是AI的回复内容模拟生成。";
}
```
## 更换方案
### 方案一: 使用Spring AI支持的其他模型
Spring AI支持多种模型提供商只需修改配置和依赖即可。
#### 1.1 更换为Azure OpenAI
**步骤1**: 修改 `pom.xml` 依赖
```xml
<!-- 移除现有OpenAI依赖 -->
<!-- <dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>1.0.0-M6</version>
</dependency> -->
<!-- 添加Azure OpenAI依赖 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId>
<version>1.0.0-M6</version>
</dependency>
```
**步骤2**: 修改 `application.yml` 配置
```yaml
spring:
ai:
azure:
openai:
api-key: ${AZURE_OPENAI_API_KEY}
endpoint: ${AZURE_OPENAI_ENDPOINT}
chat:
options:
deployment-name: gpt-4o-mini
temperature: 0.7
```
**步骤3**: 无需修改Java代码Spring AI会自动适配
#### 1.2 更换为Anthropic Claude
**步骤1**: 修改依赖
```xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-anthropic-spring-boot-starter</artifactId>
<version>1.0.0-M6</version>
</dependency>
```
**步骤2**: 修改配置
```yaml
spring:
ai:
anthropic:
api-key: ${ANTHROPIC_API_KEY}
chat:
options:
model: claude-3-sonnet-20240229
max-tokens: 1000
```
#### 1.3 更换为本地Ollama
**步骤1**: 修改依赖
```xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
<version>1.0.0-M6</version>
</dependency>
```
**步骤2**: 修改配置
```yaml
spring:
ai:
ollama:
base-url: http://localhost:11434
chat:
options:
model: llama2
temperature: 0.7
```
### 方案二: 集成阿里云通义千问
由于Spring AI暂不直接支持通义千问需要自定义实现。
**步骤1**: 添加HTTP客户端依赖
```xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>alibabacloud-dashscope-sdk-java</artifactId>
<version>2.14.0</version>
</dependency>
```
**步骤2**: 创建通义千问服务类
```java
// 新建文件: src/main/java/com/yundage/chat/service/QianWenService.java
@Service
public class QianWenService {
@Value("${dashscope.api-key}")
private String apiKey;
public String generateResponse(String prompt) {
// 实现通义千问API调用逻辑
Generation gen = new Generation();
gen.setApiKey(apiKey);
GenerationParam param = GenerationParam.builder()
.model("qwen-turbo")
.prompt(prompt)
.build();
GenerationResult result = gen.call(param);
return result.getOutput().getText();
}
public Flux<String> generateStreamResponse(String prompt) {
// 实现流式响应
return Flux.create(sink -> {
// 流式调用逻辑
});
}
}
```
**步骤3**: 修改 `ChatService.java`
```java
@Service
public class ChatService {
// 添加注入
@Autowired
private QianWenService qianWenService;
// 修改普通调用方法
private String generateAIResponse(ChatRequest request) {
return qianWenService.generateResponse(request.getMessage());
}
// 修改流式调用方法
public SseEmitter processChatStream(ChatRequest request, User user) {
// ...
Flux<String> flux = qianWenService.generateStreamResponse(request.getMessage());
// ...
}
}
```
**步骤4**: 添加配置
```yaml
dashscope:
api-key: ${DASHSCOPE_API_KEY}
```
### 方案三: 集成百度文心一言
**步骤1**: 添加百度AI SDK
```xml
<dependency>
<groupId>com.baidubce</groupId>
<artifactId>qianfan</artifactId>
<version>0.2.5</version>
</dependency>
```
**步骤2**: 创建文心一言服务
```java
// 新建文件: src/main/java/com/yundage/chat/service/ErnieService.java
@Service
public class ErnieService {
@Value("${baidu.api-key}")
private String apiKey;
@Value("${baidu.secret-key}")
private String secretKey;
public String generateResponse(String prompt) {
ChatCompletion chatCompletion = new ChatCompletion();
chatCompletion.setAccessKey(apiKey);
chatCompletion.setSecretKey(secretKey);
List<ChatCompletionMessage> messages = new ArrayList<>();
messages.add(ChatCompletionMessage.builder()
.role("user")
.content(prompt)
.build());
ChatCompletionRequest request = ChatCompletionRequest.builder()
.model("ERNIE-Bot-turbo")
.messages(messages)
.build();
ChatCompletionResponse response = chatCompletion.create(request);
return response.getResult();
}
}
```
### 方案四: 完全自定义HTTP客户端
适用于任何提供HTTP API的大模型服务。
**步骤1**: 创建通用AI客户端接口
```java
// 新建文件: src/main/java/com/yundage/chat/service/ai/AIService.java
public interface AIService {
String generateResponse(String prompt);
Flux<String> generateStreamResponse(String prompt);
}
```
**步骤2**: 实现具体的AI服务
```java
// 新建文件: src/main/java/com/yundage/chat/service/ai/CustomAIService.java
@Service
public class CustomAIService implements AIService {
@Autowired
private RestTemplate restTemplate;
@Value("${custom.ai.api-url}")
private String apiUrl;
@Value("${custom.ai.api-key}")
private String apiKey;
@Override
public String generateResponse(String prompt) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setBearerAuth(apiKey);
Map<String, Object> requestBody = Map.of(
"model", "custom-model",
"messages", List.of(Map.of("role", "user", "content", prompt))
);
HttpEntity<Map<String, Object>> request = new HttpEntity<>(requestBody, headers);
ResponseEntity<Map> response = restTemplate.postForEntity(apiUrl, request, Map.class);
// 解析响应并返回内容
return extractContentFromResponse(response.getBody());
}
@Override
public Flux<String> generateStreamResponse(String prompt) {
// 实现Server-Sent Events或WebSocket流式调用
return Flux.create(sink -> {
// 流式调用实现
});
}
private String extractContentFromResponse(Map<String, Object> response) {
// 根据API响应格式解析内容
return "";
}
}
```
## 更换建议和注意事项
### 1. 性能考虑
- **延迟**: 不同模型服务的响应延迟差异较大
- **并发**: 评估新服务的并发处理能力
- **限流**: 实现客户端限流避免触发API限制
### 2. 成本优化
- **Token计费**: 不同服务的计费方式差异较大
- **缓存策略**: 对相同问题实现响应缓存
- **模型选择**: 根据业务场景选择合适规模的模型
### 3. 质量保证
- **A/B测试**: 同时运行新旧模型对比效果
- **回退机制**: 新模型出现问题时能快速回退
- **监控告警**: 监控响应质量和错误率
### 4. 配置管理
建议将所有AI相关配置外化到环境变量:
```yaml
# application.yml
ai:
provider: ${AI_PROVIDER:openai}
openai:
api-key: ${OPENAI_API_KEY}
base-url: ${OPENAI_BASE_URL:https://api.openai.com}
azure:
api-key: ${AZURE_API_KEY}
endpoint: ${AZURE_ENDPOINT}
custom:
api-url: ${CUSTOM_AI_URL}
api-key: ${CUSTOM_AI_KEY}
```
### 5. 数据安全
- **数据加密**: 确保API调用使用HTTPS
- **敏感信息**: 避免在日志中记录用户输入内容
- **访问控制**: 限制AI服务的网络访问权限
## 测试验证
更换模型后需要进行充分测试:
1. **功能测试**: 验证基本问答功能正常
2. **流式测试**: 确认流式输出工作正常
3. **错误处理**: 测试各种异常情况的处理
4. **性能测试**: 验证响应时间和并发能力
5. **集成测试**: 端到端功能验证
## 总结
根据具体需求选择合适的更换方案:
- **简单迁移**: 选择方案一使用Spring AI支持的其他模型
- **成本优化**: 选择方案二或三,使用国内模型服务
- **深度定制**: 选择方案四,完全自定义实现
建议采用渐进式迁移,先在测试环境验证,确认无误后再部署到生产环境。
---
*更新时间: 2025-07-28*