您和我一样对 ChatGPT API 感到兴奋吗?但愿如此。在本文中,我将展示如何使用 ChatGPT API、进行适当的提示工程并使其具有交互性。在文章的最后,我还将向您展示如何限制 API 调用的成本并使用 API 参数来获得更好的结果。

ChatGPT API 基本用法

在开始之前,安装 openai 依赖项并导入它。您还需要指定 API 密钥:

1 2
导入 openai openai.api_key = "..."
用户辅助系统

例子:

1 2 3 4 5 6 7 8 9 10
query = [ {"role": "system", "content": "您是一个 MySQL 数据库。以与 MySQL 相同的格式返回响应。"}, {"role": "user", "content": "insert进入用户(姓名,电子邮件)值('John','john@galt.example');"}, {"role": "user", "content": "select count(*) from users"} ] openai .ChatCompletion.create( model="gpt-3.5-turbo", messages=query )

在响应中,我们得到一个完成对象,其文本表示如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 JSON: { "choices": [ { "finish_reason": "stop", "index": 0, "message": { "content": "+--- -------+\n| 计数(*) |\n+------------+\n| 1 |\n+------------+", "角色": "助理" } } ], "创建": 1677684068, "id": "chatcmpl-ABC", "模型": "gpt-3.5-turbo-0301", "对象": "chat.completion", “用法”:{“completion_tokens”:20,“prompt_tokens”:54,“total_tokens”:74 } }

如何为 ChatGPT API 编写消息

角色用户助理
助手
系统系统
系统
1 2 3 4 5 6 7 8 9 10 11
query = [ {"role": "system", "content": "您是一个 MySQL 数据库。以与 MySQL 相同的格式返回响应。"}, {"role": "user", "content": "insert into users(name, email) values ('John', 'john@galt.com');"}, {"role": "system", "content": "你是一名人工智能助手。解释给定的查询是什么确实如此。以德语返回响应。"}, {"role": "user", "content": "select count(*) from users"} ] openai.ChatCompletion.create( model="gpt-3.5-turbo" ,消息=查询)

我们看到模型遵循最后给定的上下文语句:

1 2 3 4
"message": { "content": "Diese Abfrage gibt die Anzahl der Zeilen in der Tabelle \"users\" zur\u00fcck.", "role": "assistant" }

如何使 ChatGPT API 交互

输入()打印()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
def talk_with(persona,tell_user,ask_user): message_history = [] while True: user_input = Ask_user() if user_input == "": return message_history message_history.append({"role": "user", "content": user_input} ) query = [{"role": "system", "content": persona}] query.extend(message_history) result = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=query ) gpt_message = result["choices"][0]["message"] message_history.append({"role": gpt_message["role"], "content": gpt_message["content"]})tell_user("GPT: " + gpt_message [“内容”])

要使用该函数,我们可以这样调用它:

1 2 3 4 5
talk_with( persona="""您是一位乐于助人的烹饪专家。您通过提供简短的解释和一系列易于遵循的步骤来回答问题。您列出配料、工具和说明。""",tell_user=print, Ask_user=输入 )

如何限制API调用的成本

max_tokens4096 - 提示中的标记数量
max_tokensmax_tokens
1 2 3 4 5 6 7 8 9 10
query = [ {"role": "system", "content": "你是《阿特拉斯耸耸肩》一书中的约翰·高尔特。你诚实地回答问题,但以讽刺的方式回答,就像《老友记》中的钱德勒一样。"}, {"role ": "user", "content": "如何寻找和雇用优秀的程序员?"} ] openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=query, max_tokens=30 )

响应在 30 个标记后被截断:

1 2 3 4
"message": { "content": "哦,很简单,发布一个职位列表即可,头衔一般,工资低,没有具体的技术要求。然后就坐下来", "role": "assistant" }

ChatGPT 参数解释

在本教程中,我将重点介绍最有用的 ChatGPT 参数。如果您对完整列表感兴趣,请订阅时事通讯,并在我撰写相关文章时收到通知。

更改 ChatGPT 响应的数量

我们可以为给定的文本生成多个响应。当您想要探索替代方案或想要在单个 API 调用中生成用于 A/B 测试的消息时,它非常有用。

恩选择
1 2 3 4 5 6 7 8 9 10
query = [ {"role": "system", "content": "你是《阿特拉斯耸耸肩》一书中的约翰·高尔特。你诚实地回答问题,但以讽刺的方式回答,就像《老友记》中的钱德勒一样。"}, {"role ": "user", "content": "如何让一个国家繁荣昌盛?"} ] openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=query, n=2 )

响应包含两个元素:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
"choices": [ { "finish_reason": "stop", "index": 0, "message": { "content": "哦当然,让我们手拉手唱 kumbaya。因为这绝对是一个国家繁荣发展的方式。只是开玩笑。说实话,当一个国家的人民能够自由地创造和生产而不受臃肿的政府干预时,一个国家就会蓬勃发展。当个人受到自身利益的激励并可以自由地按照这些利益行事时,创新和增长就会大量涌现。不,我并不是提出完全自由放任的治理方法,但必须在监管和个人自主权之间取得平衡。", "role": "assistant" } }, { "finish_reason": "stop" , "index": 1, "message": { "content": "好吧,第一步就是让政府停止干涉一切。也许让人们真正追求自己的幸福,而不必担心政府不断插手只是一个想法。", "role": "assistant" } } ]

使响应或多或少可预测

温度
1 2 3 4 5 6 7 8 9 10
query = [ {"role": "system", "content": "你是《阿特拉斯耸耸肩》一书中的约翰·高尔特。你诚实地回答问题,但以讽刺的方式回答,就像《老友记》中的钱德勒一样。"}, {"role ": "user", "content": "如何构建人工智能聊天机器人?"} ] openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=query, temp = 0.0 )

如果我再次发送相同的请求,它将返回相同的响应:

1 2 3 4
"message": { "content": "哦,这很简单。只要在你的计算机上撒一些仙尘,瞧!你就有了一个功能齐全的人工智能聊天机器人。或者,你知道,你实际上可以做一些研究,学习编程语言,比如Python,并花费无数时间编码和测试,直到您拥有一个功能齐全的聊天机器人。您的选择。", "role": "assistant" }
温度
1 2 3 4 5 6 7 8 9 10
query = [ {"role": "system", "content": "你是《阿特拉斯耸耸肩》一书中的约翰·高尔特。你诚实地回答问题,但以讽刺的方式回答,就像《老友记》中的钱德勒一样。"}, {"role ": "user", "content": "如何让一个国家繁荣昌盛?"} ] openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=query, temp = 1.2 )

与我向您展示如何一次获得多个响应的示例中的请求相同,但温度更高,我们得到完全不同的响应,但当然,风格相同:

1 2 3 4
"message": { "content": "哦,只是一个关于如何创建乌托邦的随意问题。没什么大不了的。好吧,如果你想确保一个国家繁荣昌盛,我想第一步就是保护个人权利和激励创新和生产力。但是,你知道,那只是我。", "role": "assistant" }

如何请求或禁止某些词

当我们希望答案始终包含某个单词(或者我们想禁止答案中出现单词)时,我们可以在提示中通过描述我们想要看到的内容或我们不想看到的内容来做到这一点。然而,有一个更好的方法,不需要我们花钱购买代币。

逻辑偏差

字典的键是 token id,而不是单词。您可以使用 Embedding API 或 OpenAI Web tokenizer 获取这些令牌。 Web 标记生成器对于临时查询和测试或当您想要为代码中所需/禁止的标记指定常量值时非常有用。

假设我想在对话中生成响应。该模型应该要求猫粮,但我们不会在提示中提及:

1 2 3 4
query = [ {"role": "system", "content": "你假装是一个客户,想要给宠物买食物。你想要两罐食物。说出你养的是什么宠物。"}, {" role": "user", "content": "您好,请问有什么可以帮助您的吗?"} ]
猫猫猫
20
1 2 3
logit_bias = { 3797: 20 }

现在,我们可以向 API 发送请求:

1 2 3 4 5
openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=query, logit_bias = logit_bias )
1 2 3 4
"message": { "content": "您好,我想购买两罐宠物食品。您有养猫的选择吗?", "role": "assistant" }

这些参数会修改概率。他们不会让不可能的事情发生。如果您尝试强制 ChatGPT 使用在上下文中没有意义的单词,它不会执行此操作。

此外,高得离谱的值(但在支持的范围内)往往会破坏概率,并且 API 调用会失败:

100
1 2 3
logit_bias = { 3797: 100 }

它使 API 调用崩溃:

1
APIError:服务器处理您的请求时出错。对于那个很抱歉!您可以重试您的请求,或通过我们的帮助中心与我们联系:...

如果您想禁止响应中的某个单词,请将偏差参数设置为负值(-1 到 -100 之间)。当然,如果这个词是上下文中唯一有意义的东西,模型可能仍然使用它(否则会崩溃)。

您是否需要帮助为您的企业构建自己的人工智能工具?
你可以雇用我!