<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Microsoft Agent Framework/C#:了解Workflows的幾種不同模式

      前言

      最近有空的時候在學習Microsoft Agent Framework,在這個框架中目前Workflows分為了Sequential、Concurrent、Handoffs以及Groupchat四種模式,今天讓我們來了解一下這四種不同的模式。

      首先需要以下兩個包:

      Sequential 模式

      在開始介紹之前,先看下它的效果:

      首先需要先構建一個IChatClient:

       var apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY") ?? throw new InvalidOperationException("未設置環境變量:OPENAI_API_KEY");
       //var model = Environment.GetEnvironmentVariable("OPENAI_MODEL") ?? "gpt-4o-mini";
       var model = "moonshotai/Kimi-K2-Instruct-0905";
       var baseUrl = Environment.GetEnvironmentVariable("OPENAI_BASEURL") ?? throw new InvalidOperationException("未設置環境變量:OPENAI_BASEURL");
               
       ApiKeyCredential apiKeyCredential = new ApiKeyCredential(apiKey);
      
       OpenAIClientOptions openAIClientOptions = new OpenAIClientOptions();
       openAIClientOptions.Endpoint = new Uri(baseUrl);
      
       var client = new OpenAIClient(apiKeyCredential, openAIClientOptions).GetChatClient(model).AsIChatClient();
      

      現在通過這個函數方便構建不同的翻譯代理:

       /// <summary>為指定目標語言創建翻譯代理。</summary>
       private static ChatClientAgent GetTranslationAgent(string targetLanguage, IChatClient chatClient) =>
           new(chatClient,
               $"你是一個翻譯助手,只使用{targetLanguage}回應。對于任何輸入," +
               $"首先輸出輸入語言的名稱,然后將輸入翻譯成{targetLanguage}。");
      

      構建順序工作流:

        // 創建順序工作流
        var workflow = AgentWorkflowBuilder.BuildSequential(
            from lang in (string[])["French", "Spanish", "English"] 
            select GetTranslationAgent(lang, client)
        );
      

      參數就是一組AIAgent,然后工作流會將這些AIAgent按順序組合起來。

      運行這個工作流:

        List<ChatMessage> messages = [new(ChatRole.User, InputText)];
        await RunWorkflowAsync(workflow, messages);
        
        private async Task<List<ChatMessage>> RunWorkflowAsync(Workflow workflow, List<ChatMessage> messages)
      {
          string? lastExecutorId = null;
      
          await using StreamingRun run = await InProcessExecution.StreamAsync(workflow, messages);
          await run.TrySendMessageAsync(new TurnToken(emitEvents: true));
          await foreach (WorkflowEvent evt in run.WatchStreamAsync())
          {
              if (evt is AgentRunUpdateEvent e)
              {
                  if (e.ExecutorId != lastExecutorId)
                  {
                      OutputText += "\n";
                      lastExecutorId = e.ExecutorId;
      
                      OutputText += $"{e.ExecutorId}:\n";
                  }
      
                  OutputText += e.Update.Text;
                  if (e.Update.Contents.OfType<FunctionCallContent>().FirstOrDefault() is FunctionCallContent call)
                  {
                     OutputText += "\n";
                     OutputText += $"[調用函數 '{call.Name}',參數: {JsonSerializer.Serialize(call.Arguments)}]";
                  }
              }
              else if (evt is WorkflowOutputEvent output)
              {
                  OutputText += "\n\n工作流完成!";
                  return output.As<List<ChatMessage>>()!;
              }
          }
      
          return [];
      }
      

      與直覺不一樣的地方是只有在傳入TurnToken的時候才會開始運行:

      await run.TrySendMessageAsync(new TurnToken(emitEvents: true));
      

      然后通過WorkflowEvent來進行不同操作。

      這個例子看最后的輸入就是這樣的:

      Concurrent 模式

      還是先來看下效果:

      Concurrent就是并發工作流,對同一個輸入,不同的AI Agent同時響應。

      看一下怎么構建:

       // 創建并發工作流
       var workflow = AgentWorkflowBuilder.BuildConcurrent(
           from lang in (string[])["French", "Spanish", "English"] 
           select GetTranslationAgent(lang, client)
       );
      

      Handoffs 模式

      Handoffs就是交接模式,跟之前的不太一樣,首先我們先創建3個不同的AI Agent:

      // 創建專門的代理
      ChatClientAgent historyTutor = new(client,
          "你提供歷史查詢方面的幫助。清晰地解釋重要事件和背景。只回應歷史相關內容。",
          "history_tutor",
          "歷史問題的專業代理");
      
      ChatClientAgent mathTutor = new(client,
          "你提供數學問題方面的幫助。在每一步解釋你的推理過程并包含示例。只回應數學相關內容。",
          "math_tutor",
          "數學問題的專業代理");
      
      ChatClientAgent triageAgent = new(client,
          "你根據用戶的作業問題確定使用哪個代理。總是將任務交接給另一個代理。",
          "triage_agent",
          "將消息路由到適當的專業代理");
      

      看下如何構建:

       // 創建交接工作流
       var workflow = AgentWorkflowBuilder.CreateHandoffBuilderWith(triageAgent)
           .WithHandoffs(triageAgent, [mathTutor, historyTutor])
           .WithHandoffs([mathTutor, historyTutor], triageAgent)
           .Build();
      

      來看下效果:

      這次會到這個地方:

      內部有一個FunctionCall交接給了對應的代理。

      看一下最終的結果:

      再問一個數學相關的問題看看效果:

      看一下最終的結果:

      Groupchat 模式

      Groupchat模式就是開啟一個AI群聊,我拿辯論舉個例子。

       ChatClientAgent chatClientAgent1 = new(client, "你是辯論正方");
       ChatClientAgent chatClientAgent2 = new(client, "你是辯論反方");
       
        // 創建群聊工作流
       var workflow = AgentWorkflowBuilder.CreateGroupChatBuilderWith(agents => new RoundRobinGroupChatManager(agents) { MaximumIterationCount = 5 })
           .AddParticipants([chatClientAgent1, chatClientAgent2])
           .Build();
      

      效果:

      posted @ 2025-10-23 16:40  mingupupup  閱讀(293)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 一二三四中文字幕日韩乱码| 中文字幕理伦午夜福利片| 中文字幕日韩有码av| 久久青草国产精品一区| 亚洲精品自拍在线视频| 免费看国产曰批40分钟| 欧美熟妇xxxxx欧美老妇不卡| 野花社区在线观看视频| 国产av黄色一区二区三区| 男女激情一区二区三区| 色爱综合另类图片av| 国产乱码精品一区二三区| 色777狠狠狠综合| 麻豆文化传媒精品一区观看| 三人成全免费观看电视剧高清| 人妻换着玩又刺激又爽| 少妇粗大进出白浆嘿嘿视频| 精品国产中文字幕在线| 亚洲第一无码专区天堂| 精品国产线拍大陆久久尤物| 国产极品尤物粉嫩在线观看| 亚洲 a v无 码免 费 成 人 a v| AV教师一区高清| 午夜福利视频| 午夜福利在线观看6080| 99久久99久久久精品久久| 国产精品18久久久久久麻辣 | 亚洲高清国产拍精品5G| 这里只有精品在线播放 | 五月天免费中文字幕av| 《特殊的精油按摩》3| 真实国产乱子伦视频| 日韩国产欧美精品在线| 中文字幕网红自拍偷拍视频| 欧美和黑人xxxx猛交视频| 国日韩精品一区二区三区| 久久精品不卡一区二区| 丰满高跟丝袜老熟女久久| 亚洲成a人片在线观看中文 | 在线播放国产精品亚洲| 中文字幕亚洲男人的天堂|