在这个快速发展的数字时代,AI 人工智慧已经渐渐成为我们日常生活的一部分。而 OpenAI,作为 AI 研究的机构之一,提供了强大的工具和 LLM 模型,如 GPT-3.5、GPT-4,来帮助我们更好地理解和使用 AI。
在本文中,将以简单明了的方式来说明如何控制 OpenAI 模型的一些关键设定。从生成多样回复的 n 参数,到控制回答长度的 max_tokens ,再到建立词汇黑名单的 stop 参数,以及最后的 temperature 参数,这些都是让 AI 生成的内容更加贴合我们需求的实用工具。让我们一起探索这个令人兴奋的 AI 世界。
如何用 OpenAI 获得多个答案?
使用参数 n 可选择多个答案。
当我们使用 ChatGPT 时,通常我们会得到一个答案。但如果你对这个答案不太满意怎么办?有时候,我们希望能看到不同的答案,从中选择一个最适合的。这时候你需要在答案的下方按下「重新生成」按钮,让 ChatGPT 重新生成一组新的回答。
ChatGPT 的状况
好消息是在 OpenAI,我们可以让它一次给我们好几个答案作为选择。这就是 n 这个参数的作用。通过设置 n 参数,我们可以告诉 OpenAI 一次生成多少个答案。比如说,设置 n = 3 就会一次得到三个不同的答案。
但要注意,这些答案都是针对同一个问题,回答的不同回答,而不是一来一回的连续对话。
如何做?
假设你使用 Python 语言来跟 OpenAI 沟通,可以这样写:
openai<=1.0.0 时
reply = openai.ChatCompletion.create(
model= “gpt-3.5-turbo”,
messages = [{“role”: “user”, “content”: “今天是个晴朗的天气吧”}],
n = 2
)
print(reply)
for choice in reply[“choices”]:
print(choice[“index”], choice[“messages”][“content”])
openai>=1.0.0 时
reply = client.chat.completions.create(
model=”gpt-3.5-turbo”,
messages=[{“role”: “user”, “content”: “今天是个晴朗的天气吧”}],
n=2
)
pprint(reply)
for choice in reply.choices:
print(choice.index, choice.message.content)
这段程序会让 OpenAI 给我们两个不同的回答。我们透过一个 for loop 回圈把这些回答一个一个显示出来。每个回答都有一个编号,从 0 开始。
这样你就可以看到两个不同的答案了。不过,这里必需要记得的一点是,当我们要求更多的答案时,使用的 token 数量也会增加。token 是 OpenAI 计算使用量的单位,所以多个答案意味着可能需要付出更多费用。
如何设定 OpenAI 回答的长度限制?
使用 max_tokens 参数,控制回复内容长度
回答的答案越长,所用到的 token 数越多,连带的费用也会越高。因此,有时候我们在使用 OpenAI 时不希望模型给我们太长的回答,以便于节省成本。这时,我们可以使用一个叫做 max_tokens 的设定来限制回复的长度,控制 token 的使用数量。以下用两个例子说明:
举例 1
比如说,我们只想要一个很短的回答,可以这样设定:
openai<=1.0.0 时
reply = openai.ChatCompletion.create(
model= “gpt-3.5-turbo”,
messages = [{“role”: “user”, “content”: “冬天为何会下雪?”}],
max_tokens = 10
)
print(reply[“choices”][0][“message”][“content”])
print(reply[“choices”][0][“finish_reason”])
print(reply[“usage”][“completion_tokens”])
openai>=1.0.0 时
reply = client.chat.completions.create(
model = “gpt-3.5-turbo”,
messages = [
{“role”:”user”, “content”: “冬天为何会下雪?”}
],
max_tokens = 10
)
print(reply.choices[0].message.content)
print(reply.choices[0].finish_reason)
print(reply.usage.completion_tokens)
这样设定后,OpenAI 只会回答一个很短的句子,大概 10 个词(tokens)左右。显然,这个回答不可能完整,因为 max_tokens 限制了它的长度。我们可以看到 finish_reason 的结果为 length,就可以得知,这次的回答是因为长度受到限制而停止,回答并不完整。
举例 2
还有,我们必须注意不要设定一个太大的 max_tokens 值。例如,gpt-3.5-turbo 模型最多能处理 4097 个 token 。如果设定的 max_tokens 太大,超过这个范围,API 就会出现错误,因为它超出了模型的处理能力。
openai<=1.0.0 时
reply = openai.ChatCompletion.create(
model= “gpt-3.5-turbo”,
messages = [{“role”: “user”, “content”: “冬天为何会下雪?”}],
max_tokens = 4090
)
print(reply[“choices”][0][“message”][“content”])
print(reply[“choices”][0][“finish_reason”])
print(reply[“usage”][“completion_tokens”])
openai>=1.0.0 时
reply = client.chat.completions.create(
model = “gpt-3.5-turbo”,
messages = [
{“role”:”user”, “content”: “冬天为何会下雪?”}
],
max_tokens = 4090
)
print(reply.choices[0].message.content)
print(reply.choices[0].finish_reason)
print(reply.usage.completion_tokens)
执行这个例子,会产生如下的结果。告诉我们这个模型最多只能处理 4097 个 token ,但是我们却设定了超过这个限制的 token 数( This model’s maximum context length is 4097 tokens. However, you requested 4110 tokens (20 in the messages, 4090 in the completion)
总体来说, max_tokens 是一个很有用的设定,可以帮我们控制回答的长度,进而控制用量与成本。反之,由于它的默认值为无限大,若没有特别设定 max_tokens 的话,就没有任何限制。因此要记得,设定得太高或太低都可能会影响回答的质量。
如何设定 OpenAI 模型回答的禁用语?
stop 参数,可建立词汇黑名单
当我们使用 OpenAI 的时候,可能会担心它的回答中出现一些我们不想要的词汇。那么,我们怎么才能避免这种情况呢?这时候,OpenAI 提供我们一个叫做 stop 的参数来设定黑名单。
stop 参数可以让我们指定一些不想让 AI 使用的词汇。默认情况下,这个 list 列表是空的,这也就意味着没有任何词汇被禁止。
我们最多可以在这个列表中设定四个词汇。一旦 AI 在回答中遇到这些词汇时,就会立刻停止回答,并返回目前的结果。以下举例说明:
举例
假如我们不希望回答中出现「好」这个字词,我们可以透过下面方式设定:
openai<=1.0.0 时
reply = openai.ChatCompletion.create(
model= “gpt-3.5-turbo”,
messages = [{“role”: “user”, “content”: “我很好,您好吗?”}],
stop = [“好”]
)
print(reply[“choices”][0][“message”][“content”])
print(reply[“choices”][0][“finish_reason”])
openai>=1.0.0 时
reply = client.chat.completions.create(
model=”gpt-3.5-turbo”,
messages=[{“role”: “user”, “content”: “我很好,您好吗?”}],
stop=[‘好’]
)
print(reply.choices[0].message.content)
print(reply.choices[0].finish_reason)
我们将 stop 参数设定为「好」( stop = [“好”] )。这样一来,如果 AI 的回答中包含了「好」这个字词,它就会立即停止回答。这个功能对于控制 AI 回答的内容非常有用,可以确保不会出现不适当或不想看到的词汇。