AI_EXTRACT로 문서에서 정보 추출하기

AI_EXTRACT는 자연어로 질문하거나 추출할 정보를 설명하여 텍스트 또는 문서 파일에서 엔터티, 목록, 테이블과 같은 정형 정보를 추출할 수 있는 Cortex AI 함수입니다. 다른 함수와 함께 사용하여 다양한 사용 사례에 대한 사용자 지정 문서 처리 파이프라인을 생성할 수 있습니다(Cortex AI 함수: 문서 참조).

AI_EXTRACT는 다양한 형식의 문서를 처리하고 텍스트가 많은 단락과 로고, 필기 텍스트(예: 서명), 테이블 또는 확인 표시와 같은 그래픽 형식의 콘텐츠에서 정보를 추출할 수 있습니다. AI_EXTRACT는 다음과 같은 정형 형식으로 정보를 추출할 수 있습니다.

  • 엔터티: 자연어로 질문하거나 추출할 정보(예: 도시, 거리 또는 ZIP 코드)를 설명합니다.

  • 나열(또는 배열): 은행 명세서의 모든 계좌 소유자 이름 또는 문서의 모든 주소 목록과 같이 문서에 있는 정보의 배열 또는 목록을 추출하는 JSON 스키마를 제공할 수 있습니다.

  • 테이블: 추출해야 하는 테이블 제목과 열 목록을 지정하여 문서에 있는 테이블 형식 데이터를 추출하는 JSON 스키마를 제공합니다.

AI_EXTRACT는 여러 문서를 동시에 처리하여 워크로드에 따라 자동으로 확장됩니다. 문서는 불필요한 데이터 이동을 피하기 위해 오브젝트 저장소에서 직접 처리될 수 있습니다.

참고

AI_EXTRACT 는 현재 사용자 지정 네트워크 정책 과 호환되지 않습니다.

지원되는 언어, 리전별 가용성, 비용을 포함하여 AI_EXTRACT에 대한 자세한 내용은 AI_EXTRACT 섹션을 참조하세요.

추출 품질

AI_EXTRACT는 높은 추출 정확도를 제공하는 독점적인 비전 기반 대규모 언어 모델(LLM)인 ``arctic-extract``를 사용합니다. 다음 테이블에는 여러 표준 벤치마크에서 해당 모델이 획득한 점수가 정리되어 있으며, 다른 주요 모델들의 점수도 비교 참고용으로 함께 제공됩니다.

시각적 질문 답변(VQA)

제안

DocVQA 점수

인적 평가

0.9811

Snowflake Arctic-Extract

0.9433

Azure OpenAI GPT-o3

0.9339

Google Gemini 2.5-Pro

0.9316

Google Anthropic Claude 4 Sonnet

0.9119

Azure Document Intelligence + GPT-o3

0.8853

Google Document AI + Gemini

0.8497

Azure OpenAI GPT-o3

0.9339

AWS Textract

0.8313

텍스트 전용 질문 답변(SQuAD v2)

제안

ANLS

정확한 일치

Snowflake Arctic-Extract

81.18

78.74

Anthropic Claude 4 Sonnet

80.54

77.10

Meta LLaMA 3.1 405B

80.37

76.56

Meta LLaMA 4 Scout

74.30

70.70

OpenAI GPT 4.1

70.71

66.81

Meta LLaMA 3.1 8B

59.13

54.48

정보 추출을 위한 질문 최적화

AI_EXTRACT로 작업할 때는 자연어를 사용하여 문서에 대한 질문을 할 수 있습니다. 정확한 답변이 제공되는 질문을 하려면 다음 지침을 따르십시오.

  • 쉬운 영어를 사용합니다.

  • 각 질문에 대해 기대되는 답변을 파악합니다.

  • 구체적으로 설명합니다. 예를 들어, 문서에 여러 날짜(발행일, 서명일 등)가 포함되어 있는 경우, 더 자세한 내용 없이 “What is the date?”라고 질문하지 마십시오.

  • 각 질문에 하나의 값만 요청합니다.

  • AI_EXTRACT 가 사용자의 의도를 추측하거나 특정 영역에 대한 폭넓은 지식을 가지고 있을 것이라고 기대하지 마십시오.

다음 문서를 예로 들어보겠습니다. 이 매매 계약에는 제안 만료일, 구매자와 판매자 이름, 포함 품목 등의 정보가 포함되어 있습니다.

문서 예제(콘도미니엄 매매 계약서).

다음 테이블에는 AI_EXTRACT에 질문할 수 있는 질문의 예제와 예상 답변이 나와 있습니다.

예시 질문

답변

이 계약의 날짜는 언제입니까?

'October 6, 2023'

콘도 구매자는 누구입니까?

'John Davis', 'Jane Davis'

이 제품에는 어떤 가전제품이 포함되어 있나요?

'stove/range', 'refrigerator', 'washer', 'dishwasher', 'attached television(s)', 'microwave'

아파트에 포함되지 않는 물품은 무엇입니까?

'dryer', 'security system', 'satellite dish', 'wood stove', 'fireplace insert', 'hot tub', 'attached speaker(s)', 'generator'

아파트에 건조기가 있나요?

'No'

이 매매 계약서에는 어떤 부록이 첨부되어 있습니까?

'22A (Financing)', '2AA (Appraisal)', '22FSBO (Owner Sale)'

판매자의 팩스 번호는 무엇입니까?

없음

구매자의 서명이 양식에 있습니까?

'No'

MLS 번호란 무엇입니까?

'59844680'

해당 부동산의 주소는 어디입니까?

'604 Bishop Crossing Land, Fort Lauderdale, Broward County, FL, 33338'

테이블 추출 모범 사례

이 항목에서는 AI_EXTRACT에서 테이블 추출 작업을 수행할 때의 모범 사례를 제공합니다.

특정 유형의 문서에 하나의 스키마 사용

각 추출 워크로드에는 동일한 유형의 문서가 포함되어야 하며, 추출하려는 데이터는 대부분의 테이블에서 유사해야 합니다. 소스 문서의 열 수가 문서마다 다르더라도, 모든 문서에 추출 대상인 정의된 하위 집합의 열이 포함되어 있고 공통 열의 이름과 위치가 동일하거나 유사하다면, 해당 공통 열을 추출할 수 있습니다.

예를 들어, 청구서에는 다양한 데이터를 포함하는 서로 다른 열 수가 있을 수 있지만, 모든 테이블의 첫 세 열(Item Description, Quantity, Price)이 동일하다면 해당 데이터를 추출할 수 있습니다.

자연어로 열 이름 정의

문서에서 열 이름을 복사하여 정확히 동일하게 만들 수 있습니다. 예를 들어, 열 이름을 product_code 또는 REPORT_DATE``로 지정하지 말고, 대신 ``Product Code 또는 ``Report Date``로 지정하세요.

빈 행 건너뛰기

미세 조정 데이터 세트를 생성할 때 답변이 없는(반환된 답변이 ``None``인) 행을 건너뜁니다.

문서에 나타나는 순서대로 열 정의

정확도를 높이려면 문서에 표시되는 순서와 동일한 순서로 열을 정의하세요. 일반적으로 :ref:`전치된 테이블<label-ai_extract_table_extraction_best_practices_transpose_tables>`의 경우 왼쪽에서 오른쪽 또는 위에서 아래로입니다. 순서를 다르게 정의하기로 선택할 경우, 훈련이 필요할 수 있습니다.

그러나 여러 행에 대해 값이 동일한 열의 경우(예: Invoice NumberInvoice Date), 시작 부분에 이러한 열을 추가합니다. 예:

  • Invoice Number

  • Invoice Date

  • Item Code

  • Item Name

  • Quantity

문서의 대소문자를 사용하여 값 정의

가능한 경우 문서에서 대소문자를 사용하여 값을 정의하세요. 문서 내 대소문자가 다양할 경우 첫 글자만 대문자로 작성하세요.

설명 필드 사용

AI_EXTRACT 응답 형식의 description 필드는 선택 사항입니다. 대부분의 경우 입력할 필요가 없습니다. 그러나 문서 내에 유사한 테이블이 여러 개 존재할 경우, 모델이 부정확하게 답변할 수 있습니다. 답변이 예상과 다른 소스 테이블에서 오거나 모델이 테이블을 찾을 수 없는 경우, description 필드를 사용해 보세요. 모델이 올바른 테이블을 식별하는 데 도움이 되는 정보(예: 테이블 제목 또는 번호)를 추가하세요.

테이블 레이아웃을 설명하는 섹션 열 추가

테이블이 여러 개의 명명된 섹션으로 나뉘어 있다면, 섹션 열을 추가하세요. 이는 모델이 레이아웃을 더 잘 이해하고 정확도를 향상시키는 데 도움이 됩니다. 예를 들어, 열 이름을 Section, Item section 또는 Item category 등으로 지정할 수 있습니다. 섹션에 중첩된 두 번째 수준이 있는 경우, 두 개의 열, 즉 Section``Subsection``을 추가할 수 있습니다.

값을 그룹화하려면 추가 열 생성

기존 테이블에 열을 추가하여 값을 그룹화할 수 있습니다. 이렇게 하면 전체 문서 세트의 결과를 단일 테이블로 결합할 수 있습니다. 예를 들면 다음과 같습니다.

청구서 번호

항목 상세 정보

항목 가격

수량

A

항목 A1

10.00

1

A

항목 A2

20.00

1

A

항목 A3

30.00

1

B

항목 B1

15.00

1

B

항목 B2

25.00

1

B

항목 B3

35.00

1

첫 번째 열의 값은 해당 항목들에 대해 반복된다는 점에 유의하세요.

문서 간 열 이름을 구분 가능하게 만들기

열을 의미 체계적으로 구분해 보세요. col1, val1, ``item1``과 같은 이름을 사용하지 마세요.

경우에 따라 전치가 더 효과적일 수 있는데, 특히 행 이름이 문서 간에 다르지 않거나, 약간만 다르고 닫힌 값 세트 내에 속하는 경우에 그러합니다.

지정된 열 세트로 훈련하면 결과가 개선될 수 있습니다.

계층적 헤더 작업을 할 때 상위 항목 이름을 접두사로 사용

계층적 헤더가 있는 테이블에서 정보를 추출하려면, 각 상위 항목 이름을 접두사로 사용하여 헤더 경로를 연결하세요. 예를 들어, 다음 테이블의 경우 열을 다음과 같이 정의하세요.

  • Category A Type X Column 1

  • Category A Type Y Column 2

  • Category A Type Y Column 3

  • Category B Column 4

  • Category B Column 5

헤더가 Category A와 Category B로 명명된 테이블로, Category A에는 Type X 및 Type Y라는 하위 헤더가 있습니다.

필요할 경우 테이블 전치

문서 내 테이블의 첫 번째 열 값을 출력 테이블의 열 이름으로 사용하여 전치된 테이블에서 정보를 추출할 수 있습니다.

예를 들어, 다음 테이블의 경우 열 이름을 다음과 같이 지정하세요.

  • Type A: Item 1

  • Type A: Item 2

  • Type B: Item 3

  • Type B: Item 4

전치할 수 있는 테이블의 예시.

이 예제에는 :ref:`계층적 헤더<label-ai_extract_table_extraction_best_practices_hierarchical>`가 포함되어 있음을 참고하세요.

큰 테이블의 경우 문서 분할

테이블 추출 모델은 최대 4096개 토큰 길이의 답변을 반환합니다. 즉, 모델은 해당 한계에 도달하면 추출을 중단합니다. 다음과 같은 방법으로 접근할 수 있습니다.

  • 테이블이 여러 페이지에 걸쳐 있는 경우, 문서를 여러 개의 한 페이지 문서로 분할한 다음, 후처리 단계에서 결과를 결합하세요.

  • 테이블이 너무 조밀해서 단일 페이지에서도 데이터를 추출할 수 없다면, 테이블을 열 단위로 분할하세요.

    예를 들어, 테이블에 10개의 열이 포함되어 있다면, 별도의 두 값을 정의해 보세요. 하나는 테이블의 왼쪽 절반에서 5개의 열을, 다른 하나는 테이블의 오른쪽 절반에서 5개의 열을 포함하도록 합니다. 최상의 결과를 얻으려면 열 선택을 실험해 볼 필요가 있을 수 있습니다.

문서에서 이름이 지정되지 않은 열에 대해 이름 생성

문서의 첫 번째 열에 이름이 없는 경우, 값을 정의할 때 해당 이름을 직접 생성해야 합니다. 다음과 같은 방법으로 접근할 수 있습니다.

  • 테이블 제목 또는 제목의 중요한 부분을 사용하세요.

  • 열의 데이터를 나타내는 설명이 포함된 이름을 생성합니다(예: description, type of asset, year, category).

두 개의 서로 다른 시기의 데이터 비교

연간 보고서와 같은 재무 문서에서 2023년과 2024년처럼 서로 다른 기간의 데이터를 비교하려면, 해당 열 앞에 “현재”와 “이전”을 접두사로 붙일 수 있습니다. 결과를 개선하기 위해 훈련이 필요할 수 있음을 유의하세요.

예제: 매매 계약서에서 정보 추출

다음 예제에서는 정보 추출을 위한 질문 최적화 섹션에서 볼 수 있는 콘도 매매 계약서에서 정보를 추출합니다.

엔터티 추출

판매자 이름과 오퍼 만료 날짜를 추출합니다.

SELECT AI_EXTRACT(
  file => TO_FILE('@db.schema.stage','document.pdf'),
  responseFormat => [['seller_name', 'What is the seller name?'], ['address', 'What is the offer expiration date?']]
);
Copy

결과:

{
    "error": null,
    "response": {
        "address": "12/12/2023",
        "seller_name": "Paul Doyle"
    }
}
Copy

확인란 정보 추출

이 예제에서는 문서에 표시된 확인란을 기반으로 포함되지 않은 항목에 대한 정보를 추출합니다.

SELECT AI_EXTRACT(
  file => TO_FILE('@db.schema.stage','document.pdf'),
  responseFormat => [['flat_items', 'What items are not included with the flat?'], ['default', 'What Default is selected?']]
);
Copy

결과:

{
    "error": null,
    "response": {
        "default": "Forfeiture of Earnest Money",
        "flat_items": "dryer, security system, satellite dish, wood stove, fireplace insert, hot tub, attached speaker(s), generator, other"
    }
}
Copy

서명 상태 추출

계약이 서명되었는지 여부에 대한 정보를 추출합니다.

SELECT AI_EXTRACT(
    file => TO_FILE('@db.schema.stage','document.pdf'),
    responseFormat => [['signature', 'Is this document signed?']]
);
Copy

결과:

{
  "error": null,
    "response": {
        "signature": "no"
    }
}
Copy

엔터티 목록 추출

구매자 이름 목록을 추출합니다.

SELECT AI_EXTRACT(
    file => TO_FILE('@db.schema.files', 'report.pdf'),
    responseFormat => {
        'schema': {
        'type': 'object',
        'properties': {
            'buyer_list': {
            'description': 'What are the buyer names?',
            'type': 'array'
            }
        }
        }
    }
);
Copy

결과:

{
    "error": null,
    "response": {
        "buyer_list": [
        "John Davis",
        "Jane Davis"
        ]
    }
}
Copy

예: 테이블에서 정보 추출

이 예제에서는 다음 문서에서 정보를 추출합니다.

테이블: Granger Causality Tests - P-값
SELECT AI_EXTRACT(
    file => TO_FILE('@db.schema.files', 'report.pdf'),
    responseFormat => {
        'schema': {
            'type': 'object',
            'properties': {
                'income_table': {
                'description': 'Table 2: Granger Causality Tests - P-values',
                'type': 'object',
                'column_ordering': ['description', 'countries','lags','z','z_approx'],
                'properties': {
                    'description': {
                        'description': 'Description',
                        'type': 'array'
                        },
                    'countries': {
                        'description': 'Countries',
                        'type': 'array'
                        },
                    'lags': {
                        'description': 'Lags',
                        'type': 'array'
                        },
                    'z': {
                        'description': 'Z',
                        'type': 'array'
                    },
                    'z_approx': {
                        'description': 'Z approx.',
                        'type': 'array'
                    }
                }
            }
        }
    }
);
Copy

결과:

{
    "error": null,
    "response": {
        "income_table": {
            "countries": [
                "33","80","29","84","34"
            ],
            "description": [
                "Commodity exporters",
                "Non-commodity exporters",
                "AE",
                "EMDE",
                "Large or market-dominant countries"
            ],
            "lags": [
                "2","1","1","1","1"
            ],
            "z": [
                "0.11","0.08","0.89","0.12","0.07"
            ],
            "z_approx": [
                "0.25","0.19","0.95","0.25","0.14"
            ]
        }
    }
}
Copy