晴天技术
AI5 min read

Spring AI 入门:用 Spring Boot 构建 AI 应用

Spring AI 入门:用 Spring Boot 构建 AI 应用

Spring AISpring BootJavaAI开发

Spring AI 是 Spring 官方的 AI 框架,让 Java 开发者用熟悉的方式构建 AI 应用。

什么是 Spring AI?

Spring AI 是 Spring 生态的 AI 扩展:

  • 统一的 API 抽象
  • 支持多种 AI 模型(OpenAI、Claude、Ollama 等)
  • 集成 Spring 生态
  • 支持 RAG、Function Calling 等

快速开始

1. 添加依赖

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>

2. 配置

spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}
      chat:
        options:
          model: gpt-4o
          temperature: 0.7

3. 基本使用

@RestController
public class ChatController {

    private final ChatClient chatClient;

    public ChatController(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }

    @GetMapping("/chat")
    public String chat(@RequestParam String message) {
        return chatClient.prompt()
            .user(message)
            .call()
            .content();
    }
}

ChatClient 详解

简单对话

String response = chatClient.prompt()
    .user("什么是微服务?")
    .call()
    .content();

带系统提示

String response = chatClient.prompt()
    .system("你是一个 Java 专家,用简洁的语言回答")
    .user("解释 Spring IoC 容器")
    .call()
    .content();

流式输出

Flux<String> stream = chatClient.prompt()
    .user("写一篇关于 Spring Boot 的文章")
    .stream()
    .content();

带参数

String response = chatClient.prompt()
    .user(u -> u.text("翻译以下内容到{language}: {text}")
        .param("language", "英文")
        .param("text", "你好世界"))
    .call()
    .content();

多模型支持

OpenAI

spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}

Anthropic (Claude)

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-anthropic-spring-boot-starter</artifactId>
</dependency>
spring:
  ai:
    anthropic:
      api-key: ${ANTHROPIC_API_KEY}
      chat:
        options:
          model: claude-sonnet-4-20250514

Ollama (本地模型)

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>
spring:
  ai:
    ollama:
      base-url: http://localhost:11434
      chat:
        options:
          model: llama3

Function Calling

让 AI 调用你的 Java 方法:

@Bean
@Description("获取指定城市的当前天气")
public Function<WeatherRequest, WeatherResponse> getWeather() {
    return request -> {
        // 调用天气 API
        return new WeatherResponse(request.city(), "晴天", 25);
    };
}

// 使用
String response = chatClient.prompt()
    .user("北京今天天气怎么样?")
    .functions("getWeather")
    .call()
    .content();

AI 会自动判断需要调用函数,获取结果后回答。

RAG 实现

1. 文档加载

@Bean
public VectorStore vectorStore(EmbeddingModel embeddingModel) {
    return new SimpleVectorStore(embeddingModel);
}

// 加载文档
@Bean
CommandLineRunner loadDocuments(VectorStore vectorStore) {
    return args -> {
        var documents = new TextReader("docs.txt").get();
        vectorStore.add(documents);
    };
}

2. RAG 查询

@GetMapping("/ask")
public String ask(@RequestParam String question) {
    return chatClient.prompt()
        .user(question)
        .advisors(new QuestionAnswerAdvisor(vectorStore))
        .call()
        .content();
}

实战示例

智能客服

@Service
public class CustomerService {

    private final ChatClient chatClient;
    private final OrderRepository orderRepository;

    public String handleQuestion(String userId, String question) {
        // 获取用户订单信息
        List<Order> orders = orderRepository.findByUserId(userId);

        return chatClient.prompt()
            .system("你是客服助手,基于用户订单信息回答问题")
            .user(u -> u.text("用户问题:{question}\n订单信息:{orders}")
                .param("question", question)
                .param("orders", orders.toString()))
            .call()
            .content();
    }
}

代码审查服务

@Service
public class CodeReviewService {

    private final ChatClient chatClient;

    public String reviewCode(String code) {
        return chatClient.prompt()
            .system("你是代码审查专家,审查 Java 代码并给出改进建议")
            .user(u -> u.text("审查以下代码:\n```java\n{code}\n```")
                .param("code", code))
            .call()
            .content();
    }
}

SQL 生成器

@Service
public class SqlGeneratorService {

    private final ChatClient chatClient;

    public String generateSql(String requirement, String tableSchema) {
        return chatClient.prompt()
            .system("你是 SQL 专家,根据需求生成 SQL 查询")
            .user(u -> u.text("表结构:{schema}\n需求:{requirement}\n生成 SQL:")
                .param("schema", tableSchema)
                .param("requirement", requirement))
            .call()
            .content();
    }
}

和直接调用 API 对比

特性Spring AI直接调用 API
学习成本低(Spring 开发者)中等
代码量
多模型切换配置切换改代码
Function Calling内置支持手动实现
RAG内置支持手动实现
Spring 集成原生需要封装

最佳实践

1. 使用 Prompt 模板

String response = chatClient.prompt()
    .user(u -> u.text("""
        分析以下日志,找出错误原因:
        日志内容:{log}
        应用信息:{appInfo}
        """)
        .param("log", logContent)
        .param("appInfo", appInfo))
    .call()
    .content();

2. 错误处理

try {
    String response = chatClient.prompt()
        .user(message)
        .call()
        .content();
} catch (Exception e) {
    log.error("AI 调用失败", e);
    return "抱歉,AI 服务暂时不可用";
}

3. 成本控制

spring:
  ai:
    openai:
      chat:
        options:
          max-tokens: 1000
          temperature: 0.7

总结

Spring AI 让 Java 开发者用熟悉的方式构建 AI 应用:

  • 统一 API:切换模型只改配置
  • Function Calling:让 AI 调用 Java 方法
  • RAG 内置:轻松实现知识库问答
  • Spring 生态:和 Spring Boot 无缝集成

如果你是 Java 开发者,Spring AI 是构建 AI 应用的最佳选择。