Spring AI 集成 OpenAI:实现智能对话与文本生成

在前两篇文章中,我们了解了 Spring AI 的基础用法和核心概念。本文将聚焦于最流行的 AI 提供商 OpenAI,详细介绍如何在 Spring AI 中集成 OpenAI,并实现智能对话、文本生成、函数调用等高级功能。

概述:OpenAI 与 Spring AI 的集成方式

Spring AI 通过 spring-ai-openai 模块提供了对 OpenAI 全套 API 的支持,包括:

  • Chat Completion:对话补全,支持 GPT-4o、GPT-4、GPT-3.5 等模型
  • Text Embedding:文本向量化,支持 text-embedding-3-small/large
  • Image Generation:图片生成,支持 DALL-E 系列模型
  • Audio Transcription:语音转文字,支持 Whisper 模型
  • Function Calling:函数调用,让 AI 可以调用外部工具

一句话总结:Spring AI 将 OpenAI 的 REST API 封装为优雅的 Java 接口,使开发者可以用 Spring 的方式调用 OpenAI 的全部能力。

基础集成:配置与自动装配

添加依赖

在 pom.xml 中添加 OpenAI Starter:

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

配置参数

Spring AI 提供了丰富的配置项:

spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}
      base-url: https://api.openai.com
      chat:
        options:
          model: gpt-4o
          temperature: 0.7
          max-tokens: 2048
          top-p: 0.9
      embedding:
        options:
          model: text-embedding-3-small
      image:
        options:
          model: dall-e-3
          size: 1024x1024

自动化配置原理

当引入 spring-ai-openai-spring-boot-starter 后,Spring Boot 的自动配置会:

  1. 读取 spring.ai.openai.* 配置
  2. 创建 OpenAiApi 客户端(封装 HTTP 调用)
  3. 创建 OpenAiChatModel、OpenAiEmbeddingModel 等 Bean
  4. 将这些 Bean 注入到 Spring 容器中

高级用法:多轮对话

保留对话历史是实现多轮对话的关键:

@Service
public class ConversationService {

    private final ChatClient chatClient;

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

    public String chatWithHistory(List<Message> history, String userMessage) {
        List<Message> messages = new ArrayList<>(history);
        messages.add(new UserMessage(userMessage));

        Prompt prompt = new Prompt(messages);
        ChatResponse response = chatClient.prompt()
                .messages(prompt.getInstructions())
                .call()
                .chatResponse();

        AssistantMessage assistantMessage = response.getResult().getOutput();
        messages.add(assistantMessage);

        return assistantMessage.getContent();
    }
}

进阶功能:函数调用(Function Calling)

函数调用是 Spring AI 最强大的特性之一,它允许 LLM 在需要时调用你定义的工具方法。

定义工具函数

@Component
@Description("获取指定城市的当前天气信息")
public class WeatherFunction implements Function<WeatherFunction.Request, WeatherFunction.Response> {

    public record Request(
        @JsonProperty(required = true) @JsonPropertyDescription("城市名称,如:北京、上海") String location) {}

    public record Response(String location, String temperature, String condition) {}

    @Override
    public Response apply(Request request) {
        return new Response(request.location, "25°C", "晴转多云");
    }
}

注册到 ChatClient

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

    private final ChatClient chatClient;

    public FunctionCallingController(ChatClient.Builder builder) {
        this.chatClient = builder
                .defaultSystem("你是一个天气助手,可以使用工具查询天气。")
                .defaultFunctions("weatherFunction")
                .build();
    }

    @GetMapping("/weather")
    public String askWeather(@RequestParam String question) {
        return chatClient.prompt()
                .user(question)
                .call()
                .content();
    }
}

文本生成:模板化输出

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

    private final ChatClient chatClient;

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

    @GetMapping("/generate")
    public String generateContent(@RequestParam String topic) {
        return chatClient.prompt()
                .system("你是一个资深的技术博主,擅长撰写结构清晰内容深入的技术文章。")
                .user("请为我撰写一篇关于 " + topic + " 的技术博客大纲,包含至少 5 个章节。")
                .call()
                .content();
    }
}

最佳实践:连接池与重试

生产环境中,合理的连接池和重试策略至关重要:

spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}
      chat:
        options:
          model: gpt-4o
      client:
        connect-timeout: 30s
        read-timeout: 60s
        max-retries: 3

总结:本文要点

  • Spring AI 为 OpenAI 提供了完整的集成支持,包括 Chat、Embedding、Image、Audio 等功能
  • 通过自动配置机制,引入 Starter 依赖后即可直接注入 ChatClient
  • 函数调用(Function Calling) 是 Spring AI 的高级特性,让 AI 可以调用外部服务
  • 生产环境应配置连接超时和重试策略,确保系统稳定性
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐