OpenAI文档翻译——搭建第一个自己的ChatGPT应用

news2025/1/17 2:48:55

这篇主要是讲了重头到位创建一个基于OpenAI API的应用程序的过程,同时给出了Node.js、Python版本的实例代码。应用程序的构建总体来说是很简单的就是一个接口调用,前提是我们需要提供密匙。

如果想要获取更好的结果返回一个是可以给模型提供一些列子从而更好的帮助他理解我们想要干什么,还有一个就是调整参数,来控制生成结果的离散性。示例中给出的模型是通用模型,如果想要针对特定场景给更多的示例进行训练,则可以采用微调模型。目前国内在调用的时候可能要麻烦一些主要是网络问题以及密匙的生成。

在本篇文章中将上一篇中定义的“代币符号”改为了令牌,令牌更符合行业的一个主流称呼,代币符号则可以帮助理解它的作用于含义。

OpenAPI训练出了非常擅长理解和文本生成的语言模型,同通过API的形式给用户提供对这些模型的访问,从而来解决几乎设计任何领域的文本生成任务。

在本篇快速入门教程中你将通过构建一个简单的示例应用程序,来学习日后更复杂场景下使用API的基本概念和技术,他包括:内容生成、摘要、实体分类、情感分析、数据提取、翻译......

模型使用

提示词补全是API的核心,他通过提供一个异常灵活且强大的接口,通过你输入的一些文本或提示,来为你补全对话的上下文。如同你给他输入一个"为一家冰淇淋店写一个标语"他则会回复一个"融化你的心,一个甜蜜的口感"

你可以认为这是一个非常高级的自动补全工具——他会处理你输入的内容从而预测接下来最有可能发生的内容。

(一)一个简单的提示词

假如你想要为一个宠物起一个名字,毫无头绪从零开始的时候他将会是非常难的,而这些OpenAPI可以帮你。首先你需要给他一个提示词来明确你想要干什么。如果你给他的说的是“给我的马起一个名字”与“给我的黑马起一个名字”那么他们得到的结果将会是不一样的,而这一切仅仅是因为一个形容词的改变。设计恰当的提示词本质上就是你如何训练这个“模型”,从而让他告诉你你所想要的结果。

创建好的提示词对于获取一个好的结果是重要的,但是这往往并不能够满足我们的需求。接下来我们尝试设计一些更复杂的提示词:

给一匹超级英雄马起三个名字

这时得到的结果并不是我们想要的,他所给出我们的答案都非常的通用似乎模型并有没识别到我们模型中关于马的这部分。接下来让我们尝试一下让他提出一些更加符合预期的结果。

(二)给模型添加一些示例

在很多时候,告诉模型我们想要的是什么是非常有帮助的。例如我们可以在提示词中给出一些例子可以帮助模型识别出我们提示词中细微的差别。现在我们尝试提交一个包含一些示例的提示词:

给超级英雄的动物起三个名字

动物:猫

名字:Sharpclaw船长,Fluffball探员,不可思议的猫

动物:狗狗

名字:护国公拉夫,神奇犬,狂吠爵士

动物:马

的名字:

这样的输入我们就会容易获得一个符合我们期望的结果。就像上面说的给模型添加我们期望的输出示例,可以帮助模型提供我们正在寻找的名称类型。

(三)调整参数

通过设计合适的提示词来提升输出结果质量并不是唯一的手段,我们也可以通过设置一些相关的参数来控制模型的输入内容,其中一个重要的设置就是temperature,它的值在0到1之间。当为零的时候当我们在一个回话中多次输入相同的提示词时返回的结果也总是相同的或是相似的。但是当我们设置为1那么相同的提示词输入往往就会返回不通的结果。

在使用中应该记得OpenAPI模型主要就是根据前面的提示词来预测后面肯能跟的文本。通过调节temperature,可以控制模型在进行这些预测时的自信度,如果要是值更小甚至为0模型就会认为他前面输出的结果是符合预期的所以后面的输出还会与前面高度相似,甚至一样。当设置的值高甚至为1则重复的输入相同提示词模型会认为前面的输出结果与用户预期较远,所以就会大幅调整输出结果。

构建应用

现在你已经可以很好地构造提示词并设置关键参数,掌握了构建你自己的宠物名字生成器关键技能。这里有一些官方提供的由Node.js/Python实现的示例代码,你可以下载先来来构建自己的应用程序。

(一)Node.js版本

如果要是本地没有Node.js环境,需要先安装一下相关环境。然后从这个仓库中下载或是克隆代码

git clone https://github.com/openai/openai-quickstart-node.git

如果你不习惯用git也可以通过链接直接下载zip格式的压缩包,在程序运行之前我们需要一个API密匙,你可以通过注册账号获得一个。接下来就是解压zip文件,在项目目录下运行下面的指令进行项目初始化引入相关依赖,之后运行程序

npm install npm run dev

项目运行成功之后在你的浏览器中输入本地访问网址http://localhost:3000,你讲看到一个宠物名字生成的页面,到现在整个项目已经运行成功,接下来我们来详细分析一下代码的结构。

在openai-quickstart-node/pages/api 目录下打开generate.js的文件。在文件的底部你会看到一个生成上边我们使用过的提示词。而用户只需要输入他们自己的动物类型,程序将会动态的根据用户输入生成他们所期待的宠物名。

function generatePrompt(animal) {
  const capitalizedAnimal = animal[0].toUpperCase() + animal.slice(1).toLowerCase();
  return `Suggest three names for an animal that is a superhero.

Animal: Cat
Names: Captain Sharpclaw, Agent Fluffball, The Incredible Feline
Animal: Dog
Names: Ruff the Protector, Wonder Canine, Sir Barks-a-Lot
Animal: ${capitalizedAnimal}
Names:`;
}

在genreate.js的第九行,你会看到实际发送请求的代码,如同我们在序言中讲到的在请求的信息中将参数temperature设置为了0.6

const completion = await openai.createCompletion({
  model: "text-davinci-003",
  prompt: generatePrompt(req.body.animal),
  temperature: 0.6,
});

到现在你对如何调用OpenAIP应该对调用OpenAI API接口实现宠物名生成器有了清楚的认识。

(二)Python版本

接下来我们看看Python代码的实现,主要是就是仓库地址以及项目启动存在差异:

git clone https://github.com/openai/openai-quickstart-python.git

代码启动运行的指令:

python -m venv venv
. venv/bin/activate
pip install -r requirements.txt
flask run

关于提示词以及temperature参数的设置与Node.js中都是相似的,也可以通过全局搜索找到相关的代码。

结束语

这些概念和技术将在很大程度上帮助我们构建自己的应用程序。宠物名生成器的示例只演示了可以实现的功能的一小部分!OpenAI API是非常灵活的,几乎可以解决任何语言处理任务,包括内容生成、摘要、语义搜索、主题标记、情感分析等等。要记住的一个限制是,对于大多数模型,在提示和完成之间,单个API请求最多只能处理2048个令牌(大约1500个单词)。

模型收费标准

OpenAI提供不同性能不通收费标准的一些列模型。在本教程中使用的是自然语言处理能力最强的模型text-davinci-003。建议在试用时使用这个模型因为它他提供的结果最为准确、贴合预期。一旦事情运转了起来,你可以关注一些其他的模型看看是否能够更低成本、更低延迟但依旧能实现满足预期的功能。

在单个请求的处理中令牌不能超过模型的最大上下文长度。同通常是2048个令牌或是1500个单词。通常都是以1000个Token为单位进行收费,详细的收费标准可以参考:收费保准

GPT-4模型的收费标准为:

对于更高级的任务,你会需要提供更多的例子或是上线文,而不是上面简单示例那样受限于最大的上线文长度。面对更高级的任务微调模型是一个很好地选择,他可以允许你提供数百甚至上千个示例,以便改模型在特定的领域内产生更好的效果。

为了获取更多的学习灵感,设计不同的任务提示,接下来可以:

  • 阅读指南
  • 探索实例库
  • 动手操作实验
  • 构建你自己的应用程序时牢记使用策略

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9.5 数组的指针和指向数组的指针变量-2

9.5 数组的指针和指向数组的指针变量-2 一.数组名作为函数参数(1)实参和形参都是数组名(2)实参用数组名,形参用指针变量(3)实参和形参都用指针变量,这个和(2)…

Leetcode-day1【80】删除有序数组中的重复项 II

文章目录 80. 删除有序数组中的重复项 II题目解题思路解题思路【学习】双指针 80. 删除有序数组中的重复项 II 题目 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。…

CBAM小陈读paper系列

忘记做笔记了,只能 把看文章的PDF保存下来了

神经网络:Zero2Hero 1

Zero → \to → Hero : 1 实现了一个字符级中文语言模型,数据采用的是开源中文姓名数据集中的一部分,主要内容如下: 字符的预处理 统计频次计算字符对频次矩阵 实现一个简单的先验概率模型 从训练数据中计算字符的先验概率根据先验概率通过…

前端UI框架有哪些|20个优秀免费开源的WEB前端UI框架提高网站开发效率

最近准备学习一下前端UI我也是在网上找了很久最终整理出来了20个不错的前端UI框架网站,大家都知道很多成熟的前端框架可以直接引,学习框架可以提升我们网站的开发速度。有些大型公司的前端或者后端框架都是用自己开发的,对于大部分用户和公司来讲,我们可以用开源免费的前端…

TCP和UDP通信对比

tcp通信流程 服务器: 创建流式套接字 绑定 监听 提取 读写 关闭 客户端: 创建流式套接字 连接 读写 关闭 收发数据: read recv ssize_t recv(int sockfd, void *buf, size_t len, int flags); //flagsMSG_PEEK 读数据不会删除缓冲区的数据 write send ssize_t send(int…

【Paper Note】ViViT: A Video Vision Transformer

ViViT: A Video Vision Transformer AbstractOverview of vision transformer 回顾ViTEmbedding video clips 视频编码方式Uniform frame sampling 均匀采样Tubelet embedding 时空管采样初始化3D卷积代码介绍视频编码输入到模型当中 Transformer Models for VideoSpatio-tempo…

安全测试(linux基线排查)看这一篇就够了

前言部分: 作为一个安全测试人员,在确保WEB应用程序没有漏洞外,应该也需要关注一下主机环境的安全,因为应用程序部署在主机环境提供运行环境,也应当关注一下主机环境的安全。于此,通过学习本次对linux安全加…

香橙派pi5下,debian,docker19.03.9版本runc容器逃逸

在香橙派pi5下,debian,docker19.03.9版本下,安装系统后,启动docker,显示一切正常。 当加入k8s集群以后,可以正常连接到集群,node状态显示为ready。看起来一切正常。不过过一会之后,香橙派节点内存飙升,然后挂掉。重连失败,需要重启后才能重连。且swapoff -a命令执行…

C++之深入解析C++20协程的原理和应用

一、无栈协程成为 C20 协程标准 协程分为无栈协程和有栈协程两种,无栈指可挂起/恢复的函数,有栈协程则相当于用户态线程。有栈协程切换的成本是用户态线程切换的成本,而无栈协程切换的成本则相当于函数调用的成本;无栈协程和线程…

个人写校园点评项目的笔记

目录 ​编辑 1.解决短信登陆--2023.4.14 redis 数据类型 阿里云短信服务 存入redis的key和value 流程 dto的意义 给token设置有效期 拦截器的类没有交给Spring Constants 2.商户查询缓存(不采用SpringCache,而是尝试原理实现) 20…

Spring Cloud Alibab --Seata

事务特性 A(Atomic):原子性,构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失败的情况。 C(Consistency):一致性,在事…

Tarjan算法求割点和桥

先进行一些定义,假设目前有一个无向连通图 割点:某点及其边去掉后,图不再连通 桥:某条边去掉后,图不再联通 tarjan算法求割点 不考虑子结点到父结点的情况 dfn(x) x实际杯访问的时间点 low(x) x通过图可回溯到的最…

22从零开始学Java之你知道return、break与continue的区别吗?

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中,壹哥给大家介绍了while、do-while两种循环结构,并且给大家总结…

KubeSphere 社区双周报 | OpenFunction 支持 Dapr 状态管理 | 2023.03.31-04.13

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2023.03.31-2023.…

测试工具之JMH详解

文章目录 1 JMH1.1 引言1.2 简介1.3 DEMO演示1.3.1 测试项目构建1.3.2 编写性能测试1.3.3 执行测试1.3.4 报告结果 1.4 注解介绍1.4.1 BenchmarkMode1.4.2 Warmup1.4.3 Measurement1.4.4 Threads1.4.5 Fork1.4.6 OutputTimeUnit1.4.7 Benchmark1.4.8 Param1.4.9 Setup1.4.10 Te…

大数据实战 --- 美团外卖平台

目录 开发环境 数据描述 功能需求 数据准备 数据分析 RDD操作 Spark SQL操作 创建Hbase数据表 创建外部表 统计查询 开发环境 HadoopHiveSparkHBase 启动Hadoop:start-all.sh 启动zookeeper:zkServer.sh start 启动Hive: nohup …

Netty中的HttpServerCodec和HttpObjectAggregator

首先使用Netty搭建一个HttpServer,代码如下: public class App {public static boolean useEpoll false;static {String os System.getProperty("os.name");if (Objects.nonNull(os) && os.equalsIgnoreCase("linux") &a…

Git分支篇git branch和git checkout

分支作用 在开发过程中,项目往往由多人协同开发,那么将多人编写的代码汇总到一起就成了一个困难且复杂的工作,另外项目也需要备份和版本迭代,因此不能只有一个版本。因此分支就成为了优秀的解决方案。 分支相互独立,…

C++STL详解(九)--使用红黑树封装实现set和map

文章目录 控制底层红黑树模板参数模板参数中的仿函数map,set中的正向迭代器map,set中的反向迭代器[]下标访问运算符重载map的模拟实现代码map的模拟实现适用map,set容器的底层红黑树代码(修改版本) 控制底层红黑树模板参数 如果我们用一棵KV模型的红黑树同时实现map和set,我们…