[需求分析] 淺談整合Document Intelligence、PII、OpenAI流程

  • 30
  • 0
  • AI
  • 2025-09-19

由於個資不能上雲

我們需要在呼叫OpenAI前, 先將Prompt進行個資遮蔽,
也有可能需要AI協助閱讀文件或圖片內資料,
雖然目前已有AI視覺, 但都要進行OCR和PII了,  
而且我們很少有那種需要直接讓AI看圖的需求,
本篇先來分析直接將OCR結果字串放在Prompt內呼叫OpenAI的流程
先列出SA規格:

  1. 可以指定Azure Document Intelligence(以下簡稱ocr)和 Azure OpenAI(以下簡稱ai)的Model, 
    如果有上傳檔案就解析套入Prompt
  2. 呼叫者能傳入完整OpenAI上行結果的Json格式, 請參考:  [AI] [Python] 用requests呼叫azure openai api
  3. 如果ocr model是prebuilt-read, 下行結果只會有全文, 取content即可, 
    如果是prebuilt-layout, 下行結果還會有tables, 所以要再取各table內容, 以csv格式列出(其它prebuilt暫不考慮)
    如果是自訂, 只要抓field, 以csv格式列出, 而且可能有些field就是一個小table(下行會是dictionary或list), 
    當有小table時, 要展開單一值的field到table每行, 
    為了格式整齊, 當一個小table時才能轉csv, 多個小table就無法轉csv
    欄位要依訓練時設的順序
  4. ai 回覆的下行結果再加上ocr組合字串和pii的偵測物件(=entity)
  5. 上行內容的個資置換成[個資類型加流水號], 參考: [需求分析] 淺談長文本個資遮蔽設計 最後一段
  6. 由 api 參數決定是否將ai回覆結果內的置換個資換回原個資

擴充OCR功能, 要加3個function : 

  1. 回傳全文: 呼叫prebuilt-read取content
  2. 回傳段落+Tables: 呼叫prebuilt-layout, 取得paragraphs及tables, 
    並編號Table, 將table轉csv格式, 要考量到字串內包含分隔符號或換行時, 頭尾加\n, 置換字串的\"變\"\"
    組合paragraphs, 其中與table重疊的部分有2個作法:
       2.1. 換成Table資料  
       2.2. 換成: "*詳見[Table幾]"。在全文之後再一一列出各編號Table
  3. 回傳自訂Field的CSV: 
    由於下行的filed順序是亂的, 若要依原順序可先抓model基本資料, 取得其中欄位順序, 
    抓法可參考: [AI] 呼叫佈署為容器的Azure Document Intelligence
    取得的欄位用linq展開非小Table和小Table的欄位名為一個陣列A,
    再去讀下行json轉csv, 也要考量到字串內包含分隔符號或換行, 頭尾加\n, 置換字串的\"變\"\"
    非小Table的field的值只會有一筆, 先依陣列A的欄位名查順序放入一個新陣列B, 
    若有field是小Table, 則依每列複製陣列B和值, 再填入值,
    再將陣列A和上句陣列用linq串成csv

上/下行json格式各建一個class (含subclass), 以方便json轉換使用, 
現在很多線上工具(ex. son2csharp), 把上下行json結果丟進去, 可自動產生class
產出內容不一定能直接用, 要自己視情況改成Dictionary<string, ... >
下行class加上2個屬性: List<pii的Entity>, ocr結果的string

主流程如下:

  1. 如果有上傳檔案, 依傳入的ocr model呼叫不同function取得回覆字串, 
    套入ai 上行 json的messages裡最後一個content,
    即: 上行實例.messages.Last().content = string.Format(上行實例.messages.Last().content, ocr結果組成字串);
  2. 將上行messages內的content丟到pii取得置換個資後文字覆蓋回content, 保留置換前後個資及pii的entity
  3. 呼叫ai取得下行 json, 轉成class實例A
  4. 如果呼叫方有傳入參數表示需要原個資的話, 就將ai回覆內容的置換個資轉換回來
  5. 於實例A補上pii entity
  6. 如果有ocr結果, 於實例A補上ocr結果組成字串

延伸作法1
   呼叫者可能來自公司內各系統/各部門, 所有有費用分攤問題, 故可以將使資訊寫入DB,
記錄: 來源系統, 部門, 功能(ex. PII, OCR, OpenAI Model…),類型(ex. 上行, 下行, 快取, OCR Model) ,用量等資訊

延伸作法2
  另外也能加上regex以邏輯偵測, 以確保個資完全被遮蔽。但若以置換個資的方式, 要先處理第一次PII, 第二次PII及Regex這3種偵測到的文字必定會有重疊的情況, 要將重疊的部份去除

以上2種作法我皆已實作出來, 各位也可試試

Taiwan is a country. 臺灣是我的國家