🛝iOS 本地 AI:不讓使用者乾等,Foundation Models 的 Stream Response 能輕鬆實現漸進式使用者體驗

為了不讓使用者等待,App 應該漸進地顯示生成的結果。但是,為了達到這個目的,你願意自行拼湊並解析 LLM 吐出過程中的不完整 JSON 字串嗎?太痛苦了。Foundation Models framework 提供給開發者十分優雅的方式避開這個麻煩,而且能直接沿用先前文章已學過的語法。

這個專題系列的文章,已經介紹了 Foundation Models framework 的基本語法,包含直接定義期望的資料結構的功能,以及動態準備 prompt 的語法

不過,我們之前都是使用 #Playground macro 來探索。這個功能對於快速嘗試一些 API 很有幫助,但距離真正的使用者體驗,還有一段距離。

實際的 App 有使用者介面,而在模型在運算的過程中,我們不能讓使用者盯著空空的畫面乾等。如何優雅地、漸進地呈現結果,就是開發者要面臨的挑戰。

如果我們面對的是單純的 LLM,沒有 structured output,得下 prompt 要求輸出成 JSON 或特定 schema,還要自行拼湊、解析 JSON 字串的半成品,並抽出已經能用的部分資料來顯示,才能達到漸進式呈現的效果。這些都是非常令人頭痛的事情。

幸好,Foundation Models framework 已經幫我們準備了非常方便的機制,大幅減少開發的力氣。

自動產生部分內容對應的資料結構

當我們使用 LLM 聊天服務時,應該都會觀察到模型會先「思考一下」,然後才「依序吐出一小段一小段文字」到前端的過程。

這是所有語言模型運作時的基本樣貌:

  1. 輸入
  2. 需要一些時間準備第一個 token
  3. 依序輸出後續的 tokens

Foundation Models 自然也不例外。Framework 提供非常方便的機制,讓上述的 LLM 行為輕鬆地轉換成 App 使用者能夠接收到的優雅體驗。

過程非常簡單:我們接收到的物件,一開始只會有部分的屬性有資料,可以丟給 UI 來顯示。隨著模型生成的過程,會持續收到更完整、但仍是部分的資料,也能夠繼續丟給 UI 來顯示。我們可以持續更新畫面,直到全部資料生成完畢。

具體怎麼做到的呢?先從資料結構說起。