使用 OCI Vision 和 OCI Generative AI 实现发票图像自动化
简介
公司通常会收到数千张非结构化格式的发票,这些发票是来自供应商和服务提供商的扫描图像或 PDF。从这些发票中手动提取数据(例如发票编号、客户名称、采购的货品和总金额)是一个耗时且容易出错的过程。
这些处理延迟不仅会影响应付账款周期和现金流可见性,还会导致合规性、审计和报告方面的瓶颈。
此教程演示了如何实施自动化管道来监视 Oracle Cloud Infrastructure (OCI) 中存储桶的传入发票图像,使用 OCI Vision 提取文本内容,然后应用 OCI Generative AI (LLM) 提取结构化财务数据,例如发票编号、客户和货品列表。
本教程中使用的 OCI 服务包括:
服务 | 用途 |
---|---|
OCI 视觉服务 | 对上载的发票图像执行 OCR。 |
OCI 生成式 AI | 使用少量提示从原始 OCR 文本中提取结构化 JSON 数据。 |
OCI 对象存储 | 存储输入发票图像和输出 JSON 结果。 |
目标
-
自动从 OCI Object Storage 中提取发票。
-
从半结构化扫描文档中提取结构化数据。
-
使用 OCI AI 服务在实时管道中集成光学字符识别 (OCR) 和 LLM。
Prerequisites
-
具有以下访问权限的 OCI 账户:
-
OCI 视觉
-
OCI 生成式 AI
-
OCI 对象存储
-
-
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 Object Storage 和 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
。 -
OCR 与 OCI Vision:
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 帮助中心。
Automate Invoice Images with OCI Vision and OCI Generative AI
G39787-01
Copyright ©2025, Oracle and/or its affiliates.