Skip to content

使用 OpenAI API 開發經驗分享

Note

因 OpenAI 相關技術發展神速,本文有效時間可能不算太長,閱讀後務必要自行再用自身經驗驗證

很久沒寫 Python,但我本來只是想要研究一下 APM (Application Performance Monitoring) 怎麼順利地跑在 AKS 和 ARO 上,然後就不小心就把 Line Bot ft. OpenAI 寫一寫了,既然寫了就順便紀錄一下

TL;DR

  1. Azure OpenAI Service 和 OpenAI 的 API 呼叫有可能會不一樣,務必要確認
  2. Error Handling 建議要做,不然你永遠只會收到 500 Internal Server Error
  3. 私有網路連入方式,唯一選擇 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 為主的方式作探討

  1. OpenAI API + Nodejs 11
  2. OpenAI API + Python 3.9 + Flask
  3. 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 階段:

  1. Flask + Line Message API 串接及測試: 這個網路上相當多支援,Line SDK 範例也寫得很清楚,難度不高
  2. Flask + Azure OpenAI 或 OpenAI 串接及測試: 這個要留意到,兩邊所使用的 Funcion、API Endpoint、回傳內容等等都不一樣

    • 如果你是以 Azure OpenAI Service 開發為主的,務必要把 Azure OpenAI Studio 所提供的 Playground 先玩過一次,會省下相當多的觀落陰時間
    • 如果你是以 OpenAI Service 開發為主的,就是先看 OpenAI Cookbook 為主

主要都需要注意的地方是在送訊息出去到 AOAI/OAI API Endpoint 的部分,下面提供 2 個寫法上的差異

azure-openai-service.snippet
gpt_response = openai.Completion.create(
    engine="gpt35",
    prompt=create_prompt(system_message, messages),
    max_tokens=2048,
    temperature=0.7,
    stop=["<|im_end|>"],
)
openai-service.snippet
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

如果你是寫 NodeJS 的話,可以直接加開 Application Insight 做 Auto-instrumentation,超...方便(如下圖),可惜 Python 沒有,要自己寫

關於部署方式,主要採用 GitHub 和 GitHub Actions,自動部署到指定的 Azure Web App Service 上運行,Workflow 會自己產生出來,所以我也就沒有改什麼就上了

下一步?

  1. 雲地網路整合: 因為只有 Azure OpenAI Service 可以把 API Endpoint 躲在 Private Network 裡
  2. 強化 Application Performance Management (APM) 能力: 使用 Azure Application Insight,主要是收集 Metrics 比較好判斷 API 之間呼叫的狀況
  3. 容器化: Dockerfile 和 docker-compose 撰寫
  4. 部署到 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 可以規劃使用