GPT编程:运行第一个聊天程序

news/2024/5/20 8:40:07 标签: GPT编程, Completion, GPT, OpenAI

环境搭建

很多机器学习框架和类库都是使用Python编写的,OpenAI提供的很多例子也是Python编写的,所以为了方便学习,我们这个教程也使用Python。

Python环境搭建

Python环境搭建有很多种方法,我们这里需要使用 Python 3.10 的环境,如果你已经具备或者自己很清楚怎么搭建,请跳过这个小节。

Anaconda安装

Anaconda 可以简单理解为一个软件包管理器,通过它我们可以方便的管理Python运行环境。

Anaconda 的官方下载地址是:https://www.anaconda.com/download,页面如下图所示:

请注意选择你使用的操作系统,整个安装包有800多M,下载时间取决于你的网路。

Anaconda 的安装比较简单,但是安装中间还需要下载很多程序,所以需要的时间可能会久一点;另外全部安装完毕后,可能会占用5G多的硬盘空间,需要提前预留好。

Anaconda 集成了一些方便的工具,安装完成后,我们可以使用 Anaconda Navigator 来启动它们。在Windows系统下,我们可以在开始菜单中找到这个 Anaconda Navigator,就是下面图片中的这个。

JupyterLab

启动 Anaconda Navigator 后,在右边的应用列表中找到 JupyterLab。

JupyterLab 是一个Web的交互式计算窗口,能在网页中运行Python程序,可以省掉很多麻烦。

启动后,窗口界面如下所示。左边是当前用户的根目录,右边有一些功能入口,我们先不管。

我们在左侧根目录下点击右键创建一个文件夹:gptdemo,名字可以随便起,后边我们的程序都放到这里边。

然后我们双击进入 gptdemo,再点击右键创建一个 Notebook,Notebook 可以记录文字、编写代码并执行。

在左侧文件夹中双击新创建的Notebook,它会在右侧编辑区打开,在工具栏的“Cell Type”中选择“Code”,然后点击工具栏前边的加号(+),Notebook中就会自动创建一个代码Cell,这种Cell既可以运行Python代码,也可以执行各种Shell指令。

安装OpenAI

执行下边的命令,安装openai的python sdk。

pip install --upgrade openai httpx[socks]

这个只需要安装成功一次就行了。

下图是JupyterLab中的命令执行效果演示:

代码演练

下边进入本文的重点,运行一个GPT程序。

在这个程序中,我们还是让 GPT 扮演一个善于出题的小学数学老师。

可以先把下边的代码粘贴到你的开发环境中运行一下,后面我会解释各个参数。

注意替换 api_key,没有的可以去注册一个或者找人购入一个。

from openai import OpenAI

client = OpenAI(api_key='sk-xxx')
stream = client.chat.completions.create(
    messages=[{
        "role": "system", "content": "你是一名数学老师,从事小学数学教育30年,精通设计各种数学考试题"
    },{
        "role": "user", "content": "你是谁?请以json返回"
    }],
    model='gpt-3.5-turbo-1106',
    max_tokens:1024,
    #temperature=0.1,
    top_p=0.3,
    #frequency_penalty=0.5,
    presence_penalty=0.2,
    seed=12345,
    #stop='30年',
    response_format={ "type": "json_object" },
    n=1,
    stream=True
)

for chunk in stream:
    msg = chunk.choices[0].delta.content
    if msg is not None:
        print(msg, end='')

我们需要先创建一个客户端:client = OpenAI(api_key='sk-xxx'),注意替换其中的 api-key。

然后我们使用 client.chat.completions.create 来创建一个聊天 CompletionCompletion这个单词怎么理解呢?这有点类似搜索框中的那种联想输入,我们输入部分字符,它就会生成一组补全的查询词语列表,这个技术叫:Auto Complete。

理解Token

因为很多参数都涉及到Token的概念,所以在开始介绍参数之前,我们先来理解下 Token 这个概念。

在大模型中,模型的输入和输出实际都是Token。Token不是完全对照到单词或者字符的,大模型处理数据时,文本会被切分成单个元素或标记,也就是Token,这些Token可能是单词、字符或单词的一部分。

大模型使用Token而不是直接使用单词或字符的原因主要是效率、灵活性和性能的问题。例如大词汇表会导致模型参数数量剧增,增加内存需求和计算成本,而使用子词可以降低词汇表的大小,特别是含有大量专有名词的语料库,同时子词还可以避免单个字符携带信息可能过少,导致需要处理更长序列才能理解文本的问题。另外子词对于一些语言还具备跨语言表示的能力,子词还可以让模型更好地学习和理解单词的形态变化和复杂的词形构造规则。

比如对于这个句子:I don't like cats.

其拆分后的Token序列可能是:["I", "do", "n't", "like", "cats", "."]

注意,不同的模型可能会采用不同的切分方法。

completion参数

然后我们看下这几个参数:

  • messages:聊天的上下文,里边可以包含多条消息。GPT会针对最后一条消息,结合上下文,生成文本内容。每条消息可以设定role、name、content。
    • role:就是会话中的角色,可以选择:system(系统)、assistant(GPT)、user(用户)
    • name:用来区分同一个角色中的不同人物。
    • content:具体角色发出的消息内容。
  • model:本次会话使用的GPT模型,最新的3.5模型是 gpt-3.5-turbo-1106,训练数据截止2021年9月份,上下文窗口的最大token数为16K;最新的4模型是gpt-4-1106-preview,训练数据截止2023年4月份,上下文窗口的最大token数为128K。
  • max_tokens:本次Completion允许生成的最大token数量,token数量和字符数量实际上不是对等的,不过也可以简单的认为就是字符数量。messages中输入的token数量和生成的token数量不能超过模型上下文窗口的最大token数量。
  • temperature:生成时对token进行采样的温度,取值范围为 0-2 的float,默认值为1。值越小输出越确定,值越大输出越随机,可能会跳出上下文约束,甚至输出不可读的乱七八糟字符。
  • top_p:temperature 的替代方法,称为核采样。取值范围为 0-1 的float,默认值为1。模型考虑具有top_p概率质量的标记的结果,比如 0.1 表示仅考虑概率最大的前10%的token。注意不要同时更改 temperature 和 top_p。
  • frequency_penalty:频率惩罚,用于降低生成重复token的可能性,它基于相关token出现的频率产生影响。取值范围 -2.0 到 2.0 ,默认值为0。一般限制重复时建议设置为0.1-1,强烈限制重复可设置为2,但是生成的质量可能会比较低,负值可用于增加重复。
  • presence_penalty:存在惩罚,也是用于降低生成重复token的可能性,和频率惩罚相比,它跟踪的是相关token有没有出现过至少一次。取值范围 -2.0 到 2.0,默认值为0。一般限制重复时建议设置为0.1-1,强烈限制重复可设置为2,但是生成的质量可能会比较低,负值可用于增加重复。
  • seed:这个参数是为了尽可能的提高输出的确定性。使用相同的种子和相同的其它参数,会尽可能的输出相同的结果。
  • stop:GPT生成文字时,遇到这些字符会停止继续生成。最多4个字符。
  • response_format:生成文本的格式。虽然我们也可以在聊天内容中直接要求以某种格式返回,但是这是没有保障的,也可能返回别的格式,但是如果再加上这个参数,就可以确保生成内容的格式了。
  • n:一次返回几条结果,默认为1。使用时建议设置 stream=false,可以从 choices 中获取多条结果。
  • stream:流式输出与否,一般都采用流式输出,看着比较像真人说话。

看下这个运行效果吧:


以上就是本文的主要内容,GPTBianCheng.html" title=GPT编程>GPT编程是不是挺简单的?!

后续我还会继续分享图片、插件、语音等API的使用方法。

关注萤火架构,加速技术提升!


http://www.niftyadmin.cn/n/5323968.html

相关文章

第 4 章 链表

文章目录 4.1 链表(Linked List)介绍4.2 单链表的应用实例4.3 单链表面试题(新浪、百度、腾讯)4.4 双向链表应用实例4.4.1 双向链表的操作分析和实现4.4.2 课堂作业和思路提示 4.5 单向环形链表应用场景4.6 单向环形链表介绍4.7 Josephu 问题4.8 Josephu 问题的代码实现 4.1 链…

国家注册信息安全专业人员十五类CISP证书

国家注册信息安全专业人员(Certified Information Security Professiona,简称CISP),是面向党政机关、关键信息基础设施运营单位、各类企事业单位和社会组织以及网络与信息安全企业、测评和咨询服务机构等工作的信息安全人员颁发的…

强化学习应用(三):基于Q-learning算法的无人车配送路径规划(提供Python代码)

一、Q-learning算法介绍 Q-learning是一种强化学习算法,用于解决基于环境的决策问题。它通过学习一个Q-table来指导智能体在不同状态下采取最优动作。下面是Q-learning算法的基本步骤: 1. 定义环境:确定问题的状态和动作空间,并…

服务器经常宕机的原因及解决办法

随着如今互联网信息化时代的不断发展,数据存储和传输在各种网络科技面前也显得越来越重要,对于企业来讲,建站之后服务器的安全稳定是至关重要的选择。那么选择一款好用的服务器愈发重要。 当然,不管是多好的服务器提供商&#xff…

uni-app中实现弹幕的滚动效果

在uni-app中实现弹幕的滚动效果&#xff0c;可以通过以下步骤实现&#xff1a; 在页面中创建一个容器&#xff0c;用于显示弹幕内容。可以使用<view>标签或者其他适合的标签作为容器。 使用CSS样式设置容器的位置和样式&#xff0c;例如设置position: fixed使其固定在页…

【spring源码分析】@Conditional的使用以及分析

Conditional Conditional 一、基本信息二、注解描述三、注解源码四、主要功能五、最佳实践 在Bean上使用在Configuration上使用自定义组合注解 六、时序图七、源码分析八、注意事项九、总结 最佳实践总结源码分析总结 一、基本信息 转载自github&#xff0c;在此作为个人备…

《More Effective C++》学习

条款1&#xff1a;仔细区别 pointers 和 references 引用应该被初始化&#xff0c;指针可以不被初始化。不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。指针与引用的另一个重要的不同是指针可以被重新赋值…

java常见面试题:如何使用Java进行单元测试?

单元测试是软件开发中的一个重要环节&#xff0c;它确保每个单独的代码单元都能按照预期工作。以下是如何使用Java进行单元测试的详细说明&#xff1a; JUnit&#xff1a; JUnit是Java中最流行的单元测试框架。首先&#xff0c;添加JUnit依赖到你的项目中。如果你使用Maven&…