OCI Vision 및 OCI Generative AI로 송장 이미지 자동화하기
소개
기업은 공급업체 및 서비스 제공업체로부터 스캔한 이미지 또는 PDF로 인해 수천 건의 송장을 구조화되지 않은 형식으로 수신하는 경우가 많습니다. 송장 번호, 고객 이름, 구매 품목 및 총 금액과 같은 송장에서 데이터를 수동으로 추출하는 것은 시간이 많이 걸리고 오류가 발생하기 쉬운 프로세스입니다.
이러한 처리 지연은 미지급금 주기 및 현금 흐름 가시성에 영향을 줄 뿐만 아니라 규정 준수, 감사 및 보고에 병목 현상이 발생합니다.
이 사용지침서에서는 수신 송장 이미지에 대해 Oracle Cloud Infrastructure(OCI)의 버킷을 모니터링하고, OCI Vision을 사용하여 텍스트 콘텐츠를 추출한 다음, OCI Generative AI(LLM)를 적용하여 송장 번호, 고객, 항목 목록과 같은 구조화된 회계 데이터를 추출하는 자동화된 파이프라인을 구현하는 방법을 설명합니다.
이 자습서에 사용된 OCI 서비스는 다음과 같습니다.
서비스 | 용도 |
---|---|
OCI Vision | 업로드된 송장 이미지에 대해 OCR을 수행합니다. |
OCI 생성형 AI | 몇 샷 프롬프트를 사용하여 원시 OCR 텍스트에서 구조화된 JSON 데이터를 추출합니다. |
OCI 오브젝트 스토리지 | 입력 송장 이미지 및 출력 JSON 결과를 저장합니다. |
목표
-
OCI Object Storage에서 송장 수집을 자동화합니다.
-
반구조적 스캔 문서에서 구조적 데이터를 추출합니다.
-
OCI AI 서비스를 사용하여 실시간 파이프라인에 OCR(광 문자 인식) 및 LLM을 통합할 수 있습니다.
필수 조건
-
다음에 액세스할 수 있는 OCI 계정:
-
OCI Vision
-
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 Object Storage 및 OCI Vision 서비스에 액세스하기 위해 OCI SDK 클라이언트를 설정합니다. 자세한 내용은 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을 지원합니다(
"ENG"
대신language="POR"
를 사용할 수 있음).
-
OCI Object Storage에 출력 저장:
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을 지원합니다(
"ENG"
대신language="POR"
를 사용할 수 있음).- LLM 프롬프트는
CNPJ
,quantidade
,data de emissão
등과 같은 다른 필드를 추출하도록 조정할 수 있습니다.processed_files
를 데이터베이스 또는 파일로 유지하여 프로세스에 내결함성을 부여하는 것이 좋습니다.- 이 프로세스는 송장 해결을 위한 다중 에이전트 통신 프로토콜 서버를 사용하여 AI 에이전트 구축을 선행 처리된 송장 이미지로 사용하는 사용 사례와 함께 사용할 수 있습니다. 송장은 회사 고객의 해체 송장입니다. 고객 및 위치 필드는 송장 생성자에서 수집됩니다.
관련 링크
승인
- 작성자 - 크리스티아노 호시카와(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
G39791-01
Copyright ©2025, Oracle and/or its affiliates.