相關連結: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)