Pular para o conteúdo principal

Desafio 43: Projeções do Knowledge Store

Tempo Estimado

45-60 min | Custo: ~$0.30 (transações de Search + Storage) | Domínio: Knowledge Mining & Extraction (15-20%)

Habilidades do exame cobertas

HabilidadePeso
Definir um knowledge store em um skillsetAlto
Criar projeções de tabela para dados estruturadosAlto
Criar projeções de objeto para documentos JSONMédio
Criar projeções de arquivo para imagens normalizadasMédio
Consultar dados do knowledge store a partir do Azure StorageMédio

Visão Geral

Um Knowledge Store é um destino de armazenamento persistente para conteúdo enriquecido criado por um skillset do AI Search. Enquanto o índice de pesquisa atende consultas, o knowledge store preserva a saída de enriquecimento no Azure Storage para análises downstream (Power BI, ciência de dados, apps personalizados).

Três tipos de projeção:

TipoDestino de armazenamentoFormatoCaso de uso
TabelaAzure Table StorageLinhas/colunasPower BI, análise tabular
ObjetoBlob StorageDocumentos JSONApps personalizados, processamento adicional
ArquivoBlob StorageBinário (imagens)Imagens normalizadas do pipeline de OCR

Shaper skill

O Shaper skill cria formas JSON personalizadas a partir de saídas de enriquecimento. É comumente usado para preparar dados para projeções com saída limpa e bem estruturada.

Pré-requisitos

  • Desafio 40 concluído (AI Search com skillset)
  • Azure Storage Account (do Desafio 40 ou criar novo)
  • Python 3.9+ com azure-search-documents>=11.4.0
  • .NET 8 com Azure.Search.Documents

Implementação

Tarefa 1: Adicionar um Shaper skill para preparar dados de projeção

O Shaper skill consolida enriquecimentos em uma forma estruturada adequada para projeções.

from azure.search.documents.indexes.models import (
ShaperSkill,
InputFieldMappingEntry,
OutputFieldMappingEntry,
)

shaper_skill = ShaperSkill(
name="shaper-skill",
description="Shape enriched data for knowledge store projections",
context="/document",
inputs=[
InputFieldMappingEntry(name="fileName", source="/document/metadata_storage_name"),
InputFieldMappingEntry(name="content", source="/document/content"),
InputFieldMappingEntry(name="keyphrases", source="/document/keyphrases"),
InputFieldMappingEntry(name="organizations", source="/document/organizations"),
InputFieldMappingEntry(name="language", source="/document/language"),
],
outputs=[
OutputFieldMappingEntry(name="output", target_name="documentShape")
]
)

Tarefa 2: Definir o knowledge store com projeções de tabela

from azure.search.documents.indexes.models import (
SearchIndexerSkillset,
SearchIndexerKnowledgeStore,
SearchIndexerKnowledgeStoreProjection,
SearchIndexerKnowledgeStoreTableProjectionSelector,
SearchIndexerKnowledgeStoreObjectProjectionSelector,
SearchIndexerKnowledgeStoreFileProjectionSelector,
CognitiveServicesAccountKey,
)

# Define knowledge store with table + object projections
knowledge_store = SearchIndexerKnowledgeStore(
storage_connection_string=STORAGE_CONN,
projections=[
SearchIndexerKnowledgeStoreProjection(
tables=[
SearchIndexerKnowledgeStoreTableProjectionSelector(
table_name="documentsTable",
generated_key_name="documentId",
source="/document/documentShape"
),
SearchIndexerKnowledgeStoreTableProjectionSelector(
table_name="keyphrasesTable",
generated_key_name="keyphraseId",
source="/document/documentShape/keyphrases/*"
),
],
objects=[
SearchIndexerKnowledgeStoreObjectProjectionSelector(
storage_container="knowledge-objects",
generated_key_name="objectId",
source="/document/documentShape"
)
],
files=[]
)
]
)

# Update the skillset with knowledge store
skillset = SearchIndexerSkillset(
name="document-skillset",
description="Enrichment with knowledge store projections",
skills=[key_phrase_skill, entity_skill, language_skill, shaper_skill],
knowledge_store=knowledge_store,
cognitive_services_account=CognitiveServicesAccountKey(key=AI_KEY)
)

indexer_client.create_or_update_skillset(skillset)
print("Skillset updated with knowledge store projections")

Tarefa 3: Adicionar projeções de arquivo para imagens

# File projections store binary content (normalized images from OCR)
# First, add an image extraction configuration to the indexer

from azure.search.documents.indexes.models import (
SearchIndexer,
IndexingParameters,
IndexingParametersConfiguration,
)

# Update indexer to extract images
indexer = SearchIndexer(
name="document-indexer",
data_source_name="blob-datasource",
target_index_name="documents-index",
skillset_name="document-skillset",
parameters=IndexingParameters(
configuration=IndexingParametersConfiguration(
image_action="generateNormalizedImages"
)
)
)
indexer_client.create_or_update_indexer(indexer)

# For file projections, update the knowledge store:
file_projection = SearchIndexerKnowledgeStoreProjection(
tables=[],
objects=[],
files=[
SearchIndexerKnowledgeStoreFileProjectionSelector(
storage_container="knowledge-images",
generated_key_name="imageId",
source="/document/normalized_images/*"
)
]
)

Tarefa 4: Consultar o Knowledge Store

Após executar o indexer, verifique os dados projetados no Azure Storage:

# List tables in storage account
az storage table list --account-name $STORAGE_ACCOUNT --query "[].name" -o tsv

# Query the documents table
az storage entity query \
--table-name "documentsTable" \
--account-name $STORAGE_ACCOUNT \
--query-filter "" \
--select "fileName,language" \
--top 10

# List blobs in knowledge-objects container
az storage blob list \
--container-name "knowledge-objects" \
--account-name $STORAGE_ACCOUNT \
--query "[].name" -o tsv

# Download and inspect a projected JSON object
az storage blob download \
--container-name "knowledge-objects" \
--account-name $STORAGE_ACCOUNT \
--name "<blob-name>" \
--file projected-doc.json

cat projected-doc.json | python -m json.tool

Saída Esperada

Projeção de tabela (documentsTable):

documentIdfileNamelanguagecontent (truncado)
abc123sample-doc.txtenAzure AI services provide...
def456report.pdfenQuarterly report showing...

Projeção de objeto (blob JSON):

{
"fileName": "sample-doc.txt",
"content": "Azure AI services provide cloud-based AI capabilities...",
"keyphrases": ["cloud-based AI capabilities", "cognitive services"],
"organizations": ["Microsoft"],
"language": "en"
}

Quebra & conserta

#CenárioSintomaCausa RaizCorreção
1Tabelas do knowledge store não criadasNenhuma tabela aparece no storage após o indexer executarString de conexão do storage no skillset está incorreta ou ausenteVerifique storageConnectionString na definição do knowledge store
2Caminho de origem da projeção inválidoAviso do indexer: "Could not project to knowledge store"O caminho de origem não corresponde a nenhum nó de enriquecimento (ex.: Shaper skill ausente)Adicione um Shaper skill ou corrija o caminho de origem para corresponder a uma saída de enriquecimento existente
3Tabelas relacionadas não vinculadasProjeções de tabela existem mas não é possível unir documentsTable a keyphrasesTable no Power BIProjeções em diferentes grupos projections não compartilham chavesColoque tabelas relacionadas no MESMO grupo de projeção — elas compartilham um generatedKeyName para relacionamentos
4Imagens não projetadasContainer de projeções de arquivo está vazioIndexer não configurado com imageAction: generateNormalizedImagesDefina o parâmetro do indexer configuration.imageAction como generateNormalizedImages
5Container de storage não existeErro: "Container not found"Knowledge store não cria containers automaticamente para projeções de objeto/arquivoO container É criado automaticamente. Verifique a string de conexão do storage e as permissões

Verificação de Conhecimento

1. Você quer analisar documentos enriquecidos no Power BI com linhas e colunas. Qual tipo de projeção do knowledge store você deve usar?

2. Duas projeções de tabela (documentsTable e keyphrasesTable) precisam de um relacionamento de chave estrangeira. Como você garante que elas possam ser unidas?

3. Qual é o propósito do Shaper skill em um pipeline de knowledge store?

4. Qual parâmetro do indexer deve ser definido para que projeções de arquivo armazenem imagens extraídas de documentos?

5. Onde uma projeção de objeto armazena fisicamente seus dados?

Limpeza

az group delete --name rg-ai102-search --yes --no-wait

Saiba Mais