Automatiza las imágenes de facturas con OCI Vision y OCI Generative AI
Introducción
Las empresas a menudo reciben miles de facturas en formatos no estructurados como imágenes escaneadas o PDF procedentes de proveedores y proveedores de servicios. La extracción manual de datos de estas facturas, como el número de factura, el nombre del cliente, los artículos comprados y el importe total, es un proceso que requiere mucho tiempo y es propenso a errores.
Estos retrasos en el procesamiento no solo afectan los ciclos de cuentas a pagar y la visibilidad del flujo de caja, sino que también introducen cuellos de botella en el cumplimiento, la auditoría y la generación de informes.
En este tutorial se muestra cómo implantar un pipeline automatizado que supervise un cubo en Oracle Cloud Infrastructure (OCI) para las imágenes de facturas entrantes, extraiga contenido textual mediante OCI Vision y, a continuación, aplique OCI Generative AI (LLM) para extraer datos fiscales estructurados como el número de factura, el cliente y la lista de artículos.
Los servicios de OCI utilizados en este tutorial son:
Servicio | Finalidad |
---|---|
OCI Vision | Realiza OCR en imágenes de facturas de venta cargadas. |
OCI Generative AI | Extrae datos JSON estructurados del texto de OCR sin formato mediante peticiones de datos de pocos resultados. |
OCI Object Storage | Almacena imágenes de facturas de entrada y resultados de JSON de salida. |
Objetivos
-
Automatiza la ingesta de facturas desde OCI Object Storage.
-
Permite extraer datos estructurados de documentos escaneados semiestructurados.
-
Integra el reconocimiento óptico de caracteres (OCR) y el LLM en pipelines en tiempo real mediante los servicios de IA de OCI.
Requisitos
-
Una cuenta de OCI con acceso a:
-
OCI Vision
-
OCI Generative AI
-
OCI Object Storage
-
-
Una versión
3.10
o posterior de Python. -
Un cubo para imágenes de entrada (por ejemplo,
input-bucket
) y otro para archivos de salida (por ejemplo,output-bucket
). -
Descargue los siguientes archivos:
Tarea 1: Configuración de paquetes de Python
-
Ejecute el archivo
requirements.txt
con el siguiente comando.pip install -r requirements.txt
-
Ejecute el script de Python (
main.py
). -
Cargue imágenes de factura (por ejemplo,
.png
,.jpg
) en el cubo de entrada. -
Espere a que se procese la imagen y se guarde el JSON extraído en el cubo de salida.
Tarea 2: Descripción del código
-
Cargar Configuración:
with open("./config", "r") as f: config_data = json.load(f)
Este código carga todos los valores de configuración necesarios, como el espacio de nombres, los nombres de cubo, el ID de compartimento y el punto final del LLM.
Introduzca los parámetros de configuración en el archivo
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" }
-
Inicializar clientes de 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)
Este código configura los clientes SDK de OCI para acceder a los servicios OCI Object Storage y OCI Vision. Para obtener más información, consulte OCI Vision.
-
Inicializar 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}, )
Este código inicializa el modelo de IA generativa de OCI para la comprensión del lenguaje natural y la conversión de texto a estructura.
-
Petición de datos breve:
few_shot_examples = [ ... ] instruction = """ You are a fiscal data extractor. ... """
Este código utiliza un aprendizaje puntual proporcionando un ejemplo de salida esperada para que el modelo aprenda a extraer campos estructurados como
number of invoice
,customer
,location
yitems
. -
OCR con 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
Esta función:
- Envía la imagen a OCI Vision.
- Solicita la detección de texto.
- Devuelve el texto sin formato extraído.
-
Extracción de datos con 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() }
Esta función:
- Combina instrucciones, ejemplos cortos y texto de OCR.
- Prepara los datos de OCR devueltos por OCI Vision.
- Lo envía a OCI Generative AI.
- Recibe campos JSON estructurados (como cadena).
- OCI Vision soporta OCR portugués (se puede utilizar
language="POR"
en lugar de"ENG"
).
-
Guardar salida en OCI Object Storage:
def save_output(result, file_name): ...
Este código carga el resultado estructurado en el cubo de salida mediante el nombre de archivo original con la extensión
.json
. -
Bucle Principal: Supervisión y Proceso:
def monitor_bucket(): ...
Rutina principal que:
- Supervisa el cubo de entrada cada 30 segundos.
- Detecta nuevos archivos
.png
,.jpg
y.jpeg
. - Ejecuta OCR, LLM y la carga en secuencia.
- Realiza un seguimiento de los archivos ya procesados en la memoria.
-
Punto de Entrada:
if __name__ == "__main__": monitor_bucket()
Este código inicia el observador del bloque y comienza a procesar facturas automáticamente.
Tarea 3: Ejecutar el código
Ejecute el código con el siguiente comando.
python main.py
Tarea 4: Sugerencias de prueba
-
Utilice facturas de venta reales o ficticias con líneas de productos legibles y nombre de cliente.
-
Cargue varias imágenes en el bloque de entrada en secuencia para ver el procesamiento automatizado.
-
Conéctese a la consola de OCI y vaya a Object Storage para verificar los resultados en ambos cubos.
Nota: En este tutorial, el ejemplo utilizado es una factura brasileña para ilustrar la complejidad de los atributos y la disposición y cómo se creó la petición de datos para resolver este caso.
Tarea 5: Ver salida esperada
Para cada imagen de factura cargada, consulte el archivo de cubo de salida procesado. Se genera un archivo .json
correspondiente con contenido estructurado como se muestra en la siguiente imagen.
Nota:
- OCI Vision soporta OCR portugués (se puede utilizar
language="POR"
en lugar de"ENG"
).- La petición de datos del LLM se puede ajustar para extraer otros campos como
CNPJ
,quantidade
,data de emissão
, etc.- Piense en mantener
processed_files
con una base de datos o un archivo para que el proceso sea tolerante a fallos.- Este proceso se puede utilizar con el caso de uso: Creación de un agente AI con el servidor de protocolos de comunicación de varios agentes para la resolución de facturas como imagen de factura preprocesada. La factura es una factura de devolución del cliente de la compañía. Los campos cliente y ubicación se capturan del creador de la factura.
Enlaces relacionados
Acuses de recibo
- Autor - Cristiano Hoshikawa (Oracle LAD A - Ingeniero de soluciones de equipo)
Más recursos de aprendizaje
Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de aprendizaje gratuito en el canal YouTube de Oracle Learning. Además, visite education.oracle.com/learning-explorer para convertirse en un explorador de Oracle Learning.
Para obtener documentación sobre el producto, visite Oracle Help Center.
Automate Invoice Images with OCI Vision and OCI Generative AI
G39783-01
Copyright ©2025, Oracle and/or its affiliates.