LY Corporation Tech Blog

支持 LY Corporation 和 LY Corporation Group (LINE Plus, LINE Taiwan and LINE Vietnam) 服務,宣傳技術和開發文化。

使用 Golang 透過 Google Gemini Pro 來打造一個具有LLM 功能 LINE Bot (一): Chat Completion and Image Vision

前提

就在 12 月 13 號 Google 正式公開了 Gemini Pro 的相關 API 。本篇文章將專注在第一個部分,使用 Golang 並且從 Google Gemini Pro 導入,到建立起一個 Chat Completion 與 Image Vision 的基本功能。本篇文章分成以下的章節:

  • Google Gemini Pro 有哪些資源可以學習?
  • 如何整合到 LINE Bot?
  • 打造一個回覆,圖片辨識的 Gemini Pro LINE Bot

系列文章:

  1. 使用 Golang 透過 Google Gemini Pro 來打造一個具有LLM 功能 LINE Bot (一): Chat Completion and Image Vision (本篇)

  2. 使用 Golang 透過 Google Gemini Pro 來打造一個具有LLM 功能 LINE Bot (二): 使用 Chat Session 與 LINEBot 快速整合出有記憶的 LINE Bot

Google Gemini Pro 有哪些資源可以學習

這裡也有一些我覺得蠻重要的資訊:

如何取得 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

  • 像是以上的內容,因為許多資料都有 link 可以使用,貼到 LINE Bot 沒有太多問題。
  • 不過因為直接回 Markdown 可能要把相關語法刪除掉,才能正確顯示。

接下來:

可以開始來玩玩 Function Calling 儘可能把相關內容試試看。 然後也可以等等 LangChainGo 什麼時後把 Gemini Pro 接起來

參考資料: