OPENAI API应用文档
相关链接:https://platform.openai.com/docs/introduction
1、简介
OpenAI API 几乎可以应用于任何任务。 我们提供一系列具有不同功能和价位的模型,并且能够微调定制模型。
api-reference:https://platform.openai.com/docs/api-reference/introduction
1.1、关键概念
1.1.1、Text generation models
OpenAI 的文本生成模型(通常称为生成预训练 Transformer 或简称“GPT”模型),如 GPT-4 和 GPT-3.5,已经过训练来理解自然和形式语言。 像 GPT-4 这样的模型允许文本输出来响应其输入。 这些模型的输入也称为“提示”。 设计提示本质上是如何“编程”GPT-4 等模型,通常是通过提供说明或一些如何成功完成任务的示例。 GPT-4 等模型可用于多种任务,包括内容或代码生成、摘要、对话、创意写作等。 请阅读我们的介绍性文本生成指南和提示工程指南来了解更多信息。
1.1.2、Assistants
Assistants是指实体,在 OpenAI API 的情况下,它们由 GPT-4 等大型语言模型提供支持,能够为用户执行任务。 这些Assistants根据模型上下文窗口中嵌入的指令进行操作。 他们通常还可以使用允许Assistants执行更复杂任务的工具,例如运行代码或从文件中检索信息。 在我们的 Assistants API 概述中了解有关助手的更多信息。
1.1.3、embedding
embedding是一段数据(例如某些文本)的矢量表示,旨在保留其内容和/或其含义的各个方面。 在某些方面相似的数据块往往比不相关的数据具有更紧密的嵌入。 OpenAI 提供文本嵌入模型,该模型将文本字符串作为输入并生成嵌入向量作为输出。 嵌入对于搜索、聚类、推荐、异常检测、分类等非常有用。 在我们的嵌入指南中阅读有关嵌入的更多信息。
2、快速开始
OpenAI API 为开发人员提供了一个简单的界面,可在其应用程序中创建智能层,并由 OpenAI 最先进的模型提供支持。 Chat Completions 端点为 ChatGPT 提供支持,并提供了一种简单的方法来将文本作为输入并使用 GPT-4 等模型来生成输出。
- 如何设置您的开发环境
- 如何安装最新的 SDK
- OpenAI API 的一些基本概念
- 如何发送您的第一个 API 请求
- 如果您在入门时遇到任何挑战或有疑问,请加入我们的开发者论坛。
2.1、curl
curl https://api.openai.com/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer $OPENAI_API_KEY" -d '{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "system",
"content": "You are a poetic assistant, skilled in explaining complex programming concepts with creative flair."
},
{
"role": "user",
"content": "Compose a poem that explains the concept of recursion in programming."
}
]
}'
2.2、python
from openai import OpenAI
client = OpenAI()
completion = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a poetic assistant, skilled in explaining complex programming concepts with creative flair."},
{"role": "user", "content": "Compose a poem that explains the concept of recursion in programming."}
]
)
print(completion.choices[0].message)
3、model
https://platform.openai.com/docs/models
MODELmodel | DESCRIPTIONdescription |
---|---|
GPT-4 Turbo and GPT-4 | 一组改进 GPT-3.5 的模型,可以理解并生成自然语言或代码 |
GPT-3.5 Turbo | 一组改进 GPT-3.5 的模型,可以理解并生成自然语言或代码 |
DALL·E | 可以在自然语言提示下生成和编辑图像的模型 |
TTS | 一组可以将文本转换为听起来自然的语音的模型 |
Whisper | 可以将音频转换为文本的模型 |
Embeddings | 一组可以将文本转换为数字形式的模型 |
Moderation | 可以检测文本是否敏感或不安全的微调模型 |
4、能力
4.1、文本生成
OpenAI 的文本生成模型(通常称为生成式预训练 Transformer 或大型语言模型)经过训练可以理解自然语言、代码和图像。 这些模型提供文本输出来响应其输入。 这些模型的输入也称为“提示”。 设计提示本质上是如何“编程”大型语言模型,通常是通过提供说明或一些如何成功完成任务的示例。
例子:
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-3.5-turbo",
"messages": [
{
"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."
},
{
"role": "user",
"content": "Where was it played?"
}
]
}'
4.2、函数调用
在 API 调用中,您可以描述函数,并让模型智能地选择输出包含调用一个或多个函数的参数的 JSON 对象。 聊天完成 API 不会调用该函数; 相反,模型会生成 JSON,您可以使用它来调用代码中的函数。
最新模型(gpt-3.5-turbo-0125 和 gpt-4-turbo-preview)经过训练,可以检测何时应调用函数(取决于输入)并使用符合函数签名的 JSON 进行响应 比以前的型号更接近。 这种能力也带来了潜在的风险。
4.2.1、例子
1、调用OpenAI的API时,需要增加functions参数,这个参数是json格式字符串
2、OpenAI会返回一个Json字符串告诉你调用哪个函数,参数是什么。
3、调用第三方接口,使用模型响应调用您的API
curl https://weatherapi.com/...
响应:
{ "temperature": 22, "unit": "celsius", "description": "Sunny" }
4、将响应结果发送给OpenAI进行总结
5、openai进行总结
4.3、Embeddings
curl https://api.openai.com/v1/embeddings \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "The food was delicious and the waiter...",
"model": "text-embedding-ada-002",
"encoding_format": "float"
}'
{
"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
}
}
4.4、微调
https://platform.openai.com/docs/guides/fine-tuning
微调可让您通过 API 提供以下功能,从而更充分地利用可用模型:
比提示更高质量的结果,能够训练超出提示范围的示例,由于提示较短而节省了代币,更低的延迟请求
OpenAI 的文本生成模型已经过大量文本的预训练。 为了有效地使用模型,我们在提示中包含说明,有时还包含几个示例。 使用演示来展示如何执行任务通常称为“小样本学习”。微调通过训练超出提示范围的更多示例来改进小样本学习,让您在大量任务上取得更好的结果。 一旦模型经过微调,您就不需要在提示中提供那么多示例。 这可以节省成本并实现更低延迟的请求。
在较高层面上,微调涉及以下步骤:
- 准备并上传训练数据
- 训练新的微调模型
- 评估结果并根据需要返回步骤 1
- 使用微调模型
微调数据的格式这里就不列举了
4.5、Image generation
Images API 提供了三种与图像交互的方法:
- 根据文本提示从头开始创建图像(DALL·E 3 和 DALL·E 2)
- 根据新的文本提示,通过让模型替换预先存在的图像的某些区域来创建图像的编辑版本(仅限 DALL·E 2)
- 创建现有图像的变体(仅限 DALL·E 2)
4.5.1、生成示例DALL·E 3
curl https://api.openai.com/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "dall-e-3",
"prompt": "a white siamese cat",
"n": 1,
"size": "1024x1024"
}'
from openai import OpenAI
client = OpenAI()
response = client.images.generate(
model="dall-e-3",
prompt="a white siamese cat",
size="1024x1024",
quality="standard",
n=1,
)
image_url = response.data[0].url
PROMPT | GENERATION |
---|---|
A photograph of a white Siamese cat. |
使用response_format 参数,每个图像都可以作为 URL 或 Base64 数据返回。 URL 将在一小时后过期。
4.5.2、edit图像编辑
图像编辑端点也称为“修复”,允许您通过上传图像和指示应替换哪些区域的蒙版来编辑或扩展图像。 蒙版的透明区域指示应编辑图像的位置,并且提示应描述完整的新图像,而不仅仅是擦除的区域。 此端点可以实现类似于我们 DALL·E 预览应用程序中的编辑器的体验。
curl https://api.openai.com/v1/images/edits \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F model="dall-e-2" \
-F image="@sunlit_lounge.png" \
-F mask="@mask.png" \
-F prompt="A sunlit indoor lounge area with a pool containing a flamingo" \
-F n=1 \
-F size="1024x1024"
from openai import OpenAI
client = OpenAI()
response = client.images.edit((
model="dall-e-2",
image=open("sunlit_lounge.png", "rb"),
mask=open("mask.png", "rb"),
prompt="A sunlit indoor lounge area with a pool containing a flamingo",
n=1,
size="1024x1024"
)
image_url = response.data[0].url
上传的图像和蒙版必须都是size<4MB的方形PNG图像,并且尺寸必须相同。 生成输出时不会使用遮罩的非透明区域,因此它们不一定需要像上面的示例一样与原始图像匹配。
4.5.3、variation变体(仅限 DALL·E 2)
图像变体端点允许您生成给定图像的变体。
curl https://api.openai.com/v1/images/variations \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F model="dall-e-2" \
-F image="@corgi_and_cat_paw.png" \
-F n=1 \
-F size="1024x1024"
from openai import OpenAI
client = OpenAI()
response = client.images.create_variation(
model="dall-e-2",
image=open("corgi_and_cat_paw.png", "rb"),
n=1,
size="1024x1024"
)
image_url = response.data[0].url
4.5.4、使用内存中的图像数据
上面指南中的 Python 示例使用 open 函数从磁盘读取图像数据。 在某些情况下,您可能会将图像数据存储在内存中。 以下是使用存储在 BytesIO 对象中的图像数据的 API 调用示例:
from io import BytesIO
from openai import OpenAI
client = OpenAI()
# This is the BytesIO object that contains your image data
byte_stream: BytesIO = [your image data]
byte_array = byte_stream.getvalue()
response = client.images.create_variation(
image=byte_array,
n=1,
model="dall-e-2",
size="1024x1024"
)
4.6、图片识别
Learn how to use GPT-4 to understand images
图像可通过两种主要方式提供给模型:传递图像的链接或直接在请求中传递 base64 编码的图像。 图像可以在用户、系统和助理消息中传递。 目前我们不支持第一条系统消息中的图像,但将来可能会改变。
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-4-turbo",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What’s in this image?"
},
{
"type": "image_url",
"image_url": {
"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
}
}
]
}
],
"max_tokens": 300
}'
import base64
import requests
# OpenAI API Key
api_key = "YOUR_OPENAI_API_KEY"
# Function to encode the image
def encode_image(image_path):
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')
# Path to your image
image_path = "path_to_your_image.jpg"
# Getting the base64 string
base64_image = encode_image(image_path)
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}"
}
payload = {
"model": "gpt-4-turbo",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What’s in this image?"
},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{base64_image}"
}
}
]
}
],
"max_tokens": 300
}
response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)
print(response.json())
4.6.1、多图片识别
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-4-turbo",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What are in these images? Is there any difference between them?"
},
{
"type": "image_url",
"image_url": {
"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
}
},
{
"type": "image_url",
"image_url": {
"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
}
}
]
}
],
"max_tokens": 300
}'
4.6.2、细节
通过控制细节参数(具有低、高或自动三个选项),您可以控制模型如何处理图像并生成其文本理解。 默认情况下,模型将使用自动设置,该设置将查看图像输入尺寸并决定是否应使用低设置或高设置。
low 将启用“低分辨率”模式。 该模型将收到图像的低分辨率 512px x 512px 版本,并以 65 个代币的预算表示该图像。 这使得 API 能够返回更快的响应,并在不需要高细节的用例中消耗更少的输入令牌。
high 将启用“高分辨率”模式,该模式首先允许模型查看低分辨率图像,然后根据输入图像大小将输入图像创建为 512 像素正方形的详细裁剪。 每个详细作物使用两倍的代币预算(65 个代币),总共 129 个代币。
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-4-turbo",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What’s in this image?"
},
{
"type": "image_url",
"image_url": {
"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
"detail": "high"
}
}
]
}
],
"max_tokens": 300
}'
4.7、Text to speech
了解如何将文本转换为逼真的语音
curl https://api.openai.com/v1/audio/speech \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "tts-1",
"input": "Today is a wonderful day to build something people love!",
"voice": "alloy"
}' \
--output speech.mp3
4.8、speech to text
from openai import OpenAI
client = OpenAI()
audio_file= open("/path/to/file/audio.mp3", "rb")
transcription = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file
)
print(transcription.text)