---
# System prepended metadata

title: AI應用 - 結合OCR與LLM，實現名片資料結構化
tags: [LLM, OCR, Python, GCP, AI]

---

****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？)
* 使用者指引(輸入錯誤時可提供正確之提示)
* 資料重複，
* 資料匯出



