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

环境搭建

很多机器学习框架和类库都是使用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 来创建一个聊天 Completion。Completion这个单词怎么理解呢?这有点类似搜索框中的那种联想输入,我们输入部分字符,它就会生成一组补全的查询词语列表,这个技术叫: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:流式输出与否,一般都采用流式输出,看着比较像真人说话。

看下这个运行效果吧:


以上就是本文的主要内容,GPT编程是不是挺简单的?!

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/319742.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅谈对Mybatis的理解

一、Mybatis的概述 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,由谷歌托管,并且改名为MyBatis 。2013年11月迁移到Github。 MyBatis是支持普通SQL查询,存储过程和高级映射的优…

ssm基于Web的课堂管理系统设计与实现论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

数据库(1)

目录 1.什么是数据库 1.1.数据 1.2.数据库 1.3 常见数据库 1.3.1 关系型数据库 1.3.2 非关系型数据库 2.mysql概述 ​编辑 **3.MySQL本地仓库安装 在Linux端操作 4.MySQL网络安装 **方法一:RPM捆绑包 下载安装RPM捆绑包: 在windows端操作&a…

开箱即用的企业级前后端分离【.NET Core6.0 Api + Vue 2.x + RBAC】权限框架-Blog.Core

前言 今天要给大家推荐一个开箱即用的企业级前后端分离【.NET Core6.0 Api Vue 2.x RBAC】权限框架(提高生产效率,快速开发就选它):Blog.Core。 推荐原因 Blog.Core通过详细的文章和视频讲解,将知识点各个击破&…

element表格数据,表头上(下)角标,html字符串渲染

1. 问题描述 在动态渲染的element表格中&#xff0c;表头和表中数据是一个含有html的字符串&#xff0c;需要渲染 2. 效果 3. 代码 const columns ref([{ text: 差值<sub>-3</sub> / 10<sup>-6</sup>℃<sup>-1</sup>, value: aallowEr…

三菱FX系列PLC定长切割控制(线缆裁切)

三菱PLC绝对定位指令DDRVA实现往复运动控制详细介绍请查看下面文章链接&#xff1a; https://rxxw-control.blog.csdn.net/article/details/135570157https://rxxw-control.blog.csdn.net/article/details/135570157这篇博客我们介绍线缆行业的定长切割控制相关算法。 未完待…

Xmind 网页端登录及多端同步

好久没用 Xmind 了&#xff0c;前几天登录网页端突然发现没办法登录了&#xff0c;总是跳转到 Xmind AI 页面。本以为他们不再支持网页端了&#xff0c;后来看提示才知道只是迁移到了新的网址&#xff0c;由原来的 xmind.works 现在改成了的 xmind.ai。又花费好长时间才重新登录…

Vue3 移动端自适应方案postcss-px-to-viewport

我的环境 依赖名版本pnpm8.14.0Node16.20.1Vue3.3Vite5.0.8 一、安装 pnpm install postcss-px-to-viewport1.1.1 --save-dev 二、配置 vite.config.ts import postcsspxtoviewport from postcss-px-to-viewportexport default defineConfig({css: {postcss: {plugins: [p…

【HarmonyOS】网络数据请求连接与数据持久化操作

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

QT获取程序编译时间与当前时间的区别及应用场景

一.获取编译时间与当前时间的区别 1.编译日期时间&#xff1a;这个信息通常用于标识某个源代码文件或整个应用程序的编译时间&#xff0c;程序一旦编译出来不会再改变&#xff0c;通常用于记录或跟踪代码的版本和更改历史。 2.运行当前日期时间&#xff1a;这是指程序在运行时…

ssm基于web的电影购票系统+vue论文

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统电影购票信息管理难度大&#xff0c;容错率低&#xff0c…

NI PXIe-6386国产替代,8路AI(16位,14 MS/s/ch),2路A​O,24路DIO,PXI多功能I/O模块

PXIe-6386 PXIe&#xff0c;8路AI&#xff08;16位&#xff0c;14 MS/s/ch&#xff09;&#xff0c;2路A​O&#xff0c;24路DIO&#xff0c;PXI多功能I/O模块 PXIe-6386是一款同步采样的多功能DAQ设备。该模块提供了模拟 I/O、数字I/O、四个32位计数器和模拟和数字触发。板载N…

【Linux】 系统目录结构

进入到根目录 cd /ls目录名具体作用/存放系统系统相关的目录文件/boot放置linux系统内核文件和启动时用到的一些引导文件/home包含linux系统上各用户的主目录&#xff0c;子目录名称默认以该用户名命名/root系统管理员root的家目录/bin包含常用的命令文件&#xff08;如ls 等&a…

JVM内存区域详解,一文弄懂JVM内存【内存分布、回收算法、垃圾回收器】

视频讲解地址 学习文档 一、内存区域 区域描述线程私有如何溢出程序计数器为了线程切换后能恢复到正确的执行位置&#xff0c;每个线程都要有一个独立的程序计数器。✅唯一一个不会内存溢出的地方虚拟机栈1. 每个方法执行的时候&#xff0c;Java虚拟机都会同步创建一个栈帧用于…

基于springboot+vue2的课程教学考试系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

MySQL分库分表

一、基本信息 1、作用 主要解决两个瓶颈&#xff1a; IO瓶颈CPU瓶颈 2、拆分方式 垂直分库&#xff1a;将一个数据库的表拆分到不同的数据库中&#xff0c;例如&#xff1a;A库有user表和sku表&#xff0c;将这两个表分别拆分到B库和C库&#xff0c;每个数据库的表和数据都不一…

java实现教务管理系统

git地址&#xff1a;https://gitee.com/myshort-term/school-management 1.系统简介 开发教务管理系统程序&#xff0c;设计了ems&#xff08;EMSApp&#xff09;、dao&#xff08;AssignmentDAO、CourseDAO、DeptDAO、ScoreDAO、UserDAO、EmailDAO&#xff09;、domain&#…

SpringFramework实战指南(二)

SpringFramework实战指南&#xff08;二&#xff09; 2.1 Spring 和 SpringFramework概念2.2 SpringFramework主要功能模块2.3 SpringFramework 主要优势 2.1 Spring 和 SpringFramework概念 Spring-ioc 广义的 Spring&#xff1a;Spring 技术栈&#xff08;全家桶&#xff0…

杨中科 .NETCORE 异步编程

一、 为什么需要异步编程 异步点餐的优点&#xff1a;能同时服务多个客人 异步点餐一定会提升单个客户点餐速度吗&#xff1f; 答案理所当然&#xff1a;不能 图片美化服务例子服务器能够同时服务的请求数量有限 void BeautifyPic (File photo, Response response) {byte[] …

【洛谷千题详解】P1980 [NOIP2013 普及组] 计数问题

#include<bits/stdc.h> using namespace std; int main() {int n,x,ans0;cin>>n>>x;for(int i1;i<n;i){int numberi;while(number){int anumber%10;number/10;if(ax) ans;}}cout<<ans<<endl;return 0; }