热门推荐
OpenAI接口开发指南
2024-12-20 11:46

OpenAI Api 官方地址为:https://platform.openai.com/docs/api-reference,常用的 OpenAI Api 接口总共分为 4 类:对话类、私有化模型训练类、通用类、图片 & 音频类,其中对话类与私有化模型训练类是最常用的。

这类是最常用也是最核心的接口,用于人机对话。对话类接口又细分为:Chat、Completions。Chat 是指多轮对话Completions 是指单轮对话,主要用于一次性生成一篇文章等,不具备多次对话交互的能力。

Chat(多轮对话

请求地址: POST https://api.openai.com/v1/chat/completions

 

Completions(单轮对话

请求地址:POST https://api.openai.com/v1/completions

示例

 

参数prompt:用户输入的提示词,由于 Completions 是单轮对话,所以不像 Chat 接口 messages 那么复杂

这类是用于构建私有化模型的相关接口。私有化模型构建分为两种方式:Embeddings、Fine-tunes。两个模型这里简单的介绍下

Embeddings,以改变上下文的方式来打造私有化模型,该方式不对 GPT 本身的模型进行调整。

Fine-tunes,基于 GPT 的模型再进行额外的训练,会对 GPT 模型本身的参数进行微调。

Embeddings请求地址:POST https://api.openai.com/v1/embeddings

示例

 

Embedding 建议使用 text-embedding-ada-002,input表示需要向量化的数据

Fine-tunings的接口比较多,这里主要介绍创建 Fine-tunning 的接口。大多数场景下,都会“离线”完成模型训练,然后“在线”实时调用训练后的模型,而“离线”训练更多的是借助 OpenAI 的官方工具。

Fine-tunings 的使用需要有一定的模型训练的技术基础以及经验要求,对于大多数场景来说,Embeddings 的方式会更加容易落地。

请求地址 POST https://api.openai.com/v1/fine-tunes

示例

 

参数说明

  • training_file:需要训练的文件 ID,这个文件 ID 是预先通过通用类-Files接口上传文件后获得的
  • validation_file:验证集的文件 ID,用于验证训练后的模型效果
  • model:主要有:ada、babbage、curie(默认)。ada:模型小,性能差,运行快;babbage:模型中,性能中,运行中;curie:模型大,性能优,运行慢
  • n_epochs:基于训练集的训练次数,1 表示训练一次,2 表示训练两次,训练的越多越容易过拟合,而越少则会出现欠拟合。
  • batch_size:规定模型的每一步训练,会选取训练集中的多少条数据进行。
  • learning_rate_multiplier:学习率,取值范围0到1。你可以认为学习率的值越大,模型学习训练集的过程越快越“不仔细”。如果模型学习训练集的数据太快,容易忽略数据的细节,可能导致优质的数据被忽略;如果模型学习训练集的数据太慢太“仔细”,可能受部分质量差的数据影响,从而影响最终的模型效果
  • prompt_loss_weight:prompt 的权重,取值范围0到1。如果 “prompt_loss_weight” 取值较高,那么在训练过程中模型会更关注于生成与预期响应相符的内容;如果 “prompt_loss_weight” 取值较低,那么模型则更关注于生成与目标内容接近的内容。
  • compute_classification_metrics:这个参数决定了是否在训练过程中计算和跟踪分类任务的性能指标,例如精度(accuracy)、精确度(precision)、召回率(recall)、F1 分数等
  • classification_n_classes:这个参数定义了分类任务中的类别数量。例如,在二分类任务中,classification_n_classes 的值就是 2;在有 10 个不同标签的多分类任务中,它的值就是 10。
  • classification_positive_class:这个参数定义了在二元分类任务中,哪个类别被认为是“正类”。通常,在一个二元分类任务中,我们将其中一个类别标记为“正类”,另一个类别标记为“负类”。例如,在垃圾邮件检测的任务中,垃圾邮件可以被标记为“正类”,非垃圾邮件被标记为“负类”。对于某些性能指标(例如精确度、召回率)的计算,需要知道哪个类别是“正类”
  • classification_betas:这个参数用于设定计算 F-分数(F-beta score)时的 beta 值。F-分数是精确度和召回率的加权调和平均,其中 beta 值决定了精确度和召回率的权重。如果 beta 值大于 1,那么召回率将有更大的权重;如果 beta 值小于 1,那么精确度将有更大的权重。这个参数是一个列表,可以设定多个 beta 值,模型将为每个 beta 值计算一个 F-分数
  • suffix:模型名称的后缀名。如果后缀是 “custom-model-name”,那么生成的模型名称可能会像 ‘ada:ft-your-org:custom-model-name-2022-02-15-04-21-04’ 这样。”

其他接口

获取 Fine-tunes 训练的模型列表

GET https://api.openai.com/v1/fine-tunes

获取某一个模型的详细信息

GET https://api.openai.com/v1/fine-tunes/{fine_tune_id}

取消正在训练的模型

POST https://api.openai.com/v1/fine-tunes/{fine_tune_id}/cancel

获取某一个模型训练过程中的事件

GET https://api.openai.com/v1/fine-tunes/{fine_tune_id}/events

删除一个模型

DELETE https://api.openai.com/v1/models/{model}

获取 Models 列表:GET https://api.openai.com/v1/models

获取 Models 详情

GET https://api.openai.com/v1/models/{model}

Files(上传文件到 GPT

主要用于 Fine-tunings 的训练数据集、验证数据集的上传

示例

 

翻译为Python

 

其他接口

获取文件列表

GET https://api.openai.com/v1/files

获取单个文件描述信息

GET https://api.openai.com/v1/files/{file_id}

获取单个文件内容

GET https://api.openai.com/v1/files/{file_id}/content

文生图:https://api.openai.com/v1/images/generations

示例

 

编辑图:https://api.openai.com/v1/images/edits

示例

 

图变体:https://api.openai.com/v1/images/variations

 

参数

  • n:生成图片数量
  • response_format:返回图片的格式:url 或者 b64_json

Audio(语音转文字):https://api.openai.com/v1/audio/transcriptions

 
 

functions参数属于多轮对话接口的参考,表示模型可能生成JSON输入的函数列表,每个对象的子参数如下

  • name: 名称,必填项,要调用的函数名称。必须由小写字母a-Z,大写字母A-Z,数字0-9,下划线和短横线组成,并且最大长度为64个字符。
  • description: 描述,模型使用该描述来选择何时以及如何调用这个函数。
  • parameters: 该函数接受的参数,以JSON Schema对象的形式描述。

function call:控制模型如何响应函数调用。“none"表示模型不调用函数,而是直接回应给最终用户。“auto"表示模型可以选择在最终用户和调用函数之间进行切换。如果使用{“name”:“my_function”}指定特定的函数,模型将强制调用该函数。当没有函数存在时,默认值为"none”。如果存在函数,默认值为"auto”。

注意:被调用的函数返回值必须为json.

一个 JSON Schema 示例,用于描述一个人的信息

 
  • $schema: 这是 JSON Schema 的元数据字段,用于定义使用的 JSON Schema 规范的版本。
  • type: 指定 JSON 对象应有的数据类型。在这个例子中,它是一个 object。
  • properties: 用于描述 JSON 对象内部属性的规则。它是一个对象,其中每个键都是要描述的属性名,每个值都是该属性应满足的条件。
  • required: 一个数组,列出了哪些字段是必需的。在这个例子中,Name 和 Age 是必需字段。

首先定义数据集

 

得到一段json可以作为大模型的输入。

定义一个准备被大模型调用的函数

 

可以将上面的json计算出年龄总和,下面我们的目标是让大模型能够自动选择这个函数进行计算。

对于上面的函数,functions定义如下

 

函数的返回必须为json,参数定义的JSON Schema表示有一个字符串参数input_json,它是必须字段。

然后我们就可以进行函数调用了

 

可以从结果中提取函数名和传递的参数

 

然后我们通过这个函数名调用该函数,传递这个参数给这个函数

 
 

可以看到已经得到了最终的计算结果。

我们可以自行生成自然语言,也可以交给openai进行进一步处理

 
 
 

前面我们定义完函数之后,还需要编写JSON Schema等定义。是否可以让大模型生成

首先提取函数的文档字符串

 
 

尝试生成

 

两次结果分别为

 

 

使用少量样本提示(Few-Shot prompting)可以提升模型输出的稳定性和准确性。

prompt编程是指利用结构化的数据(如JSON、Markdown、XML)来定义prompt,从而简单、高效的定制能力丰富的AI功能。prompt编程可以让GPT的回答高度可控且稳定。

用一个《育儿师》的例子跟大家讲解prompt编程,先来看看如何用prompt编程来定义育儿师这款AI功能

 

系统模块结构

可以看到,上边的prompt分为三个模块:简介、系统、打招呼。

  • 简介:用于介绍AI功能,这里可以描述功能的名字、用途、作者等,除此之前,你也可以自定一些字段Key来向用户更加详细的介绍你的AI功能。
  • 系统:用于定义你的AI功能的规则,这部分是AI功能的核心系统逻辑
  • 打招呼:规定GPT首次运行时,主动向用户打招呼,并定义打招呼的内容

系统必要模块,其他模块均为可选模块

使用“<>”会自动触发引用,比如示例中的

 
 

用户模块

规范用户的信息输入。这块功能类似表单功能,有必填信息、选填信息等。来看个例子

 

“用户”模块规定了用户需要输入的数据,并且在<系统 规则>里的 101 - 104 定义了相关规则。当然用户模块不是必须的(必填信息、选填信息也同理,当你想对用户的输入进行特殊要求的时候,就可加上该模块。

指令模块

如果我们想通过特殊的指令来与AI功能进行交互,比如:用户想查看一下之前输入的孩子的信息等,就需要我们引入"指令"模块。

我们来看一下"指令"模块的示例

 

可运行的JSON数据

 
 

prompt编程将prompt细分为4个模块:<简介>、<系统>、<用户>、<打招呼>,这就是模块化。<系统>模块进一步细化为3个子模块:<系统 指令>、<系统 返回格式>、<系统 规则>等,这就是总分

模块化,是指将相近的功能放到一个模块中,这样模块内部更加内聚,而模块之间更加低耦,避免功能之间杂糅交叉的现象产生。总分,是指将一个复杂的功进行拆分、细化。将复杂的功能拆分为相对简单的多个子模块,从而降低复杂功能的实现难度。

<系统>的模块化

模块化的一个核心点就是高内聚、低耦合,设计<系统 指令>和<系统 规则>时,容易产生高耦合的场景,例如

 

上边的"规则"并没有内聚到<系统 规则>,而是在<指令 列表 Start/Again>,并且重复,我们应该调整为

 

这样"规则"类的功能定义都放入到了<系统 规则>中更加内聚,且指令只是单纯对<系统 规则>的引用。

<系统 规则>的总分

如果要设计一个功能复杂的<系统 规则>,就需要总分的设计思路了。比如我们可以通过"序号段"来区分规则的类型,再用"子号段"来描述具体的规则,如果"子号段"的内容也过多,可以继续拆分、细化,比如

 
 

利用prompt编程,将GPT定制成具备某种智能能力的AI微服务,系统接入这个AI微服务,就具备了智能的能力。

《AI数学老师》

 

GPT并不是万能的,也有它的不足之处,比如:数学计算、联网、私有信息问答等。那在实际应用中我们可以利用插件的方式来弥补这些不足。之前的课程讲了Function Call,这节课,我们换一种方式,利用prompt编程来实现。

 
 

ChatGPT官方提供了两种训练语料的方式:embedding(嵌入)、Fine-tuning(微调)。

基于embeddings的模型训练在技术层面并没有难度术,因为复杂的部分大模型已经帮我们实现了,我们需要做的主要是以下4步

  1. 自有数据生成向量,存储到向量数据库
  2. 用户提问转成向量,去数据库做数据召回,找到TOPK的数据
  3. 根据用户提问和召回的数据重新组装成prompt
  4. 把组装好的prompt发给ChatGPT,等待响应结果

在OpenAI中,使用Embeddings来表示文本数据,默认的 ada-002 模型会将文本解析为 1536 个维度,以便于模型更好地理解和处理文本。这种方法能够大大提高模型处理文本数据的效率和准确度。

官方地址:https://platform.openai.com/docs/guides/embeddings

嵌入(embedding)是指将高维数据映射为低维表示的过程。在机器学习和自然语言处理中,嵌入通常用于将离散的符号或对象表示为连续的向量空间中的点。

在调用embedding接口的时候需要注意,文本长度不能超过8191个token,如果超过长度需要进行切分。

  • input: 需要计算向量的文本
  • model : 计算向量需要使用的模型,建议使用 text-embedding-ada-002,ada模型是目前最廉价的支持中文最好的模型。
 

结果

 

看一下embedding的长度

 

结果证实是1536 个维度。

向量数据库可参考openai官方给出的列表

https://platform.openai.com/docs/guides/embeddings/how-can-i-retrieve-k-nearest-embedding-vectors-quickly

向量数据库的选项包括

  • Pinecone,一个完全托管的向量数据库
  • Weaviate,一个开源的向量搜索引擎
  • Redis作为一个向量数据库
  • Qdrant,一个向量搜索引擎
  • Milvus,一个为可扩展相似性搜索构建的向量数据库
  • Chroma,一个开源的嵌入式存储
  • Typesense,快速的开源向量搜索
  • Zilliz,由Milvus提供支持的数据基础设施

这里建议选择PostgreSQL作为向量数据库,安装包下载地址:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

Linux平台安装方法:https://www.postgresql.org/download/

Windows安装PostgreSQL只需要不断下一步即可,安装pgvector可能会有点坑。

Windows平台安装pgvector

下载源码包

 

也可以到官网下载:https://pgxn.org/dist/vector/0.5.1/

首先确保已经安装 C++ support in Visual Studio,再用管理员身份运行cmd先执行

 

实际路径根据自己安装的Visual Studio进行调整,可以通过everything搜索vcvars64.bat,得到路径,例如我的电脑是:call “C:Program Files (x86)Microsoft Visual Studio2019BuildToolsVCAuxiliaryBuildvcvars64.bat”

然后进行下载的源码所在文件夹,依次执行如下命令

 

注意:PGROOT根据pg的实际安装路径调整。

全部安装完成后,就可以使用psql登录PostgreSQL,创建数据库和表了

 
 

创建表

 

准备一份makedown文档并处理

 

这份文档经过处理后长度为36424。

对该文档按500长度进行分块切片

 

最终得到73个分块。

下面我们连接PostgreSQL数据库

 

pip install psycopg2即可安装Python客户端

然后我们将每个分块转换为embedding

 

这样就将每个文档分块和对应的embedding存储到PostgreSQL数据库中。训练非常快,最终仅耗时38秒

73/73 [00:38<00:00, 1.92it/s]

训练完成后,我们就可以进行提问,准备的问题是“复盘的目的”,我们将该问题转换为embedding向量

 

然后我们从PostgreSQL数据库查询出相似度达到阈值的对应文档分块,这里我们设置阈值为0.78,最大2个文本块

 

匹配出最相似的文本为

 

然后我们再次提问openai

 
 
 

在OpenAI中,Fine-tuning主要用于提高预训练模型如GPT-3在特定任务上的性能。通过Fine-tuning,模型可以更好地理解和处理新任务的特性,从而得到更好的结果。

官方地址:https://platform.openai.com/docs/guides/fine-tuning

目前可用于fine-tune微调的模型有

注意gpt-3.5-turbo支持上下文连续对话,如果需要实现连续对话可以微调模型。

gpt-3.5-turbo微调的数据输入格式为

 

官方提供的一份toy_chat_fine_tuning 的训练数据集:https://github.com/openai/openai-cookbook/blob/main/examples/data/toy_chat_fine_tuning.jsonl

and 的训练格式为

 

训练数据的有效性可以参考:https://cookbook.openai.com/examples/chat_finetuning_data_prep

下面我们以模型为示例进行演示。

若我们有一个csv文件pre.csv内容如下

 

使用OpenAI 的命令行工具可以将该文件转换为 JSONL 文件,执行

 

工具运行时会提示转换结果是否要添加一些字符

 

最终生成新文件pre_prepared.jsonl,结果为

 

也可以自行编码生成这种格式的文件。

注意:babbage-002和davinci-002模型支持使用这种格式的数据进行训练。对于gpt-3.5-turbo模型支持上下文只能使用如下格式训练

 

首先上传训练集文件

 
 

然后开始微调训练

 

查看模型的训练状态

 
 

其他函数

 

等待16分钟后,微调模型终于训练完成

 
 

测试模型

    以上就是本篇文章【OpenAI接口开发指南】的全部内容了,欢迎阅览 ! 文章地址:https://sicmodule.kub2b.com/quote/9321.html 
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 企库往资讯移动站https://sicmodule.kub2b.com/mobile/,查看更多   
发表评论
0评