Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Note
Azure KI-Suche ist über das Azure Portal, REST-APIs und Azure SDKs verfügbar. Es unterstützt auch Foundry IQ, die verwaltete Wissensschicht, die Unternehmensinhalte in wiederverwendbare, berechtigungsfähige Wissensbasen für Agenten im Microsoft Foundry-Portal transformiert.
Verwenden Sie die Benutzerdefinierte Web-API-Fähigkeit , um die KI-Anreicherung durch Aufrufen eines Web-API-Endpunkts zu erweitern, der benutzerdefinierte Vorgänge bereitstellt. Wie integrierte Fähigkeiten verfügt eine benutzerdefinierte Web-API-Fähigkeit über Eingaben und Ausgaben. Abhängig von den Eingaben empfängt Ihre Web-API eine JSON-Nutzlast, wenn der Indexer ausgeführt wird, und gibt eine JSON-Nutzlast als Antwort zusammen mit einem Erfolgsstatuscode zurück. Die Antwort muss die Ausgaben enthalten, die von Ihrer benutzerdefinierten Fähigkeit angegeben werden. Jede andere Antwort gilt als Fehler und es werden keine Anreicherung durchgeführt. Die Struktur der JSON-Nutzlast wird weiter unten in diesem Dokument beschrieben.
Die Benutzerdefinierte Web-API-Fähigkeit wird auch bei der Implementierung des features Azure OpenAI On Your Data verwendet. Wenn Azure OpenAI für den rollenbasierten Zugriff konfiguriert ist und Beim Erstellen des Vektorindex Fehler auftreten403 Forbidden, überprüfen Sie, ob Azure KI-Suche über eine Systemidentität verfügt und als vertrauenswürdiger Dienst auf Azure OpenAI ausgeführt wird.
Note
Bei bestimmten Standard-HTTP-Statuscodes, die von der Web-API zurückgegeben werden, unternimmt der Indexer zwei Wiederholungsversuche. Diese HTTP-Statuscodes lauten:
502 Bad Gateway503 Service Unavailable429 Too Many Requests
@odata.type
Microsoft.Skills.Custom.WebApiSkill
Qualifikationsparameter
Bei Parametern wird die Groß-/Kleinschreibung beachtet.
| Parametername | Description |
|---|---|
uri |
Der URI der Web-API, an die die JSON-Nutzdaten gesendet werden. Nur das HTTPS-URI-Schema ist zulässig. Wenn Sie das Skillset mit GET abrufen, gibt der Dienst den ?code= Abfrageparameterwert zurück, um ?code=<redacted> die Gefährdung von Funktionsschlüsseln zu verhindern. Um die Fähigkeit zu aktualisieren, ohne den gespeicherten URI zu ändern, legen Sie uri diesen Wert fest.<unchanged> |
authResourceId |
(Optional) Eine Zeichenfolge, die angibt, dass dieser Skill bei der Verbindung mit der Funktion oder App, die den Code hostet, eine systemseitig verwaltete Identität verwenden soll. Diese Eigenschaft wird auf eine Anwendungs-ID (Client) oder auf die Registrierung einer App in Microsoft Entra ID festgelegt. Dabei wird eines dieser Formate verwendet: api://<appId>, <appId>/.default, api://<appId>/.default. Dieser Wert wird verwendet, um den Gültigkeitsbereich des vom Indexer abgerufenen Authentifizierungstokens festzulegen. Er wird zusammen mit der API-Anforderung für benutzerdefinierte Web-Skills an die Funktion oder App gesendet. Wenn diese Eigenschaft festgelegt wird, muss Ihr Suchdienst für die verwaltete Identität konfiguriert und Ihre Azure-Funktions-App für eine Microsoft Entra-Anmeldung konfiguriert sein. Rufen Sie die API mit api-version=2023-10-01-Preview auf, um diesen Parameter zu verwenden. |
authIdentity |
(Optional) Eine benutzerseitig verwaltete Identität, die vom Suchdienst zum Herstellen einer Verbindung mit der Funktion oder App verwendet wird, die den Code hostet. Sie können entweder eine system- oder eine benutzerverwaltete Identität verwenden. Wenn Sie eine vom System verwaltete Identität verwenden möchten, lassen Sie den Wert authIdentity leer. |
httpMethod |
Diese Methode wird zum Senden der Nutzlast verwendet: Zulässige Methoden sind PUT oder POST. |
httpHeaders |
Eine Sammlung von Schlüssel-Wert-Paaren, bei denen die Schlüssel Headernamen und die Werte Headerwerte darstellen, die zusammen mit den Nutzdaten an Ihre Web-API gesendet werden. Die folgenden Header dürfen nicht in dieser Sammlung enthalten sein: Accept, Accept-Charset, Accept-Encoding, Content-Length, Content-Type, Cookie, Host, TE, Upgrade, Via. Wenn Sie das Skillset mit GET abrufen, gibt <redacted> der Dienst für alle Headerwerte zurück, um die Gefährdung von Anmeldeinformationen wie Bearertoken und API-Schlüsseln zu verhindern. Um die Fähigkeit zu aktualisieren, ohne gespeicherte Headerwerte zu ändern, legen Sie jeden Wert auf <unchanged>. Der Dienst stellt den ursprünglich gespeicherten Wert wieder her. |
timeout |
(Optional) Wenn angegeben, wird damit das Zeitlimit für den HTTP-Client angegeben, der den API-Aufruf durchführt. Es muss als XSD-Wert „dayTimeDuration“ formatiert sein (eine eingeschränkte Teilmenge eines ISO 8601-Zeitwerts). Zum Beispiel PT60S für 60 Sekunden. Wenn kein Wert festgelegt ist, wird ein Standardwert von 30 Sekunden ausgewählt. Das Zeitlimit kann auf maximal 230 Sekunden und mindestens 1 Sekunde festgelegt werden. |
batchSize |
(Optional) Gibt an, wie viele Datensätze (siehe JSON-Nutzlaststruktur weiter unten) pro API-Aufruf gesendet werden. Wenn kein Wert festgelegt ist, wird der Standardwert 1000 ausgewählt. Verwenden Sie diesen Parameter, um einen geeigneten Kompromiss zwischen Indizierungsdurchsatz und Last für Ihre API zu erzielen. |
degreeOfParallelism |
(Optional) Bei Angabe dieses Parameters wird die Anzahl von Aufrufen angezeigt, die der Indexer parallel zum von Ihnen bereitgestellten Endpunkt vornimmt. Sie können diesen Wert verringern, wenn Ihr Endpunkt unter Druck ausfällt, oder ihn heraufsetzen, wenn Ihr Endpunkt die Last verarbeiten kann. Wenn kein Wert festgelegt ist, wird ein Standardwert von 5 verwendet. Der degreeOfParallelism kann auf maximal 10 und mindestens 1 festgelegt werden. |
Qualifikationseingaben
Diese Fähigkeit hat keine vordefinierten Eingaben. Die Eingaben sind jedes vorhandene Feld oder ein beliebiger Knoten in der Anreicherungsstruktur, die Sie an Ihren benutzerdefinierten Skill übergeben möchten.
Skill-Ergebnisse
Diese Fähigkeit hat keine vordefinierten Ausgaben. Achten Sie darauf, im Indexer eine Ausgabefeldzuordnung zu definieren, wenn die Skillausgabe an ein Feld im Suchindex gesendet werden soll.
Beispieldefinition
{
"@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"
}
]
}
Note
Wenn Sie ein Skillset mithilfe von GET abrufen, gibt <redacted> der Dienst für alle httpHeaders Werte und ?code=<redacted> für jeden ?code= Abfrageparameter in der uri. Beide Werte verhindern die Gefährdung von Anmeldeinformationen für Aufrufer, die die Rolle "Mitwirkender des Suchdiensts" enthalten, aber keine Rolle für den externen Dienst. Um die Fähigkeit zu aktualisieren, ohne diese gespeicherten Werte zu ändern, übergeben Sie <unchanged> für jedes betroffene Feld.
Das folgende Beispiel zeigt eine GET-Antwort für eine Fähigkeit, die headerbasierte Authentifizierung und einen Azure Funktions-URI verwendet:
{
"@odata.type": "#Microsoft.Skills.Custom.WebApiSkill",
"uri": "https://contoso.example.org/api?code=<redacted>",
"httpMethod": "POST",
"name": "myCustomSkill",
"httpHeaders": {
"Authorization": "<redacted>",
"Ocp-Apim-Subscription-Key": "<redacted>"
}
}
Um diese Fähigkeit zu aktualisieren, ohne die vorhandenen Werte zu ändern, verwenden Sie <unchanged>Folgendes:
{
"uri": "<unchanged>",
"httpHeaders": {
"Authorization": "<unchanged>",
"Ocp-Apim-Subscription-Key": "<unchanged>"
}
}
Beispiel für eine Eingabe-JSON-Struktur
Diese JSON-Struktur stellt die Nutzlast dar, die Sie an Ihre Web-API senden. Es gelten immer folgende Einschränkungen:
Die Entität der höchsten Ebene hat die Bezeichnung
valuesund ist ein Array von Objekten. Die Anzahl dieser Objekte ist höchstens derbatchSize.Jedes Objekt im
values-Array verfügt über Folgendes:Eine
recordIdEigenschaft, die eine eindeutige Zeichenfolge ist, die verwendet wird, um diesen Datensatz zu identifizieren.Eine
dataEigenschaft, die ein JSON-Objekt ist. Die Felder der Eigenschaftdataentsprechen den Namen, die im Abschnittinputsder Skilldefinition angegeben sind. Die Werte dieser Felder stammen aus densourceFeldern (die aus einem Feld im Dokument oder potenziell aus einer anderen Fähigkeit stammen können).
{
"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": []
}
}
]
}
Beispiel für eine Ausgabe-JSON-Struktur
Die „Ausgabe“ entspricht der Antwort, die von Ihrer Web-API zurückgegebenen wird. Die Web-API sollte nur eine JSON-Nutzlast zurückgeben (verifiziert durch Prüfung des Content-Type-Antwortheaders) und die folgenden Einschränkungen erfüllen:
Es muss eine Entität der höchsten Ebene mit der Bezeichnung
valuesvorhanden sein, bei der es sich um ein Array von Objekten handelt.Die Anzahl der Objekte im Array sollte gleich der Anzahl der an die Web-API gesendeten Objekte sein.
Jedes Objekt benötigt:
Eine
recordId-Eigenschaft.Eine
data-Eigenschaft, die ein Objekt ist, bei dem die Felder Anreicherungen sind, die den „Namen“ in deroutputentsprechen und deren Wert als Anreicherung betrachtet wird.Eine
errors-Eigenschaft (ein Array, das alle aufgetretenen Fehler auflistet und dem Ausführungsverlauf des Indexers hinzugefügt wird). Diese Eigenschaft ist erforderlich, kann jedoch einnull-Wert sein.Eine
warnings-Eigenschaft (ein Array, das alle aufgetretenen Warnungen auflistet und dem Ausführungsverlauf des Indexers hinzugefügt wird). Diese Eigenschaft ist erforderlich, kann jedoch einnull-Wert sein.
Die Reihenfolge der Objekte in den
valuesder Anforderung oder Antwort ist nicht wichtig.recordIdwird jedoch für die Korrelation verwendet, sodass jeder Datensatz in der Antwort, der eine Datensatz-ID (recordId) enthält, die nicht Teil der ursprünglichen Anforderung an die Web-API war, verworfen wird.
{
"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"
}
]
},
]
}
Fehlerfälle
Berücksichtigen Sie nicht nur die folgenden Fälle als Fehler, wenn Ihre Web-API nicht verfügbar ist oder nicht erfolgreiche Statuscodes sendet:
Wenn die Web-API einen Erfolgsstatuscode zurückgibt, aber die Antwort angibt, dass sie nicht
application/jsonist, ist die Antwort ungültig, und es werden keine Anreicherungen ausgeführt.Wenn das Antwortarray
valuesungültige Datensätze enthält (z. B. fehlende oder dupliziertrecordId), werden die ungültigen Datensätze nicht erweitert. Wenn Sie benutzerdefinierte Fähigkeiten entwickeln, halten Sie sich an den Web-API-Qualifikationsvertrag. Im Power Skill-Repository finden Sie ein Beispiel, das dem erwarteten Vertrag entspricht.
Wenn die Web-API nicht verfügbar ist oder einen HTTP-Fehler zurückgibt, enthält der Indexerausführungsverlauf einen freundlichen Fehler mit allen verfügbaren Details zum HTTP-Fehler.