문서 레이아웃 또는 구조별 청크 및 벡터화
참고 항목
이 기능은 현재 공개 미리 보기로 제공됩니다. 이 미리 보기는 서비스 수준 계약 없이 제공되며 프로덕션 워크로드에는 사용하지 않는 것이 좋습니다. 특정 기능이 지원되지 않거나 기능이 제한될 수 있습니다. 자세한 내용은 Microsoft Azure Preview에 대한 추가 사용 약관을 참조하세요.
텍스트 데이터 청크 전략은 RAG 응답 및 성능을 최적화하는 데 중요한 역할을 합니다. 현재 미리 보기로 제공되는 새 문서 레이아웃 기술을 사용하여 문서 구조에 따라 콘텐츠를 청크하고, 제목을 캡처하고, 단락 및 문장과 같은 의미 체계 일관성에 따라 콘텐츠 본문을 청크할 수 있습니다. 청크는 독립적으로 처리됩니다. LLM은 여러 청크에서 작동하므로 이러한 청크가 품질이 높고 의미상 일관성이 있는 경우 쿼리의 전반적인 관련성이 향상됩니다.
문서 레이아웃 기술은 문서 인텔리전스에서 레이아웃 모델을 호출합니다. 이 모델은 Markdown 구문(제목 및 콘텐츠)을 사용하여 JSON의 콘텐츠 구조를 명확하게 표시하며, 제목 및 콘텐츠의 필드는 Azure AI Search의 검색 인덱스에 저장됩니다. 문서 레이아웃 기술에서 생성된 검색 가능한 콘텐츠는 일반 텍스트이지만 통합 벡터화를 적용하여 이미지를 포함한 원본 문서의 모든 필드에 대한 포함을 생성할 수 있습니다.
이 문서에서는 다음 방법을 알아봅니다.
- 문서 레이아웃 기술을 사용하여 문서 구조 인식
- 텍스트 분할 기술을 사용하여 각 markdown 섹션으로 청크 크기 제한
- 각 청크에 대한 포함 생성
- 인덱스 프로젝션을 사용하여 포함을 검색 인덱스의 필드에 매핑
이 문서에서는 설명 목적으로 Azure Blob Storage에 업로드된 다음 데이터 가져오기 및 벡터화 마법사를 사용하여 인덱싱된 샘플 상태 계획 PDF를 사용합니다.
필수 조건
출력을 허용하는 인덱스가 있는 인덱서 기반 인덱싱 파이프라인 입니다. 인덱스에는 제목 및 콘텐츠를 받기 위한 필드가 있어야 합니다.
단락 경계에 따라 문서를 분할하는 문서 레이아웃 기술이 포함된 기술 세트입니다.
일대다 인덱싱에 대한 인덱스 프로젝션 입니다.
데이터 파일 준비
원시 입력은 지원되는 데이터 원본에 있어야 하며 파일은 문서 레이아웃 기술이 지원하는 형식이어야 합니다.
지원되는 파일 형식은 PDF, JPEG, JPG, PNG, BMP, TIFF, DOCX, XLSX, PPTX, HTML입니다.
지원되는 인덱서는 지원되는 파일 형식을 처리할 수 있는 인덱서일 수 있습니다. 이러한 인덱서는 Blob 인덱서, OneLake 인덱서, 파일 인덱서를 포함합니다.
이 기능에 지원되는 지역은 미국 동부, 미국 서부2, 서유럽, 미국 중북부입니다. 지역별 가용성에 대한 업데이트는 이 목록을 확인해야 합니다.
Azure Portal, REST API 또는 Azure SDK 패키지를 사용하여 데이터 원본을 만들 수 있습니다.
팁
지원되는 데이터 원본에 상태 계획 PDF 샘플 파일을 업로드하여 사용자 고유의 검색 서비스에서 문서 레이아웃 기술 및 구조 인식 청크를 사용해 보세요. 데이터 가져오기 및 벡터화 마법사는 이 기술을 사용해 볼 수 있는 쉬운 코드 없는 방법입니다. 구조 인식 청크를 사용하려면 기본 구문 분석 모드를 선택해야 합니다. 그렇지 않으면 Markdown 구문 분석 모드 가 대신 사용됩니다.
일대다 인덱싱을 위한 인덱스 만들기
다음은 청크를 중심으로 디자인된 단일 검색 문서의 예제 페이로드입니다. 청크를 사용할 때마다 청크 필드와 청크의 원본을 식별하는 부모 필드가 필요합니다. 이 예제에서 부모 필드는 text_parent_id. 자식 필드는 markdown 섹션의 벡터 및 비벡터 청크입니다.
문서 레이아웃 기술은 제목과 콘텐츠를 출력합니다. 이 예제 header_1
header_3
에서는 기술에서 감지한 대로 문서 머리글을 저장합니다. 단락과 같은 기타 콘텐츠는 에 chunk
저장됩니다. text_vector
필드는 청크 필드 콘텐츠의 벡터 표현입니다.
Azure Portal, REST API 또는 Azure SDK에서 데이터 가져오기 및 벡터화 마법사를 사용하여 인덱스를 만들 수 있습니다. 다음 인덱스는 마법사가 기본적으로 만드는 것과 매우 유사합니다. 이미지 벡터화를 추가하는 경우 더 많은 필드가 있을 수 있습니다.
마법사를 사용하지 않는 경우 기술 세트를 만들거나 인덱서 실행하기 전에 검색 서비스에 인덱스가 있어야 합니다.
{
"name": "my_consolidated_index",
"fields": [
{
"name": "chunk_id",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": true,
"facetable": false,
"key": true,
"analyzer": "keyword"
},
{
"name": "text_parent_id",
"type": "Edm.String",
"searchable": false,
"filterable": true,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "chunk",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "title",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "header_1",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "header_2",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "header_3",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "text_vector",
"type": "Collection(Edm.Single)",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false,
"dimensions": 1536,
"stored": false,
"vectorSearchProfile": "profile"
}
],
"vectorSearch": {
"profiles": [
{
"name": "profile",
"algorithm": "algorithm"
}
],
"algorithms": [
{
"name": "algorithm",
"kind": "hnsw"
}
]
}
}
구조 인식 청크 및 벡터화를 위한 기술 세트 정의
문서 레이아웃 기술은 미리 보기 상태이므로 이 단계에서 기술 세트 만들기 2024-11-01-preview REST API를 사용해야 합니다. Azure Portal을 사용할 수도 있습니다.
이 섹션에서는 개별 markdown 섹션, 청크 및 해당 벡터를 검색 인덱스의 필드로 투영하는 기술 세트 정의의 예를 보여 줍니다. 문서 레이아웃 기술을 사용하여 제목을 검색하고 원본 문서의 의미상 일관된 단락과 문장을 기반으로 콘텐츠 필드를 채웁니다. 텍스트 분할 기술을 사용하여 Markdown 콘텐츠를 청크로 분할합니다. Azure OpenAI 포함 기술을 사용하여 청크 및 포함하려는 다른 필드를 벡터화합니다.
기술 외에도 기술 세트에는 다음이 포함됩니다indexProjections
.cognitiveServices
indexProjections
는 청크 분할된 문서를 포함하는 인덱스에 사용됩니다. 프로젝션은 일대다 인덱싱을 위해 검색 인덱스의 필드에 부모-자식 콘텐츠를 매핑하는 방법을 지정합니다. 자세한 내용은 인덱스 프로젝션 정의를 참조하세요.cognitiveServices
청구 목적으로 Azure AI 다중 서비스 계정을 연결합니다(문서 레이아웃 기술은 종량제 가격을 통해 사용할 수 있음).
POST {endpoint}/skillsets?api-version=2024-11-01-preview
{
"name": "my_skillset",
"description": "A skillset for structure-aware chunking and vectorization with a index projection around markdown section",
"skills": [
{
"@odata.type": "#Microsoft.Skills.Util.DocumentIntelligenceLayoutSkill",
"name": "my_document_intelligence_layout_skill",
"context": "/document",
"outputMode": "oneToMany",
"inputs": [
{
"name": "file_data",
"source": "/document/file_data"
}
],
"outputs": [
{
"name": "markdown_document",
"targetName": "markdownDocument"
}
],
"markdownHeaderDepth": "h3"
},
{
"@odata.type": "#Microsoft.Skills.Text.SplitSkill",
"name": "my_markdown_section_split_skill",
"description": "A skill that splits text into chunks",
"context": "/document/markdownDocument/*",
"inputs": [
{
"name": "text",
"source": "/document/markdownDocument/*/content",
"inputs": []
}
],
"outputs": [
{
"name": "textItems",
"targetName": "pages"
}
],
"defaultLanguageCode": "en",
"textSplitMode": "pages",
"maximumPageLength": 2000,
"pageOverlapLength": 500,
"unit": "characters"
},
{
"@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
"name": "my_azure_openai_embedding_skill",
"context": "/document/markdownDocument/*/pages/*",
"inputs": [
{
"name": "text",
"source": "/document/markdownDocument/*/pages/*",
"inputs": []
}
],
"outputs": [
{
"name": "embedding",
"targetName": "text_vector"
}
],
"resourceUri": "https://<subdomain>.openai.azure.com",
"deploymentId": "text-embedding-3-small",
"apiKey": "<Azure OpenAI api key>",
"modelName": "text-embedding-3-small"
}
],
"cognitiveServices": {
"@odata.type": "#Microsoft.Azure.Search.CognitiveServicesByKey",
"key": "<Cognitive Services api key>"
},
"indexProjections": {
"selectors": [
{
"targetIndexName": "my_consolidated_index",
"parentKeyFieldName": "text_parent_id",
"sourceContext": "/document/markdownDocument/*/pages/*",
"mappings": [
{
"name": "text_vector",
"source": "/document/markdownDocument/*/pages/*/text_vector"
},
{
"name": "chunk",
"source": "/document/markdownDocument/*/pages/*"
},
{
"name": "title",
"source": "/document/title"
},
{
"name": "header_1",
"source": "/document/markdownDocument/*/sections/h1"
},
{
"name": "header_2",
"source": "/document/markdownDocument/*/sections/h2"
},
{
"name": "header_3",
"source": "/document/markdownDocument/*/sections/h3"
}
]
}
],
"parameters": {
"projectionMode": "skipIndexingParentDocuments"
}
}
}
인덱서 구성 및 실행
데이터 원본, 인덱스 및 기술 세트를 만들면 인덱서 만들기 및 실행할 준비가 된 것입니다. 이 단계에서는 파이프라인을 실행합니다.
문서 레이아웃 기술을 사용하는 경우 인덱서 정의에서 다음 매개 변수를 설정해야 합니다.
- 매개 변수는
allowSkillsetToReadFileData
.로true
설정해야 합니다. - 매개 변수를
parsingMode
.로default
설정해야 합니다.
outputFieldMappings
필드 연결을 검색하기 위해 원본 필드를 처리하므로 이 시나리오 indexProjections
에서 설정할 필요가 없습니다. 인덱스 프로젝션은 문서 레이아웃 기술에 대한 필드 연결과 가져온 데이터 워크로드 및 벡터화된 데이터 워크로드에 대한 분할 기술을 사용한 일반 청크를 처리합니다. 출력 필드 매핑은 다른 경우에 적용되는 함수를 사용한 변환 또는 복잡한 데이터 매핑에 여전히 필요합니다. 그러나 문서당 n 청크의 경우 인덱스 프로젝션은 이 기능을 기본적으로 처리합니다.
다음은 인덱서 만들기 요청의 예입니다.
POST {endpoint}/indexers?api-version=2024-11-01-preview
{
"name": "my_indexer",
"dataSourceName": "my_blob_datasource",
"targetIndexName": "my_consolidated_index",
"skillsetName": "my_skillset",
"parameters": {
"batchSize": 1,
"configuration": {
"dataToExtract": "contentAndMetadata",
"parsingMode": "default",
"allowSkillsetToReadFileData": true
}
},
"fieldMappings": [
{
"sourceFieldName": "metadata_storage_path",
"targetFieldName": "title"
}
],
"outputFieldMappings": []
}
검색 서비스에 요청을 보내면 인덱서가 실행됩니다.
결과 확인
처리가 끝난 후 검색 인덱스를 쿼리하여 솔루션을 테스트할 수 있습니다.
결과를 확인하려면 인덱스로 쿼리를 실행합니다. 검색 탐색기를 검색 클라이언트 또는 HTTP 요청을 보내는 도구로 사용합니다. 다음 쿼리는 markdown 섹션 비벡터 콘텐츠 및 해당 벡터의 출력을 포함하는 필드를 선택합니다.
검색 탐색기의 경우 JSON만 복사하여 쿼리 실행을 위해 JSON 보기에 붙여넣을 수 있습니다.
POST /indexes/[index name]/docs/search?api-version=[api-version]
{
"search": "copay for in-network providers",
"count": true,
"searchMode": "all",
"vectorQueries": [
{
"kind": "text",
"text": "*",
"fields": "text_vector,image_vector"
}
],
"queryType": "semantic",
"semanticConfiguration": "healthplan-doc-layout-test-semantic-configuration",
"captions": "extractive",
"answers": "extractive|count-3",
"queryLanguage": "en-us",
"select": "header_1, header_2, header_3"
}
상태 계획 PDF를 사용하여 이 기술을 테스트한 경우 예제 쿼리에 대한 검색 탐색기 결과는 다음 스크린샷의 결과와 유사해야 합니다.
쿼리는 텍스트 및 벡터에 대한 하이브리드 쿼리 이므로
@search.rerankerScore
해당 점수에 따라 결과가 표시됩니다.searchMode=all
는 일치 항목에 대해 모든 쿼리 용어를 고려해야 한다는 의미입니다(기본값은 모두).쿼리는 의미 체계 순위를 사용하므로 표시됩니다
captions
(스크린answers
샷에도 표시되지 않음). 결과는 의미 체계 순위에 의해 결정된 대로 쿼리 입력과 가장 의미상 관련이 있습니다.스크린샷에 표시되지 않는 문은
select
문서 레이아웃 기술이 검색하고 채우는 헤더 필드를 지정합니다. select 절에 필드를 더 추가하여 청크, 제목 또는 다른 사람이 읽을 수 있는 필드의 내용을 검사할 수 있습니다.