Spring AI 介绍

Spring AI 是 Spring 团队推出的开源项目,当前版本为 1.0.2。它是一个专门为 AI 工程设计的应用程序框架,旨在将 Spring 生态系统的设计原则(如可移植性和模块化设计)应用到 AI 领域,并推广使用 POJO 作为应用程序的构建块。

核心目标:解决 AI 集成的基本挑战 - 连接企业数据和 API 与 AI 模型

核心特性

1. 统一的 AI 模型 API

  • 跨提供商可移植性:提供统一的接口,支持多个 AI 提供商
  • 多种模型类型
    • Chat Completion(聊天补全)
    • Embedding(嵌入)
    • Text to Image(文本生成图像)
    • Audio Transcription(音频转录)
    • Text to Speech(文本转语音)
    • Moderation(内容审核)
  • 同步和流式 API:同时支持同步和异步流式处理
  • 结构化输出:将 AI 模型输出映射到 POJO

2. 向量存储 API

  • 多数据库支持:支持 14 种向量数据库
    • Apache Cassandra
    • Azure Vector Search
    • Chroma
    • Milvus
    • MongoDB Atlas
    • Neo4j
    • Oracle
    • PostgreSQL/PGVector
    • PineCone
    • Qdrant
    • Redis
    • Weaviate
  • 元数据过滤:提供类似 SQL 的元数据过滤 API
  • 检索增强生成(RAG):为 RAG 模式提供完整支持

3. 工具调用 API

  • 方法标注:使用 @Tool 注解标记可调用的方法
  • 函数式支持:支持 java.util.Function 对象
  • 客户端工具集成:允许 AI 模型调用客户端工具和函数
  • 实时信息访问:获取必要的实时信息

4. 高级 API 特性

  • ChatClient API:类似 WebClient 和 RestClient 的流式 API
  • Advisors API:封装常见的生成式 AI 模式,转换发送到语言模型的数据
  • 对话记忆:支持聊天对话记忆和上下文管理
  • RAG 支持:完整的检索增强生成实现

5. Spring Boot 集成

  • 自动配置:为 AI 模型和向量存储提供自动配置
  • Starter 支持:简化依赖管理和配置
  • 配置属性:通过 application.yml 进行配置
  • Spring Initializr:使用 start.spring.io 选择模型或向量存储

6. 数据工程与可观测性

  • ETL 框架:文档注入 ETL 框架,支持数据工程
  • 可观测性:提供 AI 相关操作的洞察和监控
  • 模型评估:评估生成内容的工具,防止幻觉响应

支持的 AI 提供商

Spring AI 支持众多主流 AI 提供商:

  • OpenAI:GPT 系列模型
  • Microsoft:Azure OpenAI 服务
  • Amazon:Bedrock 服务
  • Google:Vertex AI
  • Anthropic:Claude 系列
  • Ollama:本地模型部署
  • 其他:Hugging Face、Cohere 等

快速开始

1. Maven 配置

方式一:使用 Spring Initializr

访问 start.spring.io,选择:

  • Spring Boot 版本:3.2+
  • 依赖:Spring AI OpenAI

方式二:手动添加依赖

父 POM 配置

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.0</version>
    <relativePath/>
</parent>

<properties>
    <!-- Spring AI 版本,建议使用最新稳定版 -->
    <spring-ai.version>1.0.2</spring-ai.version>
</properties>

<dependencyManagement>
    <dependencies>
        <!-- Spring AI BOM,统一管理所有 Spring AI 相关依赖版本 -->
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-bom</artifactId>
            <version>${spring-ai.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

常用 Spring AI 依赖

<!-- OpenAI 支持 - 提供与 OpenAI API 的集成 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>

<!-- Ollama 支持 - 提供与 Ollama API 的集成 -->
<dependency>
  	<groupId>org.springframework.ai</groupId>
  	<artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>

<!-- Anthropic 支持 - 提供与 Anthropic API 的集成 -->
<dependency>
  	<groupId>org.springframework.ai</groupId>
  	<artifactId>spring-ai-starter-model-anthropic</artifactId>
</dependency>

<!-- PostgreSQL 向量存储支持 - 用于 RAG 应用 -->
<dependency>
  	<groupId>org.springframework.ai</groupId>
  	<artifactId>spring-ai-starter-vector-store-pgvector</artifactId>
</dependency>

<!-- Redis 向量存储支持 - 轻量级向量存储方案 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-vector-store-redis</artifactId>
</dependency>

<!-- PDF 文档读取器 - 用于文档处理 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-pdf-document-reader</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-tika-document-reader</artifactId>
</dependency>

2. 配置文件详解

application.yml 配置(推荐)

spring:
  ai:
    # OpenAI 配置
    openai:
      # API 密钥,建议通过环境变量设置
      api-key: ${OPENAI_API_KEY:your-api-key-here}
      # 基础 URL,默认使用 OpenAI 官方 API
      base-url: ${OPENAI_BASE_URL:https://api.openai.com}
      # 聊天模型配置
      chat:
        options:
          # 使用的模型名称,如 gpt-4, gpt-3.5-turbo
          model: gpt-4
          # 温度参数,控制输出的随机性 (0.0-2.0)
          temperature: 0.7
          # 最大生成 token 数
          max-tokens: 1000
          # 是否流式输出
          stream: false
          # 停止词列表
          stop: []
      # 嵌入模型配置
      embedding:
        options:
          # 嵌入模型名称
          model: text-embedding-ada-002
          # 嵌入维度
          dimensions: 1536
      # 图像生成配置
      image:
        options:
          # 图像模型名称
          model: dall-e-3
          # 图像尺寸
          size: 1024x1024
          # 图像质量
          quality: standard
          # 生成数量
          n: 1
    # 向量存储配置
    vectorstore:
      # PostgreSQL 向量存储配置
      pgvector:
        # 索引类型:HNSW(分层导航小世界图)或 IVFFlat
        index-type: HNSW
        # 距离计算方式:COSINE_DISTANCE, EUCLIDEAN_DISTANCE, NEGATIVE_INNER_PRODUCT
        distance-type: COSINE_DISTANCE
        # 向量维度,必须与嵌入模型维度一致
        dimensions: 1536
        # 是否使用现有表
        use-existing-index: false
        # 索引参数
        index-options:
          # HNSW 参数
          m: 16
          ef_construction: 64
      # Redis 向量存储配置
      redis:
        # Redis 连接配置
        host: localhost
        port: 6379
        password: ${REDIS_PASSWORD:}
        database: 0
        # 向量存储键前缀
        key-prefix: "spring-ai:"
        # 向量维度
        dimensions: 1536
        # 距离计算方式
        distance-type: COSINE_DISTANCE
    # 文档处理配置
    document:
      # PDF 处理配置
      pdf:
        # 是否提取元数据
        extract-metadata: true
        # 是否提取图像
        extract-images: false
        # 页面范围
        page-range: "1-"

3. 环境变量配置

推荐的环境变量设置

# OpenAI API 配置
export OPENAI_API_KEY="your-actual-api-key-here"
export OPENAI_BASE_URL="https://api.openai.com"

# Redis 配置(如果使用 Redis 向量存储)
export REDIS_PASSWORD="your-redis-password"

# 数据库配置(如果使用 PostgreSQL 向量存储)
export SPRING_DATASOURCE_URL="jdbc:postgresql://localhost:5432/vectordb"
export SPRING_DATASOURCE_USERNAME="postgres"
export SPRING_DATASOURCE_PASSWORD="your-db-password"

4. 编写代码

基础聊天功能

@RestController
@RequestMapping("/api/ai")
public class ChatController {
    
    private final ChatClient chatClient;
    
    public ChatController(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }
    
    @PostMapping("/chat")
    public ResponseEntity<String> chat(@RequestBody ChatRequest request) {
        try {
            String response = chatClient.prompt(request.getMessage()).call().content();
            return ResponseEntity.ok(response);
        } catch (Exception e) {
            return ResponseEntity.status(500).body("AI 服务暂时不可用");
        }
    }
    
    // 流式聊天
    @PostMapping("/chat/stream")
    public ResponseEntity<StreamingResponseBody> chatStream(@RequestBody ChatRequest request) {
        return ResponseEntity.ok()
            .contentType(MediaType.TEXT_PLAIN)
            .body(outputStream -> {
                chatClient.prompt(request.getMessage())
                    .stream()
                    .content()
                    .forEach(content -> {
                        try {
                            outputStream.write(content.getBytes());
                            outputStream.flush();
                        } catch (IOException e) {
                            throw new RuntimeException(e);
                        }
                    });
            });
    }
}

// 请求 DTO
public class ChatRequest {
    private String message;
    
    // getter 和 setter
    public String getMessage() { return message; }
    public void setMessage(String message) { this.message = message; }
}

命令行运行示例

@SpringBootApplication
public class SpringAiDemoApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(SpringAiDemoApplication.class, args);
    }
    
    @Bean
    public CommandLineRunner runner(ChatClient.Builder builder) {
        return args -> {
            ChatClient chatClient = builder.build();
            String response = chatClient.prompt("Tell me a joke").call().content();
            System.out.println("AI Response: " + response);
        };
    }
}

5. 运行应用

# 使用 Maven 运行
./mvnw spring-boot:run

# 或者先编译再运行
./mvnw clean package
java -jar target/your-app.jar

# 使用环境变量运行
OPENAI_API_KEY=your-key ./mvnw spring-boot:run

典型应用场景

1. 智能客服系统

@RestController
public class ChatController {
    
    @Autowired
    private ChatClient chatClient;
    
    @PostMapping("/chat")
    public String chat(@RequestBody String message) {
        return chatClient.prompt(message).call().content();
    }
}

2. 文档问答系统(RAG)

  • 使用嵌入模型对文档进行向量化
  • 实现语义搜索和问答功能
  • 支持多轮对话和上下文记忆

3. 智能代码助手

  • 结合代码嵌入进行语义搜索
  • 提供代码补全和建议
  • 支持多种编程语言

4. 内容生成

  • 自动摘要生成
  • 文本翻译和润色
  • 创意内容创作

技术优势

1. Spring 生态集成

  • 与 Spring Boot、Spring Security 等无缝集成
  • 遵循 Spring 的设计理念和最佳实践
  • 支持依赖注入和 AOP

2. 配置简化

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

3. 类型安全

  • 强类型 API 设计
  • 编译时错误检查
  • 更好的 IDE 支持

4. 可扩展性

  • 插件化架构
  • 自定义模型支持
  • 灵活的配置选项

总结

Spring AI 为 Java 开发者提供了一个强大、灵活且易于集成的 AI 解决方案。它让您能够在熟悉的 Spring 生态系统中快速构建现代化的 AI 驱动应用程序,特别适合实现"基于文档的问答"和"与文档对话"等常见用例。