通過前四篇的測試我們已基本上掌握了 Gradio 的用法, 本篇要應用 Gradio 作為使用者介面來串接 OpenAI API, 模仿類似 ChatGPT 的聊天功能.
八. 用 Gradio 串接語言模型 API :
使用 OpenAI API 需先註冊帳號並取得 API 金鑰, 做法參考 :
注意, OpenAI 已不再贈送 5 美元給初次的 API 註冊者, API key 在帳號註冊完成後即可取得, 但必須付費儲值 (Pay As You Go) 至少 5 美元後才能使用 API key 與 GPT 模型互動.
1. 在本機執行 OpenAI API 聊天機器人程式 :
簡易的無記憶性聊天機器人程式碼如下 :
import gradio as gr
from openai import OpenAI
def ask_gpt(api_key, prompt):
client=OpenAI(api_key=api_key)
chat_completion=client.chat.completions.create(
messages=[{'role': 'user', 'content': prompt}],
model='gpt-3.5-turbo'
)
return chat_completion.choices[0].message.content
api_key=gr.Textbox(label='輸入 OpenAI 金鑰', type='password')
prompt=gr.Textbox(label='您的詢問: ')
reply=gr.Textbox(label='OpenAI 回答: ')
iface=gr.Interface(
fn=ask_gpt,
inputs=[api_key, prompt],
outputs=reply,
title='OpenAI API 聊天機器人',
flagging_mode='never',
)
iface.launch()
此例有兩個 Textbox 輸入元件與一個 Textbox 輸出元件 : api_key 是一個指定 type='password' 的密碼文字欄位 Textbox 元件, 用來輸入自己的 OpenAI API key; 而 prompt 則是用來輸入提示詞的 Textbox 元件; reply 則是用來輸出 OpenAI API 的回應結果. 在本機的執行結果如下 :
2. 在 Hugging Face Spaces 佈署 OpenAI API 聊天機器人程式 :
由於執行上面的 App 程式碼需要安裝 openai 套件才能呼叫 OpenAI API, 但 Gradio Playground 上並沒有預載 openai 套件, 所以此 App 無法在 Gradio Playground 上測試, 當然也就無法一鍵佈署至 Hugging Face Spaces 空間, 須手動在 Hugging Face Spaces 上自行佈署 App 與安裝所需套件. 網址如下 :
首先需為 App 建立一個執行空間, 按右上角的 "Create new space" 鈕新增 Space :
輸入 Space name (網址的一部份, 不要有空格) 與 Short description (簡短的 App 描述), 勾選一種授權方式 (隨意),
Space 建立完成頁面如下, 有附上 Gradio 應用程式 app.py 的範例與上傳程式檔案的 Git 指令 :
可以按右上角的 File 按鈕進入檔案管理頁面線上編輯 app.py, 如果沒有顯示 File 則要按右上角的三個點點小按鈕展開選單 :
在檔案管理頁面按 "+Add file" 鈕選擇 "Create a new file" 新增程式檔案 app.py :
在開啟的程式編輯器中, 上方輸入框固定要填入 app.py, 底下則貼入上面的程式碼 :
然後按最底下的 "Commit new file to main" 鈕存檔 :
存檔後若要繼續修改按 Edit 鈕, 刪除按 Delete 鈕 :
但在佈署之前還需要新增一個 requirement.txt 檔列出需安裝之套件 openai, 按 App 專案目錄超連結回到檔案列表, 按 "+ Add file" 新增 requirement.txt, 內容輸入 :
openai>=1.14.0
表示要安裝 v1.14.0 版以上的 openai 套件 :
同樣按最底下的 "Commit new file to main" 鈕存檔後按上方自己的帳號回 App 列表 :
這時可看到此 App 左上角顯示 "Building", 直接按此 App 執行佈署 :
佈署完成就會出現 App 網頁了 :
與上面在本機執行的頁面是一樣的. 此 Web App 網址如下 :
3. 在 Hugging Face Spaces 佈署 Gemini API 聊天機器人程式 :
在上面的測試中使用了一個 type='password' 的 Textbox 來儲存 OpenAPI 金鑰, 其實 Hugging Face Spaces 有提供 Secrets 資料表來儲存 API key 或 token 之類的隱密資訊 (每個 App 用到的 Secrets 是各自獨立不相關的), 以下將以串接 Google Gemini API 為例說明做法, 關於 Gemini 參考 :
首先先在本機測試 Gemini 聊天機器人, 程式碼如下 :
# gradio_gemini_api_1.py
import gradio as gr
import google.generativeai as genai
import os, time
from dotenv import load_dotenv
def ask_gemini(model_sel, prompt):
start_time=time.time()
model=genai.GenerativeModel(model_sel)
safety_settings={
'HATE': 'BLOCK_NONE',
'HARASSMENT': 'BLOCK_NONE',
'SEXUAL' : 'BLOCK_NONE',
'DANGEROUS' : 'BLOCK_NONE'
}
reply=model.generate_content(prompt, safety_settings=safety_settings)
elapsed_time=time.time()-start_time
return f'{reply.text}\n模型: {model_sel}\n耗時: {elapsed_time:.2f} 秒'
load_dotenv()
api_key=os.environ.get('GEMINI_API_KEY')
genai.configure(api_key=api_key)
model_sel=gr.Radio(label='選擇模型',
choices=['gemini-1.5-flash', 'gemini-1.5-pro'],
value='gemini-1.5-flash')
prompt=gr.Textbox(label='您的詢問: ')
reply=gr.Textbox(label='Gemini 的回答: ')
iface=gr.Interface(
fn=ask_gemini,
inputs=[model_sel, prompt],
outputs=reply,
title='Gemini API 聊天機器人',
flagging_mode='never',
)
iface.launch()
此例有兩個輸入元件 (用來選擇模型的 Radio 元件與輸入提示詞的 Textbox 元件) 與一個用來輸出 Gemini 回應的 Textbot 元件. 我已經將 Gemini API key 存放在目前工作目錄下的 .env 隱藏檔的 GEMINI_API_KEY 變數裡, 然後利用 dotenv 模組的 loadenv() 函式載入此隱藏檔, 再利用 os 模組的 os.environ.get() 函式取得 API key. 執行結果如下 :
接下來要將此 App 佈署到 Hugging Face 上, 跟上面一樣先建立一個名為 "gradio_gemini_api_1" 的 Space :
按 File 進入檔案管理頁面 :
將上面的程式碼貼到 app.py 檔案內容裡 :
requirements.txt 則要指定安裝第三方套件 python-dotenv 與 google.generativeai (注意, dotenv 套件的安裝名稱是 python-dotenv) :
檔案新增完成後如下所示, 接下來要將 API key 存入 Secrets 變數中, 按上方的 Settings 鈕 :
往下拉到 "Variables and secrets" 這一項, 按右方的 "New secret" 鈕 :
Name 欄填入與上面程式中相同的 API key 名稱 GEMINI_API_KEY, 而 Value 欄則填入 API key 後按 Save 即可 :
這樣就完成佈署此 App 的全部設定了, 這是 Hugging Face Spaces 帳戶就會看到此 App 已經在 Running 狀態, 點進去即可看到 App 頁面 :
此 Web App 網址如下 :
當然上面的 Open AI 聊天機器人也可以這麼做, 只是會扣儲值的錢, Google Gemini 應該是所有語言模型中最佛心的了 (等做大了就會收費啦).
沒有留言 :
張貼留言