Google PaLM API | Generative AI for Developers

免費試用中

看 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_counttemperature

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 ColabGitHub 玩玩。

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 ColabGitHub 玩玩。

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之間是反義詞?等我找到資料再來補充。

xclose_to_x embedding 值為 0.7314063252924405。
xdifferent_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 ColabGitHub 玩玩。

YouTube

我是在 Google I/O 2023 的 Firebase 影片中看到的,以下影片播放秒數已設定在 PaLM 出現處:

Google 有另一則影片,是專門介紹 PaLM 的:

介紹 PaLM 2

PaLM 2 Technical Report:

透過 Firebase 使用 Google PaLM 2 API,2 分鐘構建和部署一個全端 LLM 的應用程式。影片中的螢幕右下方有 2 分鐘倒數計時喔。(看留言好好笑)

3個讚

Google I/O 2023 的 Firebase 影片連結失效了

1個讚

感謝 Chris 兄通知!

我試了一下,兩則 google 釋出的影片都還看得到也。

早上點了兩次,影片都出不來,剛下午看了你的回信,再點,竟然影片又能播出來了,拍謝,誤報~

1個讚

太客氣了,感謝 Chris 兄的即時回饋。

如果之後還有類似問題,還請不吝提出喔。 :hugs: