OpenAI开发系列(六):Completions模型的工作原理及应用实例(开发多轮对话机器人)

本文深入探讨了OpenAI的Completions模型,包括其基本概念、调用方法和关键参数如temperature、presence_penalty的调参实践。通过实例展示了如何使用这些参数实现多轮对话的聊天机器人,强调了参数设置对模型输出质量和风格的影响,并提供了实现这一功能的代码示例。

授权声明: 本文基于九天Hector的原创课程资料创作,已获得其正式授权。
原课程出处:九天Hector的B站主页,感谢九天Hector为学习者带来的宝贵知识。
请尊重原创,转载或引用时,请标明来源。

全文共7000余字,预计阅读时间约15~30分钟 | 满满干货(附代码),建议收藏!

本文目标:理解OpenAI提供的Completions模型类,熟悉其调用方法和调参技巧,通过实现一个多轮对话的聊天机器人,提供一种基于Completions模型开发上层应用的思路。

image-20230814113056663

代码下载点这里

一、 Completions基本概念

对于先进的深度学习模型,它们通常通过大量的文本数据进行训练,掌握语法关系和多种表达风格。在这个基于广泛语义空间的训练过程中,这些模型不仅学习了基本的文本模式,还会经过微调,更好地适应特定的人类意图。当模型作出预测时,其本质是根据给定的输入(或称为提示)来产生对应的文本输出。通常,这样的模型的训练会分为两个主要阶段:

  • 阶段一:预训练

在这个阶段,模型使用大量未标记的文本进行训练,如在线收集的书籍和文章。这一步主要是进行语言模型训练,使模型能预测给定上下文中的下一个单词,从而掌握词汇、语法和基本知识

  • 阶段二:微调

预训练完成后,模型会在特定任务的数据上进行进一步的训练。例如,对于一个问答任务,可以提供成对的问题和答案来调整模型,从而在该任务上达到更好的效果。

OpenAI公司的GPT系列模型在NLP领域中是领先的。它为开发者提供了API接口,允许开发者向模型发送文本提示,并获得模型的响应,意味着开发者可以无需自行训练和部署大型模型,而是直接利用OpenAI的服务

所谓的“Completions”模型实际上是指OpenAI基于其GPT系列模型提供的自动文本补全能力。这种模型不仅可以自动生成和补全文本,还可以回答问题、撰写文章等。此过程,即根据提示生成相应文本的机制,被称为“Completion”。因此,能够执行此功能的模型被称为“Completion模型”。例如,经过RLHF微调后基于text-davinci-002模型的text-davinci-003,就是这样的一个Completion模型。

总的来说:Completions 是 OpenAI 提供的 API,以用来生成文本,Completions API 主要用于补全问题,用户输入一段提示文字,模型按照文字的提示给出对应的输出

二、 Completions模型类

截至目前,OpenAI官网发布的Completions模型类如下:

image-20230717224140771

OpenAI发布的带有"text"标识的A、B、C、D四大类模型都属于Completions模型系列,即GPT-3系列模型。GPT-3.5和GPT-4则被定义为Chat Completions模型

从功能角度来看,Completions模型具有更基础且全面的功能,而且它是唯一一个OpenAI提供微调接口的模型。相反,Chat Completions模型则是一种更专业、更先进的模型。每种模型都有其独特的应用场景。本文先主要讲解Completions模型的参数及用法。

三、 Completion.create API

3.1 参数详解

在OpenAI提供的在线大模型中,所有的Completions模型都需要通过Completion.create进行调用,并在实际调用的过程中通过超参数设置对应的调用模型及模型相关参数。

看下OpenAI官网给出的参数列表:

image-20230717224644862

各参数解释如下:

1

3.2 调用测试

  • Step 1:引入依赖包和加载OPENAI_API_KEY
import os
import openai

openai.api_key = os.getenv("OPENAI_API_KEY")
  • Step 2:调用测试

所有的Completions模型都需要通过Completion.create()函数进行调用,在实际调用的过程中通过超参数设置对应的调用模型及模型相关参数,测试代码如下:

response = openai.Completion.create(
           model="text-davinci-003",
           prompt="This is a test message"
           )

输出结果如下:

image-20230811143158808

如果程序不报错,基本就证明了已经正常调用了,返回结果response包含了text_completion id(completion任务编码)、模型回复结果及本轮调用的资源使用情况,从模型的回复上来看,Completions作为补全模型,会根据输入继续生成后面的内容,也就是从This is a test message – > This is a test message to test how emails work. Depending on the

最简单的调用是仅设置model和prompt参数,也就只有这两个参数是必填的,其中model表示调用的模型,而prompt则表示提示词。

  • Step 3:数据操作

当得到回复后,就可以使用Python做一些基础的操作,首先response是一个OpenAIObject类型对象

image-20230811151305425

  • 提取response中具体返回的文本

image-20230811151426028

  • 提取text对象

image-20230811151507753

需要强调的是:生成式大模型的输出结果往往是不确定且难以复现的。虽然理论上,当temperature设为0时,模型会在每个步骤中始终选择概率最高的下一个token,使得输出变得更加确定和一致。但实际上,由于模型内部计算的精度限制、舍入误差等因素,仍然不能保证输出结果的完全一致性。

除了temperature外,目前OpenAI并没有提供任何额外的可以用于控制结果随机性的参数。top_p尽管可以影响输出结果,但并不能完全控制模型随机性。此外,目前OpenAI的在线大模型也并没有类似机器学习领域的随机数种子的参数设置。因此,就目前的情况而言,控制大语言输出结果使其能够复现,几乎是不可能做到的。

3.3 调参实践

大语言模型是非常复杂的黑箱模型,导致很多时候参数设置导致的结果并不能完全按照理论情况来进行推演,因此需要通过大量的实践,来积累不同参数的使用经验,即掌握不同参数在实际Completion过程中对输出结果的影响。

先来试一下 尝试调整Completion.create的核心参数来观察模型输出结果变化情况

3.3.1 参数n

response = openai.Completion.create(
           model="text-davinci-003",
           prompt="请问什么是机器学习",
           max_tokens=1000,
           n=3
           )
  • 参数n:表示一个提示返回几个Completion

当输入n=3时,就有3个completion返回,如下:

image-20230718085111023

可以这样查看单独的某一个:

response["choices"][0]["text"].strip('?\n\n')

输出如下:

image-20230811152738198

当n不等于1的时候,取结果就采用索引的方式,当输入n=3的时候,response[“choices”][0]就是取第一个Completion的内容,response[“choices”][1]就是取第二个Completion的内容…

将上述过程封装成一个函数,代码如下:

import openai
import json

def get_completion_response(model, prompt, n=1):
    """
    使用OpenAI的API查询并获取响应。

    参数:
    - model (str): 要查询的模型名称,例如 "text-davinci-003"。
    - prompt (str): 用于查询的提示或问题。
    - n (int): 返回响应的数量,默认为1。

    返回:
    - str: 一个包含所有响应的JSON字符串。

    示例:
    result = get_completion_response("text-davinci-003", "请问什么是机器学习", 3)
    print(result)
    """

    # 使用OpenAI的API获得响应
    response = openai.Completion.create(
        model=model,
        prompt=prompt,
        max_tokens=1000,
        n=n
    )

    # 存储处理后的响应文本
    response_texts = []

    # 根据n的大小,依次处理每一个响应的内容
    for i in range(n):
        text = response["choices"][i]["text"].strip('?\n\n')
        print(f"Response {
     
     i + 1}: {
     
     text}")  # 打印内容
        response_texts.append(text)

    # 把返回内容封装在一个Json中
    response_json = json.dumps({
   
   "responses": response_texts}, ensure_ascii=False)
    return response_json

测试一下函数:

# 调用函数示例
model = "text-davinci-003"
prompt = "请问什么是机器学习"
n = 3

# result = get_completion_response(model=model, prompt=prompt, n=n)
# print(result)
get_completion_response(model=model, prompt=prompt, n=n)

看下输出结果:

image-20230811160150625

3.3.2 参数temperature

  • temperature是非常核心且重要的参数,它用于控制模型输出结果随机性的参数。其取值范围在0-2之间,默认值为1,数值越大模型随机性越大

先尝试设置temperature=1.5,调用代码如下:

response = openai.Completion.create(
           model="text-davinci-003",
           prompt="请问什么是机器学习",
           max_tokens=1000,
           n=3</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法小陈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值