image-20231216015206933

前提

上一次開始使用 tmc/langchaingo 打造一些基礎的 Golang 應用後,就在 12 月 13 號 Google 正式公開了 Gemini Pro 的相關 API 。本篇文章開始以下的事項:

  • 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
  3. 使用 Golang 透過 Google Gemini Pro 來打造一個具有LLM 功能 LINE Bot (三): 使用 Gemini-Pro-Vision 來打造名片管理的聊天機器人

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

image-20231216014823886

雖然才正式公佈不久,但是網路上其實有不少資源可以學習。我這邊列出一些資源: (直接問 Gemini Pro 出來的)

image-20231216015049307

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

如何取得 Google Gemini Pro - API Keys

到 Google AI Studio : https://makersuite.google.com/app/apikey

image-20231216015529412

目前價位如下,還有一些免費額度可以用:

Image

如何整合 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)
		}
	}
	fmt.Println("---")
	return ret + "\n---"
}

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. 資料時效相當的新

image-20231216022242789

image-20231216022248154

時效蠻新的,很多資料都是 2023/07 之後。ChatGPT 這種就回答不出來。

  • ChatGPT GPT 3.5 是 2022
  • API GPT4 是 2023/04

image-20231216015049307

  • 像是以上的內容,因為許多資料都有 link 可以使用,貼到 LINE Bot 沒有太多問題。
  • 不過因為直接回 Markdown 可能要把相關語法刪除掉,才能正確顯示。
  • 這裡註解一下,因為 Gemini Pro 的 temperature 預設是 0.9 (refer)

接下來:

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

# 參考資料:


Buy Me A Coffee

Evan

Attitude is everything