SemainticKernel之代理Agent

  LLM下的Agent代表着一个“智能体”角色,或是大领域全才,或是细分领导专才。成为一个代理后的最大好处是可以让Agent作为代表,与其他的Agent进行交互,直到达到想要的结果。

  下面是一个高级程序员和架构师两个架构作为代理的案例,高级程序员写完程序后,架构师来Review,针对性地提出修改意见。如果结果满意,则放行通过。

  引入nuget包:

  <ItemGroup>
    <PackageReference Include="Microsoft.SemanticKernel" Version="1.7.1" />
    <PackageReference Include="Microsoft.SemanticKernel.Experimental.Agents" Version="1.7.1-alpha" />
  </ItemGroup>

  具体代码如下:

复制代码
using Microsoft.SemanticKernel.Experimental.Agents;

#pragma warning disable SKEXP0101
var key = File.ReadAllText(@"C:\GPT\key.txt");
var chatModelId = "gpt-4-0125-preview";
var s_agents = new List<IAgent>();
Console.WriteLine("======== 开始协作 ========");
IAgentThread? thread = null;
try
{
    // 创建文案代理来产生想法
    var copyWriter = await CreateCopyWriterAsync();
    // 创建艺术总监代理来审查想法、提供反馈和最终批准
    var artDirector = await CreateArtDirectorAsync();

    // 创建协作线程,两个代理都向其中添加消息。
    thread = await copyWriter.NewThreadAsync();

    // 添加用户留言
    var messageUser = await thread.AddUserMessageAsync("功能模块:完成一个用户登录的C#代码。数据库用的是MySql,OEM用的是Dapper。");
    DisplayMessage(messageUser);
    var times = 1;
    bool isComplete = false;
    do
    {
        times++;
        // 启动高程工作
        var agentMessages = await thread.InvokeAsync(copyWriter).ToArrayAsync();
        DisplayMessages(agentMessages, copyWriter, ConsoleColor.Green);

        // 启动架构工作
        agentMessages = await thread.InvokeAsync(artDirector).ToArrayAsync();
        DisplayMessages(agentMessages, artDirector, ConsoleColor.Yellow);

        // 评估是否达到目标。
        if (agentMessages.First().Content.Contains("采用它", StringComparison.OrdinalIgnoreCase))
        {
            isComplete = true;
        }
        if (times > 3)
        {
            isComplete = true;
        }
    }
    while (!isComplete);
}
finally
{
    // 清理
    await Task.WhenAll(s_agents.Select(a => a.DeleteAsync()));
}

async Task<IAgent> CreateCopyWriterAsync()
{
    return
        Track(
            await new AgentBuilder()
                .WithOpenAIChatCompletion(chatModelId, key)
                .WithInstructions("您是一位C#高级程序员(Architect),以严谨闻名。你全神贯注于手头的目标。生成高质量,且完养的代码。完善想法时考虑架构师的建议。")
                .WithName("高级程序员")
                .WithDescription("高级程序员")
                .BuildAsync());
}

async Task<IAgent> CreateArtDirectorAsync()
{
    return
        Track(
            await new AgentBuilder()
                .WithOpenAIChatCompletion(chatModelId, key)
                .WithInstructions("你是一位C#经验丰富的架构师(Architect),对代码质量有较高要求,对命名规则有严格要求。目标是确定给定的代码是否符合要求,是否采用。如果不符合要求,提出你的建议给对方,但不要把具体代码的实现给对方。始终在开头重复建议。如果代码可以接受并且符合您的标准,请说:采用它。")
                .WithName("架构师")
                .WithDescription("架构师")
                .BuildAsync());
}

void DisplayMessages(IEnumerable<IChatMessage> messages, IAgent? agent = null, ConsoleColor color = ConsoleColor.White)
{
    foreach (var message in messages)
    {
        DisplayMessage(message, agent, color);
    }
}

void DisplayMessage(IChatMessage message, IAgent? agent = null, ConsoleColor color = ConsoleColor.White)
{
    Console.ResetColor();
    Console.ForegroundColor = color;
    Console.WriteLine($"[{message.Id}]");
    if (agent != null)
    {
        Console.WriteLine($"# {message.Role}: ({agent.Name}) {message.Content}");
    }
    else
    {
        Console.WriteLine($"# {message.Role}: {message.Content}");
    }
    Console.ResetColor();
}

IAgent Track(IAgent agent)
{
    s_agents.Add(agent);
    return agent;
}
复制代码

  Agent之间,因为有几个来回的调度,一般比较慢一些,具体结果如下:

  文章来源微信公众号

  想要更快更方便的了解相关知识,可以关注微信公众号 

posted @   刘靖凯  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2019-02-27 WHERE 子句操作符
2019-02-27 不同的数据库查询行数的方式
点击右上角即可分享
微信分享提示