Aracılarla Bağlamsal İşlev Seçimi

Önemli

Bu özellik deneysel aşamadadır. Bu aşamadaki özellikler etkin geliştirme aşamasındadır ve önizleme veya sürüm adayı aşamasına geçmeden önce önemli ölçüde değişebilir.

Genel Bakış

Bağlamsal İşlev Seçimi, Aracıların geçerli konuşma bağlamına göre yalnızca en ilgili işlevleri dinamik olarak seçmesine ve tanıtmalarına olanak tanıyan, AnlamSal Çekirdek Aracısı Çerçevesi'ndeki gelişmiş bir özelliktir. Bu özellik, kullanılabilir tüm işlevleri yapay zeka modeline göstermek yerine yalnızca kullanıcının isteğine en uygun işlevleri filtrelemek ve sunmak için Retrieval-Augmented Oluşturma (RAG) kullanır.

Bu yaklaşım, yapay zeka modellerinin uygun işlevi seçmekte zorlanabileceği ve karışıklığa ve yetersiz performansa yol açabileceği çok sayıda kullanılabilir işlevle ilgilenirken işlev seçiminin zorluğuna çözüm getirir.

Uyarı

Agent'i kullanırken ContextualFunctionProvider, UseImmutableKernel ayarı, aracıyı çağırırken çekirdeği kopyalama ihtiyacı nedeniyle true olarak ayarlanmalıdır. Not edin ki UseImmutableKernel'yi true olarak ayarlamak, aracı çağırma sırasında örneğin eklentiler tarafından yapılan çekirdek veri değişikliklerinin, çağrı tamamlandıktan sonra korunmaması anlamına gelir.

Bağlamsal İşlev Seçimi Nasıl Çalışır?

Bir ajan bağlamsal işlev seçimiyle yapılandırıldığında, bir vektör deposu ve gömme oluşturucu kullanarak geçerli konuşma bağlamını (önceki iletiler ve kullanıcı girişi dahil) mevcut işlevlerin açıklamaları ve adlarıyla anlamsal olarak eşleştirir. Belirtilen sınıra kadar en uygun işlevler çağrı için yapay zeka modeline tanıtılır.

Bu mekanizma özellikle geniş bir eklenti veya araç kümesine erişimi olan aracılar için kullanışlıdır ve her adımda yalnızca bağlamsal olarak uygun eylemlerin dikkate alınmasını sağlar.

Kullanım Örneği

Aşağıdaki örnekte, bir aracının bağlamsal işlev seçimini kullanacak şekilde nasıl yapılandırılacağı gösterilmektedir. Aracı, müşteri incelemelerini özetlemek üzere ayarlanmıştır, ancak her çağrı için yapay zeka modeline yalnızca en ilgili işlevler tanıtılır. yöntemi, GetAvailableFunctions bağlamsal seçimin avantajlarını vurgulamak için kasıtlı olarak hem ilgili hem de ilgisiz işlevleri içerir.

// Create an embedding generator for function vectorization
var embeddingGenerator = new AzureOpenAIClient(new Uri("<endpoint>"), new ApiKeyCredential("<api-key>"))
    .GetEmbeddingClient("<deployment-name>")
    .AsIEmbeddingGenerator();

// Create kernel and register AzureOpenAI chat completion service
var kernel = Kernel.CreateBuilder()
    .AddAzureOpenAIChatCompletion("<deployment-name>", "<endpoint>", "<api-key>");
    .Build();

// Create a chat completion agent
ChatCompletionAgent agent = new()
{
    Name = "ReviewGuru",
    Instructions = "You are a friendly assistant that summarizes key points and sentiments from customer reviews. For each response, list available functions.",
    Kernel = kernel,
    Arguments = new(new PromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(options: new FunctionChoiceBehaviorOptions { RetainArgumentTypes = true }) }),
    // This setting must be set to true when using the ContextualFunctionProvider
    UseImmutableKernel = true
};

// Create the agent thread and register the contextual function provider
ChatHistoryAgentThread agentThread = new();

agentThread.AIContextProviders.Add(
    new ContextualFunctionProvider(
        vectorStore: new InMemoryVectorStore(new InMemoryVectorStoreOptions() { EmbeddingGenerator = embeddingGenerator }),
        vectorDimensions: 1536,
        functions: AvailableFunctions(),
        maxNumberOfFunctions: 3, // Only the top 3 relevant functions are advertised
        loggerFactory: LoggerFactory
    )
);


// Invoke the agent
ChatMessageContent message = await agent.InvokeAsync("Get and summarize customer review.", agentThread).FirstAsync();
Console.WriteLine(message.Content);

// Output
/*
    Customer Reviews:
    -----------------
    1. John D. - ★★★★★
       Comment: Great product and fast shipping!
       Date: 2023-10-01

    Summary:
    --------
    The reviews indicate high customer satisfaction,
    highlighting product quality and shipping speed.

    Available functions:
    --------------------
    - Tools-GetCustomerReviews
    - Tools-Summarize
    - Tools-CollectSentiments
*/

IReadOnlyList<AIFunction> GetAvailableFunctions()
{
    // Only a few functions are directly related to the prompt; the majority are unrelated to demonstrate the benefits of contextual filtering.
    return new List<AIFunction>
    {
        // Relevant functions
        AIFunctionFactory.Create(() => "[ { 'reviewer': 'John D.', 'date': '2023-10-01', 'rating': 5, 'comment': 'Great product and fast shipping!' } ]", "GetCustomerReviews"),
        AIFunctionFactory.Create((string text) => "Summary generated based on input data: key points include customer satisfaction.", "Summarize"),
        AIFunctionFactory.Create((string text) => "The collected sentiment is mostly positive.", "CollectSentiments"),

        // Irrelevant functions
        AIFunctionFactory.Create(() => "Current weather is sunny.", "GetWeather"),
        AIFunctionFactory.Create(() => "Email sent.", "SendEmail"),
        AIFunctionFactory.Create(() => "The current stock price is $123.45.", "GetStockPrice"),
        AIFunctionFactory.Create(() => "The time is 12:00 PM.", "GetCurrentTime")
    };
}

Vektör Deposu

Sağlayıcı öncelikle basitlik sunan bellek içi vektör depolarıyla çalışacak şekilde tasarlanmıştır. Ancak, diğer vektör deposu türleri kullanılıyorsa, veri eşitleme ve tutarlılığı işleme sorumluluğunun barındırma uygulamasına ait olduğunu unutmayın.

İşlev listesi her değiştiğinde veya işlev eklemelerinin kaynağı değiştirildiğinde eşitleme gereklidir. Örneğin, bir aracı başlangıçta vektörleştirilmiş ve bir bulut vektör deposunda depolanan üç işleve (f1, f2, f3) sahipse ve daha sonra f3 aracının işlev listesinden kaldırılırsa, vektör deposu yalnızca aracının sahip olduğu geçerli işlevleri (f1 ve f2) yansıtacak şekilde güncelleştirilmelidir. Vektör deposunun güncelleştirilememesi, ilgisiz işlevlerin sonuç olarak döndürülmesine neden olabilir. Benzer şekilde, işlev adları, açıklamalar vb. vektörleştirme için kullanılan veriler değişirse, vektör deposu temizlenmeli ve güncelleştirilmiş bilgilere göre yeni eklemelerle yeniden doldurulmalıdır.

Dış veya dağıtılmış vektör depolarında veri eşitlemeyi yönetmek karmaşık olabilir ve özellikle farklı hizmetlerin veya örneklerin bağımsız olarak çalışabileceği ve aynı verilere tutarlı erişim gerektirebileceği dağıtılmış uygulamalarda hatalara eğilimli olabilir. Buna karşılık, bellek içi depo kullanmak bu işlemi basitleştirir: işlev listesi veya vektörleştirme kaynağı değiştiğinde, bellek içi depo yeni işlev kümesi ve bunların eklemeleri ile kolayca yeniden oluşturulabilir ve minimum çabayla tutarlılık sağlar.

İşlevleri Belirtme

Bağlamsal işlev sağlayıcısı, geçerli bağlama göre en uygun işlevleri seçebileceği bir işlev listesi ile sağlanmalıdır. Bu, functions oluşturucusunun ContextualFunctionProvider parametresine bir işlev listesi sağlayarak gerçekleştirilir.

İşlevlere ek olarak, parametresini kullanarak maxNumberOfFunctions döndürülecek en fazla ilgili işlev sayısını da belirtmeniz gerekir. Bu parametre, geçerli bağlam için en uygun işlevleri seçerken sağlayıcının kaç işlevi dikkate alacağını belirler. Belirtilen numaranın kesin olması amaçlanmamıştır; bunun yerine, belirli bir senaryoya bağlı olan bir üst sınır görevi görür.

Bu değerin çok düşük ayarlanması, aracının bir senaryo için gerekli tüm işlevlere erişmesini engelleyebilir ve bu da senaryo hatasına yol açabilir. Buna karşılık, çok yüksek ayarlamak aracıyı çok fazla işlevle bunaltabilir ve bu da halüsinasyonlara, aşırı giriş belirteci tüketimine ve en iyi olmayan performansa neden olabilir.

// Create the provider with a list of functions and a maximum number of functions to return
ContextualFunctionProvider provider = new (
    vectorStore: new InMemoryVectorStore(new InMemoryVectorStoreOptions { EmbeddingGenerator = embeddingGenerator }),
    vectorDimensions: 1536,
    functions: [AIFunctionFactory.Create((string text) => $"Echo: {text}", "Echo"), <other functions>]
    maxNumberOfFunctions: 3 // Only the top 3 relevant functions are advertised
);

Bağlamsal İşlev Sağlayıcısı Seçenekleri

Sağlayıcı sınıfı kullanılarak yapılandırılabilir ve bu sayede sağlayıcının ContextualFunctionProviderOptions çalışma biçiminin çeşitli yönlerini özelleştirebilirsiniz:

// Create options for the contextual function provider
ContextualFunctionProviderOptions options = new ()
{
    ...
};

// Create the provider with options
ContextualFunctionProvider provider = new (
    ...
    options: options // Pass the options
);

Bağlam Boyutu

Bağlam boyutu, yeni bir çağırmanın bağlamını oluştururken önceki aracı çağrılarından gelen en son iletilerin sayısını belirler. Sağlayıcı, önceki çağrılardan belirtilen numaraya kadar tüm iletileri toplar ve bağlamı oluşturmak için bunları yeni iletilere ekler.

Son iletileri yeni iletilerle birlikte kullanmak, konuşmadaki önceki adımlardan bilgi gerektiren görevler için özellikle yararlıdır. Örneğin, bir aracı bir kaynağı tek bir çağrıda sağlar ve sonraki adımda dağıtırsa, dağıtım adımı dağıtım için sağlanan kaynak bilgilerini almak üzere sağlama adımından ayrıntılara erişebilir.

Bağlamdaki son iletilerin sayısı için varsayılan değer 2'dir, ancak NumberOfRecentMessagesInContext özelliği ContextualFunctionProviderOptions içinde belirtilerek bu ayar gerektiğinde yapılandırılabilir.

ContextualFunctionProviderOptions options = new ()
{
    NumberOfRecentMessagesInContext = 1 // Only the last message will be included in the context
};

Bağlam Gömme Kaynak Değeri

Bağlamsal işlev seçimi gerçekleştirmek için sağlayıcının vektör deposundaki kullanılabilir işlevlerle karşılaştırılabilmesi için geçerli bağlamı vektörleştirmesi gerekir. Varsayılan olarak sağlayıcı, boş olmayan son ve yeni iletileri tek bir dizede birleştirerek bu bağlam ekleme işlemini oluşturur. Bu dize vektörleştirilir ve ilgili işlevleri aramak için kullanılır.

Bazı senaryolarda, bu davranışı şu şekilde özelleştirmek isteyebilirsiniz:

  • Belirli ileti türlerine (örneğin, yalnızca kullanıcı iletileri) odaklanın
  • Belirli bilgileri bağlam dışında tutma
  • Vektörleştirmeden önce bağlamı ön işlemden geçir veya özetle (örn. istemi yeniden yazarak)

Bunu yapmak için ContextEmbeddingValueProvider öğesine özel bir temsilciyi atayabilirsiniz. Bu temsilci son ve yeni iletileri alır ve bağlam ekleme için kaynak olarak kullanılacak bir dize değeri döndürür:

ContextualFunctionProviderOptions options = new()
{
    ContextEmbeddingValueProvider = async (recentMessages, newMessages, cancellationToken) =>
    {
        // Example: Only include user messages in the embedding
        var allUserMessages = recentMessages.Concat(newMessages)
            .Where(m => m.Role == "user")
            .Select(m => m.Content)
            .Where(content => !string.IsNullOrWhiteSpace(content));
        return string.Join("\n", allUserMessages);
    }
};

Bağlam eklemenin özelleştirilmesi, özellikle karmaşık veya son derece özelleştirilmiş aracı senaryolarında işlev seçiminin ilgi düzeyini artırabilir.

İşlev Ekleme Kaynak Değeri

Sağlayıcının bağlamla karşılaştırmak ve en uygun işlevleri seçmek için kullanılabilir her işlevi vektörleştirmesi gerekir. Varsayılan olarak sağlayıcı, işlevin adını ve açıklamasını vektörleştirilip vektör deposunda depolanan tek bir dizede birleştirerek bir işlev ekleme işlemi oluşturur.

EmbeddingValueProvider özelliğini ContextualFunctionProviderOptions kullanarak bu davranışı özelleştirebilirsiniz. Bu özellik, işlevi ve iptal belirtecini alan bir geri çağırma belirtmenize olanak tanır ve işlev ekleme için kaynak olarak kullanılacak bir dize döndürür. Bu, aşağıdakiler için kullanışlıdır:

  • Ekleme kaynağına ek işlev meta verileri ekleme
  • Vektörleştirmeden önce işlev bilgilerini ön işleme, filtreleme veya yeniden biçimlendirme
ContextualFunctionProviderOptions options = new()
{
    EmbeddingValueProvider = async (function, cancellationToken) =>
    {
        // Example: Use only the function name for embedding
        return function.Name;
    }
};

İşlev ekleme kaynak değerinin özelleştirilmesi, özellikle işlevlerinizin zengin, bağlamla ilgili meta verileri olduğunda veya aramayı her işlevin belirli yönlerine odaklamak istediğinizde işlev seçiminin doğruluğunu artırabilir.

Sonraki Adımlar

Bağlamsal işlev seçimi örneklerini keşfetme

Çok Yakında

Daha fazla bilgi yakında sunulacaktır.

Çok Yakında

Daha fazla bilgi yakında sunulacaktır.