隨著最近 HuggingGPT 和 AutoGPT 的火爆,讓 LLM 作為 Control 調用各種各樣的 Domain Expert Models 也成為了一個常見的需求了。
前幾天 OpenAI 三巨頭之一的 GDB 在 Ted 給了一個 talk,也再次向公眾秀了一把 ChatGPT Plugin...
可惜 量子位的這篇報導 明顯是混淆了 AutoGPT 和 ChatGPT Plugin...
調模型可以算做使用工具的一環,但 AutoGPT 核心的 feature 是 Auto 啊。
連 Gradio 也在上週推出了 gradio_client 功能。
讓我們看看它都能做些什麼吧~!
在具體討論 gradio_client 之前,我們不妨稍微回顧一下當前開發者的現狀,隨著 ChatGPT 的火爆和其極其廉價的,近乎於傾銷的定價模式,使得 OpenAI API 已經幾乎成為所有開發者的標配,甚至許多開發者都將開源 LLM 封裝成類似 OpenAI API 的調用格式。實際上,利用 HuggingFace Inference Endpoints,也可以做到和 OpenAI API 類似的功能,而 gradio_client 則可以讓一個 Gradio 程序即使脫離 HuggingFace 平台,也依然保持通信。
這乍看起來像是某種 反射魔法。。。直接就構造一個類然後 import 進來它的 predict 函數了?
。。不過那安全性怎麼處理?。。所以應該還是工程層面的東西吧。。
- https://github.com/gradio-app/gradio/tree/main/client
- https://www.tomsoderlund.com/ai/building-ai-powered-rest-api
例子#
The Gradio client works with any hosted Gradio app, whether it be an image generator, a text summarizer, a stateful chatbot, a tax calculator, or anything else! The Gradio Client is mostly used with apps hosted on Hugging Face Spaces, but your app can be hosted anywhere, such as your own server.
ChatGPT#
首先我們先使用 ChatGPT 熟悉一下基礎的 Gradio 程序。
HuggingFace 上 ChatGPT instance 不要太多。。。讓我們隨機看幾個例子。。
loveleaves2012/ChatGPT#
- https://huggingface.co/spaces/loveleaves2012/ChatGPT
這個版本加了一點點 Pre-Prompt 來做功能,但代碼也最離譜,居然把 OpenAI Key 直接 hardcode 在了源代碼裡,但是其實 huggingface 是有環境變量的設計的。
ysharma/ChatGPTwithAPI#
- https://huggingface.co/spaces/ysharma/ChatGPTwithAPI
這個版本比較標準,讓用戶自己填自己的 OpenAI Key,這貌似也是現在這類應用的一個標準做法。(讓用戶自帶 Key 。。。)
anzorq/chatgpt-demo#
這個版本目前我覺得最棒。。。因為它還代一個類似 stable diffusion 安裝插件的功能。。從 gist 裡同步 prompt 模板。。。
我們復刻的版本在 這裡。
ChatGLM#
- https://github.com/Akegarasu/ChatGLM-webui
- https://huggingface.co/spaces/multimodalart/ChatGLM-6B
- https://github.com/lychees/ChatGLM-Gradio
當然上面的例子裡雖然是 Gradio,但實際最後都是用 OpenAI 的服務,並沒能展現 gradio_client 的優越性。。。
所以我們換一個 LLM 的例子。上面是三段 ChatGLM 的代碼,都是用 Gradio 實現。
首先是紅葉大大的版本,這個版本的控件最豐富,但是是完全本地版,需要用戶將模型下載到本地方可運行。
並不兼容 huggingface。
第二個是 HF 的高產 stuff,multimodalart 的版本,利用了 HF 的基礎設施,但是需要用戶花錢 host model 方可運行。
def predict(input, history=None):
if history is None:
history = []
response, history = model.chat(tokenizer, input, history)
return history, history
第三個版本是我從第二個版本魔改而來,核心是只需要修改 predict 函數,跳過模型調用的過程,而直接從遠端進行呼叫。
def predict(input, history=None):
if history is None:
history = []
client = Client('https://multimodalart-chatglm-6b.hf.space/')
with open(client.predict(input, fn_index=0)) as f:
text = process_text(f.read())
output = json.loads(text)[0]
history += [output]
return history, history
這個例子目前跑在這兒:https://testing.agentswap.net/models/19/remi-test-app
Stable Diffusion 2.1#
這個例子更複雜一些,首先,雖然 host 在 huggingface 上,但它並不是一個傳統的 huggingface service,而是更類似之前的 ChatGPT 裡的例子,是一個由 Google 和 StabilityAI 共同維護的公共產品。。
但是我們依然和上例一樣。。。可以通過 gradio_client 獲得 predict 方法。。。
可以在 這裡 看到實際運行的結果。
Further Discussion#
gradio_client 看起來符合了我對開源軟件的完美預期,人人為我,我為人人,甚至說我可以本地 self host,然後 share=true,
然後利用 gradio_client 再打包成外部服務(比如 telegram bot)。。。想像空間很大。。。
但是仔細想想,這裡也有一些問題,最大的受害者可能是部署模型的那個孩子,相當於花錢給大家做公共產品。
而且如果一份模型非常火爆,現有的架構的可擴展性相較於 Cloud Model 也會很快顯示出不足。
當然現在因為資料太少,我依然沒搞懂它是怎麼實現的,以及 export 出的 function 滿足什麼樣的規則,有沒有安全性風險等等。。
最後 這裡 似乎有更多的例子。
甚至還有依賴 gradio_client 構建的 gradio_tools。。。。太快了吧。。