Delen via


Toegang tot gegevens in AI-functies

Wanneer u AI-functies maakt, moet u mogelijk toegang krijgen tot contextuele gegevens buiten de parameters van het AI-model. De Microsoft.Extensions.AI bibliotheek biedt verschillende mechanismen om gegevens door te geven aan functiedelegeringen.

AIFunction klas

Het AIFunction type vertegenwoordigt een functie die kan worden beschreven in een AI-service en wordt aangeroepen. U kunt AIFunction objecten maken door een van de AIFunctionFactory.Create overloads aan te roepen. Maar AIFunction is ook een basisklasse en u kunt ermee afleiden en uw eigen AI-functietype implementeren. DelegatingAIFunction biedt een eenvoudige manier om een bestaande AIFunction uit te breiden met extra functionaliteit, waaronder het vastleggen van extra gegevens die moeten worden gebruikt.

Gegevens doorgeven

U kunt gegevens koppelen aan de functie op het moment dat deze worden gemaakt, hetzij via sluiting of via AdditionalProperties. Als u uw eigen functie maakt, kunt u deze op de gewenste wijze vullen AdditionalProperties . Als u de functie maakt AIFunctionFactory , kunt u gegevens vullen met behulp van AIFunctionFactoryOptions.AdditionalProperties.

U kunt ook verwijzingen naar gegevens registreren als onderdeel van de gedelegeerde functie die aan AIFunctionFactory is verstrekt. Dat wil zeggen, je kunt inbouwen wat je wilt refereren als onderdeel van AIFunction zelf.

Toegang tot gegevens in functie-delegaten

U kunt uw AIFunction rechtstreeks bellen, of indirect aanroepen met behulp van FunctionInvokingChatClient. In de volgende secties wordt beschreven hoe u toegang krijgen tot argumentgegevens met behulp van een van beide benaderingen.

Handmatige aanroep van functie

Als u een AIFunction handmatig aanroept door het bellen van AIFunction.InvokeAsync(AIFunctionArguments, CancellationToken), geeft u AIFunctionArguments mee. Het AIFunctionArguments type omvat:

Als u toegang wilt krijgen tot de AIFunctionArguments of de IServiceProvider in uw AIFunctionFactory.Create delegate, kunt u een parameter maken die is getypt als IServiceProvider of AIFunctionArguments. Deze parameter wordt gebonden aan de relevante gegevens van de AIFunctionArguments doorgegeven aan AIFunction.InvokeAsync().

De volgende code toont een voorbeeld:

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 is ook bijzonder: als de AIFunctionFactory.Create gedelegeerde of lambda een CancellationToken parameter bevat, zal deze worden gebonden aan de CancellationToken die doorgegeven is aan AIFunction.InvokeAsync().

Aanroepen via FunctionInvokingChatClient

FunctionInvokingChatClient publiceert de status over de huidige aanroep naar FunctionInvokingChatClient.CurrentContext, inclusief niet alleen de argumenten, maar alle invoerobjecten ChatMessage , de ChatOptionsen details over welke functie wordt aangeroepen (van het aantal). U kunt alle gegevens die u wilt toevoegen aan ChatOptions.AdditionalProperties en ze binnen uw AIFunction extraheren uit FunctionInvokingChatClient.CurrentContext.Options.AdditionalProperties.

De volgende code toont een voorbeeld:

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}");

Afhankelijkheidsinjectie

Als u functies automatisch oproept met FunctionInvokingChatClient, configureert die client een AIFunctionArguments object dat aan de AIFunction wordt doorgegeven. Omdat AIFunctionArguments de IServiceProvider omvat die aan de FunctionInvokingChatClient zelf geleverd is, wordt, wanneer u uw client bouwt met behulp van standaard DI-middelen, dat IServiceProvider helemaal doorgegeven aan uw AIFunction. Op dat moment kunt u deze opvragen voor alles wat u wilt van DI.

Geavanceerde technieken

Als u meer fijnmazige controle wilt over hoe parameters afhankelijk zijn, kunt u gebruiken AIFunctionFactoryOptions.ConfigureParameterBinding, waardoor u de controle hebt over hoe elke parameter wordt gevuld. De MCP C#-SDK gebruikt deze techniek bijvoorbeeld om parameters van DI automatisch te binden.

Als u de AIFunctionFactory.Create(MethodInfo, Func<AIFunctionArguments,Object>, AIFunctionFactoryOptions) overbelasting gebruikt, kunt u ook uw eigen willekeurige logica uitvoeren wanneer u het doelobject maakt waarop de instantiemethode telkens wordt aangeroepen. En u kunt doen wat u wilt configureren voor dat exemplaar.