LY Corporation Tech Blog

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

使用 Golang 透過 Google Gemini Pro 來打造一個具有LLM 功能 LINE Bot (三): 使用 Gemini-Pro-Vision 來打造名片管理的聊天機器人

前提

在之前的文章中,探討了如何使用 Golang 結合 Google Gemini Pro 來開發一個具備大型語言模型(LLM)功能的 LINE Bot。這些文章分別介紹了如何整合 Gemini Pro 的聊天完成(Chat Completion)和圖像識別(Image Vision)功能:

  1. 使用 Golang 透過 Google Gemini Pro 來打造一個具有LLM 功能 LINE Bot (一): 聊天完成與圖像識別
  2. 使用 Golang 透過 Google Gemini Pro 來打造一個具有LLM 功能 LINE Bot (二): 使用聊天會話(Chat Session)與 LINE Bot 快速整合,打造具有記憶功能的 LINE Bot

這次,將簡要介紹如何利用 Gemini Pro Vision 模型來創建一個能夠幫助你整理名片的小工具,它甚至能自行識別名片上的資訊。

相關開源程式碼:

https://github.com/kkdai/linebot-smart-namecard

註解: 關於如何使用 Notion 作為線上免費的資料庫,請參考這篇文章 : [Golang][Notion] 如何透過 Golang 來操控 Notion DB 當成線上資料庫 

系列文章:

  1. 使用 Golang 透過 Google Gemini Pro 來打造一個具有LLM 功能 LINE Bot (一): 聊天完成與圖像識別
  2. 使用 Golang 透過 Google Gemini Pro 來打造一個具有LLM 功能 LINE Bot (二): 使用聊天會話(Chat Session)與 LINE Bot 快速整合,打造具有記憶功能的 LINE Bot
  3. 使用 Golang 透過 Google Gemini Pro 來打造一個具有LLM 功能 LINE Bot (三): 使用 Gemini-Pro-Vision 來打造名片管理的聊天機器人 (本篇)

辨識名片處理上的小訣竅

執行的 Prompt

關於打造一個名片辨識的部分,這裡分享相關的做法:

// Const variables of Prompts.
const ImagePrompt = "這是一張名片,你是一個名片秘書。請將以下資訊整理成 json 給我。如果看不出來的,幫我填寫 N/A, 只好 json 就好:  Name, Title, Address, Email, Phone, Company.   其中 Phone 的內容格式為 #886-0123-456-789,1234. 沒有分機就忽略 ,1234"
 

這個名片分成幾個部分來解釋:

解析圖片

相關資訊透過照片的上傳。請 Gemini Pro Vision 來分析。

產出格式

這裡有說明,希望 LLm 將資訊透過 json 來提供解決。並且透過以下欄位來分開提供。 這裡也說明一下,這樣說明,就會讓 LLM 會自動去看懂名片上的資訊然後分開提供給你相關資訊。

  • Name
  • Title
  • Address
  • Email
  • Phone
  • Company

特殊處理

透過 Gemini-Pro-Vision 或是其他 GPT-Vision 大模型來處理影像的時候,都需要準備相關的特殊處理。

關於名片上電話的處理案例:

以下分享幾個電話例子:

  • (02) 1234-5678
  • (02) 1234 5678
  • (02) 1234-5678 轉 123
  • (02) 1234-5678 分機 123

根據電話資訊的正確輸入法: 電話好買 *886-02-1234-5678, 1234 (如果分機是 1234) 的話。 使用以下的 Prompt 可以有效的取得:

"其中 Phone 的內容格式為 #886-0123-456-789,1234. 沒有分機就忽略 ,1234。"

關於名片上空白數值:

如果在 Notion 資料庫中有著空的數值不會有任何問題。但是如果要使用 Flex Message 卡片格式來放資料。每一個欄位則必須要有數值,不然 LINE 平台無法接受這樣的 Flex Message. 。

而相信許多人也收過,有些人的名片是比較精簡的版本,上面並不會有職稱,或是說不會有電話(比較常見)。這個時候需要填入一些數值,讓資料不會有空值。 相關的 Prompt 為:

如果看不出來的,幫我填寫 N/A

GPT Vision 辨識處理 Golang 程式碼

關於 Gemini Pro 影像辨識的程式碼是跟之前(第一篇文章)一樣,這邊就不重新敘述。也可以直接參考 github 。 但是這裡寫一下處理的方式:

透過外部參數或是環境變數處理 Prompt

在寫 LLM 相關應用的時候,要記得 Prompt 是會隨時去調整來取得最佳的辨識效果。這時候如果 Prompt 是寫在程式碼裡面,就會發生不斷修改與部署。建議要寫在外部資料庫,或是系統環境變數。以下提供相關流程:

 // Const variables of Prompts.
const ImagePrompt = "這是一張名片,你是一個名片秘書。請將以下資訊整理成 json 給我。如果看不出來的,幫我填寫 N/A, 只好 json 就好:  Name, Title, Address, Email, Phone, Company.   其中 Phone 的內容格式為 #886-0123-456-789,1234. 沒有分機就忽略 ,1234"


// 檢查是否有環境變數,如果沒有,就使用自定義的 Prompt 。
card_prompt := os.Getenv("CARD_PROMPT")
	if card_prompt == "" {
		card_prompt = ImagePrompt
	}
	

// 透過圖片下 Prompt
// Chat with Image
				ret, err := GeminiImage(data, card_prompt)
				if err != nil {
					ret = "無法辨識圖片內容文字,請重新輸入:" + err.Error()
					if err := replyText(e.ReplyToken, ret); err != nil {
						log.Print(err)
					}
					continue
				}
 

輸入卡片到資料庫的基本處理

雖然本篇文章不會詳細敘述關於 Notion 資料庫的處理。但是這邊稍微提供卡片資料庫的基本處理流程。

  • 掃描到卡片後,透過 Email 作為卡片的唯一資料來檢查是否有重複資料。
  • 如果有 Email 相同,則會 skip 本次的掃描資訊。

這部分的處理就算是一個段落,接下來要講解如何透過關鍵字搜尋的相關處理。

方便的名片搜尋

以往在搜尋名片的時候,經常會使用一些關鍵字來搜尋。比如說:

  • 想要找出所有認識的「經理」
  • 想要找位於某間公司的所有窗口
  • 想要找出所有認識的行銷窗口
  • 印象中認識一位「李教授」但是不確定是哪間學校。

以上的方式都是名片搜尋需要的功能,本段將介紹該如何實作這一段的部分:

名片搜尋方式:

這邊稍微列出在 Notion 上面使用的程式碼:

				//using test as keyword to query database
				nDB := &NotionDB{
					DatabaseID: os.Getenv("NOTION_DB_PAGEID"),
					Token:      os.Getenv("NOTION_INTEGRATION_TOKEN"),
					UID:        uID,
				}

				// Query the database with the provided uID and text
				results, err := nDB.QueryDatabaseContains(message.Text)
				log.Println("Got results:", results)

				// If there's an error or no results, reply with an error message
				if err != nil || len(results) == 0 {
					ret := "查不到資料,請重新輸入"
					if err != nil {
						ret = fmt.Sprintf("%s: %s", ret, err.Error())
					}
					if err := replyText(e.ReplyToken, ret); err != nil {
						log.Print(err)
					}
					continue
				}
 

其中 QueryDatabaseContains 這個 function 會先尋找 Name, Title 與公司名稱。依照這三個順序,將所有的資料搜尋出來。

成果與未來展望

使用方式:

  • 新增名片: 直接透過相片,掃描名片即可。 不需要像其他名片軟體需要抓名片的四周,也不需要等待對應。
  • 查詢名片: 直接在 LINE Bot 想要搜尋的關鍵字,接下來會自動去搜尋「姓名」「職稱」「公司名稱」等等欄位。

未來展望:

1. 更智慧的操作流程

目前相關套件,沒有比較好的 Gemini Pro 的 Function Calling 可以使用。 我有起了一些架構在,接下來會使用 Function Callin 來達到以下相關功能:

  • 智慧查詢: 可以問一個句子,找出相關名片資料。 (e.g. 想找是學術界,姓陳的教授。)
  • 交流紀錄: 可以增加一筆欄位交流紀錄,透過輸入交流紀錄之後可以有更多相關資料可以輔助。

2. 圖片支援

目前沒有將原來的名片圖片存取下來,由於 Notion 並不開放直接上傳檔案,這部分也會思考如何在 Notion 裡面可以更順暢的處理。

如果有更多建議,也歡迎送上 Pull Request https://github.com/kkdai/linebot-smart-namecard 

總結:

本文介紹了利用 Golang 和 Google Gemini Pro 開發的 LINE Bot,它能夠識別名片資訊,並將其整理和搜尋,未來還將增加更多智慧查詢和交流紀錄功能,以提升用戶管理名片的效率。

參考資料: