当今社会,AI技术的发展进入了爆发期,而其中最为引人注目的就是GPT(Generative Pre-trained Transformer)模型,这一模型凭借其强大的生成能力和智能化让人惊叹,ChatGPT的诞生,也意味着在AI从人工智障到智能的一个巨大的进步。随着GPT-3.5接口的开放,越来越多的开发者可以利用这一接口进行自然语言处理和文本生成等方面的创新应用。本文将介绍GPT-3.5接口的基本特性、应用场景以及相关技术细节,旨在让读者更好地了解GPT-3.5接口的强大功能。本文由chatGPT辅助写作。
什么是GPT以及chatGPT?
GPT(Generative Pre-trained Transformer)是一种基于Transformer架构的自然语言处理模型,由OpenAI公司开发。它的核心思想是在大规模的文本语料库上进行无监督的预训练学习,以此构建一个通用的语言理解模型。这个模型可以用于各种下游任务,如文本分类、摘要生成、对话系统等。
而ChatGPT则是基于GPT模型的一种特定应用,它专注于对话系统领域。ChatGPT通过前期的大规模预训练,在输入对话文本后,可以自动生成与用户对话内容相符合的回复。与传统的对话系统不同,ChatGPT不需要设计特定的规则和逻辑,也不需要对数据进行标记,因为它已经基于海量的数据进行了模型的训练,可以自动学习到语言的各种规律和逻辑关系。通过与用户不断的交互,ChatGPT可以逐渐加深对用户意图和需求的理解,从而更加准确地回答用户问题。
总的来说,GPT和ChatGPT是一种新型的自然语言处理技术,它们利用大数据和先进的算法,可以实现自然、流畅、智能的自然语言交流。这两种技术在各种领域都有广泛的应用前景,包括客服机器人、智能助手、智能家居等等。
GPT以及Open API
两个公共核心参数 (重要)
temperature
用来调整生成模型中文本语言的多样性和随机性的。它会在每一步骤中重新缩放模型中每个单词的概率分布,使得常见的词更有可能被选择,同时也让不太常见的单词出现的可能性更高。较高的temperature值通常会生成更大胆、更具创造性的文本,而较低的temperature值则会基于模型已经学到的内容生成更保守的文本。通常情况下,temperature的取值范围在0到2之间,值越大,生成的结果越随机,值越小,生成的结果越保守。
top_p
用于在生成模型中对概率进行剪枝。它计算一个累积概率分布,并在该分布超过top_p值时立即停止。例如,top_p为0.3表示只有占总概率分布前30%的标记被考虑。这样可以避免输出过于随机和不合适的文本,提高输出的合理性和可控性。
1、chat
地址: api.openai.com/v1/chat/com…
方法: POST
该API主要是用于对话,由于众所周知的原因,我们不能使用OpenAI官网提供的ChatGPT服务,但是我们还是可以在国内的很多网站去使用国内版的ChatGPT的服务,这其实就是基于此API所搭建的服务,请求参数以及响应列表如下: 当然可以,以下是 https://platform.openai.com/docs/api-reference/chat
中 chat
API 的参数列表:
请求参数
参数名称 | 类型 | 是否必填 | 参数说明 |
model |
string | 是 | 要使用的模型名称,截至今天,支持的模型有gpt-4, gpt-4-0314, gpt-4-32k, gpt-4-32k-0314, gpt-3.5-turbo, gpt-3.5-turbo-0301,注意4的模型需要申请权限 |
messages |
array | 是 | 对话的起始文本 |
temperature |
float | 否 | 生成文本的随机度量程度。值越高,则生成结果更随机 |
max_tokens |
int | 否 | 生成文本中最大的 token 数量 |
n |
int | 否 | 生成文本的数量 |
stop |
string | 否 | 生成文本的标志,当生成的文本中出现该标志时,自动停止生成 |
message参数,是最重要的内容,我们看一下官网的案例
[ { "role":"system", "content":"You are a helpful assistant." }, { "role":"user", "content":"Who won the world series in 2020?" }, { "role":"assistant", "content":"The Los Angeles Dodgers won the World Series in 2020." } ]
从案例可以看出message的本质,就是role和conten字段组成的数组。role字段共有三个值,分别是system、user和assistant,system代表的是当前对话中AI的角色设定,案例中的意思是AI扮演的是个很有用的助手,user则代表用户的提问,assistant,则代表助手回答的内容。
你可能想问为什么一个message需要带这么多内容,这里我们回忆一个场景,我们在使用chatGPT的时候,它是可以记住上下文的,秘密就是在这里,其实在ChatGPT的服务端,是不记录每次回答的内容的,而是每次都会把上下文内容带过去,这就是它能记住上下文的原因。这里也有一个特别坑的地方,上下文也会被记录到token数量中,过长的上下文会导致费用上升。关于收费,可以参考文章后面的内容。
response
{ "id": "chatcmpl-123", "object": "chat.completion", "created": 1677652288, "choices": [{ "index": 0, "message": { "role": "assistant", "content": "\n\nHello there, how may I assist you today?", // AI的回答内容 }, "finish_reason": "stop" }], "usage": { "prompt_tokens": 9, // 请求的token长度 "completion_tokens": 12, // 响应的token长度 "total_tokens": 21 // 总长度 } }
2、completion
地址: api.openai.com/v1/completi…
方法: POST
根据用户的提示,来完成任务,主要是文本类型任务。这个和上面的chatAPI不同的是可以使用不同的模型,不同的模型能力不一样,以下是请求参数列表
参数名 | 类型 | 是否必须 | 说明 |
model | string | 是 | 准备使用的模型,这里支持的模型都有text-davinci-003, text-davinci-002, text-curie-001, text-babbage-001, text-ada-001,除过这些还可以使用自己的fine-tunes模型 |
prompt | string | 是 | 需要生成文本的起始文本 |
max_tokens | int | 否 | 生成文本的最大长度。默认为16,最大值为2048。 |
temperature | float | 否 | 控制生成文本的随机程度。默认为1,越高则生成的文本越随机。 |
top_p | float | 否 | 与温度类似,控制生成文本的随机程度。默认为1,越高则生成的文本越随机。 |
n | int | 否 | 指定需要生成的文本的数量。默认为1。 |
stream | bool | 否 | 是否将生成的文本流式返回。默认为False。 |
stop | list of string | 否 | 停止生成文本的标记符号列表。 |
presence_penalty | float | 否 | 控制生成文本的重复程度。默认为0。 |
frequency_penalty | float | 否 | 控制生成文本中特定单词(比如人名)出现的频率。默认为0。 |
best_of | int | 否 | 设定多次调用API后,取结果中最佳的n个结果。默认为1。 |
logprobs | int | 否 | 控制需要返回每个标记符号的日志概率。默认为None。 |
echo | bool | 否 | 是否向生成的文本添加起始文本。默认为True。 |
response
{ "id": "cmpl-uqkvlQyYK7bGYrRHQ0eXlWi7", "object": "text_completion", "created": 1589478378, "model": "text-davinci-003", "choices": [ { "text": "\n\nThis is indeed a test", // AI'的回答 "index": 0, "logprobs": null, "finish_reason": "length" } ], "usage": { "prompt_tokens": 5, //同上 "completion_tokens": 7, "total_tokens": 12 } }
3、edits
方法: POST
这个api通常被用作文本纠错,润色。参数列表如下:
参数名 | 类型 | 是否必须 | 描述 |
model |
string | 是 | 这里支持的模型有text-davinci-edit-001 or code-davinci-edit-001 |
input |
string | 否 | 一个可选的显式提示,将引导API生成特定类型的文本。 |
instruction |
string | 否 | 指令,指的是你要求ai做的事情 |
temperature |
float | 否 | 控制生成本文中的随机性的值。较高的温度会导致更出人意料的文本。默认值为1。 |
top_p |
int | 否 | 生成文本的最大标记数。请注意,每个标记可能包含多个单词。 |
n |
int | 否 | 生成返回的备选文本个数。默认为1。 |
response
{ "object": "edit", "created": 1589478378, "choices": [ { "text": "What day of the week is it?", // AI回复 "index": 0, } ], "usage": { "prompt_tokens": 25, // 同上 "completion_tokens": 32, "total_tokens": 57 } }
4、images
(1)生成Image
地址: api.openai.com/v1/images/g…
方法: POST
参数列表
参数名 | 类型 | 是否必须 | 描述 |
prompt |
string | 是 | 提示,将引导API生成特定类型的图像。 |
n |
int | 否 | 生成图片的数量(最大为10)。默认是1。 |
size |
string | 否 | 要生成的图像的大小,例如:“1024x1024”。默认值是“512x512”。 |
response_format |
string | 否 | 服务器返回文件的格式。可以是:“url”(以URL的形式返回)或“base64”(以base64编码的形式返回)。默认是“url”。 |
user |
int | 否 | 用户唯一标识符,用的很少 |
response
{ "created": 1589478378, "data": [ { "url": "https://..." // 图片地址 }, { "url": "https://..." } ] }
(2)image edit
根据提示编辑图片
地址: api.openai.com/v1/images/e…
方法: POST
参数列表
参数名 | 类型 | 是否必须 | 描述 |
image |
string | 是 | 包含图像数据的对象。目前支持PNG格式,图片必须小于4M |
mask |
string | 否 | 另外一张图片,根据官方解释,这里是指定image中哪些地方呗编辑的(因为不搞图片处理,作者也不太明白的,懂的可以在评论区讨论下)。 |
prompt |
string | 是 | 一个可选的显式提示,将引导API生成特定类型的图像。 |
n |
int | 否 | 生成图片的数量(最大为10)。默认是1。 |
size |
string | 否 | 要生成的图像的大小,例如:“1024x1024”。默认值是“512x512”。 |
response_format |
string | 否 | 服务器返回文件的格式。可以是:“url”(以URL的形式返回)或“base64”(以base64编码的形式返回)。默认是“url”。 |
user |
int | 否 | 用户唯一标识符,用的很少 |
响应同上
5、embeddings
根据给定的输入,计算出一个向量,常被用于搜索,聚合,分类等领域
地址: api.openai.com/v1/embeddin…
方法: POST
参数列表:
参数名 | 类型 | 是否必须 | 描述 |
model |
string | 是 | 这里支持的模型有text-davinci-edit-001 or code-davinci-edit-001 |
input |
string | 否 | 一个可选的显式提示,将引导API生成特定类型的文本。 |
响应
{ "object": "list", "data": [ { "object": "embedding", "embedding": [ 0.0023064255, -0.009327292, .... (1536 floats total for ada-002) -0.0028842222, ], // 向量 "index": 0 } ], "model": "text-embedding-ada-002", "usage": { "prompt_tokens": 8, "total_tokens": 8 } }
官方推荐的计算相似度的函数是余弦相似度函数,比如说用在搜索时,我们先将被搜索的数据都求出上面的向量值,然后再把关键词求出向量,再使用余弦相关函数来对比,如果是专业的搜索,推荐使用向量检索数据库来做。
6、fine-tunes
fine-tunes是深度学习中的一个术语,指的是在已经训练好的模型上,使用新的训练集进行微调,以使其适应新的任务或数据集。这个过程通常会调整模型的参数(例如权重和偏差),以使其能够更好地拟合新的数据,并提高整体性能。这里的API较多,这里只列最重要的两个
(1)上传文件
方法: POST
方法只有两个参数,一个是file,文件格式,另外一个是purpose,字符串类型,代表上传的目的是什么。我们来看一组request和response的示例。 request
{ "file": "mydata.jsonl", // 文件路径 "purpose": "create fine-tunes" }
response
{ "id": "file-XjGxS3KTG0uNmNOK362iJua3", // 文件Id,用于后边创建自己的fine-tunes模型 "object": "file", "bytes": 140, "created_at": 1613779121, "filename": "mydata.jsonl", "purpose": "fine-tune" }
(2)创建fine-tunes
地址:api.openai.com/v1/fine-tun…
方法: POST
参数列表(仅列出常用且重要的)
参数名 | 类型 | 是否必须 | 描述 |
model |
string | 是 | 基于哪个模型去做微调,这里仅支持"ada", "babbage", "curie", "davinci"这四种以及在2022-04-21之后fine-tunes的模型 |
training_file |
string | 否 | 文件ID,即上个API返回值中的ID |
注意,fine-tunes模型的创建,需要一定的时间,一般来说在半个小时以上。
响应
{ "id": "ft-AF1WoRqd3aJAHsqc9NY7iL8F", "object": "fine-tune", "model": "curie", "created_at": 1614807352, "events": [ // 这里是创建fine-tune过程中的事件,如果创建完成,这里也会对应信息 { "object": "fine-tune-event", "created_at": 1614807352, "level": "info", "message": "Job enqueued. Waiting for jobs ahead to complete. Queue number: 0." } ], "fine_tuned_model": null, "hyperparams": { "batch_size": 4, "learning_rate_multiplier": 0.1, "n_epochs": 4, "prompt_loss_weight": 0.1, }, "organization_id": "org-...", "result_files": [], "status": "pending", "validation_files": [], "training_files": [ { "id": "file-XGinujblHPwGLSztz8cPS8XY", "object": "file", "bytes": 1547276, "created_at": 1610062281, "filename": "my-data-train.jsonl", "purpose": "fine-tune-train" } ], "updated_at": 1614807352, }
目前支持的模型
我们可以调用api.openai.com/v1/models 来查看自己可以使用哪些model。下面是各个模型的详细介绍
GPT3.5
模型名称 | 描述 | 最大 token 数 | 训练数据 |
gpt-3.5-turbo | GPT-3.5 家族中最具能力且成本效益最高的模型,针对聊天进行了优化,也适用于传统的语言生成任务。 | 4,096 | 截至2021年9月 |
gpt-3.5-turbo-0301 | 基于 gpt-3.5-turbo 的快照,适用于三个月的支持期限,并不会再更新。 | 4,096 | 截至2021年9月 |
text-davinci-003 | 可以完成任何语言任务,比 curie、babbage 或 ada 模型具有更好的质量、更长的输出和一致的指令跟随,支持在文本中插入自动完成功能。 | 4,097 | 截至2021年6月 |
text-davinci-002 | 具有类似于 text-davinci-003 的功能,但经过有监督的微调而非强化学习进行训练。 | 4,097 | 截至2021年6月 |
code-davinci-002 | 针对代码补全任务进行了优化的模型。 | 8,001 | 截至2021年6月 |
其中,以上模型都是 GPT-3.5 模型,能够理解和生成自然语言或代码。其中 gpt-3.5-turbo 是最具能力且成本效益最高的模型,适用于聊天和传统文本生成任务。text-davinci-003可以完成任何语言任务,并具有更好的质量、更长的输出和一致的指令跟随,同时支持在文本中插入自动完成功能。另外,code-davinci-002这个模型则是针对代码补全任务进行了优化。
GPT4
模型名称 | 描述 | 最大 token 数 | 训练数据 |
gpt-4 | 目前最新的 GPT 模型,支持文本生成和处理。相较于其它 GPT-3.5 模型,GPT-4 在更复杂的推理场景下表现出更高的准确性,并且在聊天优化方面也进行了改进。 | 8,192 | 截至2021年9月 |
gpt-4-0314 | 基于 GPT-4 的快照,不会再更新,并只支持三个月的期限,将于2023年6月14日结束。 | 8,192 | 截至2021年9月 |
gpt-4-32k | 能力与基础的 GPT-4 模型相同,但上下文长度为其 4 倍。将根据最新的模型迭代进行更新。 | 32,768 | 截至2021年9月 |
gpt-4-32k-0314 | 基于 gpt-4-32k 的快照,将不会再更新,并只支持三个月的期限,将于2023年6月14日结束。 | 32,768 | 截至2021年9月 |
虽然对于一些基础的任务而言,GPT-4 与 GPT-3.5 模型之间的差异并不明显,但在更复杂的推理场景下,GPT-4 显得更加强大。需要注意的是,GPT-4 目前处于限制性测试阶段,只有被授权的用户才能够使用。
API Key的申请以及收费
上面每条API都需要通过ApI Key来调用,API key可以在platform.openai.com/account/api… 申请,至于token的计算,可以在OpenAI官网platform.openai.com/tokenizer 来计算。token收费可以参考参考官方这个页面openai.com/pricing 来看。