狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C# AIModelRouter:使用不同的AI模型完成不同的任務

freeflydom
2025年1月9日 9:34 本文熱度 58

AIModelRouter

AI模型路由,模型的能力有大小之分,有些簡單任務,能力小一點的模型也能很好地完成,而有些比較難的或者希望模型做得更好的,則可以選擇能力強的模型。為什么要這樣做呢?可以降低AI模型的使用成本,畢竟能力強的模型會更貴一點,省著用挺好的。

Semantic Kernel中可以很簡便地使用一個AIModelRouter。

實踐

先來一個簡單的例子

來自https://github.com/microsoft/semantic-kernel/tree/main/dotnet/samples/Demos/AIModelRouter

新建一個CustomRouter類,如下所示:

internal sealed class CustomRouter()
{
    internal string GetService(string lookupPrompt, List<string> serviceIds)
    {
        // The order matters, if the keyword is not found, the first one is used.
        foreach (var serviceId in serviceIds)
        {
            if (Contains(lookupPrompt, serviceId))
            {
                return serviceId;
            }
        }
        return serviceIds[0];
    }
    // Ensure compatibility with both netstandard2.0 and net8.0 by using IndexOf instead of Contains
    private static bool Contains(string prompt, string pattern)
        => prompt.IndexOf(pattern, StringComparison.CurrentCultureIgnoreCase) >= 0;
}

新建一個SelectedServiceFilter類用于打印一些信息:

 internal sealed class SelectedServiceFilter : IPromptRenderFilter
 {
     /// <inheritdoc/>
     public Task OnPromptRenderAsync(PromptRenderContext context, Func<PromptRenderContext, Task> next)
     {
         Console.ForegroundColor = ConsoleColor.Yellow;
         Console.WriteLine($"Selected service id: '{context.Arguments.ExecutionSettings?.FirstOrDefault().Key}'");
         Console.ForegroundColor = ConsoleColor.White;
         Console.Write("Assistant > ");
         return next(context);
     }
 }

使用多個模型:

為捕獲路由器選擇的服務 ID 添加自定義過濾器:

開啟一個聊天循環:

        Console.ForegroundColor = ConsoleColor.White;
        ChatHistory history = [];
        string history1 = string.Empty;
        bool isComplete = false;
        do
        {
            Console.WriteLine();
            Console.Write("> ");
            string? input = Console.ReadLine();
            if (string.IsNullOrWhiteSpace(input))
            {
                continue;
            }
            if (input.Trim().Equals("EXIT", StringComparison.OrdinalIgnoreCase))
            {
                isComplete = true;
                break;
            }
            if (input.Trim().Equals("Clear", StringComparison.OrdinalIgnoreCase))
            {
                history.Clear();
                history1 = " ";
                Console.WriteLine("已清除聊天記錄");
                continue;
            }
            history.Add(new ChatMessageContent(AuthorRole.User, input));
            history1 += $"User:{input}\n";
            Console.WriteLine();
            // Find the best service to use based on the user's input
            KernelArguments arguments = new(new PromptExecutionSettings()
            {
                ServiceId = router.GetService(input, serviceIds).Result,
                FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
            });
            // Invoke the prompt and print the response
            //await foreach (var chatChunk in kernel.InvokePromptStreamingAsync(userMessage, arguments).ConfigureAwait(false))
            //{
            //    Console.Write(chatChunk);
            //}
           
            var result = await kernel.InvokePromptAsync(history1, arguments).ConfigureAwait(false);
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine(result);
            Console.WriteLine();
            // Add the message from the agent to the chat history
            history.AddMessage(AuthorRole.Assistant, result.ToString());
            history1 += $"Assistant:{result}\n";
        } while (!isComplete);
    }
}

來看看現在這個簡單的路由規則:

當你的提問中包含一個ServiceId的時候,就會選擇那個服務ID對應的模型進行回復,如果不包含就選擇第一個服務ID對應的模型進行回復。

實際上這樣使用,很容易讓AI迷惑,因為我們總是要帶上一個ServiceId,如果讓AI根據用戶的提問,自己決定用哪個模型是更好的。

進階使用,用AI自己來決定

使用一個靠譜的AI模型來做這個事情比較好。

我們輸入你好,那么Prompt就會變成這樣:

AI返回的結果如下:

再試試其他幾個怎么觸發:

而工具調用與其他比較容易混淆,因為就算是我們自己,也很難分辨有什么區別:

這時候或許修改Prompt可以奏效。

修改后的Prompt如下:

 string skPrompt = """
          根據用戶的輸入,返回最佳服務ID。
          如果用戶需要獲取當前時間與寫郵件,則選擇工具調用相關的服務ID。
          用戶輸入:
          {{$input}}
          服務ID列表:
          {{$serviceIds}}
          無需返回任何其他內容,只需返回服務ID。              
     """;

效果如下所示:

以上就是本次分享的全部內容,希望對你有所幫助。

?轉自https://www.cnblogs.com/mingupupu/p/18654982


該文章在 2025/1/9 9:34:20 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved