OpenAI API 接口与 Spring AI 对应关系
OpenAI API 提供了一套强大的接口,允许开发者将其先进的人工智能模型集成到各种应用中。它支持文本生成、翻译、总结、问答、对话、代码生成、图像生成、音频处理等多种任务。
Spring AI 通过统一的 API 对 OpenAI 的各种接口进行了封装,使得开发者可以在 Spring 生态系统中轻松使用 OpenAI 的所有功能。Spring AI 不仅支持 OpenAI,还支持其他遵循 OpenAI 接口规范的模型提供商。
第一部分:OpenAI API 接口详解
1. API 概述
基础信息:
- 基础 URL:
https://api.openai.com/v1 - 认证方式:Bearer Token
- 请求格式:JSON
- 响应格式:JSON
2. 认证与安全
# 请求头格式Authorization: Bearer YOUR_API_KEYContent-Type: application/json安全最佳实践:
- 将 API 密钥存储在环境变量中
- 使用密钥管理服务
- 定期轮换密钥
- 监控 API 使用情况
3. 速率限制与计费
速率限制:
- 基于账户类型和使用情况
- 按分钟和按天限制
- 可在账户设置中查看
计费模式:
- 按使用量计费
- 不同模型不同价格
- 按输入和输出标记数计算
第二部分:OpenAI API 接口详解
1. 聊天补全(Chat Completions)
端点: POST https://api.openai.com/v1/chat/completions
用途: 支持多轮对话,适用于构建聊天机器人等应用
请求参数:
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
model | string | 是 | 模型名称(如 gpt-4, gpt-3.5-turbo) |
messages | array | 是 | 消息列表 |
temperature | number | 否 | 温度参数(0-2),控制随机性 |
max_tokens | integer | 否 | 最大生成标记数 |
top_p | number | 否 | 核采样参数(0-1) |
n | integer | 否 | 生成数量(1-10) |
stream | boolean | 否 | 是否流式输出 |
stop | array | 否 | 停止序列 |
presence_penalty | number | 否 | 存在惩罚(-2到2) |
frequency_penalty | number | 否 | 频率惩罚(-2到2) |
user | string | 否 | 用户标识 |
消息格式:
{ "role": "system|user|assistant", "content": "消息内容"}请求示例:
curl https://api.openai.com/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d '{ "model": "gpt-4", "messages": [ {"role": "system", "content": "你是一个乐于助人的助手。"}, {"role": "user", "content": "你好!"} ], "temperature": 0.7, "max_tokens": 1000, "top_p": 0.9, "stream": false }'响应示例:
{ "id": "chatcmpl-abc123", "object": "chat.completion", "created": 1677652288, "model": "gpt-4", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "你好!有什么我可以帮助您的吗?" }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 15, "completion_tokens": 10, "total_tokens": 25 }}2. 文本补全(Completions)
端点: POST https://api.openai.com/v1/completions
用途: 生成或编辑文本,适用于内容创作、代码生成等
请求参数:
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
model | string | 是 | 模型名称(如 text-davinci-003) |
prompt | string/array | 是 | 输入提示 |
max_tokens | integer | 否 | 最大生成标记数 |
temperature | number | 否 | 温度参数(0-2) |
top_p | number | 否 | 核采样参数(0-1) |
n | integer | 否 | 生成数量(1-10) |
stream | boolean | 否 | 是否流式输出 |
stop | array | 否 | 停止序列 |
presence_penalty | number | 否 | 存在惩罚(-2到2) |
frequency_penalty | number | 否 | 频率惩罚(-2到2) |
user | string | 否 | 用户标识 |
请求示例:
curl https://api.openai.com/v1/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d '{ "model": "text-davinci-003", "prompt": "请写一首关于春天的诗。", "max_tokens": 100, "temperature": 0.7, "top_p": 0.9 }'响应示例:
{ "id": "cmpl-abc123", "object": "text_completion", "created": 1677652288, "model": "text-davinci-003", "choices": [ { "text": "春天来了,万物复苏,花儿绽放,鸟儿歌唱。", "index": 0, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 10, "completion_tokens": 20, "total_tokens": 30 }}3. 嵌入(Embeddings)
端点: POST https://api.openai.com/v1/embeddings
用途: 将文本转换为向量表示,适用于语义搜索、推荐系统等
请求参数:
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
model | string | 是 | 嵌入模型名称 |
input | string/array | 是 | 输入文本 |
encoding_format | string | 否 | 编码格式(float, base64) |
dimensions | integer | 否 | 嵌入维度 |
user | string | 否 | 用户标识 |
请求示例:
curl https://api.openai.com/v1/embeddings \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d '{ "model": "text-embedding-ada-002", "input": "机器学习的基本概念", "encoding_format": "float", "dimensions": 1536 }'响应示例:
{ "object": "list", "data": [ { "object": "embedding", "embedding": [0.123, 0.456, -0.789, ...], "index": 0 } ], "model": "text-embedding-ada-002", "usage": { "prompt_tokens": 5, "total_tokens": 5 }}4. 图像生成(Images)
端点: POST https://api.openai.com/v1/images/generations
用途: 根据文本描述生成图像
请求参数:
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
model | string | 是 | 图像模型名称(dall-e-2, dall-e-3) |
prompt | string | 是 | 图像描述 |
n | integer | 否 | 生成数量(1-10) |
size | string | 否 | 图像尺寸 |
quality | string | 否 | 图像质量(standard, hd) |
response_format | string | 否 | 响应格式(url, b64_json) |
style | string | 否 | 图像风格(vivid, natural) |
user | string | 否 | 用户标识 |
请求示例:
curl https://api.openai.com/v1/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d '{ "model": "dall-e-3", "prompt": "一只可爱的猫在花园里玩耍", "n": 1, "size": "1024x1024", "quality": "standard", "response_format": "url", "style": "vivid" }'响应示例:
{ "created": 1677652288, "data": [ { "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/...", "revised_prompt": "一只可爱的猫在花园里玩耍,背景是美丽的花朵" } ]}5. 音频转录(Audio Transcriptions)
端点: POST https://api.openai.com/v1/audio/transcriptions
用途: 将音频转换为文本
请求参数:
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
file | file | 是 | 音频文件 |
model | string | 是 | 转录模型(whisper-1) |
language | string | 否 | 语言代码 |
prompt | string | 否 | 提示文本 |
response_format | string | 否 | 响应格式(json, text, srt, verbose_json, vtt) |
temperature | number | 否 | 温度参数(0-1) |
timestamp_granularities | array | 否 | 时间戳粒度 |
请求示例:
curl https://api.openai.com/v1/audio/transcriptions \ -H "Authorization: Bearer YOUR_API_KEY" \ -F file="@audio.mp3" \ -F model="whisper-1" \ -F language="zh" \ -F response_format="json" \ -F temperature=0.0响应示例:
{ "text": "想象一下你曾经有过的最疯狂的想法,并且你想知道它如何扩展到100倍、1000倍的规模。"}6. 文本转语音(Text-to-Speech)
端点: POST https://api.openai.com/v1/audio/speech
用途: 将文本转换为语音
请求参数:
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
model | string | 是 | TTS 模型(tts-1, tts-1-hd) |
input | string | 是 | 输入文本 |
voice | string | 是 | 语音类型(alloy, echo, fable, onyx, nova, shimmer) |
response_format | string | 否 | 响应格式(mp3, opus, aac, flac) |
speed | number | 否 | 语速(0.25-4.0) |
user | string | 否 | 用户标识 |
请求示例:
curl https://api.openai.com/v1/audio/speech \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d '{ "model": "tts-1", "input": "你好,欢迎使用语音服务!", "voice": "alloy", "response_format": "mp3", "speed": 1.0 }'响应: 返回音频文件的二进制数据
7. 流式处理
流式聊天补全:
curl -X POST https://api.openai.com/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d '{ "model": "gpt-4", "messages": [{"role": "user", "content": "讲一个故事"}], "stream": true }'流式响应格式:
data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1677652288,"model":"gpt-4","choices":[{"index":0,"delta":{"role":"assistant","content":"从前"},"finish_reason":null}]}
data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1677652288,"model":"gpt-4","choices":[{"index":0,"delta":{"content":"有"},"finish_reason":null}]}
data: [DONE]8. 错误处理
错误响应格式:
{ "error": { "message": "Invalid API key", "type": "invalid_request_error", "code": "invalid_api_key" }}常见错误码:
400:请求错误401:认证失败429:速率限制500:服务器错误
第三部分:Spring AI 与 OpenAI API 详细对应关系
1. 聊天补全(Chat Completions)
OpenAI API
POST https://api.openai.com/v1/chat/completions{ "model": "gpt-4", "messages": [ {"role": "system", "content": "你是一个助手"}, {"role": "user", "content": "你好"} ], "temperature": 0.7, "max_tokens": 1000}Spring AI 对应
// 配置@Configurationpublic class OpenAiConfig {
@Bean public OpenAiChatModel openAiChatModel() { return new OpenAiChatModel( new OpenAiApi("your-api-key", "https://api.openai.com"), OpenAiChatOptions.builder() .withModel("gpt-4") .withTemperature(0.7f) .withMaxTokens(1000) .withTopP(0.9f) .withFrequencyPenalty(0.0f) .withPresencePenalty(0.0f) .withStop(Arrays.asList("Human:", "AI:")) .withN(1) .withUser("spring-ai-app") .build() ); }
@Bean public ChatClient chatClient(OpenAiChatModel chatModel) { return ChatClient.create(chatModel); }}
// 使用@RestControllerpublic class ChatController {
private final ChatClient chatClient;
public ChatController(ChatClient.Builder builder) { this.chatClient = builder.build(); }
@PostMapping("/chat") public String chat(@RequestBody String message) { return chatClient.prompt() .system("你是一个助手") .user(message) .call() .content(); }
// 流式处理 @PostMapping(value = "/stream", produces = MediaType.TEXT_PLAIN_VALUE) public ResponseEntity<StreamingResponseBody> streamChat(@RequestBody String message) { return ResponseEntity.ok() .contentType(MediaType.TEXT_PLAIN) .body(outputStream -> { chatClient.prompt() .user(message) .stream() .content() .forEach(content -> { try { outputStream.write(content.getBytes()); outputStream.flush(); } catch (IOException e) { throw new RuntimeException(e); } }); }); }}参数映射关系
| OpenAI API 参数 | Spring AI 配置 | 说明 |
|---|---|---|
model | OpenAiChatOptions.withModel() | 模型名称 |
messages | Prompt 构建 | 消息列表 |
temperature | OpenAiChatOptions.withTemperature() | 温度参数 (0-2) |
max_tokens | OpenAiChatOptions.withMaxTokens() | 最大标记数 |
top_p | OpenAiChatOptions.withTopP() | 核采样参数 (0-1) |
stream | ChatClient.stream() | 流式输出 |
stop | OpenAiChatOptions.withStop() | 停止序列 |
presence_penalty | OpenAiChatOptions.withPresencePenalty() | 存在惩罚 (-2到2) |
frequency_penalty | OpenAiChatOptions.withFrequencyPenalty() | 频率惩罚 (-2到2) |
n | OpenAiChatOptions.withN() | 生成数量 |
user | OpenAiChatOptions.withUser() | 用户标识 |
2. 文本补全(Completions)
OpenAI API
POST https://api.openai.com/v1/completions{ "model": "text-davinci-003", "prompt": "写一首诗", "max_tokens": 100, "temperature": 0.7}Spring AI 对应
// 配置@Configurationpublic class CompletionConfig {
@Bean public OpenAiCompletionModel openAiCompletionModel() { return new OpenAiCompletionModel( new OpenAiApi("your-api-key", "https://api.openai.com"), OpenAiCompletionOptions.builder() .withModel("text-davinci-003") .withTemperature(0.7f) .withMaxTokens(100) .withTopP(0.9f) .withFrequencyPenalty(0.0f) .withPresencePenalty(0.0f) .withStop(Arrays.asList("\n\n")) .withN(1) .withUser("spring-ai-app") .build() ); }}
// 使用@Servicepublic class CompletionService {
private final OpenAiCompletionModel completionModel;
public String complete(String prompt) { return completionModel.call(prompt); }}3. 嵌入(Embeddings)
OpenAI API
POST https://api.openai.com/v1/embeddings{ "model": "text-embedding-ada-002", "input": "机器学习的基本概念", "encoding_format": "float", "dimensions": 1536}Spring AI 对应
// 配置@Configurationpublic class EmbeddingConfig {
@Bean public OpenAiEmbeddingModel openAiEmbeddingModel() { return new OpenAiEmbeddingModel( new OpenAiApi("your-api-key", "https://api.openai.com"), OpenAiEmbeddingOptions.builder() .withModel("text-embedding-ada-002") .withEncodingFormat("float") .withDimensions(1536) .withUser("spring-ai-app") .build() ); }}
// 使用@Servicepublic class EmbeddingService {
private final OpenAiEmbeddingModel embeddingModel;
public List<Double> embed(String text) { return embeddingModel.embed(text); }
public List<List<Double>> embed(List<String> texts) { return embeddingModel.embed(texts); }
// 批量嵌入 public EmbeddingResponse embedBatch(List<String> texts) { return embeddingModel.call(texts); }}参数映射关系
| OpenAI API 参数 | Spring AI 配置 | 说明 |
|---|---|---|
model | OpenAiEmbeddingOptions.withModel() | 嵌入模型名称 |
input | EmbeddingModel.embed() | 输入文本 |
encoding_format | OpenAiEmbeddingOptions.withEncodingFormat() | 编码格式 |
dimensions | OpenAiEmbeddingOptions.withDimensions() | 嵌入维度 |
user | OpenAiEmbeddingOptions.withUser() | 用户标识 |
4. 图像生成(Images)
OpenAI API
POST https://api.openai.com/v1/images/generations{ "model": "dall-e-3", "prompt": "一只可爱的猫", "n": 1, "size": "1024x1024", "quality": "standard", "response_format": "url", "style": "vivid"}Spring AI 对应
// 配置@Configurationpublic class ImageConfig {
@Bean public OpenAiImageModel openAiImageModel() { return new OpenAiImageModel( new OpenAiApi("your-api-key", "https://api.openai.com"), OpenAiImageOptions.builder() .withModel("dall-e-3") .withN(1) .withSize("1024x1024") .withQuality("standard") .withResponseFormat("url") .withStyle("vivid") .withUser("spring-ai-app") .build() ); }}
// 使用@Servicepublic class ImageService {
private final OpenAiImageModel imageModel;
public ImageResponse generateImage(String prompt) { return imageModel.call(prompt); }
// 生成多张图片 public ImageResponse generateImages(String prompt, int count) { return imageModel.call(OpenAiImagePrompt.builder() .withPrompt(prompt) .withN(count) .build()); }}参数映射关系
| OpenAI API 参数 | Spring AI 配置 | 说明 |
|---|---|---|
model | OpenAiImageOptions.withModel() | 图像模型名称 |
prompt | ImageModel.call() | 图像描述 |
n | OpenAiImageOptions.withN() | 生成数量 (1-10) |
size | OpenAiImageOptions.withSize() | 图像尺寸 |
quality | OpenAiImageOptions.withQuality() | 图像质量 |
response_format | OpenAiImageOptions.withResponseFormat() | 响应格式 |
style | OpenAiImageOptions.withStyle() | 图像风格 |
user | OpenAiImageOptions.withUser() | 用户标识 |
5. 音频转录(Audio Transcriptions)
OpenAI API
POST https://api.openai.com/v1/audio/transcriptions-F file="@audio.mp3"-F model="whisper-1"-F language="zh"-F response_format="json"-F temperature=0.0Spring AI 对应
// 配置@Configurationpublic class AudioConfig {
@Bean public OpenAiAudioTranscriptionModel openAiAudioTranscriptionModel() { return new OpenAiAudioTranscriptionModel( new OpenAiApi("your-api-key", "https://api.openai.com"), OpenAiAudioTranscriptionOptions.builder() .withModel("whisper-1") .withLanguage("zh") .withResponseFormat("json") .withTemperature(0.0f) .withTimestampGranularities(Arrays.asList("word", "segment")) .withUser("spring-ai-app") .build() ); }}
// 使用@Servicepublic class AudioService {
private final OpenAiAudioTranscriptionModel transcriptionModel;
public String transcribe(Resource audioFile) { return transcriptionModel.call(audioFile); }
// 从文件路径转录 public String transcribeFromFile(String filePath) { Resource audioFile = new FileSystemResource(filePath); return transcriptionModel.call(audioFile); }}参数映射关系
| OpenAI API 参数 | Spring AI 配置 | 说明 |
|---|---|---|
model | OpenAiAudioTranscriptionOptions.withModel() | 转录模型 |
file | AudioTranscriptionModel.call() | 音频文件 |
language | OpenAiAudioTranscriptionOptions.withLanguage() | 语言代码 |
response_format | OpenAiAudioTranscriptionOptions.withResponseFormat() | 响应格式 |
temperature | OpenAiAudioTranscriptionOptions.withTemperature() | 温度参数 |
timestamp_granularities | OpenAiAudioTranscriptionOptions.withTimestampGranularities() | 时间戳粒度 |
user | OpenAiAudioTranscriptionOptions.withUser() | 用户标识 |
6. 文本转语音(Text-to-Speech)
OpenAI API
POST https://api.openai.com/v1/audio/speech{ "model": "tts-1", "input": "你好,欢迎使用语音服务!", "voice": "alloy", "response_format": "mp3", "speed": 1.0}Spring AI 对应
// 配置@Configurationpublic class TTSConfig {
@Bean public OpenAiAudioSpeechModel openAiAudioSpeechModel() { return new OpenAiAudioSpeechModel( new OpenAiApi("your-api-key", "https://api.openai.com"), OpenAiAudioSpeechOptions.builder() .withModel("tts-1") .withVoice("alloy") .withResponseFormat("mp3") .withSpeed(1.0f) .withUser("spring-ai-app") .build() ); }}
// 使用@Servicepublic class TTSService {
private final OpenAiAudioSpeechModel speechModel;
public byte[] synthesize(String text) { return speechModel.call(text); }
// 保存为文件 public void synthesizeToFile(String text, String outputPath) { byte[] audioData = speechModel.call(text); try { Files.write(Paths.get(outputPath), audioData); } catch (IOException e) { throw new RuntimeException("保存音频文件失败", e); } }}参数映射关系
| OpenAI API 参数 | Spring AI 配置 | 说明 |
|---|---|---|
model | OpenAiAudioSpeechOptions.withModel() | TTS 模型 |
input | AudioSpeechModel.call() | 输入文本 |
voice | OpenAiAudioSpeechOptions.withVoice() | 语音类型 |
response_format | OpenAiAudioSpeechOptions.withResponseFormat() | 响应格式 |
speed | OpenAiAudioSpeechOptions.withSpeed() | 语速 |
user | OpenAiAudioSpeechOptions.withUser() | 用户标识 |
总结
Spring AI 通过统一的 API 对 OpenAI 的各种接口进行了完整封装,主要对应关系包括:
- ChatClient ↔ Chat Completions API - 聊天对话
- EmbeddingModel ↔ Embeddings API - 文本嵌入
- ImageModel ↔ Images API - 图像生成
- AudioTranscriptionModel ↔ Audio Transcriptions API - 音频转录
- AudioSpeechModel ↔ Text-to-Speech API - 文本转语音
- CompletionModel ↔ Completions API - 文本补全
这种设计使得开发者可以:
- 使用统一的 API 访问不同的 AI 功能
- 轻松切换不同的模型提供商
- 享受 Spring 生态系统的所有优势
- 简化配置和错误处理
- 支持流式处理和异步操作
- 实现复杂的多模态 AI 应用