由於個資不能上雲
我們需要在呼叫OpenAI前, 先將Prompt進行個資遮蔽,
也有可能需要AI協助閱讀文件或圖片內資料,
雖然目前已有AI視覺, 但都要進行OCR和PII了,
而且我們很少有那種需要直接讓AI看圖的需求,
本篇先來分析直接將OCR結果字串放在Prompt內呼叫OpenAI的流程
先列出SA規格:
- 可以指定Azure Document Intelligence(以下簡稱ocr)和 Azure OpenAI(以下簡稱ai)的Model,
如果有上傳檔案就解析套入Prompt - 呼叫者能傳入完整OpenAI上行結果的Json格式, 請參考: [AI] [Python] 用requests呼叫azure openai api
- 如果ocr model是prebuilt-read, 下行結果只會有全文, 取content即可,
如果是prebuilt-layout, 下行結果還會有tables, 所以要再取各table內容, 以csv格式列出(其它prebuilt暫不考慮)
如果是自訂, 只要抓field, 以csv格式列出, 而且可能有些field就是一個小table(下行會是dictionary或list),
當有小table時, 要展開單一值的field到table每行,
為了格式整齊, 當一個小table時才能轉csv, 多個小table就無法轉csv
欄位要依訓練時設的順序 - ai 回覆的下行結果再加上ocr組合字串和pii的偵測物件(=entity)
- 上行內容的個資置換成[個資類型加流水號], 參考: [需求分析] 淺談長文本個資遮蔽設計 最後一段
- 由 api 參數決定是否將ai回覆結果內的置換個資換回原個資
擴充OCR功能, 要加3個function :
- 回傳全文: 呼叫prebuilt-read取content
- 回傳段落+Tables: 呼叫prebuilt-layout, 取得paragraphs及tables,
並編號Table, 將table轉csv格式, 要考量到字串內包含分隔符號或換行時, 頭尾加\n, 置換字串的\"變\"\"
組合paragraphs, 其中與table重疊的部分有2個作法:
2.1. 換成Table資料
2.2. 換成: "*詳見[Table幾]"。在全文之後再一一列出各編號Table - 回傳自訂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
主流程如下:
- 如果有上傳檔案, 依傳入的ocr model呼叫不同function取得回覆字串,
套入ai 上行 json的messages裡最後一個content,
即: 上行實例.messages.Last().content = string.Format(上行實例.messages.Last().content, ocr結果組成字串); - 將上行messages內的content丟到pii取得置換個資後文字覆蓋回content, 保留置換前後個資及pii的entity
- 呼叫ai取得下行 json, 轉成class實例A
- 如果呼叫方有傳入參數表示需要原個資的話, 就將ai回覆內容的置換個資轉換回來
- 於實例A補上pii entity
- 如果有ocr結果, 於實例A補上ocr結果組成字串
延伸作法1:
呼叫者可能來自公司內各系統/各部門, 所有有費用分攤問題, 故可以將使資訊寫入DB,
記錄: 來源系統, 部門, 功能(ex. PII, OCR, OpenAI Model…),類型(ex. 上行, 下行, 快取, OCR Model) ,用量等資訊
延伸作法2:
另外也能加上regex以邏輯偵測, 以確保個資完全被遮蔽。但若以置換個資的方式, 要先處理第一次PII, 第二次PII及Regex這3種偵測到的文字必定會有重疊的情況, 要將重疊的部份去除
以上2種作法我皆已實作出來, 各位也可試試
Taiwan is a country. 臺灣是我的國家