GPT应用开发:运行你的第一个聊天程序
本系列文章介绍基于OpenAI GPT API开发应用的方法,适合从零开始,也适合查缺补漏。
本文首先介绍基于聊天API编程的方法。
环境搭建
很多机器学习框架和类库都是使用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 OpenAIclient = 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.contentif 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的使用方法。
如需GPT账号、加入学习陪伴群,推荐加入小册:大模型应用开发 | API 实操
关注萤火架构,加速技术提升!
相关文章:

GPT应用开发:运行你的第一个聊天程序
本系列文章介绍基于OpenAI GPT API开发应用的方法,适合从零开始,也适合查缺补漏。 本文首先介绍基于聊天API编程的方法。 环境搭建 很多机器学习框架和类库都是使用Python编写的,OpenAI提供的很多例子也是Python编写的,所以为了…...

力扣刷MySQL-第一弹(详细解析)
🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页:小小恶斯法克的博客 🎈该系列文章专栏:力扣刷题讲解-MySQL 🍹文章作者技术和水平很有限,如果文中出…...

Xcode 15 for Mac:超越开发的全新起点
作为一名开发人员,你是否正在寻找一款强大而高效的开发工具,来帮助你在Mac上构建出卓越的应用程序?那么,Xcode 15就是你一直在寻找的答案。 Xcode 15是苹果公司最新推出的一款集成开发环境(IDE)࿰…...
2021腾讯、华为前端面试题集(基础篇)
Vue 面试题 生命周期函数面试题 1.什么是 vue 生命周期2.vue 生命周期的作用是什么 3.第一次页面加载会触发哪几个钩子 4.简述每个周期具体适合哪些场景 5.created 和 mounted 的区别 6.vue 获取数据在哪个周期函数 7.请详细说下你对 vue 生命周期的理解? **vue 路由…...

怎么修改或移除WordPress后台仪表盘概览底部的版权信息和主题信息?
前面跟大家分享『WordPress怎么把后台左上角的logo和评论图标移除?』和『WordPress后台底部版权信息“感谢使用 WordPress 进行创作”和版本号怎么修改或删除?』,其实在WordPress后台仪表盘的“概览”底部还有一个WordPress版权信息和所使用的…...

计算机三级(网络技术)——应用题
第一题 61.输出端口S0 (直接连接) RG的输出端口S0与RE的S1接口直接相连构成一个互联网段 对172.0.147.194和172.0.147.193 进行聚合 前三段相同,将第四段分别转换成二进制 11000001 11000010 前6位相同,加上前面三段 共30…...

Node.js基础知识点(四)
本节介绍一下最简单的http服务 一.http 可以使用Node 非常轻松的构建一个web服务器,在 Node 中专门提供了一个核心模块:http http 这个模块的就可以帮你创建编写服务器。 1. 加载 http 核心模块 var http require(http) 2. 使用 http.createServe…...

持久双向通信网络协议-WebSocket-入门案例实现demo
1 介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。 HTTP协议和WebSocket协议对比: HTTP是短连接࿰…...

LV.13 D10 Linux内核移植 学习笔记
具体实验步骤在lv13day10 实验十 一、Linux内核概述 1.1 内核与操作系统 内核 内核是一个操作系统的核心,提供了操作系统最基本的功能,是操作系统工作的基础,决定着整个系统的性能和稳定性 操作系统 操作系统是在内核的基础上添…...
STM32面试体验和题目
目录 一、说一下你之前的工作主要干了什么? 二、stm32有关的知识点 1.stm32的外设有哪一些 2.你的毕业论文的项目里面是怎么设计的 三,C语言的考察 1.写一个结构体(结构体的内容自由发挥) 2.写一个指针型的变量 3.结构体是…...

微软.NET、.NET Framework和.NET Core联系和区别
我是荔园微风,作为一名在IT界整整25年的老兵,看到不少初学者在学习编程语言的过程中如此的痛苦,我决定做点什么,我小时候喜欢看小人书(连环画),在那个没有电视、没有手机的年代,这是…...

Shell脚本同时调用#!/bin/bash和#!/usr/bin/expect
如果你想在一个脚本中同时使用bash和expect,你可以将expect部分嵌入到bash脚本中。以下是一个示例: #!/bin/bash# 设置MySQL服务器地址、端口、用户名和密码 MYSQL_HOST"localhost" MYSQL_PORT"3306" MYSQL_USER"your_usernam…...

C++ Webserver从零开始:基础知识(一)——Linux网络编程基础API
目录 前言 一.socket地址API 1.主机字节序和网络字节序 2.通用socket地址 3.专用socket地址 二.创建socket 三.绑定socket(命名socket) 四.监听socket 五.接受连接(服务端) 六.发起连接(客户端) 七.关闭连接…...

cookie和session的工作过程和作用:弥补http无状态的不足
cookie是客户端浏览器保存服务端数据的一种机制。当通过浏览器去访问服务端时,服务端可以把状态数据以key-value的形式写入到cookie中,存储到浏览器。浏览器下次去服务服务端时,就可以把这些状态数据携带给服务器端,服务器端可以根…...

【蓝桥杯选拔赛真题30】C++字母转换 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析
目录 C/C++字母转换 一、题目要求 1、编程实现 2、输入输出...
资产负债表#通俗易懂
资产负债表(the Balance Sheet)亦称财务状况表,表示企业在一定日期(通常为各会计期末)的财务状况(即资产、负债和业主权益的状况)的主要会计报表。 (99 封私信 / 11 条消息) 能通俗易懂的给小白…...
PCF8563转STM32 RTC避坑指南
问题一,时间读取错误 原因,读写时间必须Time在前,Date在后 HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BCD); HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BCD); HAL_RTC_SetTime(&hrtc, &time, RTC_FORMAT_BCD); …...

前端重置密码报错记录
昨天晚上,我写了重置密码的前端,测试的时候报错 今天上午,我继续试图解决这个问题,我仔细检查了一遍,前端没有问题 可以正常接收输入的数据并且提交 但是后端接收到的数据为空,后端接口也没有问题 但后端收…...
css3的过度效果transition支持哪些属性,Transition 所支持的css属性
transition-property是用来指定当元素其中一个属性改变时执行transition效果: 所支持的属性类型如下: 名称描述属性color: 通过红、绿、蓝和透明度组件变换(每个数值处理) 如: background-color, border-color, color, outline-co…...

JAVAEE初阶 文件IO(一)
这里写目录标题 一. 计算机中存储数据的设备1.1 CPU1.2 内存1.3 硬盘1.4 三种存储的区别 二.文件系统2.1 相对路径2.2 绝对路径2.3 .和..的含义2.4 例子2.5 everything工具 三.文件3.1 文本文件3.2 二进制文件 四. JAVA对于文件的API4.1 getParent getName getPath getAbsolute…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...