Spring AI 框架详解:核心特性与应用实践

242 阅读5分钟

一、Spring AI 框架概述

Spring AI 是 Spring 官方团队推出的一个新兴开源框架,旨在简化基于 Java 的人工智能应用程序开发。它于 2023 年底首次发布,为 Spring 生态带来了与 AI 模型集成的标准化方式。

1.1 框架定位

Spring AI 的核心目标是:

  • 降低 AI 集成门槛:让 Java 开发者无需深入掌握 AI 底层技术也能快速构建智能应用
  • 统一访问接口:提供跨 AI 供应商的一致 API,减少厂商锁定风险
  • Spring 风格集成:延续 Spring 框架熟悉的编程模型和设计理念

1.2 技术栈关系

Spring AI 在 Spring 生态中的位置:

┌───────────────────────────────────────┐
│            Spring Ecosystem           │
│  ┌───────────┐ ┌───────────┐         │
│  │ Spring MVC │ │Spring Data│         │
│  └───────────┘ └───────────┘         │
│  ┌───────────────────────────────┐   │
│  │           Spring AI           │   │
│  │  ┌───────┐  ┌──────────────┐  │   │
│  │  │ OpenAI │  │Azure OpenAI  │  │   │
│  │  └───────┘  └──────────────┘  │   │
│  └───────────────────────────────┘   │
└───────────────────────────────────────┘

二、Spring AI 核心特性

2.1 统一 API 抽象

Spring AI 的核心设计是提供供应商中立的 API 接口,主要抽象包括:

2.1.1 ChatClient

public interface ChatClient {
    default String call(String message) {
        // 默认实现
    }
    
    ChatResponse call(Prompt prompt);
}

使用示例:

@RestController
public class ChatController {
    
    private final ChatClient chatClient;
    
    public ChatController(ChatClient chatClient) {
        this.chatClient = chatClient;
    }
    
    @GetMapping("/ask")
    public String ask(@RequestParam String question) {
        return chatClient.call(question);
    }
}

2.1.2 Prompt 抽象

public class Prompt {
    private final List<Message> messages;
    
    public Prompt(String message) {
        this.messages = List.of(new SystemMessage(message));
    }
    
    // 其他构造方法和工具方法
}

2.2 多模型支持

Spring AI 支持的主流 AI 提供商:

提供商支持模型特点
OpenAIGPT-3.5, GPT-4最广泛使用的商业API
Azure OpenAIGPT 系列企业级部署方案
HuggingFace开源模型本地/自托管解决方案
AnthropicClaude 系列注重安全性的模型
Ollama本地LLM运行框架开发者本地测试

配置示例(application.yml):

spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}
      model: gpt-3.5-turbo
    azure:
      openai:
        api-key: ${AZURE_OPENAI_KEY}
        endpoint: https://your-resource.openai.azure.com

2.3 提示工程支持

Spring AI 提供了强大的提示模板功能:

@Bean
PromptTemplate questionPromptTemplate() {
    return new PromptTemplate("""
        你是一个专业的{role}。
        请用{style}风格回答以下问题:
        问题:{question}
        """);
}

@Service
public class AdvisorService {
    
    private final PromptTemplate promptTemplate;
    private final ChatClient chatClient;
    
    public String getAdvice(String role, String style, String question) {
        Prompt prompt = promptTemplate.create(Map.of(
            "role", role,
            "style", style,
            "question", question
        ));
        return chatClient.call(prompt).getResult().getOutput().getContent();
    }
}

2.4 输出解析

Spring AI 提供类型安全的输出解析:

public record Movie(String title, int year, List<String> genres) {}

String promptText = """
    请推荐一部{genre}类型的电影。
    按照以下JSON格式返回:
    {format}
    """;

PromptTemplate template = new PromptTemplate(promptText);
template.add("genre", "科幻");
template.add("format", JsonOutputParser.OBJECT_MAPPER
    .getTypeFactory()
    .constructType(Movie.class));

Prompt prompt = template.create();
Movie movie = chatClient.call(prompt)
    .getResult()
    .getOutput()
    .getParsedResult(Movie.class);

2.5 向量数据库集成

Spring AI 支持多种向量数据库:

@Configuration
public class VectorConfig {
    
    @Bean
    VectorStore vectorStore(EmbeddingClient embeddingClient) {
        return new SimpleVectorStore(embeddingClient);
    }
    
    @Bean
    EmbeddingClient embeddingClient() {
        return new OpenAiEmbeddingClient();
    }
}

@Service
public class DocumentService {
    
    private final VectorStore vectorStore;
    
    public void addDocument(String content) {
        vectorStore.add(List.of(
            new Document(content, Map.of("timestamp", Instant.now()))
        );
    }
    
    public List<Document> search(String query, int topK) {
        return vectorStore.similaritySearch(query, topK);
    }
}

三、Spring AI 架构设计

3.1 核心模块划分

┌───────────────────────────────────┐
│           Spring AI Core          │
├───────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐ │
│  │   Chat API   │  │ Vector API  │ │
│  └─────────────┘  └─────────────┘ │
├───────────────────────────────────┤
│  ┌─────────────────────────────┐  │
│  │        Connectors           │  │
│  ├─────────────┬───────┬───────┤  │
│  │   OpenAI    │ Azure │ HF    │  │
│  └─────────────┴───────┴───────┘  │
└───────────────────────────────────┘

3.2 关键设计模式

  1. 模板方法模式:在 ChatClient 实现中广泛使用
  2. 策略模式:不同 AI 提供商作为可插拔策略
  3. 建造者模式:复杂 Prompt 的构建

四、Spring AI 实战示例

4.1 智能客服系统

@RestController
@RequestMapping("/api/customer-service")
public class CustomerServiceController {
    
    private final ChatClient chatClient;
    private final VectorStore vectorStore;
    
    @PostMapping("/query")
    public ResponseEntity<String> handleQuery(@RequestBody QueryRequest request) {
        // 1. 知识库检索
        List<Document> docs = vectorStore.similaritySearch(request.question(), 3);
        
        // 2. 构建增强提示
        String context = docs.stream()
            .map(Document::getContent)
            .collect(Collectors.joining("\n\n"));
        
        String prompt = """
            你是一名客服代表,请基于以下知识库内容回答问题:
            
            知识库:
            {context}
            
            用户问题:{question}
            
            要求:
            - 如果知识库没有相关信息,如实告知
            - 保持专业友好的语气
            """;
            
        Prompt enhancedPrompt = new PromptTemplate(prompt)
            .create(Map.of(
                "context", context,
                "question", request.question()
            ));
            
        // 3. 获取AI响应
        String response = chatClient.call(enhancedPrompt).getResult().getOutput().getContent();
        
        return ResponseEntity.ok(response);
    }
}

4.2 代码生成工具

@Service
public class CodeGenerator {
    
    private final ChatClient chatClient;
    
    public GeneratedCode generateClass(CodeSpec spec) {
        String prompt = """
            你是一个资深{language}开发专家。
            请生成一个{classPurpose}的{classType}实现。
            
            要求:
            - 使用{style}编码风格
            - 包含详细的文档注释
            - 遵循{framework}最佳实践
            
            具体需求:
            {requirements}
            """;
            
        Prompt codePrompt = new PromptTemplate(prompt)
            .create(Map.of(
                "language", spec.language(),
                "classPurpose", spec.classPurpose(),
                "classType", spec.classType(),
                "style", spec.style(),
                "framework", spec.framework(),
                "requirements", spec.requirements()
            ));
            
        String code = chatClient.call(codePrompt).getResult().getOutput().getContent();
        return new GeneratedCode(code, spec.language());
    }
}

五、Spring AI 最佳实践

5.1 性能优化

  1. 批处理请求
List<Prompt> prompts = // 多个提示
List<ChatResponse> responses = chatClient.batchCall(prompts);
  1. 流式响应
@GetMapping("/stream")
public SseEmitter streamResponse(@RequestParam String question) {
    SseEmitter emitter = new SseEmitter();
    
    chatClient.stream(new Prompt(question))
        .subscribe(
            chunk -> {
                try {
                    emitter.send(chunk.getResult().getOutput().getContent());
                } catch (IOException e) {
                    emitter.completeWithError(e);
                }
            },
            emitter::completeWithError,
            emitter::complete
        );
    
    return emitter;
}

5.2 安全实践

  1. 输入净化
public String sanitizeInput(String input) {
    // 移除敏感信息
    String sanitized = input.replaceAll("(?i)password|credit card|ssn", "[REDACTED]");
    
    // 限制长度
    return sanitized.length() > 1000 
        ? sanitized.substring(0, 1000) + "...[TRUNCATED]" 
        : sanitized;
}
  1. 内容审核
public boolean containsInappropriateContent(String text) {
    // 实际应用中可以使用专门的审核API
    return text.toLowerCase().matches(".*(暴力|色情|仇恨言论).*");
}

六、Spring AI 未来发展方向

  1. 多模态扩展:支持图像、音频等非文本交互
  2. Agent 框架:构建自主 AI Agent 的支持
  3. 本地模型优化:更好的一体化本地模型支持
  4. 企业级特性:监控、审计等生产就绪功能
  5. Spring Boot Starter:更简单的自动配置

七、总结

Spring AI 作为 Spring 生态中的新成员,为 Java 开发者提供了以下价值:

  1. 降低门槛:使传统 Java 开发者无需成为 AI 专家也能构建智能应用
  2. 标准化集成:统一不同 AI 供应商的接入方式
  3. Spring 原生体验:依赖注入、自动配置等熟悉的开发模式
  4. 生产就绪:与 Spring 安全、监控等基础设施无缝集成

随着 AI 技术的快速发展,Spring AI 有望成为 Java 生态中 AI 应用开发的事实标准框架。对于已经在使用 Spring 的技术团队,采用 Spring AI 可以显著降低技术栈复杂度和学习成本。

示例项目结构:

spring-ai-demo/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           ├── config/
│   │   │           ├── controller/
│   │   │           ├── model/
│   │   │           ├── service/
│   │   │           └── Application.java
│   │   └── resources/
│   │       ├── application.yml
│   │       └── prompts/
│   └── test/
└── pom.xml