這是 OpenAI DevDay 2024 舊金山場 10/1 的四大重點
- Realtime API 你也可以做出 ChatGPT 進階語音模式在你的 app 了,這將帶來一整個新世代的語音 app
- Prompt caching 不用額外設置,命中快取就自動有 50% 折扣
- Vision fine tuning 視覺圖片微調 gpt-4o
- Model distillation & eval tools! 模型蒸餾和評估工具
以下細節解讀:
1. Realtime API 即時語音
- 官方公告: openai.com/index/introducing-the-realtime-api
- 官方 API 文件: platform.openai.com/docs/guides/realtime
- 之前要做語音助手,需要用 whisper 先做語音辨識,轉文字後呼叫 API,得到文字後再用 TTS API 轉成語音回給用戶,但這樣不但速度較慢,而且失去情感、重音和口音。
- 現在用 Realtime API 可以完整處理整個過程,直接串流音訊輸入和輸出,使對話體驗更加自然,還可以在接收音訊時用 API 提前中斷。
- 就是前幾天 ChatGPT 的 Advanced Voice mode 的 API 版本,現在大家自己的 app 也可以做了
- 實作上,Realtime API 使用 WebSocket 連接,整個 API 都是基於 websoket 事件來處理,包括音訊也是用 base64 編碼後塞進 json 傳遞
- 支援 function calling,可以用來透過語音來呼叫 tool 工具
- 新模型叫做是 gpt-4o-realtime-preview 今天應該就會開放給大家
- 還有另有一個 gpt-4o-audio-preview 模型接下來幾週會釋出,我不太確定差別是什麼,看起來是一個非 realtime 的版本(和 Chat Completions API 一樣的 HTTP API),可以輸出和輸出 文字或語音
- 價錢: 每分鐘語音輸入約 0.06 美元,每分鐘語音輸出約 0.24 美元,目前還是不便宜的
- 官方的 demo app: github.com/openai/openai-realtime-console 這個全用前端做的,瀏覽器直接 WebSocket 去連接 OpenAI 後端,API key 也存在前端上,因此只是 demo 用途。實務上 production 是用戶瀏覽器連接我們的 app server,我們 server 再連接 OpenAI 後端 (這 repo 中也有後端方案 Relay Server 的範例 code)。
2. Prompt caching 快取
- 官方公告: openai.com/index/api-prompt-caching/
- 官方 API 文件: platform.openai.com/docs/guides/prompt-caching
- 適用 gpt-4o, gpt-4o-mini, o1-preview, o1-mini
- 只有在 prompt prefix 符合時才有作用,因此請把不會變的 prompt 文字放前面,會變的內容放後面
- 會被快取的長度至少要有 1024 tokens,並且 128 tokens 累加,例如 1024, 1152, 1280….
- 回傳 response 的 usage 會有 cached_tokens 告訴你命中多少 tokens,可以便宜一半價錢 (不過相比其他家例如 Claude 如果命中快取是省90%啦)
- image, tool use, structured outputs json schema 這些也可以算在 快取,讚讚
- 快取的 expire 時間是 5~10 分鐘(如果沒作用就會被清掉),非高峰時間最多幫你活一小時
3. Vision fine tuning 視覺微調
- 官方公告: openai.com/index/introducing-vision-to-the-fine-tuning-api/
- 官方 API 文件: platform.openai.com/docs/guides/fine-tuning/vision
- 可以拿你的圖片資料集去微調 gpt-4o 模型
- 可以用於增強的視覺搜索功能、產品推薦、自動駕駛車輛或智慧城市的物體檢測改進(交通標誌檢測或車道檢測)、醫療影像分析等等
4. Model distillation 模型蒸餾
- 官方公告: openai.com/index/api-model-distillation/
- 官方 API 文件: platform.openai.com/docs/guides/distillation
- 官方 API 評估文件: platform.openai.com/docs/guides/evals
- 其實就是做微調,只是 openai 針對這個蒸餾場景把流程做的更順
- 新的 Stored Completions 功能: 在 gpt-4o 或 o1 的 API 呼叫中,用 store: true, metadata: {“tag”: “my-app-1”} 可以把結果在 openai 後台儲存下來,並搭配 metadata 一起,例如 metadata 寫這是你的哪一個 app 的 prompt
- 在後台透過 metadata 找出這些 input/output pairs,用這些 pairs 去微調 gpt-4o-mini !!!
- 搭配後台新出的評估工具,你就可以把一個平常你用 gpt-4o 做特定任務的 app,跑一陣子收集數據之後,就可以換成微調好的 gpt-4o-mini 來省錢啦!!
Whisper large-v3-turbo
另外還有一個 keynote 沒講的更新是 Whisper large-v3-turbo model 釋出 github.com/openai/whisper/pull/2361/files
這是 large-v3 的蒸餾版本,速度更快,犧牲一點點準確性。
又仔細看了 Realtime API 文件
除了 OpenAI 的官方文件,也推薦 Azure github.com/azure-samples/aoai-realtime-audio-sdk README 寫的不錯可以一看
- 輸入可以是 text 或 audio,你可以只打字輸入不講話
- 輸出可以是 audio 或 (audio+text) (也就是同時串流聲音跟文字都給你),但是不能只輸出 text,這個參數叫做 modalities,預設是 [“text”, “audio”]
- 輸入是 audio 時,輸出可以多 transcription 文字 (也就是你講話聲音的逐字稿),這個參數是 input_audio_transcription 可以開關
- 可以設定是否打開 VAD (voice activity detection) 模式,也就是始終在串流對話並讓 AI 判斷自動回話。可以設定 activation threshold, prefix_padding_ms, silence_duration_ms 來調整敏感度。
這也可以關閉,用在你自己做個通話按鈕,手動控制串流對話的開始跟結束。 - 同一個 websocket session 連線 AI會記得你講過什麼。但是如果 user 中斷重連,AI 不會記得之前講過啥,你可以把對話紀錄透過 websocket 事件先傳給 AI,但是這裡不支援傳語音! 因此你得自己存下所有對話文字(難怪這個 API 都有功能可以拿到 text)
- 想手動提前中斷AI輸出的話,除了呼叫 response.cancel 事件之外,還有一個 conversation.item.truncate 事件可以呼叫,用途是可以刪掉 AI 還沒講到的話 (因為 AI 很可能已經生成好內容塞進對話 歷史紀錄了,但是因為語音講不夠快,用戶其實還沒聽到)
- 小結: 輸出的文字有兩種:
- 一種是透過 response.content_part.* 事件串流回來的,這種是 gpt-4o-realtime-preview 模型的輸出
- 一種是透過 conversation.item.input_audio_transcription.completed 事件回來的,這種是用 whisper 模型把你的語音輸入轉成逐字稿。