0. 背景
不知道大家在使用 OpenAI API 的过程中有没有遇到过类似的问题:同一个Prompt,在ChatGPT界面中使用,返回的结果非常好,但是将Prompt放到API中调用,经常会返回“抱歉,我无法满足您的要求”,或一些不符合预期的结果。
如下面的例子:
使用ChatGPT界面,返回了预期的结果。
而使用 OpenAI API,返回的却是:“抱歉,我无法完成您的要求”
1. 问题原因及解决办法
1.1 原因1
通过API方式的调用,Prompt实际上是一个字符串,这与直接使用界面不同,你不知道ChatGPT界面背后是怎么处理这个字符串的。
1.1.1 原因解析
来看看API方式调用时,代码中Prompt的样子:
Prompt模板代码:
prompt = f""" 你需要根据给定的任务思考出一系列Tasks,以此来保证能够一步一步地实现该任务的目标。任务为: {self.objective}. """ prompt += """ Return one task per line in your response. The result must be a numbered list in the format: #. First task #. Second task The number of each entry must be followed by a period. If your list is empty, write "There are no tasks to add at this time." Unless your list is empty, do not include any headers before your numbered list or follow your numbered list with any other output. OUTPUT IN CHINESE """
它产生的实际Prompt字符串:
'\n 你需要根据给定的任务思考出一系列Tasks,以此来保证能够一步一步地实现该任务的目标。任务为: 历史上的今天发生了什么?.\n \n Return one task per line in your response. The result must be a numbered list in the format:\n\n #. First task\n #. Second task\n\n The number of each entry must be followed by a period. If your list is empty, write "There are no tasks to add at this time."\n Unless your list is empty, do not include any headers before your numbered list or follow your numbered list with any other output. \n OUTPUT IN CHINESE\n '
可以看到,产生的Prompt中带入了大量的空格、换行符等特殊字符。以我的测试来看,这些是导致大模型无法正确输出内容的直接原因。
1.1.2 解决方案
在给大模型输入Prompt前,对这个字符串进行处理,去除里面的大量空格,换行符可以保留。
处理代码:
prompt = prompt.replace(' ', '')
注意,replace函数的第一个参数' '
中是两个空格,如果是一个空格,会将英文单词之前的空格也删掉,导致如下的情况:
正确处理后的Prompt应该类似:
这样应该就能让大模型正确返回结果,不再是“抱歉”:
1.2 原因2
除了以上Prompt中可能存在大量干扰性的空格之外,还有个可能的原因是你使用的框架中可能隐藏了隐式的Prompt。
以我使用的MetaGPT为例,它在询问大模型时,除了我这个Prompt,其实还有自己隐式的Prompt,如下图,它每次调用大模型API时,会自动加一个system的Prompt,如果这个Prompt对你的问题有干扰,那也会大模型无法给出正确答案,所以这个system prompt的设置,也需要格外注意。