前提
就在 12 月 13 號 Google 正式公開了 Gemini Pro 的相關 API 。本篇文章將專注在第一個部分,使用 Golang 並且從 Google Gemini Pro 導入,到建立起一個 Chat Completion 與 Image Vision 的基本功能。本篇文章分成以下的章節:
- Google Gemini Pro 有哪些資源可以學習?
- 如何 整合到 LINE Bot?
- 打造一個回覆,圖片辨識的 Gemini Pro LINE Bot
系列文章:
-
使用 Golang 透過 Google Gemini Pro 來打造一個具有LLM 功能 LINE Bot (一): Chat Completion and Image Vision (本篇)
- 使用 Golang 透過 Google Gemini Pro 來打造一個具有LLM 功能 LINE Bot (二): 使用 Chat Session 與 LINEBot 快速整合出有記憶的 LINE Bot
Google Gemini Pro 有哪些資源可以學習
這裡也有一些我覺得蠻重要的資訊:
- Vetex-ai (Google) 的 function calling: https://cloud.google.com/vertex-ai/docs/generative-ai/multimodal/function-calling#function-calling-sdk-samples
- Colab: https://colab.research.google.com/github/GoogleCloudPlatform/generative-ai/blob/main/gemini/function-calling/intro_function_calling.ipynb
- Golang 加上 Gemini pro 這邊有大大 Eli Bendersky 寫的 sample code https://eli.thegreenplace.net/2023/using-gemini-models-from-go/
如何取得 Google Gemini Pro - API Keys
到 Google AI Studio : https://makersuite.google.com/app/apikey
目前價位如下,還有一些免費額度可以用:
如何整合 LINE Bot?
程式碼: https://github.com/kkdai/linebot-gemini-pro
這邊主要先整入兩個主要功能 : ChatSession 跟 Image ,相關程式碼都在 gemini.go
Chat Completion
// Gemini Chat Complete: Iput a prompt and get the response string.
func GeminiChatComplete(req string) string {
ctx := context.Background()
client, err := genai.NewClient(ctx, option.WithAPIKey(geminiKey))
if err != nil {
log.Fatal(err)
}
defer client.Close()
model := client.GenerativeModel("gemini-pro")
cs := model.StartChat()
send := func(msg string) *genai.GenerateContentResponse {
fmt.Printf("== Me: %s\n== Model:\n", msg)
res, err := cs.SendMessage(ctx, genai.Text(msg))
if err != nil {
log.Fatal(err)
}
return res
}
res := send(req)
return printResponse(res)
}
這個主要是處理一個 Chat Session ,就是類似 OpenAI 的 Chat Completion。 加強解釋一些東西:
- 回傳資料
res := send(req)
其中的 res 不能直接用,需要透過 printResponse(res) 拿回來。
其實也就是拿出最接近的那個答案中的本文:
func printResponse(resp *genai.GenerateContentResponse) string {
var ret string
for _, cand := range resp.Candidates {
for _, part := range cand.Content.Parts {
ret = ret + fmt.Sprintf("%v", part)
fmt.Println(part)
}
}
return ret
}
Gemini Pro Vision / 圖片相關 API
func GeminiImage(imgData []byte) (string, error) {
ctx := context.Background()
client, err := genai.NewClient(ctx, option.WithAPIKey(geminiKey))
if err != nil {
log.Fatal(err)
}
defer client.Close()
model := client.GenerativeModel("gemini-pro-vision")
prompt := []genai.Part{
genai.ImageData("png", imgData),
genai.Text("Describe this image with scientific detail, reply in zh-TW:"),
}
log.Println("Begin processing image...")
resp, err := model.GenerateContent(ctx, prompt...)
log.Println("Finished processing image...", resp)
if err != nil {
log.Fatal(err)
return "", err
}
return printResponse(resp), nil
}
幾件事情要注意:
- model 不一樣,放錯會出事情: "gemini-pro-vision"
- 資料一定要指定副檔名,超怪。 不過我都放 "png" 就過了。
快速部署
不想學那麼多,就準備好以下資料,就按下 Deploy
- ChannelAccessToken
- ChannelSecret
- GOOGLE_GEMINI_API_KEY
成果與 Google Gemini Pro API 的一些特點:
1. 資料時效相當的新
時效蠻新的,很多資料都是 2023/07 之後。ChatGPT 這種就回答不出來。
- ChatGPT GPT 3.5 是 2022
- API GPT4 是 2023/04
2. 很多資料會附上 Markdown Link ,蠻方便在 LINE Bot 中使用:
- 像是以上的內容,因為許多資料都有 link 可以使用,貼到 LINE Bot 沒有太多問題。
- 不過因為直接回 Markdown 可能要把相關語法刪除掉,才能正確顯示。
接下來:
可以開始來玩玩 Function Calling 儘可能把相關內容試試看。 然後也可以等等 LangChainGo 什麼時後把 Gemini Pro 接起來。
參考資料:
- Using Gemini models from Go by Eli Bendersky’s website
- Google Gemini API
- Google Build with Gemini
- Google Blog: It’s time for developers and enterprises to build with Gemini Pro
- Google Gemini Pro - API Keys
- Vertex API with Function Calling by LangChain: Competitor Analytics with Langchain Agents and Vertex Palm API