我有两个与OpenAI完成结果相关的问题。
当我提供500字的内容并提示“修正语法错误”时,以下结果并未返回完整的文本(是标记问题吗?)
第二个问题是当文本中有时出现双引号或单引号时,会干扰JSON格式。因此,我从内容中删除了任何类型的引号(我不确定这是不是最佳解决方案,但我可能更倾向于在JavaScript中而不是PHP中进行操作)。
curl_setopt($ch, CURLOPT_POSTFIELDS, "{\n \"model\": \"text-davinci-001\",\n \"prompt\": \"" . $open_ai_prompt . ":nn" . $content_text . "\",\n \"temperature\": 0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0.0,\n \"presence_penalty\": 0.0\n}");
“message”: “我们无法解析您的请求的JSON主体。(提示:这可能意味着您没有正确使用HTTP库。OpenAI API期望一个JSON负载,但发送的内容不是有效的JSON。”
回答:
关于标记限制
首先,我认为您不了解标记的工作原理:500个单词超过500个标记。使用标记器来计算标记数量。
正如官方OpenAI文章中所述:
根据使用的模型,请求可以使用最多
4097
个标记,共享在提示和完成之间。如果您的提示是4000
个标记,那么您的完成最多可以是97
个标记。目前的限制是一个技术限制,但在限制内通常有创造性的解决问题的方法,例如压缩您的提示,将文本分成更小的部分等。
将text-davinci-001
切换为GPT-3模型,因为其标记限制更高。
关于JSON中的双引号
您可以通过在双引号前使用\
来转义JSON中的双引号,如下所示:
"This is how you can escape \"double quotes\" in JSON."
但是…这更像是一个快速修复。对于适当的解决方案,请参见@ADyson的评论:
不要像那样手动构建您的JSON。创建一个具有正确结构的PHP对象/数组,然后使用
json_encode()
将其转换为有效的JSON,它会自动处理任何需要的转义等,您还可以使用选项来调整输出的某些方面 – 查看PHP文档。
编辑1
您需要将max_tokens
参数设置得更高。否则,输出将比您的输入短。您不会得到完整的修正文本,而是只得到其中的一部分。
编辑2
现在您将max_tokens
参数设置得太高了!如果您设置max_tokens = 5000
,这对于最强大的GPT-3模型(即text-davinci-003
)来说也太多了。提示和完成一起可以是4097
个标记。
如果您查看您收到的错误信息,就可以弄清楚这一点:
"error": {"message": "此模型的最大上下文长度为4097个标记,但您请求了6450个标记(您的提示中有1450个;完成需要5000个)。请减少您的提示或完成长度。"}