雜談:不是每個API都叫做OpenAI的API / TALK: Not Every API Is Called OpenAI’s API
最近遇上太多「號稱背後是OpenAI」的大型語言模型API,但實際上並不是「OpenAI的API」的狀況。這種誤解造成實際開發時帶來很大的困擾,我們藉這個機會說明一下吧。
OpenAI的API / OpenAI’s API
https://platform.openai.com/docs/api-reference/introduction
OpenAI API 是一組由 OpenAI 開發的應用程式介面 (API),讓開發人員可以運用 OpenAI 的 AI 模型,像是 GPT、DALL-E、 Text Embedding等,建構自己的應用程式。它提供程式化的存取途徑,讓使用者可以透過程式碼與這些模型互動,進行像是自然語言處理、影像生成等任務。開發人員可以透過 API 傳送請求,並接收模型產生的結果,進而整合到自己的軟體或服務中。
OpenAI API 支援多種程式語言,讓開發人員可以更彈性地整合到自己的開發環境中。一般常見的語法是使用Python的函式庫openai:
import openai
# 設定 API Key
openai.api_key = "your_openai_api_key"
# 發送請求給 GPT-4o
response = openai.ChatCompletion.create(
model="gpt-4o", # 指定使用 GPT-4o
messages=[
{"role": "system", "content": "你是一位專業的 AI 助理。"},
{"role": "user", "content": "請問 OpenAI GPT-4o 的特點是什麼?"}
],
temperature=0.7
)
# 顯示回應
print(response["choices"][0]["message"]["content"])
除此之外,OpenAI API也支援使用curl直接呼叫的方式取用。以下是詢問4o-mini模型的範例:
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "Say this is a test!"}],
"temperature": 0.7
}'
值得注意的是,OpenAI API 與 ChatGPT 等服務有著完全不同的形態。前者API 是一個基礎工具集,其目的是讓開發者能將API結合到自己的專案中來使用OpenAI的模型;而後者 ChatGPT 則是一個功能完整的產品,以網頁或APP的形式呈現給終端使用者取用。
另一個需要注意的是,你可以看到curl指令在用來傳送請求資料的-d裡面設定了model名稱、messages傳送訊息、temperature溫度,而messages又有role跟content等複雜的結構,這就是OpenAI API特有的請求方式,跟一般使用curl來說並不一樣。簡單來說,如果不是使用對應的網址、輸入參數、分析回傳資料的方式來呼叫,那就無法正確OpenAI API。
https://platform.openai.com/docs/api-reference/embeddings/create
除了使用OpenAI的大型語言模型之外,OpenAI API也可以拿來請求各種不同的服務。其中開發RAG最常用到的就是文本嵌入(text embedding)的相關模型。其他細節請查閱OpenAI的API Reference。
OpenAI 相容 API / OpenAI Compatible API
由於OpenAI在大型語言模型領域一直是領頭羊的角色,其他公司或組織開發的 API就會設計成能與 OpenAI 的 API 格式相容,以便讓開發者可以輕鬆地將使用 OpenAI API 所撰寫的程式碼遷移到自家開發的API上。
https://api-docs.deepseek.com/zh-cn/
近期相當熱門的一個例子就是DeekSeek。DeepSeek 設計了與 OpenAI 相容的 API。這表示開發者可以使用 OpenAI SDK 或任何與 OpenAI API 相容的套裝軟體,透過簡單的設定修改,就能存取 DeepSeek API。這大幅降低了開發者使用 DeepSeek AI 模型的門檻,也是普及市佔率的常見做法。
儘管有人會認為DeepSeek製作相容API的做法是抄襲OpenAI,但通常這種涉及「介面」、「規格」或「標準」類型的設計不會納入專利,因為這對市場競爭和推廣都有很大的幫助,而API背後的模型和實際上的服務才是各家展現專利技術的重點。舉個例子來說,多年前IEEE 1394 (FireWire)被蘋果壟斷,使用時就得收一大筆專類費用。另一邊USB本身不收專利費用,使得USB被廣泛採用。而如今已經沒有設備採用IEEE 1394,但USB Type-C成為了歐盟法規的統一充電標準。從歷史的發展可知,開放給眾人使用「介面」、「規格」和「標準」,不僅可以促進科技技術的普及,也能夠有效推廣自家的產品。
https://ollama.com/blog/openai-compatibility
話說回來,使用跟OpenAI相容API的產品可不只是DeekSeek,就連本機運作大型語言模型第一首選的Ollama本身也可以用相容與OpenAI API的方式呼叫。OpenAI的影響力可見一斑。
為什麼要用OpenAI API? / Why Use OpenAI API?
我在開發的過程中,有許多人不斷對此提出疑問:「OpenAI的API明明就可以用curl呼叫,那我這個也能用curl呼叫的API,不就也可以直接使用嗎?」
嗯,顯然的,答案是不行。
現今大部分使用大型語言模型的系統都有相容OpenAI API,而OpenAI API需要用特定的參數跟網址(主要是路徑部分)來存取。如果你用不相容的方式呼叫它,自然就會發生錯誤。上圖就是Dify裡面在OpenAI模型設定用了不相容的API所出現的錯誤。其實也就是讀不到而已。
https://github.com/HKUDS/LightRAG
別說像Dify這種力求能夠相容與大部分模型的系統都沒有對客製化的API有直接支援了,像是LightRAG這種研究型的系統,大多也都是設計只用OpenAI API而已。
https://github.com/fatwang2/dify2openai/blob/main/app.js
當然,我知道有人會說,這時候就是拿出設計模式中的「轉接器模式」(adapter pattern),做一個相容於OpenAI API的轉換介面就好了吧?的確,fatwang2也在dify2openai專案中實作了Dify轉換到OpenAI API的做法,實際上也可以使用。
然而,到頭來還是在用OpenAI API,不是嗎?
結語 / In Closing
https://udn.com/news/story/7240/8527483
OpenAI公司因為ChatGPT的盛行而聲名大噪,而取用GPT等模型的OpenAI API也成為軟體開發中常見的重要元件。現今有許多服務都是號稱「背後具有GPT模型等級」,但實際上是用各自開發的服務包裹起來,這並不代表他們的API就能跟OpenAI API畫上等號。
對於開發者來說,OpenAI API的功能不僅僅只是使用大型語言模型來對話,甚至還需要用到檔案上傳的多模態分析、文本嵌入 (text-embedding)、微調(fine-tuning)等多種進階功能。因此,並不是任何一個支援curl的API,都可以當作是OpenAI API來使用。
AI在行銷上的話術已經夠混亂了,作為開發者,還是有必要釐清技術上實作的細節啊。