使用 OCI Vision 和 OCI Generative AI 將發票影像自動化
簡介
公司通常會收到數千張非結構化格式的發票,這些發票是源自供應商和服務供應商的掃描影像或 PDF。手動從這些發票中擷取資料,例如發票號碼、客戶名稱、採購項目和總金額,都是耗時且容易出錯的流程。
這些處理延遲不僅會影響應付帳款週期與現金流量的可見性,還會導致合規性、稽核及報表出現瓶頸。
本教學課程示範如何在 Oracle Cloud Infrastructure (OCI) 中導入監控內送發票映像檔儲存桶的自動化管線、使用 OCI Vision 擷取文字內容,然後套用 OCI Generative AI (LLM) 以擷取結構化會計資料,例如發票號碼、客戶和項目清單。
本教學課程中使用的 OCI 服務包括:
服務 | 目的 |
---|---|
OCI Vision | 對上傳的發票影像執行光學辨識 。 |
OCI 生成式 AI | 使用少量快照提示,從原始 OCR 文字擷取結構化 JSON 資料。 |
OCI Object Storage | 儲存輸入發票影像與輸出 JSON 結果。 |
目標
-
自動從 OCI Object Storage 擷取發票。
-
從半結構化掃描的文件擷取結構化資料。
-
使用 OCI AI 服務將光學字元辨識 (OCR) 和 LLM 整合至即時管線。
必備條件
-
可存取下列項目的 OCI 帳戶:
-
OCI Vision
-
OCI 生成式 AI
-
OCI Object Storage
-
-
Python
3.10
或更新版本。 -
輸入影像的儲存桶 (例如
input-bucket
),另一個用於輸出檔案 (例如output-bucket
)。 -
下載下列檔案:
工作 1:設定 Python 套裝軟體
-
使用下列命令執行
requirements.txt
檔案。pip install -r requirements.txt
-
執行 Python 程序檔 (
main.py
)。 -
將發票影像 (例如
.png
、.jpg
) 上傳至您的輸入分組。 -
等待處理影像,以及儲存在輸出儲存桶中的擷取 JSON。
工作 2:瞭解程式碼
-
載入組態:
with open("./config", "r") as f: config_data = json.load(f)
此程式碼會載入所有必要的組態值,例如命名空間、儲存桶名稱、區間 ID 以及 LLM 端點。
在
config
檔案中輸入您的組態參數。{ "oci_profile": "DEFAULT", "namespace": "your_namespace", "input_bucket": "input-bucket", "output_bucket": "output-bucket", "compartment_id": "ocid1.compartment.oc1..xxxx", "llm_endpoint": "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com" }
-
起始 OCI 從屬端:
oci_config = oci.config.from_file("~/.oci/config", PROFILE) object_storage = oci.object_storage.ObjectStorageClient(oci_config) ai_vision_client = oci.ai_vision.AIServiceVisionClient(oci_config)
此程式碼會設定 OCI SDK 從屬端以存取 OCI 物件儲存和 OCI Vision 服務。如需詳細資訊,請參閱 OCI Vision 。
-
初始化 LLM:
llm = ChatOCIGenAI( model_id="meta.llama-3.1-405b-instruct", service_endpoint=LLM_ENDPOINT, compartment_id=COMPARTMENT_ID, auth_profile=PROFILE, model_kwargs={"temperature": 0.7, "top_p": 0.75, "max_tokens": 2000}, )
此程式碼初始化 OCI Generative AI 模型,以進行自然語言理解和文字至結構的轉換。
-
少許快照提示:
few_shot_examples = [ ... ] instruction = """ You are a fiscal data extractor. ... """
此程式碼使用少量快照學習,提供預期輸出的範例,讓模型瞭解如何擷取結構化欄位,例如
number of invoice
、customer
、location
和items
。 -
使用 OCI Vision 進行 OCR:
def perform_ocr(file_name): print(f"📄 Performing OCR on: {file_name}") response = ai_vision_client.analyze_document( analyze_document_details=oci.ai_vision.models.AnalyzeDocumentDetails( features=[ oci.ai_vision.models.DocumentTableDetectionFeature( feature_type="TEXT_DETECTION")], document=oci.ai_vision.models.ObjectStorageDocumentDetails( source="OBJECT_STORAGE", namespace_name=NAMESPACE, bucket_name=INPUT_BUCKET, object_name=file_name), compartment_id=COMPARTMENT_ID, language="POR", document_type="INVOICE") ) print(response.data) return response.data
此函數 :
- 將映像檔傳送至 OCI Vision。
- 要求文字偵測。
- 傳回擷取的原始文字。
-
使用 LLM 擷取資料:
def extract_data_with_llm(ocr_result, file_name): # 🔍 Extrai texto OCR (usando a estrutura da resposta do OCI Vision) extracted_lines = [] for page in getattr(ocr_result, 'pages', []): for line in getattr(page, 'lines', []): extracted_lines.append(line.text.strip()) plain_text = "\n".join(extracted_lines) # 🧠 Monta o prompt com instrução, few-shot e texto OCR limpo prompt = instruction + "\n" + "\n".join(few_shot_examples) + f"\nInvoice text:\n{plain_text}\nExtracted fields (JSON format):" # 🔗 Chamada ao LLM response = llm([HumanMessage(content=prompt)]) # 🧪 Tenta extrair JSON puro da resposta try: content = response.content.strip() first_brace = content.find("{") last_brace = content.rfind("}") json_string = content[first_brace:last_brace + 1] parsed_json = json.loads(json_string) except Exception as e: print(f"⚠️ Erro ao extrair JSON da resposta do LLM: {e}") parsed_json = {"raw_response": response.content} return { "file": file_name, "result": parsed_json, "timestamp": datetime.utcnow().isoformat() }
此函數 :
- 結合指示、少量快照範例和 OCR 文字。
- 準備 OCI Vision 傳回的 OCR 資料。
- 將其傳送至 OCI Generative AI。
- 接收結構化 JSON 欄位 (作為字串)。
- OCI Vision 支援葡萄牙文 OCR (
language="POR"
可取代"ENG"
)。
-
將輸出儲存至 OCI 物件儲存:
def save_output(result, file_name): ...
此程式碼會使用原始檔案名稱 (副檔名為
.json
) 將結構化結果上傳至輸出儲存桶。 -
主迴圈 - 監視與處理:
def monitor_bucket(): ...
主要常式:
- 每 30 秒監督輸入儲存桶。
- 偵測新的
.png
、.jpg
、.jpeg
檔案。 - 執行 OCR、LLM 並依序上傳。
- 持續追蹤記憶體中已處理的檔案。
-
進入點:
if __name__ == "__main__": monitor_bucket()
此代碼會啟動分組監視器,並自動開始處理商業發票。
任務 3:執行程式碼
使用下列命令執行程式碼。
python main.py
作業 4:測試建議
-
使用含有合法產品線與客戶名稱的實際或虛擬商業發票。
-
依序在輸入儲存桶上傳多個影像,以查看自動化處理。
-
登入 OCI 主控台,瀏覽至物件儲存以驗證兩個儲存桶中的結果。
注意:在本教學課程中,使用的範例是巴西發票,說明屬性和處置的複雜性,以及如何建立提示來解決此情況。
作業 5:檢視預期輸出
針對每個上傳的發票影像,查看已處理的輸出分組檔案。相對應的 .json
檔案會以結構化內容產生,如下圖所示。
注意:
- OCI Vision 支援葡萄牙文 OCR (
language="POR"
可取代"ENG"
)。- 您可以調整 LLM 提示以擷取其他欄位,例如
CNPJ
、quantidade
、data de emissão
等等。- 請考慮將
processed_files
與資料庫或檔案保存,以容錯處理。- 此處理可與下列使用案例搭配使用:使用多代理程式通訊協定伺服器建立 AI 代理程式以進行發票解析作為預先處理的發票影像。商業發票是來自公司客戶的商業發票。客戶與地點欄位是從發票建立者擷取。
相關連結
確認
- 作者 - Cristiano Hoshikawa (Oracle LAD A - 團隊解決方案工程師)
其他學習資源
在 docs.oracle.com/learn 上探索其他實驗室,或在 Oracle Learning YouTube 頻道上存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。
如需產品文件,請造訪 Oracle Help Center 。
Automate Invoice Images with OCI Vision and OCI Generative AI
G39788-01
Copyright ©2025, Oracle and/or its affiliates.