본문으로 건너뛰기

© 2026 Molayo

GitHub요약2026. 06. 10. 08:51

Azure-Samples/multimodal-rag-code-execution

요약

GPT-4V, TaskWeaver, Assistants API를 활용하여 텍스트, 이미지, 테이블을 통합 분석하는 멀티모달 RAG 솔루션을 소개합니다. 코드 인터프리터를 통해 복잡한 계산과 그래프 생성을 지원하며, 기존 텍스트 중심 RAG의 한계를 극복합니다.

핵심 포인트

  • 텍스트, 이미지, 테이블을 포함한 멀티모달 데이터 자동 수집 및 분석
  • 코드 인터프리터를 활용한 정확한 수치 계산 및 그래프 생성
  • 비정형 데이터(이미지, 그래프)의 구조화된 정보 추출 기술 적용
  • Azure 환경에서의 손쉬운 배포 및 기존 리소스 재사용 지원

참고: 여기 Tutorials 폴더에 있는 Tutorial Notebooks부터 시작하세요.

RAG 및 코드 실행(Code Execution)을 활용한 멀티모달(Multimodal) 문서 분석: GPT4-V, TaskWeaver 및 Assistants API를 사용한 텍스트, 이미지 및 데이터 테이블 활용:

"멀티모달 데이터와 채팅하기 (Chat-With-Your-Multimodal-Data)": 텍스트, 테이블, 이미지를 포함한 멀티모달 문서를 자동으로 수집 및 분석하고, 검색 가능한 시맨틱(Semantic) 콘텐츠를 생성하는 생성형 AI (GenAI) 솔루션을 구현했습니다.
콘텐츠 생성 (Content Generation): 이 솔루션은 수집된 데이터의 핵심 사실을 강조하는 메모나 PowerPoint 프레젠테이션과 같은 표준화된 형식에 필요한 대부분의 콘텐츠를 출력하는 데 사용될 수 있습니다.
OpenAI Assistants API 및 Taskweaver를 활용한 분석 쿼리 (Analytical Queries): 분석가가 코드 인터프리터 (Code Interpreter)와 통합된 채팅 인터페이스를 사용하여 멀티모달 데이터와 상호 작용할 수 있는 고급 기능을 개발합니다. 이 도구는 계산 및 즉석 그래프 및 파일 생성을 포함한 복잡한 분석 쿼리를 지원합니다.

"Deploy to Azure" 버튼을 클릭하세요.

매개변수(Parameters)를 입력하세요.

이 배포를 위한 특별한 매개변수는 없습니다. 배포를 맞춤 설정하기 위한 선택적 매개변수를 사용할 수 있습니다 (아래 참조). 일반적으로 기존 Azure OpenAI 리소스를 재사용하려면 openAINameopenAIRGName만 사용됩니다. 기존 컨테이너 레지스트리 (Container Registry)가 설정되지 않은 경우 평균 배포 시간은 10분입니다.

추가적인 배포 맞춤 설정을 원하시면 배포 README 가이드에 있는 상세 지침을 따르십시오.

  • 이 작업은 데이터 표현과 정보 추출을 극대화하기 위해 텍스트, 이미지, 데이터 테이블을 추출하여 멀티모달 (multi-modal) 분석 문서를 처리하는 데 중점을 두며, GPT-4 모델과의 호환성을 위해 Python 코드, Markdown, Mermaid 스크립트와 같은 형식을 활용합니다.

  • 텍스트는 문서에서 프로그래밍 방식으로 추출되며, 검색 가능성을 높이기 위해 구조 개선 및 태그 추출 과정을 거칩니다. 수치 데이터는 추후 사용을 위해 생성된 Python 코드를 통해 캡처됩니다.

  • 이미지와 데이터 테이블은 정보의 검색 가능성을 보장하고, Code Interpreter (코드 인터프리터) 기능을 사용하여 계산, 예측 및 머신러닝 (machine learning) 모델 적용에 사용할 수 있도록 다양한 텍스트 기반 표현(상세 텍스트 설명, 이미지용 Mermaid 및 Python 코드, 테이블용 다양한 형식 포함)을 생성하도록 처리됩니다.

  • 오늘날의 전통적인 기술로는, RAG (검색 증강 생성)를 통해 지식 베이스를 검색하려면 문서에서 텍스트를 추출하여 청킹 (chunking)하고 벡터 데이터베이스 (vector database)에 저장해야 합니다.

  • 이 프로세스는 현재 순수하게 텍스트에만 집중되어 있습니다:

  • 문서에 이미지, 그래프 또는 테이블이 있는 경우, 이러한 요소들은 대개 무시되거나 정돈되지 않은 비정형 텍스트로 추출됩니다.

  • RAG를 통해 비정형 테이블 데이터를 검색하면 정확도가 매우 낮은 답변으로 이어집니다.

  • LLM (대규모 언어 모델)은 일반적으로 숫자에 매우 취약합니다. 질의에 어떤 종류의 계산이라도 필요할 경우, LLM은 대개 환각 (hallucination) 현상을 보이거나 기본적인 수학적 실수를 저지릅니다.

  • 그래프, 숫자, 테이블이 많은 멀티모달 분석 문서를 수집하고 상호작용하십시오.

  • 이전에는 불가능했던 문서 내 일부 요소로부터 구조화된 정보를 추출하십시오:

  • 이미지

  • 그래프

  • 테이블

  • 검색 결과에 기반하여 계산이 필요한 경우 Code Interpreter (코드 인터프리터)를 사용하여 답변을 구성하십시오.

  • Private Equity (사모펀드) 거래를 위한 투자 기회 문서 분석

  • 감사 목적의 세무 문서 내 테이블 분석

  • 재무제표 분석 및 초기 계산 수행

  • 멀티모달 (Multi-modal) 제조 문서 분석 및 상호작용

  • 학술 및 연구 논문 처리

  • 교과서, 매뉴얼 및 가이드북 수집 및 상호작용

  • 교통 및 도시 계획 문서 분석

다음은 이 솔루션의 일부로 구현된 기술적 기능입니다:

  • 지원되는 파일 형식은 PDF, MS Word 문서, MS Excel 시트 및 csv 파일입니다.
  • 이미지와 테이블을 포함한 멀티모달 (Multimodal) 문서 수집
  • 신뢰할 수 있는 장기 실행 및 모니터링을 위해 Azure Machine Learning에서 실행되는 수집 (Ingestion) 작업
  • Azure 상에 솔루션 구성 요소를 생성하고 웹 앱을 위한 Docker 이미지를 빌드하는 전체 배포 스크립트
  • 벡터 (Vector) 및 키워드 (Keyword) 검색, 그리고 시맨틱 리랭커 (Semantic re-ranker)를 사용하는 AI Search 기반의 하이브리드 검색
  • 키워드 검색 최적화를 위한 청크 레벨 (Chunk-level) 태그 및 문서 전체 레벨 (Whole-document-level) 청크 추출
  • 추가적인 컨텍스트를 제공하기 위해 최종 검색 프롬프트의 일부로 사용되는 문서 전체 요약
  • OpenAI Assistants API Code Interpreter를 사용한 코드 실행 (Code Execution)
  • 매우 긴 사용자 쿼리(예: 생성 프롬프트)를 최적화하기 위한 태그 기반 검색
  • 맞춤형 처리 파이프라인을 위한 프로세서 (Processors)를 갖춘 모듈식이며 사용하기 쉬운 인터페이스
  • 매 청크마다 반복되는 헤더와 테이블 요약을 포함하는 Markdown 테이블의 스마트 청킹 (Smart chunking)
  • 두 가지 새로운 임베딩 (Embedding) 모델인 text-embedding-3-smalltext-embedding-3-largetext-embedding-ada-002 지원
  • 근사 고정 크기 청크를 활용한 동적 시맨틱 청킹 (Dynamic semantic chunking) (곧 출시 예정)
  • 향상된 데이터 검색을 위한 Graph DB 지원. Graph DB는 AI Search 리소스를 대체하는 것이 아니라 보완합니다.

확장 가능한 모듈형 아키텍처 (modular architecture)를 제공하기 위해, 본 액셀러레이터(accelerator)에는 프로세싱 파이프라인 (processing pipeline) 개념을 구현하였습니다. 여기서 각 문서는 사전에 지정된 수의 처리 단계를 거치며, 각 단계는 문서에 일정 수준의 변화를 추가합니다. 프로세서 (Processors)는 특정 형식(예: PDF, MS Word, Excel 등)에 특화되어 있으며, 해당 형식에 대해 멀티모달 (multimodal) 문서를 가장 효율적인 방식으로 수집(ingest)할 수 있도록 생성되었습니다. 따라서 PDF를 위한 처리 단계 목록은 Excel 시트를 위한 단계 목록과 다릅니다. 이는 processor.py Python 파일에 구현되어 있습니다. 처리 단계 목록은 processing_plan.json 파일을 변경함으로써 커스텀할 수 있습니다. 예를 들어, Excel 파일을 처리할 때는 아래의 단계들을 따르며, 각 단계는 이전 단계의 결과를 바탕으로 진행됩니다:

extract_xlsx_using_openpyxl: OpenPyxl을 사용하여 Excel 시트를 읽고 이를 데이터프레임 (dataframe)에 저장합니다.

create_table_doc_chunks_markdown: 데이터프레임을 마크다운 (Markdown)으로 변환한 후, 문장 중간을 끊지 않으면서 크기가 거의 동일하도록 텍스트를 스마트하게 청킹 (chunking)합니다.

create_image_doc_chunks: Excel에 이미지가 있는 경우 이미지를 추출합니다.

generate_tags_for_all_chunks: 각 텍스트 청크 (chunk)에 대해 태그를 생성합니다. 이는 AI Search의 하이브리드 검색 (hybrid search)을 위해 매우 중요합니다.

generate_document_wide_tags: 문서 전체에 대한 태그를 생성합니다. 이는 AI Search의 하이브리드 검색을 위해 매우 중요합니다.

generate_document_wide_summary: RAG를 위한 컨텍스트 (Context) 및 상위 청크들과 함께 삽입될 문서 요약을 제공합니다.

generate_analysis_for_text: 문서 전체와 관련하여 각 텍스트 청크에 대한 분석을 제공합니다. 예를 들어, 해당 청크가 전체 텍스트와 비교했을 때 어떤 정보를 추가하는지 등을 분석합니다.

프로세싱 파이프라인의 시작 부분에서, ingestion_pipeline_dict라고 불리는 Python 딕셔너리 (dictionary) 변수가

모든 입력 파라미터를 포함하는 ingestion_pipeline_dict가 Processor의 생성자 (constructor)에서 생성된 후 첫 번째 단계 (step)로 전달됩니다. 해당 단계는 자체적인 처리를 수행하며, ingestion_pipeline_dict 내부의 변수들을 변경하고 새로운 변수들을 추가합니다. 그 후 ingestion_pipeline_dict는 이 첫 번째 단계에 의해 반환되며, 두 번째 단계의 입력값이 됩니다. 이러한 방식으로 ingestion_pipeline_dict는 파이프라인의 각 단계에서 다음 다운스트림 (downstream) 단계로 전달됩니다. 이는 모든 단계가 작업하는 공통 컨텍스트 (common context) 역할을 합니다. ingestion_pipeline_dict는 디버깅 (debugging) 및 트러블슈팅 (troubleshooting)을 용이하게 하기 위해 각 단계가 끝날 때마다 stages 디렉토리 내의 프로세싱 폴더 이름 아래 텍스트 파일로 저장됩니다.

다음은 파이프라인의 시각적 표현입니다:

이 문서의 끝에는 모든 단계의 목록과 각 단계에 대한 짧은 설명이 있습니다. 아래의 JSON 블록은 처리 옵션별, 문서 형식별 처리 파이프라인 (processing pipelines)을 설명합니다:

{
".pdf": {
"gpt-4-vision": [
...

아래는 이 솔루션의 논리적 아키텍처 (logical architecture)입니다. GraphDB는 아직 솔루션에 추가되지 않았으나, 현재 통합 (integration) 작업이 개발 중입니다:

  • GPT-4-Turbo는 128k 토큰 윈도우 (token window)라는 큰 용량 덕분에 큰 도움이 됩니다.
  • Vision 기능이 포함된 GPT-4-Turbo는 비정형 문서 형식에서 테이블 (tables)을 추출하는 데 탁월합니다.
  • GPT-4 모델은 다양한 형식 (Python, Markdown, Mermaid, GraphViz DOT 등)을 이해할 수 있으며, 이는 정보 추출을 극대화하는 데 필수적이었습니다.
  • 생성 프롬프트 (Generation Prompts)가 일반적인 사용자 쿼리 (user queries)에 비해 매우 길었기 때문에, 태그 (tags) 기반의 새로운 벡터 인덱스 검색 (vector index searching) 접근 방식이 필요했습니다.
  • 개방형 분석 질문 (open-ended analytics questions)을 수행하기 위해 Taskweaver 및 Assistants API의 코드 인터프리터 (Code Interpreters)가 도입되었습니다.

이 솔루션을 고객의 테넌트 (tenant)에 안전한 방식으로 배포하는 방법은 Enterprise Deployment 가이드를 확인해 주세요. 솔루션을 로컬에서 개발하거나 테스트하려면 아래에 설명된 튜토리얼 노트북 (tutorial notebooks) 또는 Chainlit 앱을 사용하시기 바랍니다.

여기 있는 튜토리얼 노트북 (Tutorial notebooks)부터 시작해 주세요. 이 노트북들은 이 저장소 (repo)에서 사용된 일련의 개념들을 설명합니다.

이 솔루션의 일부로 구현된 두 가지 웹 앱 (web apps)이 있습니다. Streamlit 웹 앱과 Chainlit 웹 앱입니다.

  • Streamlit 웹 앱은 다음을 포함합니다:

  • 웹 앱은 문서를 수집 (ingest)할 수 있으며, Azure Machine Learning (권장)을 사용하거나 웹 앱 자체에서 Python 서브 프로세스 (sub-process)를 사용하여 수집 작업 (ingestion job)을 생성합니다 (로컬 테스트용).

  • Streamlit 앱의 두 번째 부분은 생성 (Generation)입니다. "프롬프트 관리 (Prompt Management)" 뷰를 통해 사용자는 하위 섹션이 포함된 복잡한 프롬프트를 구축하고, 이를 Cosmos에 저장하며, 이 프롬프트들을 기반으로 출력을 생성하는 데 솔루션을 사용할 수 있습니다.

  • Chainlit 웹 앱은 수집된 문서와 채팅하는 데 사용되며, 검색에 대한 감사 추적 (audit trail) 및 멀티모달 (multimodal) 지원(이미지 및 테이블 확인 가능)이 포함된 답변 참조 섹션과 같은 고급 기능을 갖추고 있습니다.

Conda 환경은 **프로젝트 루트 폴더 (project root folder)**에서 다음 명령어를 실행하여 설치할 수 있습니다. 새로운 conda 환경을 만들기 위해 아래 명령어를 따라주세요. Python 버전은 >= 3.10이어야 합니다 (단, 3.10에서 철저히 테스트되었습니다):

# conda 환경 생성
conda create -n mmdoc python=3.10
# conda 환경 활성화
...

.env 파일을 적절하게 구성하십시오. 이 솔루션에 포함된 .env.sample 파일을 참조하십시오. 솔루션이 제대로 작동하려면 모든 필수 값을 반드시 입력해야 합니다.

.env 파일은 다음 용도로 사용됩니다:

  • 필요한 경우 로컬 개발 (Local Development)
  • 배포 스크립트가 .env 파일에서 값을 읽어 두 웹 앱 모두에 대한 구성 변수 (Configuration Variables)를 채웁니다. - 솔루션을 로컬에서 실행하려면 .env에 다음 라인을 추가하십시오:
    API_BASE_URL=http://localhost:9000

API 웹 앱은 다른 두 웹 앱보다 먼저 실행되어야 합니다. 이 앱은 나머지 두 웹 앱을 위한 API 인프라를 제공합니다. 웹 앱을 로컬에서 실행하려면, conda 환경에서 다음을 실행하십시오:

# code 폴더로 이동
cd code
# chainlit 앱 실행
...

Chainlit 웹 앱은 데이터와 채팅하기 위한 메인 웹 앱입니다. 웹 앱을 로컬에서 실행하려면, conda 환경에서 다음을 실행하십시오:

# 프로젝트 루트 폴더에 있는지 확인한 후, ui 폴더로 이동
cd ui
# chainlit 앱 실행
...

Streamlit 웹 앱은 문서를 수집(Ingest)하고 생성 (Generation)을 위한 프롬프트를 구축하는 메인 웹 앱입니다. 웹 앱을 로컬에서 실행하려면, conda 환경에서 다음을 실행하십시오:

# ui 폴더로 이동
cd ui
# chainlit 앱 실행
...
  • .env 파일을 적절하게 구성하십시오. 이 솔루션에 포함된 .env.sample 파일을 참조하십시오. - Chainlit 웹 앱에서 인덱스 이름을 설정하려면 cmd index를 사용하십시오.

빠른 개발 반복(Iteration)과 클라우드 테스트를 위해, push.ps1 스크립트를 사용하여 리소스 그룹이나 아키텍처의 다른 구성 요소를 생성하거나 변경하지 않고 Docker 이미지만 빌드하여 Azure Container Registry로 푸시할 수 있습니다. 그 후, Azure Portal의 웹 앱 페이지로 이동하여 왼쪽의 Deployment > Deployment Center로 이동한 다음, 오른쪽의 Settings로 이동하여 Tag 드롭다운에서 올바른 Docker 이미지를 선택함으로써 웹 앱에 Docker 이미지를 수동으로 할당해야 합니다.

push.ps1 스크립트를 편집하여 Azure Container Registry 엔드포인트, 사용자 이름 및 비밀번호, 리소스 그룹 이름, 그리고 구독 ID (Subscription ID)에 대한 올바른 값을 입력하십시오. 그런 다음 스크립트를 실행하려면 아래의 Powershell 지침을 따르십시오.

AI 자동 생성 콘텐츠

본 콘텐츠는 GitHub AI Tools의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0