【一文系列】一篇文章记载gpt API的运用进程(python版)

“一文系列”方针是仅经过一篇文章来解决一个类别问题,简洁高效,快速获取知识,提升技术。


前言

让咱们开始吧!!!

自然言语处理(NLP)作为人工智能范畴的关键技术之一,正在以迅猛的脚步开展。OpenAI的GPT系列模型一直是NLP范畴的领军者,为咱们带来了许多令人惊叹的发展。也为开发者提供了无与伦比的自然言语处理能力。本文将探讨ChatGPT API的背景,并以python言语为例,依据gpt-3.5-turbo-0613模型进行API调用、小比如、进阶运用等方面的讨论,协助读者能够了解如何运用AI来发明程序开发的新时代。


一、背景介绍

就在前些时刻,openai推出了gpt-3.5-turbo-0613和gpt-3.5-turbo-16k这两款为开发者提供更强大和多样化的自然言语处理模型,在gpt-3.5-turbo模型的基础上进一步缩短了单次拜访的呼应时刻,并扩展了模型的使用规模。

作为大言语模型,gpt的功用远不止进行智能聊天那么简略,假如能够凭借AI的力气来完结咱们日常开发中比较扎手的问题,那才是AI真正能为开发人员进行赋能的价值,依据以上思考,本文将从简略的gpt API运用作为进口,并经过案例来展现gpt模型在NLP范畴的前瞻性含义以及能为开发人员带来的无限或许。

二、gpt API的代码调用

1. 环境预备

(1)python3环境: 本文在进行gpt API的运用上是直接依据python3的openai模块进行的,所以应该确保操作系统中依照了python3环境,python3的装置这儿不再过多陈述,详细的装置办法请参阅python官网。

(2)openai API key: 需求去openai官网上申请API key。

(3)外网拜访条件:openai api的拜访服务现在还没有向国内提供,在进行调用时需求经过技术手段进行科学上网,或是在国外vps服务器上拜访,引荐运用第二种方案,第一种会有被封号的或许。

(4)openai python模块:装置好python3环境后能够运用以下2种命令装置openai模块

运用pip东西

pip3 install openai

运用conda东西

# 需求装置conda环境
conda install openai

2. 环境验证

完结上述的环境预备,就能够上手进行openai模块的调用,能够运用以下代码来验证环境的可用性。

将api key写入环境变量,不引荐以明文方法在代码中呈现

export OPENAI_API_KEY="<OPENAI_API_KEY>"

环境验证代码

import openai
import os
​
# 从环境变量中读取openai api key
openai.api_key = os.getenv('OPENAI_API_KEY')
​
resp = openai.ChatCompletion.create(
  model = 'gpt-3.5-turbo-0613',
  messages = [{'role': 'system', 'content': 'hello'}],
  timeout = 30,
  n = 1
)
print(resp)

当有如下输出后阐明环境验证成功,接下来就能够享受AI带来的趣味了。

【一文系列】一篇文章记录gpt API的使用过程(python版)

3. 简略参数阐明

(1)恳求参数

  1. model: 模型的称号,这儿调用gpt-3.5-turbo-0613模型。
  2. messages: 音讯上下文列表,运用数组表明,数组的元素表明一次会话音讯,其间role特点表明当时会话的人物,包括:systemuserassistant。system表明系统音讯,user表明模型运用者,assistant表明gpt机器人;content特点表明当时会话的内容,未来提交给gpt的提示词便是这个特点。
  3. timeout: 会话超时时刻,单位为秒。
  4. n: 希望gpt给出答复的数目,会影响gpt呼应中的choices数组长度,默以为1,一般运用默认值即可。

(2)呼应参数

  1. choices: gpt模型做出的答复的目标数组,数组长度为恳求参数中的n。choices目标的各个特点如下:
  • finish_reason: 模型关于此次会话完毕的原因,分别为stoplengthmax_tokens,其间stop正常完毕,后边两项分别为是因为达到了最大内容长度和最大token而反常完毕。

  • index: 在choices数组中的索引。

  • message: 会话音讯目标,包括如下特点:

    • content: 音讯内容,即gpt模型给出的答复内容。
    • role: gpt模型所扮演的人物,一般固定为assistant
  1. created: 恳求的时刻戳。

  2. id: 恳求id。

  3. model: 模型称号,与恳求中的model参数一致。

  4. object: 返回的目标类型(例如:chat.completion)

  5. usage: token的运用量,包括:

    • completion_tokens:模型完结会话所运用的token量。
    • prompt_tokens:提示词运用的token量。
    • total_tokens:一共运用的token量,即completion_tokens与prompt_tokens的累加和。

上述列出的是平常开发中最为常用的参数,更多参数请参阅openai官方文档。


三、牛刀小试:运用gpt API完结加法器

完结环境的构建,就能够凭借gpt API进行一些有趣的试验,在这一部分将以完结一个简略的加法器作为切入点,并总结了本人在运用gpt API时的过程和心得。

1. 创立使命提示词

提示词(prompt)在运用gpt这种生成式大言语模型中至关重要,好的提示词能够明晰的让AI理解功用需求,并能够对输入输出格局进行把控。本人在构建提示词时习气从以下方面来考虑:

(1)背景:描绘需求场景,让gpt能够理解咱们的需求。

(2)输入格局:给出咱们提供给gpt的输入格局,并对必要部分进行阐明,让gpt能够更有意图的提早咱们给出的提问。

(3)输出格局:这部分至关重要,在不规矩输出格局时,gpt给出的答复格局是没有规矩的,咱们很难对成果进行意图性提取。因此需求严格规矩gpt的输出格局,这一点就类似于咱们日常的api接口开发,需求对期望成果指定返回格局,关于gpt模型而言道理同理。

(4)示例:关于较为杂乱的需求或许只经过背景的描绘还不满足让gpt所理解,所以需求给出1到多个示例,就类似于咱们在做算法题一样,这样能够让gpt给出的成果更加精准。

(5)要求:给出gpt一些要求去限制其答复,例如反常处理,格局操控等。

(6)使命:明确需求使命,让gpt作为履行引擎来完结咱们的方针需求。

(7)承认:用于承认gpt能否理解咱们的需求,一起也作为模型预处理阶段gpt给咱们的反应,只有经过承认的模型咱们才能够开始之后的交互操作。

依据上述阐明,为了gpt能够完结加法器需求,能够给出类似如下的提示词:

sum.prompt(我习气于将提示词文件命名为.prompt后缀,仅仅为了便利辨认)

-- 背景
加法功用是咱们常用的功用,能够将两个数字进行相加并求和,请依照以下要求完结数字求和的操作。
​
-- 输入格局
\input: [方括号内为数字1], [方括号内为数字2]
(阐明:输入有必要以"\input: "字符串作为最初,后边是两个数字类型参数
​
-- 输出格局
\output: [方括号内为数字1 + 数字2的成果]
(阐明:输出有必要以"\output: "字符串作为最初,后边是输入的两个数字类型的累加和
​
​
-- 示例
   -- 我的输入:
   \input: 1, 2
   -- 你的输出:
   \output: 3-- 要求
   1. 请校验输入格局,不满足输入格局的字符串依照过错状况处理,过错状况请只答复"error"2. 请严格依照输出的格局进行答复;
​
-- 使命
请严格依照上述内容和要求依据我的输入做出相应答复,请只依照输出格局答复,回绝其他描绘性文字。
​
-- 承认
假如了解了上述要求,请只答复”yes“

2. 代码示例

import openai
import os
​
openai.api_key = os.getenv("OPENAI_API_KEY")
​
model_name = 'gpt-3.5-turbo-0613'# 加载提示词文件并获取提示词
with open('./sum.prompt', 'r', encoding='utf-8') as f:
  prompt = f.read()
​
​
def gpt_sum(val1: int, val2: int):
  # 首要给出gpt使命提示词
  messages = [{'role': 'system', 'content': prompt}]
  # 模仿gpt的承认呼应,后续能够直接以user人物给出gpt问题
  messages.append({'role': 'assistant', "content": 'yes'})
  # 以user人物给出gpt问题
  user_input = f"\input: {val1}, {val2}"
  messages.append({'role': 'user', 'content': user_input})
  gpt_resp = openai.ChatCompletion.create(
    model=model_name,
    messages=messages,
    timeout=30
   )
  if gpt_resp.choices and gpt_resp.choices[0]:
    resp_str: str = gpt_resp.choices[0].message.content
    if resp_str and resp_str.startswith('\output: '):
      return int(resp_str[len('\output: '):].strip())
  raise Exception(
    f'Failed to get available response from gpt, resp_str={resp_str}')
​
​
if __name__ == '__main__':
  terminal_input = input("Please give two integers, split by comma: ")
  inputs: list[str] = terminal_input.split(',')
  if len(inputs) < 2:
    raise Exception("Invalid input, Please give two integers, split by comma")
  val1 = int(inputs[0].strip())
  val2 = int(inputs[1].strip())
  print(f"result = {gpt_sum(val1, val2)}")
​

3. 运行并测验

以下是履行成果:


4. 留意点

在试验中测验发现gpt关于输入格局的校验存在误判的状况,一般是会将过错的输入格局理解为正确的,但几乎没有呈现将正确的输入格局理解为过错的状况;别的一般gpt能够将与规矩输入格局相差较大的输入正确判别。以下是对上述观念的测验代码

gpt对与输入格局误判

import openai
import os
​
openai.api_key = os.getenv("OPENAI_API_KEY")
​
model_name = 'gpt-3.5-turbo-0613'
​
​
if __name__ == '__main__':
  # 加载提示词文件并获取提示词
  with open('./sum.prompt', 'r', encoding='utf-8') as f:
    prompt = f.read()
  # 首要给出gpt使命提示词
  messages = [{'role': 'system', 'content': prompt}]
  # 模仿gpt的承认呼应,后续能够直接以user人物给出gpt问题
  messages.append({'role': 'assistant', "content": 'yes'})
  
  # 以下的用户输入不满足提示词格局
  user_input = "2, 3"
  messages.append({'role': 'user', 'content': user_input})
  gpt_resp = openai.ChatCompletion.create(
    model=model_name,
    messages=messages,
    timeout=30
   )
  # gpt仍然将非法的输入格局理解为正确的,并能给出答案
  misjudgement_content= gpt_resp.choices[0].message['content']
  print(misjudgement_content)
  messages.append({'role': 'assistant', 'content': misjudgement_content})
  # 给出一个更加离谱的输入,一般这种状况gpt能够正确给出判别
  messages.append({'role': 'user', 'content': "过错的输入"})
  gpt_resp = openai.ChatCompletion.create(
    model=model_name,
    messages=messages,
    timeout=30
   )
  correct_judgment = gpt_resp.choices[0].message['content']
  # 能够正确给出校验成果
  print(correct_judgment)

成果如下,能够发现gpt关于第一次的user输入未能给出正确的校验:

总结:最好在运用时运用咱们自己的程序对反常输入进行提早校验,避免gpt的误判已经或许对gpt带来的干扰。


四、进阶案例:运用gpt API完结交互式翻译器

有了上述的测验经历,能够运用gpt做一些更加杂乱的测验,毕竟单纯运用gpt作为累加器来说实属大材小用。在这部分将凭借gpt来完结一个终端交互式的翻译器。

实践上这部分的差异首要在于提示词的创立,别的考虑到gpt关于恳求速率会有限制,在恳求时增加了指数退避重试机制,来提高功用的可用。

依照第三部分的过程进行如下的操作:

1. 创立使命提示词

translator.prompt

-- 背景
需求完结将非中文言语(例如:英文、日文、韩文等)翻译成中文的功用。
​
-- 输入格局
{
   ”source": [方括号内是需求被翻译的文字内容,字符串类型]
}
(阐明:输入是json格局,包括一个source特点)
​
-- 输出格局
{
   "success": [方括号内表明此次功用是否成功,值为布尔类型,成功为true, 失败为false]
   "translation": [方括号内是将输入内容翻译为中文的文字内容,字符串类型,当且仅当success为true时有值]
   "reason": [方括号内是过错信息,字符串类型,当且仅当success为false时有值]
}
(阐明:输出是json格局,包括success和translation特点)
​
-- 示例1
   -- 我的输入
   {
     "source": "Try it yourself. It was fun!"
   }
​
   -- 你的答复
   {
     "success": true,
     "translation": "试试看吧,这很有趣!"
   }
-- 示例2
   -- 我的输入
   {
     "source": "楽しみに待っています。"
   }
​
   -- 你的答复
   {
     "success": true,
     "translation": "我正在等待地等待。"
   }
-- 示例3
   -- 我的输入
   {
     "wrong_attr": "wrong attribute"
   }
​
   -- 你的答复
   {
     "success": false,
     "reason": "输入格局过错",
   }
​
-- 要求
   1. 请校验输入格局,不满足输入格局的字符串依照过错状况处理;
   2. 请严格依照输出的json格局进行答复;
​
-- 使命
请严格依照上述内容和要求依据我的输入做出相应答复,请只依照输出内容答复,回绝其他描绘性文字。
​
-- 承认
假如了解了上述要求,请只答复”yes“

2. 代码示例

import jsonpickle
import openai
import os
import time
openai.api_key = os.getenv("OPENAI_API_KEY")
model_name = 'gpt-3.5-turbo-0613'
with open('./translator.prompt', 'r', encoding='utf-8') as f:
    prompt = f.read()
class ChatGpt(object):
    __init_interval = 2
    __max_internal_exponent = 5
    def __init__(self, model: str, messages: list, timeout: int = 30, max_retries: int = 3):
        self.model = model
        self.messages = messages
        self.timeout = timeout
        self.max_retries = max_retries
    def response(self):
        retry_time = 0
        # 进行指数退避重试
        while True:
            try:
                return openai.ChatCompletion.create(
                    model=self.model,
                    messages=self.messages,
                    timeout=self.timeout
                )
            except openai.error.RateLimitError as e:
                interval = self.__init_interval * \
                    (1 << min(self.__max_internal_exponent, retry_time))
                print(
                    f"[warning]: Slepp {interval}s and retry due to rate limitation")
                time.sleep(interval)
                retry_time += 1
def translate(content: str):
    messages = [{'role': 'system', 'content': prompt}]
    messages.append({'role': 'assistant', "content": 'yes'})
    messages.append({'role': 'user', 'content': jsonpickle.encode({
        "source": content
    }, indent=True)})
    gpt = ChatGpt(model=model_name, messages=messages)
    gpt_resp = gpt.response()
    if gpt_resp.choices and gpt_resp.choices[0]:
        resp = gpt_resp.choices[0].message.content
        resp_obj = jsonpickle.decode(resp)
        if True is resp_obj['success']:
            return resp_obj['translation']
        else:
            if False is resp_obj['success'] and resp_obj['reason']:
                raise Exception(resp_obj['reason'])
    return None
if __name__ == '__main__':
    while True:
        source = input("Please input, enter Q to quit: ")
        if source == 'Q':
            print('Bye!')
            break
        print(f">>> {translate(source)}")

3. 运行并测验

以下是履行成果:

【一文系列】一篇文章记录gpt API的使用过程(python版)

上述测验分别运用英文、日文和法文进行了测验,实践发现gpt模型更倾向于欧美言语的翻译,关于其他地区的翻译有时会呈现不太精确的状况,不过能够证明gpt已经能够很好的完好咱们既定的需求了。


总结

一文总结

经过本篇文章,能够协助读者了解ChatGPT API的背景和代码调用方法。一起,咱们探究了API的小比如和进阶运用技巧。ChatGPT API为开发者带来了更多或许性,咱们等待在不同范畴看到更多创新和使用。

最终希望笔者的文章能给大家带来协助,内容方面如有不足之处也希望大家多多给出定见和建议,让咱们共同进步!!!

示例代码地址:gitee