分享

SemainticKernel之代理Agent

 黄爸爸好 2024-04-16 发布于上海

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 SKEXP0101var 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之间,因为有几个来回的调度,一般比较慢一些,具体结果如下:

图片

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多