
在使用openai微调模型时,开发者常遇到“the model `xxxxx` does not exist”错误。这通常是由于使用了错误的api端点或请求格式。本文将详细阐述不同基础模型(gpt-3与gpt-3.5 turbo)微调后对应的正确api端点(completions api vs. chat completions api)及请求参数(`prompt` vs. `messages`),并提供多种语言的示例代码,帮助开发者有效解决此类问题。
理解微调模型与API端点的匹配
当您在Openai平台对模型进行微调后,虽然通过API列表可以确认该模型确实存在,但在实际调用时仍可能遇到“The model xxxxx does not exist”的错误。这并非模型本身不存在,而是您用于调用该模型的API端点或请求结构不正确,未能与您微调模型的基础类型相匹配。
OpenAI API针对不同类型的模型提供了不同的端点和请求参数:
- Completions API (/v1/completions): 主要用于访问较早的GPT-3系列模型(如text-davinci-003、babbage-002、davinci-002等)及其微调版本。这些模型通常接受一个简单的字符串作为prompt参数。
- Chat Completions API (/v1/chat/completions): 专为GPT-3.5 Turbo及GPT-4等对话模型设计。这些模型通过一个messages数组来处理对话历史,每个消息包含role和content。
核心问题:API端点与模型类型的不匹配
最初,OpenAI的微调功能主要针对GPT-3基础模型(如babbage-002和davinci-002)。这些微调模型必须通过Completions API (/v1/completions) 进行调用,并使用prompt参数。如果尝试使用Chat Completions API (/v1/chat/completions) 和messages参数来调用这些GPT-3微调模型,就会出现“模型不存在”的错误。
重要更新(2023年8月22日): OpenAI已推出GPT-3.5 Turbo的微调功能。这意味着,如果您的微调模型是基于gpt-3.5-turbo训练的,那么它现在可以通过Chat Completions API (/v1/chat/completions) 进行调用,并使用messages参数。
解决方案:根据基础模型选择正确的API端点
解决此问题的关键在于识别您的微调模型所基于的基础模型类型,并据此选择正确的API端点和请求结构。
-
对于基于GPT-3基础模型(如babbage-002, davinci-002)的微调模型:
- API端点: https://api.openai.com/v1/completions
- 请求参数: 使用prompt字段传递您的输入文本。
- 示例:
{ "model": "ft-your-gpt3-model-name", "prompt": "您的输入文本" }
-
对于基于GPT-3.5 Turbo基础模型的微调模型:
- API端点: https://api.openai.com/v1/chat/completions
- 请求参数: 使用messages字段传递对话历史数组。
- 示例:
{ "model": "ft-your-gpt35-turbo-model-name", "messages": [ {"role": "system", "content": "您是一个有帮助的助手。"}, {"role": "user", "content": "您的输入文本"} ] }
您可以通过查询微调作业的详细信息来确定您的fine_tuned_model是基于哪种基础模型。当微调作业成功后,fine_tuned_model字段会显示模型的名称,其前缀或命名约定通常会暗示其基础模型。
示例代码
以下是针对不同场景和编程语言的调用示例。
原始问题中的node.js Axios调用修正(假设为GPT-3微调模型)
如果您的微调模型是在2023年8月GPT-3.5 Turbo微调功能发布之前训练的,或者您确定它是基于GPT-3基础模型,则需要将chat/completions端点更改为completions,并将messages参数更改为prompt。
const API_KEY = "/"; // 替换为您的OpenAI API Key const ORG_ID = "/"; // 替换为您的OpenAI Organization ID const headers = { "Content-Type": "application/json", Authorization: "Bearer " + API_KEY, "OpenAI-Organization": ORG_ID, }; // 假设 ft-modelname 是基于 GPT-3 的微调模型 const res = await axios.post( "https://api.openai.com/v1/completions", // 更改为 completions 端点 { model: "ft-modelname", prompt: "您的输入消息。", // 更改为 prompt 参数 max_tokens: 150 // 可选:设置生成文本的最大长度 }, { headers } ); console.log(res.data.choices[0].text); // Completions API 的响应结构不同
使用OpenAI官方库的通用示例
import os import openai openai.api_key = os.getenv("OPENAI_API_KEY") # 对于基于 GPT-3 的微调模型 # 例如: ft-your-babbage-002-model response_gpt3 = openai.Completion.create( model="ft-your-gpt3-model-name", prompt="这是您的输入文本。", max_tokens=150 ) print(response_gpt3.choices[0].text) # 对于基于 GPT-3.5 Turbo 的微调模型 # 例如: ft-gpt-3.5-turbo-your-model-id response_gpt35_turbo = openai.ChatCompletion.create( model="ft-your-gpt35-turbo-model-name", messages=[ {"role": "system", "content": "你是一个乐于助人的助手。"}, {"role": "user", "content": "这是您的输入文本。"} ], max_tokens=150 ) print(response_gpt35_turbo.choices[0].message.content)
node.js (使用 openai 库)
const { Configuration, OpenAIApi } = require("openai"); const configuration = new Configuration({ apiKey: process.env.OPENAI_API_KEY, }); const openai = new OpenAIApi(configuration); // 对于基于 GPT-3 的微调模型 // 例如: ft-your-babbage-002-model async function callGpt3FineTune() { const response = await openai.createCompletion({ model: "ft-your-gpt3-model-name", prompt: "这是您的输入文本。", max_tokens: 150 }); console.log(response.data.choices[0].text); } // 对于基于 GPT-3.5 Turbo 的微调模型 // 例如: ft-gpt-3.5-turbo-your-model-id async function callGpt35TurboFineTune() { const response = await openai.createChatCompletion({ model: "ft-your-gpt35-turbo-model-name", messages: [ { role: "system", content: "你是一个乐于助人的助手。" }, { role: "user", content: "这是您的输入文本。" } ], max_tokens: 150 }); console.log(response.data.choices[0].message.content); } callGpt3FineTune(); callGpt35TurboFineTune();
# 对于基于 GPT-3 的微调模型 curl https://api.openai.com/v1/completions -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: application/json" -d '{ "model": "ft-your-gpt3-model-name", "prompt": "这是您的输入文本。", "max_tokens": 150 }' # 对于基于 GPT-3.5 Turbo 的微调模型 curl https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: application/json" -d '{ "model": "ft-your-gpt35-turbo-model-name", "messages": [ {"role": "system", "content": "你是一个乐于助人的助手。"}, {"role": "user", "content": "这是您的输入文本。"} ], "max_tokens": 150 }'
OpenAI CLI
# 对于基于 GPT-3 的微调模型 openai api completions.create -m <ft-your-gpt3-model-name> -p "这是您的输入文本。" --max-tokens 150 # 对于基于 GPT-3.5 Turbo 的微调模型 # 注意:CLI 目前对 chat completions 的微调模型调用可能需要特定版本或格式, # 通常直接使用 API 客户端更灵活。以下是一个概念性示例,实际可能需要调整。 # 更好的做法是使用 Python/Node.js 客户端或 cURL。 # openai api chat.completions.create -m <ft-your-gpt35-turbo-model-name> # -M '[{"role": "system", "content": "你是一个乐于助人的助手。"}, {"role": "user", "content": "这是您的输入文本。"}]' # --max-tokens 150
注意事项与总结
- 确认微调模型的基础类型: 在使用微调模型之前,务必确认它是基于GPT-3系列(如babbage-002)还是GPT-3.5 Turbo。这决定了您应该使用哪个API端点和请求参数。
- API端点和参数匹配:
- GPT-3微调模型 → Completions API (/v1/completions) + prompt 参数。
- GPT-3.5 Turbo微调模型 → Chat Completions API (/v1/chat/completions) + messages 参数。
- 响应结构差异: Completions API和Chat Completions API的响应结构不同。Completions API的响应通常在choices[0].text中包含生成内容,而Chat Completions API的响应在choices[0].message.content中。
- 模型名称准确性: 确保您在API请求中使用的微调模型名称与OpenAI平台返回的fine_tuned_model名称完全一致。
通过遵循这些指导原则,您可以避免“模型不存在”的常见错误,并成功地将您的OpenAI微调模型集成到应用程序中。


