免費試用中
看 Google I/O 2023 的 YouTube 頻道,發現 Firebase 也釋出 Generative AI API - PaLM。
因為目前不收費,所以趁機來玩玩。
提醒:PaLM API 目前只提供給美國(填寫 Waiting list 時要選國家)
Firebase Extensions Hub
Firebase 是 Google 的一個 backend-as-a-service (BaaS) 平台。
之前會注意到,主要還是因為開發 App 的關係。在研究 Flutter 跨平台開發時,後端就是對應到 Firebase。
Firebase 有個 Extensions Hub(你可以想像成是 Chrome Extensions,只不過它是給後端用的),看你要在伺服器架設什麼服務,就安裝相對應的 extension。
像是知名的 Stripe, Mailchimp, Twilio 等,你可以參考以下網站查看列表。
PaLM API
我看了目前三個主要的應用,對照表如下:
名稱以 OpenAI 為主 | OpenAI API | Google PaLM API |
---|---|---|
Text Completion | openai.Completion.create | palm.generate_text |
ChatGPT API | openai.ChatCompletion.create | palm.chat |
Text Embedding | openai.Embedding.create | palm.generate_embeddings |
安裝一樣用 pip
pip install -q google-generativeai
1. Text generation
這個就是相對於 OpenAI 的 Text Completion
response = openai.Completion.create(…)
使用 palm.list_models
取得可用的 models
import pprint
import google.generativeai as palm
palm.configure(api_key=PALM_KEY)
models = [m for m in palm.list_models() if 'generateText' in m.supported_generation_methods]
model = models[0].name
print(model)
輸出
models/text-bison-001
然後使用 palm.generate_text
來產生 prompot
prompt = """
I have three houses, each with three cats.
each cat owns 4 mittens, and a hat. Each mitten was
knit from 7m of yarn, each hat from 4m.
How much yarn was needed to make all the items?
Think about it step by step, and show your work.
"""
completion = palm.generate_text(
model=model,
prompt=prompt,
# The maximum length of the response
max_output_tokens=800,
)
print(completion.result)
輸出
There are 3 houses * 3 cats / house = 9 cats.
There are 9 cats * 4 mittens / cat = 36 mittens.
There are 9 cats * 1 hat / cat = 9 hats.
The total amount of yarn needed for the mittens is 36 mittens * 7m / mitten = 252m.
The total amount of yarn needed for the hats is 9 hats * 4m / hat = 36m.
The total amount of yarn needed is 252m + 36m = 288m.
So the answer is 288
參數用法也幾乎一樣(model, prompt, max token),我想應該是有 致敬 OpenAI 的 API 吧?
接下來的範例,我只列部分出來,可以看到就是多了 candidate_count
和 temperature
。
completion = palm.generate_text(
model=model,
prompt=prompt,
# The number of candidates to return
candidate_count=8,
# Set the temperature to 1.0 for more variety of responses.
temperature=1.0,
max_output_tokens=800,
)
print(completion.result)
上面的完整範例,你可以到 Google Colab 或 GitHub 玩玩。
2. Chat
這個就是相對於 OpenAI 的 ChatGPT API
response = openai.ChatCompletion.create(…)
安裝和 API key 的部分同前,就不贅述了。
import google.generativeai as palm
palm.configure(api_key=PALM_KEY)
# Create a new conversation 開始交談
response = palm.chat(messages='Hello')
# Last contains the model's response:
response.last
# > 輸出 'Hello! How can I help you today?'
# Add to the existing conversation by sending a reply # 繼續交談
response = response.reply("Just chillin'")
# See the model's latest response in the `last` field:
response.last
# > 輸出 "That's great! Chilling is a great way to relax and de-stress.
# I hope you're having a good day."
這裡的作法,就和 ChatGPT API 有很大的不同了。
ChatGPT API 是把之前的話一直包進去,一次呼叫;PaLM API 則是 response.reply
response.last
輪流執行。
觀看 OpenAI 的 ChatGPT API 分享:1️⃣ Section 11. ChatGPT API
上面的完整範例,你可以到 Google Colab 或 GitHub 玩玩。
3. Embedding generation
這個就是相對於 OpenAI 的 Text Embedding
response = openai.Embedding.create(…)
和 Text Completion 一樣,我不知道為什麼 model name 還要去搜尋?是 Google 自己也還不確定嗎?
import numpy as np
import google.generativeai as palm
palm.configure(api_key='PALM_KEY')
for model in palm.list_models():
if 'embedText' in model.supported_generation_methods:
print(model.name)
輸出:Embedding 要使用的 model name
models/embedding-gecko-001
使用 palm.generate_embeddings
建立 Text 向量集。
x = 'What do squirrels eat?'
close_to_x = 'nuts and acorns'
different_from_x = 'This morning I woke up in San Francisco, and took a walk to the Bay Bridge. It was a good, sunny morning with no fog.'
model = "models/embedding-gecko-001"
# Create an embedding
embedding_x = palm.generate_embeddings(model=model, text=x)
embedding_close_to_x = palm.generate_embeddings(model=model, text=close_to_x)
embedding_different_from_x = palm.generate_embeddings(model=model, text=different_from_x)
print(embedding_x)
輸出(很長,純示意):
{‘embedding’: [-0.025894878, …, -0.0011330071]}
上面的程式裡有三個字串:
-
x: 松鼠吃什麼?
-
close_to_x: 堅果、橡子
-
different_from_x: (完全無關的一句話)早上我在舊金山散步…
使用 generate_embeddings
來產生各字串相對於 Text 向量集內容的值。
下面的程式中,使用 .dot
來判斷各字串在 Text 向量集內容的關連程度。
返回值介於 -1 和 1 之間,表示兩個向量在它們指向的方向上排列的緊密程度。
值越接近 0,目標(在本例中為兩個字符)越不相似、值越接近 1 越相似。
疑問:上面兩句話是原文的意思。但我看不懂到底是 -1 還是 0,值愈不相近。還是 0 和 -1之間是反義詞?等我找到資料再來補充。
x
和 close_to_x
embedding 值為 0.7314063252924405。
x
和 different_from_x
embedding 值為 0.43560702838194704。
顯示前者關聯度較高。
心得:明明是正確答案,距離 1 還是很遠啊。
我看原文下方還有幾個範例,有空再來研究一下。
similar_measure = np.dot(embedding_x['embedding'], embedding_close_to_x['embedding'])
print(similar_measure)
# 輸出:0.7314063252924405
different_measure = np.dot(embedding_x['embedding'], embedding_different_from_x['embedding'])
print(different_measure)
# 輸出:0.43560702838194704
什麼場合適用呢?
這裡 Google 舉的範例倒是和 OpenAI 差不多:
-
搜索(文檔、網絡等)- Search (documents, web, etc.)
-
推薦系統 - Recommendation systems
-
聚類 - Clustering
-
情緒分析/文本分類 - Sentiment analysis / text classification
觀看 OpenAI 的 Text Embedding 分享:1️⃣ Section 10. 文字嵌入(Text Embedding)
上面的完整範例,你可以到 Google Colab 或 GitHub 玩玩。
YouTube
我是在 Google I/O 2023 的 Firebase 影片中看到的,以下影片播放秒數已設定在 PaLM 出現處:
Google 有另一則影片,是專門介紹 PaLM 的:
介紹 PaLM 2
PaLM 2 Technical Report:
透過 Firebase 使用 Google PaLM 2 API,2 分鐘構建和部署一個全端 LLM 的應用程式。影片中的螢幕右下方有 2 分鐘倒數計時喔。(看留言好好笑)