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.
Wenn Sie KI-Funktionen erstellen, müssen Sie möglicherweise über die vom KI-Modell bereitgestellten Parameter hinaus auf Kontextdaten zugreifen. Die Microsoft.Extensions.AI Bibliothek bietet mehrere Mechanismen zum Übergeben von Daten an Funktionsdelegatten.
AIFunction-Klasse
Der AIFunction Typ stellt eine Funktion dar, die für einen KI-Dienst beschrieben und aufgerufen werden kann. Sie können AIFunction Objekte erstellen, indem Sie eine der AIFunctionFactory.Create Überladungen aufrufen. Es handelt sich aber AIFunction auch um eine Basisklasse, von der Sie ableiten und Ihren eigenen KI-Funktionstyp implementieren können.
DelegatingAIFunction bietet eine einfache Möglichkeit, eine vorhandene AIFunction zu umschließen und zusätzliche Funktionen einzubinden, einschließlich der Erfassung zusätzlicher Daten zur Verwendung.
Daten übergeben
Sie können die Daten der Funktion zum Zeitpunkt der Erstellung zuordnen, entweder über das Schließen oder über AdditionalProperties. Wenn Sie eine eigene Funktion erstellen, können Sie AdditionalProperties nach Belieben befüllen. Wenn Sie die Funktion mit AIFunctionFactory erstellen, können Sie Daten mithilfe AIFunctionFactoryOptions.AdditionalProperties hinzufügen.
Sie können auch alle Datenverweise als Teil des übergebenen AIFunctionFactory-Delegaten erfassen. Das heißt, Sie können alles einbinden, was Sie als Teil des AIFunction selbst referenzieren möchten.
Zugriff auf Daten in Funktionsdelegaten
Möglicherweise rufen Sie Ihr AIFunction direkt an, oder indirekt über FunctionInvokingChatClient. In den folgenden Abschnitten wird beschrieben, wie Sie mit beiden Ansätzen auf Argumentdaten zugreifen.
Manuelle Funktionsaufrufe
Wenn Sie eine AIFunction manuell durch den Aufruf von AIFunction.InvokeAsync(AIFunctionArguments, CancellationToken) aufrufen, übergeben Sie AIFunctionArguments. Der AIFunctionArguments Typ umfasst:
- Ein Wörterbuch mit benannten Argumenten.
-
Context: Eine beliebige
IDictionary<object, object>Möglichkeit zum Übergeben zusätzlicher Umgebungsdaten an die Funktion. -
Services: Ein IServiceProvider Objekt, mit dem der
AIFunctionbeliebige Zustand aus einem Di-Container (Abhängigkeitseinfügung) aufgelöst werden kann.
Wenn Sie entweder auf das AIFunctionArguments oder das IServiceProvider von innerhalb des AIFunctionFactory.Create-Delegaten zugreifen möchten, erstellen Sie einen Parameter, der als IServiceProvider oder AIFunctionArguments typisiert ist. Dieser Parameter wird an die relevanten Daten, die mit AIFunctionArguments übergeben wurden, in AIFunction.InvokeAsync() gebunden.
Der folgende Code zeigt ein Beispiel:
Delegate getWeatherDelegate = (AIFunctionArguments args) =>
{
// Access named parameters from the arguments dictionary.
string? location = args.TryGetValue("location", out object? loc) ? loc.ToString() : "Unknown";
string? units = args.TryGetValue("units", out object? u) ? u.ToString() : "celsius";
return $"Weather in {location}: 35°{units}";
};
// Create the AIFunction.
AIFunction getWeather = AIFunctionFactory.Create(getWeatherDelegate);
// Call the function manually.
var result = await getWeather.InvokeAsync(new AIFunctionArguments
{
{ "location", "Seattle" },
{ "units", "F" }
});
Console.WriteLine($"Function result: {result}");
CancellationToken ist auch spezialbehandelt: Wenn der AIFunctionFactory.Create Delegat oder Lambda über einen CancellationToken Parameter verfügt, wird er an das AIFunction.InvokeAsync() gebunden, das an CancellationToken übergeben wurde.
Aufruf durch FunctionInvokingChatClient
FunctionInvokingChatClient veröffentlicht den Status des aktuellen Aufrufs für FunctionInvokingChatClient.CurrentContext, einschließlich nicht nur der Argumente, sondern aller Eingabeobjekte ChatMessage , der ChatOptions, und Details darüber, welche Funktion aufgerufen wird (aus wie vielen). Sie können alle gewünschten Daten zu ChatOptions.AdditionalProperties hinzufügen und diese innerhalb Ihrer AIFunction aus FunctionInvokingChatClient.CurrentContext.Options.AdditionalProperties extrahieren.
Der folgende Code zeigt ein Beispiel:
FunctionInvokingChatClient client = new FunctionInvokingChatClient(
new AzureOpenAIClient(new Uri(endpoint), new AzureKeyCredential(apiKey))
.GetChatClient(model).AsIChatClient());
AIFunction getWeather = AIFunctionFactory.Create(() =>
{
// Access named parameters from the arguments dictionary.
AdditionalPropertiesDictionary props =
FunctionInvokingChatClient.CurrentContext.Options.AdditionalProperties;
string location = props["location"].ToString();
string units = props["units"].ToString();
return $"Weather in {location}: 35°{units}";
});
var chatOptions = new ChatOptions
{
Tools = [getWeather],
AdditionalProperties = new AdditionalPropertiesDictionary {
["location"] = "Seattle",
["units"] = "F"
},
};
List<ChatMessage> chatHistory = [
new(ChatRole.System, "You're a helpful weather assistant.")
];
chatHistory.Add(new ChatMessage(ChatRole.User, "What's the weather like?"));
ChatResponse response = await client.GetResponseAsync(chatHistory, chatOptions);
Console.WriteLine($"Response: {response.Text}");
Abhängigkeitsinjektion
Wenn Sie FunctionInvokingChatClient verwenden, um Funktionen automatisch aufzurufen, konfiguriert ein Client ein AIFunctionArguments Objekt, das in das AIFunction übergeben wird. Da AIFunctionArguments das IServiceProvider umfasst, das dem FunctionInvokingChatClient selbst zur Verfügung gestellt wurde, wird, wenn Sie Ihren Client mit standardmäßigen DI-Mitteln konstruieren, dieses IServiceProvider vollständig in Ihr AIFunction übergeben. Zu diesem Zeitpunkt können Sie es nach beliebigen Elementen aus DI abfragen.
Erweiterte Techniken
Wenn Sie eine genauere Kontrolle darüber wünschen, wie Parameter gebunden werden, können Sie verwenden AIFunctionFactoryOptions.ConfigureParameterBinding, wodurch Sie steuern können, wie die einzelnen Parameter aufgefüllt werden. Beispielsweise verwendet das MCP C#-SDK diese Technik , um Parameter automatisch von DI zu binden.
Wenn Sie die AIFunctionFactory.Create(MethodInfo, Func<AIFunctionArguments,Object>, AIFunctionFactoryOptions) Überladung verwenden, können Sie auch eine eigene beliebige Logik ausführen, wenn Sie das Zielobjekt erstellen, für das die Instanzmethode jedes Mal aufgerufen wird. Und Sie können alles tun, was Sie für diese Instanz konfigurieren möchten.