Spring AI 集成 OpenAI:实现智能对话与文本生成
·
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 的自动配置会:
- 读取 spring.ai.openai.* 配置
- 创建 OpenAiApi 客户端(封装 HTTP 调用)
- 创建 OpenAiChatModel、OpenAiEmbeddingModel 等 Bean
- 将这些 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 可以调用外部服务
- 生产环境应配置连接超时和重试策略,确保系统稳定性
更多推荐
所有评论(0)