Try   HackMD

****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
  1. 使用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"
}
  1. 將相關檔案(影像、文字、JSON)儲存於Google Cloud Storage
  2. 將文字匯入Google Vertex AI的資料儲存庫
  3. 將JSON資料匯入MongoDB
  4. 詢問已拍照匯入之名片相關資料

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

系統建置與相關技術:

  1. Line官方帳號申請
  2. Line Message API啟用
  3. Google Cloud Storage
    雖然名片資料最終儲存於mongoDB,但處理過程中所產生的暫存檔儲存在Google Cloud Storage。系統需要以下暫存位置:
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →
  • 系統:處理過程中需要之JSON Template檔案
    • 目前提供兩組Template:
      • { "公司名稱": "", "公司名稱(英文)": "", "姓名": "", "姓名(英文)": "", "部門": "", "職稱": [ { "職稱": "" } ], "地址": [ { "地址": "", "電話號碼": "", "分機號碼": "" } ], "統一編號": "", "網站": "", "電子郵件": "", "行動電話號碼": "", "Line ID": "" }
      • { "公司名稱": "", "公司名稱(英文)": "", "姓名": "", "姓名(英文)": "", "部門": "", "職稱": "", "地址": [ { "地址": "", "電話號碼": "", "分機號碼": "" } ], "統一編號": "", "網站": "", "電子郵件": "", "行動電話號碼": "", "Line ID": "" }
  • 影像:儲存拍攝上傳知名片影像檔
  • TXT檔(聯絡方式):OCR所產生的文字檔
  • JSON檔(結構資料):LLM所產生的JSON檔
  • 暫存:處理過程中有錯誤或無法順利產生結果時,暫存檔案的位置
  1. 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。相關設定範例如下:

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

  1. 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
  1. Google Generaticeai
    使用LLM技術將文字檔轉會為JSON檔,提供JSON Template,LLM即可根據該Template產生對應之JSON檔案。

  2. Google Cloud Function
    另一個Google Cloud Function則為事件驅動,當JSON順利產生時,該事件會驅動sasa-workerCloud Function,將JSON檔儲存至mongoDB。

  3. MongoDB Altas
    以JSON格式儲存名片資料以供查詢

背景作業 - 資料正確性與格式正規化

  • 電話、行動電話、統一編號等有特定格式欄位可透過背景作業執行正規化,如果格式錯誤則修正或刪除。
  • 公司名稱、公司名稱(英文)、統一編號、地址等訊息,可透過同一公司其他訊息補強。

背景作業 - House Keeping

  • 失敗檔案會儲存於暫存目錄,透過背景作業可重新使用LLM(使用較簡單的提示,取得主要資料),取得相關資料。
  • 同一張名片重複輸入,採用資料交集。

背景作業 - 公司資料整理

透過個人資料累積,建立公司部門組織結構與校正基本資料。

未來功能增加與系統改善

  • LLM/OCR皆有其不穩定性,可針對mongoDB以儲存的資料作進一步處理,得到更佳的效果。例如:姓名誤植為中英文修正、電話號碼格式正規化
  • 結合Open Data可將基本資料更精確,例如:公司中英文名稱確認、公司統編補足等
  • 使用者介面優化(開發專屬APP?)
  • 使用者指引(輸入錯誤時可提供正確之提示)
  • 資料重複,
  • 資料匯出