****AI應用 - 結合OCR與LLM,實現名片資料結構化
===
問題
---
如何將名片上的資料轉換成JSON,供後續系統使用
資料流
--
1. 使用者將名片拍照,上傳至line 官方帳號
2. 透過WebHook,將Message ID傳給Google CCloud Function
3. 根據Message ID,取得上傳影像檔案
4. 使用Coud Vision AI之OCR功能,擷取影像檔案所包含之文字資料,範例如下:
```
tmht
medical service provider
陳鴻裕
系統開發事業處
技術長
Omnicell
大同醫護股份有限公司
104427台北市中山區中山北路三段22號(北設工6樓)
電話:(02)7735-0950·2700-2737ext.950
統一編號:27397172
https://www.tmhtc.net
E-mail:hongyu.chen@tmhtc.net
行動電話:0935-589-471
```
5. 使用Vertex AI,將文字資料轉為半結構化的JSON/NDJSON格式,範例如下:
```
{
"公司名稱": "大同醫護股份有限公司",
"姓名": "陳鴻裕",
"部門": "系統開發事業處",
"職稱": "技術長",
"地址": [
{
"地址": "104427台北市中山區中山北路三段22號(北設工6樓)",
"電話號碼": "(02)7735-0950·2700-2737ext.950"
}
],
"統一編號": "27397172",
"網站": "https://www.tmhtc.net",
"電子郵件": "hongyu.chen@tmhtc.net",
"行動電話號碼": "0935-589-471"
}
```
6. 將相關檔案(影像、文字、JSON)儲存於Google Cloud Storage
7. 將文字匯入Google Vertex AI的資料儲存庫
8. 將JSON資料匯入MongoDB
9. 詢問已拍照匯入之名片相關資料

系統建置與相關技術:
--
1. Line官方帳號申請
2. Line Message API啟用
3. Google Cloud Storage
雖然名片資料最終儲存於mongoDB,但處理過程中所產生的暫存檔儲存在Google Cloud Storage。系統需要以下暫存位置:

* 系統:處理過程中需要之JSON Template檔案
* 目前提供兩組Template:
* `{
"公司名稱": "",
"公司名稱(英文)": "",
"姓名": "",
"姓名(英文)": "",
"部門": "",
"職稱": [
{
"職稱": ""
}
],
"地址": [
{
"地址": "",
"電話號碼": "",
"分機號碼": ""
}
],
"統一編號": "",
"網站": "",
"電子郵件": "",
"行動電話號碼": "",
"Line ID": ""
}`
* `{
"公司名稱": "",
"公司名稱(英文)": "",
"姓名": "",
"姓名(英文)": "",
"部門": "",
"職稱": "",
"地址": [
{
"地址": "",
"電話號碼": "",
"分機號碼": ""
}
],
"統一編號": "",
"網站": "",
"電子郵件": "",
"行動電話號碼": "",
"Line ID": ""
}`
* 影像:儲存拍攝上傳知名片影像檔
* TXT檔(聯絡方式):OCR所產生的文字檔
* JSON檔(結構資料):LLM所產生的JSON檔
* 暫存:處理過程中有錯誤或無法順利產生結果時,暫存檔案的位置
4. Google Cloud Function
負責系統主要處理流程,主要邏輯如下:
* 接收Line Server轉傳之訊息並parsing
* 若訊息種類為"image",下載影像檔
* 使用Version AI,取得影像檔之文字
* 使用Generative AI,將文字轉會為結構化的JSON檔
* 將JSON儲存至mongoDB
* 若訊息種類為"text",搜尋mongoDB並回傳搜尋結果
* "#"開頭表示搜尋個人
* "@"開頭表示搜尋公司
Cloud Function必須設定以下環境變數,根據相關環境變數,Cloud Function可連接Line、Cloud Storage、Generative AI與MongoDB。相關設定範例如下:

5. Google Cloud Vision AI
Cloud Vision AI可辨識影像檔、PDF與TIFF所包含的文字,可以辨識手寫文字,相關程式碼如下:
```
def extract_text_from_memory(content):
client = vision.ImageAnnotatorClient()
image = vision.Image(content=content)
response = client.text_detection(image=image)
texts = response.text_annotations
return texts[0].description
```
6. Google Generaticeai
使用LLM技術將文字檔轉會為JSON檔,提供JSON Template,LLM即可根據該Template產生對應之JSON檔案。
7. Google Cloud Function
另一個Google Cloud Function則為事件驅動,當JSON順利產生時,該事件會驅動`sasa-worker`Cloud Function,將JSON檔儲存至mongoDB。
8. MongoDB Altas
以JSON格式儲存名片資料以供查詢
背景作業 - 資料正確性與格式正規化
---
* 電話、行動電話、統一編號等有特定格式欄位可透過背景作業執行正規化,如果格式錯誤則修正或刪除。
* 公司名稱、公司名稱(英文)、統一編號、地址等訊息,可透過同一公司其他訊息補強。
背景作業 - House Keeping
---
* 失敗檔案會儲存於暫存目錄,透過背景作業可重新使用LLM(使用較簡單的提示,取得主要資料),取得相關資料。
* 同一張名片重複輸入,採用資料交集。
背景作業 - 公司資料整理
---
透過個人資料累積,建立公司部門組織結構與校正基本資料。
未來功能增加與系統改善
---
* LLM/OCR皆有其不穩定性,可針對mongoDB以儲存的資料作進一步處理,得到更佳的效果。例如:姓名誤植為中英文修正、電話號碼格式正規化
* 結合Open Data可將基本資料更精確,例如:公司中英文名稱確認、公司統編補足等
* 使用者介面優化(開發專屬APP?)
* 使用者指引(輸入錯誤時可提供正確之提示)
* 資料重複,
* 資料匯出