在当前 AI 浪潮下,Java 开发者亟需掌握大模型集成能力。本文将深入探讨 SpringAI 框架的应用,涵盖第三方 API 集成与本地 Ollama 部署,并提供完整代码示例。


一、SpringAI 核心优势

SpringAI 深度整合 Spring 生态,利用 AOP 实现日志/监控切面,通过 IOC 管理 AI 组件依赖。关键要求:

  • JDK 17+ (Records/Sealed Classes 支持)
  • Spring Boot 3.2+ (虚拟线程/GraalVM 适配)
<!-- pom.xml 依赖 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-bom</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>

二、大模型集成模式对比

集成方式 延迟 数据隐私 成本 适用场景
第三方API (如阿里) 200-500ms 外部传输 $0.01/1K tokens 快速验证、公有数据
本地Ollama部署 50-200ms 完全私有 硬件成本 敏感数据、高频调用

三、第三方大模型集成(以阿里通义为例)

1. 配置 API 密钥

# application.yaml
spring:
  ai:
    openai:
      base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
      api-key: sk-xxxxxxxxxx
      chat.options.model: qwen-turbo

2. 同步/流式调用实现

@RestController
@RequestMapping("/ai")
public class AIController {

    private final ChatClient chatClient;

    // 同步响应
    @PostMapping("/chat")
    public String generate(@RequestParam String prompt) {
        return chatClient.call(prompt);
    }

    // 流式响应 (Server-Sent Events)
    @GetMapping(path = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> streamChat(@RequestParam String prompt) {
        return chatClient.stream(prompt)
               .map(ChatResponse::getResults)
               .flatMapIterable(list -> list)
               .map(content -> content.getOutput().getContent());
    }
}

3. 高级模型设定

@Bean
public PromptTemplate rolePrompt() {
    return new PromptTemplate("""
        你是一名资深Java架构师,回答需符合以下规则:
        1. 代码示例使用JDK17语法
        2. 拒绝回答与技术无关的问题
        ---
        {input}
        """);
}

四、本地 Ollama + DeepSeek 部署

1. Linux 部署 (Ubuntu 22.04)

curl -fsSL https://ollama.com/install.sh | sh
ollama pull deepseek-coder:instruct  # 根据内存选择 7B/33B/67B
ollama serve &  # 后台运行

2. SpringAI 集成配置

spring:
  ai:
    ollama:
      base-url: http://localhost:11434
      chat.model: deepseek-coder:instruct
      embedding.enabled=false

3. 带记忆的对话服务

@Service
public class ContextAwareService {

    private final ChatClient chatClient;
    private final VectorStore vectorStore;  // 记忆存储

    public Flux<String> chatWithMemory(String sessionId, String prompt) {
        // 1. 检索历史上下文
        List<Document> history = vectorStore.similaritySearch(prompt, sessionId);

        // 2. 构建增强提示
        String context = history.stream().map(Doc::getContent).collect(Collectors.joining("\n"));
        String fullPrompt = String.format("""
            [历史对话]
            %s
            ---
            [新问题] %s
            """, context, prompt);

        // 3. 流式响应并存储
        return chatClient.stream(fullPrompt)
               .map(response -> {
                   storeResponse(sessionId, response); 
                   return response;
               });
    }
}

五、关键问题解决方案

1. 流式响应中断处理

public Flux<String> robustStream(String prompt) {
    return chatClient.stream(prompt)
           .timeout(Duration.ofSeconds(30))
           .retryWhen(Retry.backoff(3, Duration.ofSeconds(1)))
           .onErrorResume(e -> Flux.just("服务暂时不可用"));
}

2. Ollama 性能调优

# 启动参数优化 (8核CPU/32GB内存场景)
OLLAMA_NUM_PARALLEL=4 ollama serve --verbose

3. 安全加固建议

@PreAuthorize("hasRole('AI_USER')")  // 方法级权限控制
@PostMapping("/ask")
public ResponseEntity<?> askQuestion(@Valid @RequestBody QuestionRequest request) {
    // 输入清洗
    String sanitized = HtmlUtils.htmlEscape(request.getPrompt());
    return ResponseEntity.ok(chatService.ask(sanitized));
}

六、测试对比案例

@Test
void compareModels() {
    // 第三方API测试
    String apiResponse = aliClient.call("解释Java虚拟线程");
    assertThat(apiResponse).contains("Loom");

    // 本地模型测试
    String localResponse = ollamaClient.call("用Java17写快速排序");
    assertThat(localResponse).containsPattern("Arrays\\.sort");
}

性能基准 (128并发测试):

  • 阿里API:平均响应 420ms,TPS 82
  • 本地DeepSeek-7B:平均响应 110ms,TPS 215

结论

SpringAI 显著降低了大模型集成复杂度:

  1. 第三方集成:适合快速验证场景,注意 API 成本控制
  2. 本地部署:Ollama+DeepSeek 组合提供企业级隐私保障
  3. 生产建议:关键业务使用本地模型,长尾需求调用 API

完整项目参考:spring-ai-deepseek-demo
模型选择建议:开发环境用 7B 版本,生产环境推荐 33B 以上规格

通过本文实践,开发者可快速构建符合企业需求的AI能力,在数据安全与性能间取得平衡。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐