Modelo de demonstração: intenções de rotulagem com crowd-classifier - Amazon SageMaker

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Modelo de demonstração: intenções de rotulagem com crowd-classifier

Ao escolher usar um modelo personalizado, você acessará o Painel de tarefas de rotulagem personalizado. Ali, você pode selecionar vários modelos iniciais que representam algumas das tarefas mais comuns. Os modelos fornecem um ponto de partida para trabalhar na criação do modelo da sua tarefa de rotulagem personalizado.

Nesta demonstração, você trabalhará com o modelo Detecção de Intenções, que usa o elemento crowd-classifier e as funções do AWS Lambda necessárias para o processamento de seus dados antes e depois da tarefa.

Modelo personalizado de Detecção de intenções inicial

Este é o modelo de detecção de intenções fornecido como ponto de partida.

<script src="https://assets.crowd.aws/crowd-html-elements.js"></script> <crowd-form> <crowd-classifier name="intent" categories="{{ task.input.labels | to_json | escape }}" header="Pick the most relevant intention expressed by the below text" > <classification-target> {{ task.input.utterance }} </classification-target> <full-instructions header="Intent Detection Instructions"> <p>Select the most relevant intention expressed by the text.</p> <div> <p><strong>Example: </strong>I would like to return a pair of shoes</p> <p><strong>Intent: </strong>Return</p> </div> </full-instructions> <short-instructions> Pick the most relevant intention expressed by the text </short-instructions> </crowd-classifier> </crowd-form>

Os modelos personalizados usam a Linguagem de modelo Liquid, e cada um dos itens entre chaves duplas é uma variável. A função AWS Lambda de pré-anotação deve fornecer um objeto taskInput chamado e as propriedades desse objeto podem ser acessadas {{ task.input.<property name> }} como em seu modelo.

Seu modelo personalizado de detecção de intenções

No modelo inicial, há duas variáveis: a propriedade task.input.labels na tag de abertura do elemento crowd-classifier e o task.input.utterance no conteúdo da região classification-target.

A menos que você precise oferecer diferentes conjuntos de rótulos com enunciados diferentes, evitar uma variável e simplesmente usar texto economizará tempo de processamento e criará menos possibilidade de erro. O modelo usado nesta demonstração removerá essa variável, mas variáveis e filtros como to_json são explicados mais detalhadamente no artigo de crowd-bounding-box demonstração.

Estilização de elementos

Duas partes desses elementos personalizados que são por vezes ignoradas são as regiões <full-instructions> e <short-instructions>. Boas instruções geram bons resultados.

Nos elementos que incluem essas regiões, <short-instructions> aparecem automaticamente no painel "Instruções" à esquerda da tela do operador. As <full-instructions> estão vinculadas ao link "Exibir instruções completas" na parte superior do painel. Clique no link para abrir um painel modal com mais instruções detalhadas.

Você não pode usar apenas HTML e CSS. JavaScript Nessas seções, recomendamos que você o faça se acreditar que pode fornecer um conjunto sólido de instruções e exemplos que ajudarão os funcionários a concluir suas tarefas com melhor velocidade e precisão.

exemplo Experimentar com JSFiddle

A white cat with blue eyes sitting on a patterned surface. (AI generated)

Experimente uma tarefa de <crowd-classifier> exemplo. O exemplo é renderizado pelo JSFiddle, portanto, todas as variáveis de modelo são substituídas por valores codificados. Clique no link "Visualizar instruções completas" para conferir um conjunto de exemplos com estilo de CSS estendido. Você pode bifurcar o projeto para experimentar suas próprias alterações no CSS, adicionar imagens de amostra ou adicionar JavaScript funcionalidades estendidas.

exemplo : modelo personalizado final de detecção de intenções

Ele usa a tarefa <crowd-classifier> de exemplo, mas com uma variável para o <classification-target>. Se estiver tentando manter um design CSS consistente entre uma série de trabalhos de rotulagem diferentes, você pode incluir uma folha de estilos externa usando um elemento <link rel...> da mesma forma que faria em qualquer outro documento HTML.

<script src="https://assets.crowd.aws/crowd-html-elements.js"></script> <crowd-form> <crowd-classifier name="intent" categories="['buy', 'eat', 'watch', 'browse', 'leave']" header="Pick the most relevant intent expressed by the text below" > <classification-target> {{ task.input.source }} </classification-target> <full-instructions header="Emotion Classification Instructions"> <p>In the statements and questions provided in this exercise, what category of action is the speaker interested in doing?</p> <table> <tr> <th>Example Utterance</th> <th>Good Choice</th> </tr> <tr> <td>When is the Seahawks game on?</td> <td> eat<br> <greenbg>watch</greenbg> <botchoice>browse</botchoice> </td> </tr> <tr> <th>Example Utterance</th> <th>Bad Choice</th> </tr> <tr> <td>When is the Seahawks game on?</td> <td> buy<br> <greenbg>eat</greenbg> <botchoice>watch</botchoice> </td> </tr> </table> </full-instructions> <short-instructions> What is the speaker expressing they would like to do next? </short-instructions> </crowd-classifier> </crowd-form> <style> greenbg { background: #feee23; display: block; } table { *border-collapse: collapse; /* IE7 and lower */ border-spacing: 0; } th, tfoot, .fakehead { background-color: #8888ee; color: #f3f3f3; font-weight: 700; } th, td, tfoot { border: 1px solid blue; } th:first-child { border-radius: 6px 0 0 0; } th:last-child { border-radius: 0 6px 0 0; } th:only-child{ border-radius: 6px 6px 0 0; } tfoot:first-child { border-radius: 0 0 6px 0; } tfoot:last-child { border-radius: 0 0 0 6px; } tfoot:only-child{ border-radius: 6px 6px; } td { padding-left: 15px ; padding-right: 15px ; } botchoice { display: block; height: 17px; width: 490px; overflow: hidden; position: relative; background: #fff; padding-bottom: 20px; } botchoice:after { position: absolute; bottom: 0; left: 0; height: 100%; width: 100%; content: ""; background: linear-gradient(to top, rgba(255,255,255, 1) 55%, rgba(255,255,255, 0) 100% ); pointer-events: none; /* so the text is still selectable */ } </style>
exemplo : Seu arquivo de manifesto

Se você estiver preparando o arquivo manifesto manualmente para uma tarefa de classificação de texto como essa, será necessário que seus dados sejam formatados da seguinte maneira:

{"source": "Roses are red"} {"source": "Violets are Blue"} {"source": "Ground Truth is the best"} {"source": "And so are you"}

Isso difere do arquivo manifesto usado para a demonstração "Modelo de demonstração: anotação de imagens com crowd-bounding-box", em que source-ref foi usado como nome da propriedade em vez de source. O uso de source-ref designa URIs do S3 para imagens ou outros arquivos que devem ser convertidos em HTTP. Caso contrário, source deve ser usado como nas strings de texto acima.

Sua função Lambda de pré-anotação

Como parte da configuração do trabalho, forneça o ARN de um AWS Lambda que pode ser chamado para processar suas entradas de manifesto e passá-las para o mecanismo de modelos.

Essa função Lambda é necessária para ter uma das quatro strings a seguir como parte do nome da função: SageMaker, Sagemaker, sagemaker ou LabelingFunction.

Isso se aplica tanto aos Lambdas de pré-anotação quanto de pós-anotação.

Quando você estiver usando o console, se tiver Lambdas na sua conta, uma lista suspensa de funções que atendem aos requisitos de nomenclatura será fornecida para escolha.

Neste exemplo muito básico, em que você tem apenas uma variável, trata-se basicamente uma função de passagem. Aqui está um exemplo de pré-rotulagem do Lambda usando o Python 3.7.

import json def lambda_handler(event, context): return { "taskInput": event['dataObject'] }

A propriedade dataObject do event contém as propriedades de um objeto de dados no seu manifesto.

Nesta demonstração, que é uma simples passagem, você passa por isso como valor taskInput. Se você adicionar propriedades com esses valores ao objeto event['dataObject'], eles estarão disponíveis para o seu modelo HTML como variáveis Liquid com o formato {{ task.input.<property name> }}.

Sua função Lambda de pós-anotação

Como parte da configuração do trabalho, forneça o ARN de uma função Lambda que pode ser chamado para processar os dados do formulário quando um trabalhador concluir uma tarefa. Isso pode ser tão simples ou complexo quanto você quiser. Se você quiser fazer uma consolidação de resposta e uma pontuação conforme a chegada dos dados, poderá aplicar os algoritmos de escore ou consolidação de sua escolha. Se quiser armazenar os dados brutos para processamento offline, essa é uma opção.

Definir permissões para sua função Lambda de pós-anotação

Os dados de anotação estarão em um arquivo designado pela string s3Uri no objeto payload. Para processar as anotações assim que elas chegarem, mesmo para uma simples função de repasse, você precisa atribuir ao S3ReadOnly acesso ao seu Lambda para que ele possa ler os arquivos de anotação.

Na página Console para a criação do seu Lambda, role até o painel Perfil de execução. Selecione Criar uma nova função a partir de um ou mais modelos. Dê um nome à função. Na lista suspensa Policy templates (Modelos de política), escolha Amazon S3 object read-only permissions (Permissões somente leitura do objeto Amazon S3). Salve o Lambda, e a função será salva e selecionada.

O exemplo a seguir refere-se ao Python 3.7.

import json import boto3 from urllib.parse import urlparse def lambda_handler(event, context): consolidated_labels = [] parsed_url = urlparse(event['payload']['s3Uri']); s3 = boto3.client('s3') textFile = s3.get_object(Bucket = parsed_url.netloc, Key = parsed_url.path[1:]) filecont = textFile['Body'].read() annotations = json.loads(filecont); for dataset in annotations: for annotation in dataset['annotations']: new_annotation = json.loads(annotation['annotationData']['content']) label = { 'datasetObjectId': dataset['datasetObjectId'], 'consolidatedAnnotation' : { 'content': { event['labelAttributeName']: { 'workerId': annotation['workerId'], 'result': new_annotation, 'labeledContent': dataset['dataObject'] } } } } consolidated_labels.append(label) return consolidated_labels

Sua saída do trabalho de rotulagem

O Lambda de pós-anotação geralmente recebe lotes de resultados de tarefas no objeto de evento. Esse lote será o objeto payload que o Lambda deve percorrer.

Você encontrará a saída da tarefa em uma pasta com o nome da sua tarefa de rotulagem no bucket do S3 de destino especificado. Ele estará em uma subpasta chamada manifests.

Para uma tarefa de detecção de intenção, a saída no manifesto de saída será um pouco parecida com a demonstração abaixo. O exemplo foi limpo e espaçado para facilitar a leitura pelos operadores. A saída real será mais comprimida para leitura de máquina.

exemplo : JSON no manifesto de saída
[ { "datasetObjectId":"<Number representing item's place in the manifest>", "consolidatedAnnotation": { "content": { "<name of labeling job>": { "workerId":"private.us-east-1.XXXXXXXXXXXXXXXXXXXXXX", "result": { "intent": { "label":"<label chosen by worker>" } }, "labeledContent": { "content":"<text content that was labeled>" } } } } }, "datasetObjectId":"<Number representing item's place in the manifest>", "consolidatedAnnotation": { "content": { "<name of labeling job>": { "workerId":"private.us-east-1.6UDLPKQZHYWJQSCA4MBJBB7FWE", "result": { "intent": { "label": "<label chosen by worker>" } }, "labeledContent": { "content": "<text content that was labeled>" } } } } }, ... ... ... ]

Isso deve ajudá-lo a criar e usar seu próprio modelo personalizado.