使用 OpenAI API 開發經驗分享
Note
因 OpenAI 相關技術發展神速,本文有效時間可能不算太長,閱讀後務必要自行再用自身經驗驗證
很久沒寫 Python,但我本來只是想要研究一下 APM (Application Performance Monitoring) 怎麼順利地跑在 AKS 和 ARO 上,然後就不小心就把 Line Bot ft. OpenAI 寫一寫了,既然寫了就順便紀錄一下
TL;DR
- Azure OpenAI Service 和 OpenAI 的 API 呼叫有可能會不一樣,務必要確認
- Error Handling 建議要做,不然你永遠只會收到 500 Internal Server Error
- 私有網路連入方式,唯一選擇 Azure OpenAI Service
Azure OpenAI Service 與 OpenAI 異同之處
基於小弟自行寫過兩邊服務的經驗和對 Azure 熟悉程度,列舉出下列的比較
Features | Azure OpenAI Service (AOAI) | OpenAI (OAI) |
---|---|---|
服務定位 | 穩定 | 最新 |
API Endpoint | https://{your own endpoint}.openai.azure.com | https://api.openai.com |
SLA | 99.9% | 未來會推出 |
模型支援 | GPT-3.5, DALL-E and Codex (including Codex Fine-Tuning) | GPT-3.5, Codex and DALL-E, ChatGPT API and Whisper API |
Azure 可用區域 | 3 個, West Europe/South Central US/East US | 1 個, US |
主要服務窗口 | Microsoft Azure | OpenAI |
客戶支援方式 | 在地 Azure 團隊 | 需自行找 OpenAI 團隊 |
支援付款方式 | 使用 MACC (Microsoft Azure Consumption Commitment) | 信用卡或其他方式 |
Public API Endpoint | 可 | 可 |
Public API Endpoint 資安機制 | 可限定特定 IP 或特定 Subnet 連入 | 無 |
Private API Endpoint | 使用 Azure Private Endpoint / Private Link | 無 |
Security | 可沿用 Azure 既有資安服務 | 需自行處理 |
RBAC | 採用 Azure Acitve Directory 或自行整合 3rd SSO | OpenAI 自帶 SSO 或自行整合 3rd SSO |
個人經驗分享
整體架構圖
Bot 主程式
主要目的是希望能讓 Line 可以串接到 OpenAI API,直接使用 Line 進行對話,目前已實作出下列 3 種方式,主要會針對 2 和 3 以 Python 為主的方式作探討
- OpenAI API + Nodejs 11
- OpenAI API + Python 3.9 + Flask
- Azure OpenAI API + Python 3.9 + Flask
若以 Python 3 為主的開發語言,你會需要知道下列幾個 Python 相關的資訊,基本上全部都一樣
,要留意 AOAI 跟 OAI 所使用到的 Python SDK 目前
是同一個
DX | Azure OpenAI Service (AOAI) | OpenAI (OAI) |
---|---|---|
API Framework | Flask 2.x | Flask 2.x |
Python Library | OpenAI Python Library | OpenAI Python Library |
Line Bot Library | Line Bot SDK Python | Line Bot SDK Python |
Python Version | Python 3.9 | Python 3.9 |
Python Environment | venv | venv |
程式開發上,可以分下列 2 階段:
- Flask + Line Message API 串接及測試: 這個網路上相當多支援,Line SDK 範例也寫得很清楚,難度不高
-
Flask + Azure OpenAI 或 OpenAI 串接及測試: 這個要留意到,兩邊所使用的 Funcion、API Endpoint、回傳內容等等都不一樣
- 如果你是以 Azure OpenAI Service 開發為主的,務必要把 Azure OpenAI Studio 所提供的 Playground 先玩過一次,會省下相當多的觀落陰時間
- 如果你是以 OpenAI Service 開發為主的,就是先看 OpenAI Cookbook 為主
主要都需要注意的地方是在送訊息出去到 AOAI/OAI API Endpoint 的部分,下面提供 2 個寫法上的差異
gpt_response = openai.Completion.create(
engine="gpt35",
prompt=create_prompt(system_message, messages),
max_tokens=2048,
temperature=0.7,
stop=["<|im_end|>"],
)
gpt_response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": event.message.text }
],
max_tokens=2048,
temperature=0.7,
stop=None
)
據我對現行 SDK 和 API 的理解是 OpenAI 會先當前導驗證測試的角色,等使用到大部分的問題都解決了以後,才會下放到 Azure OpenAPI 來做企業級的導入和使用,但因為這技術進展很快
關於 Error Handling,處理這段程式碼的時候,會有超高機率會收到 500 Internal Server Error,有各式各樣的理由會導致出現這個,反舉 InvalidRequestError、APIConnectionError、AuthError 和你輸入它覺得不合規的文字等等,都會吐相同的 HTTP Status 500 給你,詳細可看 error.py,所以建議 Error Handling 要做和上 Logger 紀錄一下
Bot 運行平台及部署方式
關於運行平台,提供下列參數
-
Azure Web App Service
- App Service Plan:
B1
- Operating System:
Linux
- Language:
Python 3.9
- App Service Plan:
如果你是寫 NodeJS 的話,可以直接加開 Application Insight 做 Auto-instrumentation,超...方便(如下圖),可惜 Python 沒有,要自己寫
關於部署方式,主要採用 GitHub 和 GitHub Actions,自動部署到指定的 Azure Web App Service 上運行,Workflow 會自己產生出來,所以我也就沒有改什麼就上了
下一步?
- 雲地網路整合: 因為只有 Azure OpenAI Service 可以把 API Endpoint 躲在 Private Network 裡
- 強化 Application Performance Management (APM) 能力: 使用 Azure Application Insight,主要是收集 Metrics 比較好判斷 API 之間呼叫的狀況
- 容器化: Dockerfile 和 docker-compose 撰寫
- 部署到 Azure Kubernetes Service / Azure Red Hat OpenShift: 因為這個服務剛好是 Stateless Application 的代表,所以相當適合拿來丟在 K8s 上面搞很多奇怪的 Demo
Q & A
Q1: 為何使用 Flask?
我覺得看起來比較直覺一點,VSCode 原生也支援 Flask Debugger,詳參 Flask Tutorial in Visual Studio Code,還我青春,減少觀落陰時間
Q2: 可不可以將 AOAI 跟 OAI 的呼叫寫在同一個 flask app?
技術上一定可以,但因為 AOAI 跟 OAI 無論是函式、API Endpoint、Parameter、Key Format,其實還是有差異,秉持 KISS 原則,建議 AOAI 寫一個 app,OAI 自己寫一個 app,不要搞得太複雜
Q3: 用同一句文字,同樣的 Model,問 Azure OpenAI Service 跟 OpenAI 會是一樣的結果嗎?
不一樣,如果詠唱 (Prompt) 太短的話,同一個問題問起來會天差地遠,請參考下列範例
Q4: 如果我需要 API Endpoint 在私有網路內,要選什麼?
只有 Azure OpenAI Service,因為有支援 Private Link / Private Endpoint,同時之間也有支援跨區域連線的方式,下圖就是一個很典型的設定,Azure OpenAI Service 開在 South Central US,而 Private Endpoint 和 Private Link 則放在 Japan East
Q5: 如果我需要 API Endpoint 在外網,但又要有 Rate Limit、Quota、Auth 等等的管理機制該怎麼辦?
請找 API Management 相關的解決方案,如果你是 Azure 的話就是 Azure API Management 可以規劃使用