****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. 詢問已拍照匯入之名片相關資料 ![AI應用-2](https://hackmd.io/_uploads/BkCfxYrB0.png) 系統建置與相關技術: -- 1. Line官方帳號申請 2. Line Message API啟用 3. Google Cloud Storage 雖然名片資料最終儲存於mongoDB,但處理過程中所產生的暫存檔儲存在Google Cloud Storage。系統需要以下暫存位置: ![BusinessCard-1](https://hackmd.io/_uploads/rJZVQqoLA.png) * 系統:處理過程中需要之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。相關設定範例如下: ![BusinessCard-2](https://hackmd.io/_uploads/SJEgNioU0.png) 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?) * 使用者指引(輸入錯誤時可提供正確之提示) * 資料重複, * 資料匯出