OpenAI Completion接口两类问题咨询:返回截断与JSON解析失败
OpenAI Completion接口问题解决方案
问题1:Token长度限制导致请求失败或返回不完整
原因
text-davinci-001模型的最大上下文长度为2049个token,当传入的prompt(含"Fix grammar mistakes")加上待修正内容的总token数超过该限制时,会触发报错:OpenAI GPT-3 API error: "This model's maximum context length is 2049 tokens",同时可能返回不完整结果。
JavaScript解决方案
- 提前计算Token数:使用OpenAI官方的
tiktoken库估算输入内容的token数量,避免超过模型限制import { encoding_for_model } from 'tiktoken'; // 初始化对应模型的编码工具 const encoding = encoding_for_model('text-davinci-001'); const basePrompt = "Fix grammar mistakes:\n\n"; const fullPrompt = basePrompt + contentText; const tokenCount = encoding.encode(fullPrompt).length; encoding.free(); // 释放资源 // 超过限制时截断内容(可根据需求调整截断逻辑) if (tokenCount > 2049) { const baseTokenLength = encoding.encode(basePrompt).length; const availableTokens = 2049 - baseTokenLength; const truncatedContent = encoding.decode(encoding.encode(contentText).slice(0, availableTokens)); fullPrompt = basePrompt + truncatedContent; } - 更换大上下文模型:若内容较长,可改用
gpt-3.5-turbo-instruct模型,其最大上下文长度为4096个token,能容纳更多内容。
问题2:特殊字符破坏JSON格式导致请求失败
原因
手动拼接JSON字符串时,内容中的单引号、双引号等特殊字符会破坏JSON结构,导致接口无法解析请求体,触发报错:"message": "We could not parse the JSON body of your request..."。删除引号会破坏原文语义,并非最优解。
JavaScript解决方案
使用JSON.stringify()自动转义特殊字符:无需手动拼接JSON,直接构造请求体对象,再用JSON.stringify()处理,该方法会自动转义所有特殊字符,确保JSON格式合法。
示例(使用fetch API):
const apiKey = '你的OpenAI API密钥'; const openAiPrompt = "Fix grammar mistakes"; const contentText = '包含"双引号"和\'单引号\'的待修正内容'; const requestBody = { model: "text-davinci-001", prompt: `${openAiPrompt}:\n\n${contentText}`, temperature: 0, top_p: 1.0, frequency_penalty: 0.0, presence_penalty: 0.0 }; fetch('https://api.openai.com/v1/completions', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${apiKey}` }, body: JSON.stringify(requestBody) // 自动转义特殊字符 }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('请求失败:', error));
示例(使用axios):
import axios from 'axios'; const apiKey = '你的OpenAI API密钥'; const openAiPrompt = "Fix grammar mistakes"; const contentText = '包含"双引号"和\'单引号\'的待修正内容'; axios.post('https://api.openai.com/v1/completions', { model: "text-davinci-001", prompt: `${openAiPrompt}:\n\n${contentText}`, temperature: 0, top_p: 1.0, frequency_penalty: 0.0, presence_penalty: 0.0 }, { headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${apiKey}` } }) .then(response => console.log(response.data)) .catch(error => console.error('请求失败:', error));
内容的提问来源于stack exchange,提问作者Mostafa Ezzat
相关产品推荐
相关产品推荐

