使用AgentThread实现同一Agent的多轮回话
目录一、简化多轮对话二、代码示例三、从示例可以学到什么四、结语微软开源的agent-framework 以简洁方式帮助构建具备多轮对话能力的智能 Agent。我们一如既往的沿用上一节中我们的基础配置。如果你没有看上一节请转到上一节使用 Microsoft Agent Framework 构建你的第一个 Agent 应用一、简化多轮对话创建带上下文记忆的 Agent利用微软 agent-framework结合 Azure OpenAI 服务创建了一个能够记忆对话上下文的智能 Agent。每次回复都基于上一次的内容真正实现“多轮对话”让 Agent 能够理解和跟进用户的上下文需求。自定义 Agent 个性与功能代码中通过 instructions角色设定给 Agent 加入了个性“你擅长讲笑话”让 AI 每次回答都能契合这个人设体验丝滑的定制化智能服务。多轮对话与上下文 Thread利用AgentThread对象维护对话上下文将每轮交互加入 thread实现连续多轮交谈比如先让 AI 讲一个海盗笑话再要求加入表情并模仿鹦鹉风格AI 都能准确响应。流式输出体验示例还展示了多轮对话的流式输出方式Streaming更适合输出长文本或逐步构建回复让用户实时看到生成过程带来更好的交互体验。二、代码示例创建一个 Console 应用项目并添加以下 NuGet 包dotnet add package Azure.AI.OpenAI dotnet add package Microsoft.Agents.AI.OpenAI dotnet add package Microsoft.Extensions.AI.OpenAI dotnet add package Azure.Identity// Copyright (c) Microsoft. All rights reserved. // This sample shows how to create and use a simple AI agent with a multi-turn conversation. using Azure.AI.OpenAI; using Azure.Identity; using Microsoft.Agents.AI; using OpenAI; using System.Text; Console.InputEncoding Encoding.UTF8; Console.OutputEncoding new UTF8Encoding(encoderShouldEmitUTF8Identifier: false); var endpoint Environment.GetEnvironmentVariable(AZURE_OPENAI_ENDPOINT) ?? thrownew InvalidOperationException(AZURE_OPENAI_ENDPOINT is not set.); var deploymentName Environment.GetEnvironmentVariable(AZURE_OPENAI_DEPLOYMENT_NAME) ?? gpt-4o-mini; AIAgent agent new AzureOpenAIClient( new Uri(endpoint), new AzureCliCredential()) .GetChatClient(deploymentName) .CreateAIAgent(instructions: 你是一位江湖说书人擅长用幽默、接地气的方式讲笑话和故事。, name: Joker); AgentThread thread agent.GetNewThread(); Console.WriteLine(await agent.RunAsync(给我讲一个发生在茶馆里的段子轻松一点的那种。, thread)); Console.WriteLine(await agent.RunAsync(现在把这个段子加上一些表情符号并用说书人的语气再讲一遍。, thread)); // Invoke the agent with a multi-turn conversation and streaming, where the context is preserved in the thread object. thread agent.GetNewThread(); Console.WriteLine(await agent.RunAsync(再讲一个关于江湖侠客的小笑话要幽默一点。, thread)); Console.WriteLine(await agent.RunAsync(给这个江湖侠客的小笑话加些表情符号再添加点夸张的江湖腔。, thread)); //await foreach (var update in agent(再讲一个关于江湖侠客的小笑话要幽默一点。, thread)) //{ // Console.WriteLine(update); //} //await foreach (var update in agent.RunStreamingAsync(给这个江湖侠客的小笑话加些表情符号再添加点夸张的江湖腔。, thread)) //{ // Console.WriteLine(update); //}话说啊这江湖上最大的事儿归根结底就是两件儿——喝茶和扯皮。要说这茶馆儿嘿那可是江湖的大本营高手云集故事多得能绕八个城墙。 有一天啊青城派的老张头、武当派的小王还有一个闲云野鹤的卖糖葫芦的老葛头仨人凑一起喝茶。老张头拍着桌子就吹牛“我们青城派啊那可是讲究内功这内功练好了能隔空点火炉子都不用带自备火锅随时吃” 小王一听不服气“屁啊我武当派练的是太极能借力打力你别说火锅你那锅里的肉片落下去我就能用一根筷子给它弹回来刀工都不用练直接薄成比翅” 卖糖葫芦的老葛头在边上听了半天嗞溜一口茶悠悠地来一句“别吹了你们这功夫学得再好还不是得请我贴糖葫芦搁锅里热一热” 俩人被怼得哑口无言但是为了面子觉得不能输老张头愤怒地把茶碗一放“伙计来壶茶” 伙计过来壶手一抖茶水全洒了。小王瞪眼就骂“怎么回事这武功不行啊” 伙计搓搓手叹气道“不好意思啊一听你们聊功夫吓的怕我这洒水派入不了流啊。” 全场顿时哄堂大笑这就是江湖嘛吹牛为主动手为辅嗓门最大才是真高手 好嘞客官您稍坐听我慢慢道来 咱说这江湖啊那不外乎两件事儿**喝茶扯皮**这茶馆喽嘿那可是不打眼的地方却是江湖大侠的聚集地高手云集热闹得跟过年似的 有一日青城派的老张头、武当派的小王再加上一位闲云野鹤的——呃干啥的卖糖葫芦的老葛头仨人凑一桌边喝茶边吹牛。 老张头一拍桌子差点把壶震翻了张嘴就来“我们青城派的内功那叫一个绝 隔空点火了解一下炉子都不用带随随便便自己点火——呲啦一声吃火锅直接开干” 小王一听这话哪能忍得住站起身来了个武当派的手势“你这算啥我们武当可是真正借力打力的巅峰✨ 那肉片儿往锅里一掉我一根筷子就能直接把它给弹回锅沿上刀工还能用脚趾写个‘服’字呢” 这时候旁边的卖糖葫芦的老葛很冷静吃着自己的糖葫芦喝了一口茶悠悠地搭了句“嘁你们这两派吵啥呢再有功夫不还是得买我糖葫芦给肉片糖一糖蘸点甜味儿才香” 哎哟这话一出老张头和小王直接当场哑火了但又觉得输了面子不爽正要再怼回去这时——伙计端茶过来了 结果呢不知伙计是太激动还是这茶壶里有暗劲儿您猜怎么着那茶壶一抖茶水全洒了‍♂️ 小王瞪圆眼睛就开骂“哎你个茶水工没练过轻功啊洒一桌你这是武功不行呗” 那伙计搓搓手低头一脸无奈“哎二位大侠别怪啊……小的我啊这不怕了吗 看您几个聊功夫怕露馅儿咱这**洒水派**估计……入不了流吧” ‍♂️ 哎呀全场居然噗的一声全乐了哈哈哈哈 不愧是江湖这高手过招“吹牛为主动手为辅”嗓门最大才是天下第一啊 好嘞听好了这可是我的绝活—— 话说明月楼上有一位大侠名叫李不凡轻功了得刀法通神那可真是人敬鬼怕。但他有个毛病天生路痴这件事在江湖上人尽皆知。 有一天一个小镇闹山贼于是乡亲们赶紧托人去请李不凡来帮忙。李大侠听了二话不说一扬手豪情万丈“放心小事一桩先给我准备庆功酒我半个时辰内就赶到” 结果半个时辰过去了大侠没到一个时辰过去了还没到直到天黑了乡亲们一边喝着庆功酒一边还没见人影。 第二天大中午李不凡终于风尘仆仆地翻墙而入气喘吁吁地喊“山贼呢快带我去剿” 乡亲们一头雾水“李大侠那山贼昨天就被隔壁镇另一位大侠打跑了您怎么才到啊” 李不凡脸一红尬笑道“这……我这不练轻功绕着走的吗结果不小心跑了三圈又走岔到你们隔壁镇去了” 乡亲们忍不住扶额而隔壁镇送信的伙计在一边弱弱地说“嘿我说的嘛昨天怎么看到您飞檐走壁跟那山贼擦肩而过当时还以为您是故意放他们一马呢” 这下李不凡不好意思地挠了挠头只能感慨“哎江湖路远真是路痴的万丈深渊啊” 怎么样是不是觉着连大侠都有难解的“江湖忧”别笑岔气了 哈哈好嘞那我再来给这个笑话加点江湖味儿还送表情符号一波全场注意笑点 --- 话说呀江湖响当当的大侠、轻功飞天的刀王——李不凡️今天又被乡亲们请下山啦这位李大侠刀起刀落如秋风扫落叶动作潇洒犹如仙人踏云看上去简直无敌但偏偏有一桩“盖世烦恼”——天生认路不过关‍活生生就是活地图里的漏网之鱼。 事情是这样的 这一天镇上闹山贼了⚔️乡亲们鸡飞狗跳村长慌忙跪求“李大侠啊高抬贵脚救救我们吧山贼要劫咱米缸啦” 李不凡听了豪气冲天拍拍刀鞘大喊“小事小事刀在手无敌是最寂寞乡亲们看着吧——我半个时辰内到先备庆功酒” 然而啊半个时辰过去了人呢一个时辰过去了那人……还是没来。他们等到天都黑了只好喝着庆功酒边喝边等。 到了第二天的晌午李不凡才突然从院墙上翻进来衣服还沾着草叶脸皮厚得像猪头气喘吁吁地喊“山贼呢快快带我剿了‍♂️” 乡亲们愣住了“李大侠情况报告一下那山贼昨天就被隔壁镇的刀王剿跑了……您咋才到啊” 李不凡一听顿时脸色一红头上“金汗如雨”挠头尴尬笑道“哈哈哈哈哈……这……我练轻功飞天走墙嘛结果绕了三圈跑到隔壁镇去复健了‍♂️。” 旁边隔壁镇的送信小哥忍不住接了句“李大侠我昨天还看您跟山贼擦肩而过呐那一刻我脑补您是要放他们一码真是‘侠肝义胆’没想到您迷路迷上天……‍” 这下乡亲们是真扶额扶到天灵盖了李大侠的脸比城门还红摇头感叹“唉这江湖路远山高水长可怜我这路痴走不出江湖万丈深渊啊” --- 哈哈哈各位当大侠也是不容易特别是走路靠命运一出门就开启《导航失灵版江湖》如何看完是不是跟吃了辣椒一样——笑的吼辣辣 E:\Repos\aspnetcore-developer\aspnetcore-developer\src\09-AI-Agent\Agent-Framework\MultiturnConversation\bin\Debug\net10.0\MultiturnConversation.exe (process 15892) exited with code 0 (0x0). To automatically close the console when debugging stops, enable Tools-Options-Debugging-Automatically close the console when debugging stops. Press any key to close this window . . .要点AgentThread负责上下文关联。RunAsync返回完整结果。RunStreamingAsync提供逐步生成的流式体验。三、从示例可以学到什么上下文线程 Thread 非常关键, 框架通过 Thread 封装了上下文管理减轻了开发者负担。Agent 角色设定简单直接, 只需一段说明文字就能让 Agent 带上特定风格。流式输出易于集成使用 RunStreamingAsync 即可获取实时生成内容。适用场景广泛聊天助手、客服问答、教学互动、内容生成、工具型界面等。四、结语agent-framework 将“对话、记忆、角色”封装得轻量便于快速构建多轮对话应用。示例代码简洁易读适合入门与扩展。建议直接运行官方示例加深理解。源代码地址https://github.com/bingbing-gui/aspnetcore-developer/tree/master/src/09-AI-Agent/Agent-Framework/MultiturnConversation引入地址

相关新闻