Habilidade de API Web personalizada em um pipeline de enriquecimento de Pesquisa de IA do Azure
A habilidade de API da Web personalizada permite que você estenda o enriquecimento da IA chamando para um ponto de extremidade da API da Web fornecendo operações personalizadas. Semelhante às habilidades internas, uma habilidade de API Web personalizada tem entradas e saídas. Dependendo das entradas, sua API Web recebe uma carga JSON quando o indexador é executado e gera uma carga JSON como resposta, juntamente com um código de status de sucesso. Espera-se que a resposta tenha as saídas especificadas pela sua habilidade personalizada. Qualquer outra resposta é considerada um erro e nenhum enriquecimento é realizado. A estrutura da carga JSON é descrita mais abaixo neste documento.
A habilidade API Web personalizada também é usada na implementação do recurso Azure OpenAI On Your Data . Se o Azure OpenAI estiver configurado para acesso baseado em função e você receber 403 Forbidden
chamadas ao criar o índice vetorial, verifique se o Azure AI Search tem uma identidade atribuída ao sistema e é executado como um serviço confiável no Azure OpenAI.
Nota
O indexador tenta novamente duas vezes para determinados códigos de status HTTP padrão retornados da API da Web. Esses códigos de status HTTP são:
502 Bad Gateway
503 Service Unavailable
429 Too Many Requests
@odata.type
Microsoft.Skills.Custom.WebApiSkill
Parâmetros de habilidade
Os parâmetros diferenciam maiúsculas de minúsculas.
Nome do parâmetro | Description |
---|---|
uri |
O URI da API Web para a qual a carga JSON é enviada. Somente o esquema de URI https é permitido. |
authResourceId |
(Opcional) Uma cadeia de caracteres que, se definida, indica que essa habilidade deve usar uma identidade gerenciada pelo sistema na conexão com a função ou aplicativo que hospeda o código. Esta propriedade leva um ID de aplicativo (cliente) ou registro do aplicativo no Microsoft Entra ID, em qualquer um destes formatos: api://<appId> , <appId>/.default , api://<appId>/.default . Esse valor é usado para definir o escopo do token de autenticação recuperado pelo indexador e é enviado junto com a solicitação personalizada da API de habilidade da Web para a função ou aplicativo. A definição dessa propriedade requer que seu serviço de pesquisa esteja configurado para identidade gerenciada e seu aplicativo de função do Azure esteja configurado para uma entrada do Microsoft Entra. Para usar esse parâmetro, chame a API com api-version=2023-10-01-Preview . |
authIdentity |
(Opcional) Uma identidade gerenciada pelo usuário usada pelo serviço de pesquisa para se conectar à função ou aplicativo que hospeda o código. Você pode usar uma identidade gerenciada pelo sistema ou pelo usuário. Para usar uma identidade gerenciada pelo sistema, deixe authIdentity em branco. |
httpMethod |
O método a utilizar durante o envio da carga. Os métodos permitidos são PUT ou POST |
httpHeaders |
Uma coleção de pares chave-valor em que as chaves representam nomes de cabeçalho e valores representam valores de cabeçalho que são enviados para sua API da Web junto com a carga útil. Os seguintes cabeçalhos são proibidos de estar nesta coleção: Accept , Accept-Charset , Accept-Encoding , Content-Length , Content-Type , Cookie , Host , TE Upgrade , . Via |
timeout |
(Opcional) Quando especificado, indica o tempo limite para o cliente http que faz a chamada de API. Ele deve ser formatado como um valor XSD "dayTimeDuration" (um subconjunto restrito de um valor de duração ISO 8601). Por exemplo, PT60S durante 60 segundos. Se não estiver definido, será escolhido um valor padrão de 30 segundos. O tempo limite pode ser definido para um máximo de 230 segundos e um mínimo de 1 segundo. |
batchSize |
(Opcional) Indica quantos "registros de dados" (consulte a estrutura de carga JSON abaixo) são enviados por chamada de API. Se não estiver definido, um padrão de 1000 será escolhido. Recomendamos que você use esse parâmetro para obter uma compensação adequada entre a taxa de transferência de indexação e a carga em sua API. |
degreeOfParallelism |
(Opcional) Quando especificado, indica o número de chamadas que o indexador faz em paralelo com o ponto de extremidade fornecido. Você pode diminuir esse valor se o endpoint estiver falhando sob pressão, ou aumentá-lo se o endpoint puder lidar com a carga. Se não estiver definido, um valor padrão de 5 será usado. O degreeOfParallelism pode ser ajustado para um máximo de 10 e um mínimo de 1. |
Contributos para as competências
Não há entradas predefinidas para esta habilidade. As entradas são qualquer campo existente ou qualquer nó na árvore de enriquecimento que você deseja passar para sua habilidade personalizada.
Resultados em termos de competências
Não há saídas predefinidas para essa habilidade. Certifique-se de definir um mapeamento de campo de saída no indexador se a saída da habilidade deve ser enviada para um campo no índice de pesquisa.
Definição da amostra
{
"@odata.type": "#Microsoft.Skills.Custom.WebApiSkill",
"description": "A custom skill that can identify positions of different phrases in the source text",
"uri": "https://contoso.count-things.com",
"batchSize": 4,
"context": "/document",
"inputs": [
{
"name": "text",
"source": "/document/content"
},
{
"name": "language",
"source": "/document/languageCode"
},
{
"name": "phraseList",
"source": "/document/keyphrases"
}
],
"outputs": [
{
"name": "hitPositions"
}
]
}
Exemplo de estrutura JSON de entrada
Essa estrutura JSON representa a carga que é enviada para sua API da Web. Segue sempre estas restrições:
A entidade de nível superior é chamada
values
e é uma matriz de objetos. O número de tais objetos é, no máximo, obatchSize
.Cada objeto na
values
matriz tem:Uma
recordId
propriedade que é uma cadeia de caracteres exclusiva , usada para identificar esse registro.Uma
data
propriedade que é um objeto JSON. Os campos dadata
propriedade correspondem aos "nomes" especificados nainputs
seção da definição de habilidade. Os valores desses campos são dossource
campos (que podem ser de um campo no documento ou, potencialmente, de outra habilidade).
{
"values": [
{
"recordId": "0",
"data":
{
"text": "Este es un contrato en Inglés",
"language": "es",
"phraseList": ["Este", "Inglés"]
}
},
{
"recordId": "1",
"data":
{
"text": "Hello world",
"language": "en",
"phraseList": ["Hi"]
}
},
{
"recordId": "2",
"data":
{
"text": "Hello world, Hi world",
"language": "en",
"phraseList": ["world"]
}
},
{
"recordId": "3",
"data":
{
"text": "Test",
"language": "es",
"phraseList": []
}
}
]
}
Exemplo de estrutura JSON de saída
A "saída" corresponde à resposta retornada da sua API Web. A API da Web só deve retornar uma carga JSON (verificada observando o cabeçalho de Content-Type
resposta) e deve satisfazer as seguintes restrições:
Deve haver uma entidade de nível superior chamada
values
, que deve ser uma matriz de objetos.O número de objetos na matriz deve ser o mesmo que o número de objetos enviados para a API da Web.
Cada objeto deve ter:
Uma
recordId
propriedade.Uma
data
propriedade, que é um objeto onde os campos são enriquecimentos correspondentes aos "nomes" nooutput
e cujo valor é considerado o enriquecimento.Uma
errors
propriedade, uma matriz que lista todos os erros encontrados que são adicionados ao histórico de execução do indexador. Esta propriedade é necessária, mas pode ter umnull
valor.Uma
warnings
propriedade, uma matriz que lista todos os avisos encontrados que são adicionados ao histórico de execução do indexador. Esta propriedade é necessária, mas pode ter umnull
valor.
A ordenação dos objetos na
values
solicitação ou na resposta não é importante. No entanto, orecordId
é usado para correlação, portanto, qualquer registro na resposta que contenha umrecordId
, que não fazia parte da solicitação original para a API da Web é descartado.
{
"values": [
{
"recordId": "3",
"data": {
},
"errors": [
{
"message" : "'phraseList' should not be null or empty"
}
],
"warnings": null
},
{
"recordId": "2",
"data": {
"hitPositions": [6, 16]
},
"errors": null,
"warnings": null
},
{
"recordId": "0",
"data": {
"hitPositions": [0, 23]
},
"errors": null,
"warnings": null
},
{
"recordId": "1",
"data": {
"hitPositions": []
},
"errors": null,
"warnings": [
{
"message": "No occurrences of 'Hi' were found in the input text"
}
]
},
]
}
Casos de erro
Além de sua API da Web estar indisponível ou enviar códigos de status sem sucesso, os seguintes são considerados casos errados:
Se a API da Web retornar um código de status de sucesso, mas a resposta indicar que não
application/json
é, a resposta será considerada inválida e nenhum enriquecimento será executado.Se houver registros inválidos (por exemplo,
recordId
está faltando ou duplicado) na matriz de respostavalues
, nenhum enriquecimento será executado para os registros inválidos. É importante aderir ao contrato de habilidades da API Web ao desenvolver habilidades personalizadas. Você pode consultar este exemplo fornecido no repositório Power Skill que segue o contrato esperado.
Para casos em que a API da Web não está disponível ou retorna um erro HTTP, um erro amigável com todos os detalhes disponíveis sobre o erro HTTP é adicionado ao histórico de execução do indexador.