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_KEY
Content-Type: application/json

安全最佳实践:

  • 将 API 密钥存储在环境变量中
  • 使用密钥管理服务
  • 定期轮换密钥
  • 监控 API 使用情况

3. 速率限制与计费

速率限制:

  • 基于账户类型和使用情况
  • 按分钟和按天限制
  • 可在账户设置中查看

计费模式:

  • 按使用量计费
  • 不同模型不同价格
  • 按输入和输出标记数计算

第二部分:OpenAI API 接口详解

1. 聊天补全(Chat Completions)

端点: POST https://api.openai.com/v1/chat/completions

用途: 支持多轮对话,适用于构建聊天机器人等应用

请求参数:

参数类型必需说明
modelstring模型名称(如 gpt-4, gpt-3.5-turbo)
messagesarray消息列表
temperaturenumber温度参数(0-2),控制随机性
max_tokensinteger最大生成标记数
top_pnumber核采样参数(0-1)
ninteger生成数量(1-10)
streamboolean是否流式输出
stoparray停止序列
presence_penaltynumber存在惩罚(-2到2)
frequency_penaltynumber频率惩罚(-2到2)
userstring用户标识

消息格式:

{
  "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

用途: 生成或编辑文本,适用于内容创作、代码生成等

请求参数:

参数类型必需说明
modelstring模型名称(如 text-davinci-003)
promptstring/array输入提示
max_tokensinteger最大生成标记数
temperaturenumber温度参数(0-2)
top_pnumber核采样参数(0-1)
ninteger生成数量(1-10)
streamboolean是否流式输出
stoparray停止序列
presence_penaltynumber存在惩罚(-2到2)
frequency_penaltynumber频率惩罚(-2到2)
userstring用户标识

请求示例:

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

用途: 将文本转换为向量表示,适用于语义搜索、推荐系统等

请求参数:

参数类型必需说明
modelstring嵌入模型名称
inputstring/array输入文本
encoding_formatstring编码格式(float, base64)
dimensionsinteger嵌入维度
userstring用户标识

请求示例:

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

用途: 根据文本描述生成图像

请求参数:

参数类型必需说明
modelstring图像模型名称(dall-e-2, dall-e-3)
promptstring图像描述
ninteger生成数量(1-10)
sizestring图像尺寸
qualitystring图像质量(standard, hd)
response_formatstring响应格式(url, b64_json)
stylestring图像风格(vivid, natural)
userstring用户标识

请求示例:

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

用途: 将音频转换为文本

请求参数:

参数类型必需说明
filefile音频文件
modelstring转录模型(whisper-1)
languagestring语言代码
promptstring提示文本
response_formatstring响应格式(json, text, srt, verbose_json, vtt)
temperaturenumber温度参数(0-1)
timestamp_granularitiesarray时间戳粒度

请求示例:

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

用途: 将文本转换为语音

请求参数:

参数类型必需说明
modelstringTTS 模型(tts-1, tts-1-hd)
inputstring输入文本
voicestring语音类型(alloy, echo, fable, onyx, nova, shimmer)
response_formatstring响应格式(mp3, opus, aac, flac)
speednumber语速(0.25-4.0)
userstring用户标识

请求示例:

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 对应

// 配置
@Configuration
public 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);
    }
}

// 使用
@RestController
public 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 配置说明
modelOpenAiChatOptions.withModel()模型名称
messagesPrompt 构建消息列表
temperatureOpenAiChatOptions.withTemperature()温度参数 (0-2)
max_tokensOpenAiChatOptions.withMaxTokens()最大标记数
top_pOpenAiChatOptions.withTopP()核采样参数 (0-1)
streamChatClient.stream()流式输出
stopOpenAiChatOptions.withStop()停止序列
presence_penaltyOpenAiChatOptions.withPresencePenalty()存在惩罚 (-2到2)
frequency_penaltyOpenAiChatOptions.withFrequencyPenalty()频率惩罚 (-2到2)
nOpenAiChatOptions.withN()生成数量
userOpenAiChatOptions.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 对应

// 配置
@Configuration
public 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()
        );
    }
}

// 使用
@Service
public 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 对应

// 配置
@Configuration
public 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()
        );
    }
}

// 使用
@Service
public 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 配置说明
modelOpenAiEmbeddingOptions.withModel()嵌入模型名称
inputEmbeddingModel.embed()输入文本
encoding_formatOpenAiEmbeddingOptions.withEncodingFormat()编码格式
dimensionsOpenAiEmbeddingOptions.withDimensions()嵌入维度
userOpenAiEmbeddingOptions.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 对应

// 配置
@Configuration
public 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()
        );
    }
}

// 使用
@Service
public 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 配置说明
modelOpenAiImageOptions.withModel()图像模型名称
promptImageModel.call()图像描述
nOpenAiImageOptions.withN()生成数量 (1-10)
sizeOpenAiImageOptions.withSize()图像尺寸
qualityOpenAiImageOptions.withQuality()图像质量
response_formatOpenAiImageOptions.withResponseFormat()响应格式
styleOpenAiImageOptions.withStyle()图像风格
userOpenAiImageOptions.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.0

Spring AI 对应

// 配置
@Configuration
public 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()
        );
    }
}

// 使用
@Service
public 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 配置说明
modelOpenAiAudioTranscriptionOptions.withModel()转录模型
fileAudioTranscriptionModel.call()音频文件
languageOpenAiAudioTranscriptionOptions.withLanguage()语言代码
response_formatOpenAiAudioTranscriptionOptions.withResponseFormat()响应格式
temperatureOpenAiAudioTranscriptionOptions.withTemperature()温度参数
timestamp_granularitiesOpenAiAudioTranscriptionOptions.withTimestampGranularities()时间戳粒度
userOpenAiAudioTranscriptionOptions.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 对应

// 配置
@Configuration
public 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()
        );
    }
}

// 使用
@Service
public 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 配置说明
modelOpenAiAudioSpeechOptions.withModel()TTS 模型
inputAudioSpeechModel.call()输入文本
voiceOpenAiAudioSpeechOptions.withVoice()语音类型
response_formatOpenAiAudioSpeechOptions.withResponseFormat()响应格式
speedOpenAiAudioSpeechOptions.withSpeed()语速
userOpenAiAudioSpeechOptions.withUser()用户标识

总结

Spring AI 通过统一的 API 对 OpenAI 的各种接口进行了完整封装,主要对应关系包括:

  1. ChatClientChat Completions API - 聊天对话
  2. EmbeddingModelEmbeddings API - 文本嵌入
  3. ImageModelImages API - 图像生成
  4. AudioTranscriptionModelAudio Transcriptions API - 音频转录
  5. AudioSpeechModelText-to-Speech API - 文本转语音
  6. CompletionModelCompletions API - 文本补全

这种设计使得开发者可以:

  • 使用统一的 API 访问不同的 AI 功能
  • 轻松切换不同的模型提供商
  • 享受 Spring 生态系统的所有优势
  • 简化配置和错误处理
  • 支持流式处理和异步操作
  • 实现复杂的多模态 AI 应用