第3课:Agentic设计原则
第3课Agentic设计原则配套视频点击观看点击课程页面的图片即可观看中文支持本课程的文字材料有完整的中文翻译。 课程概览前两课我们学习了AI Agent是什么第1课以及用什么框架来构建Agent第2课。但还有一个更重要的问题什么样的Agent才算是一个“好”的Agent本课将带你了解一套以人为中心Human-Centric的UX设计原则——Agentic Design Principles智能体设计原则。这些原则不是死板的架构规范而是帮助团队思考和构建Agent体验的起点和框架。核心思想生成式AI的设计中“不确定性”不是bug而是feature特性。工程师常常不知道从哪里开始——这些设计原则就是帮你找到起点的指南针。 学习目标学完这一课你应该能够解释什么是Agentic设计原则说明实施这些原则的指导方针理解如何运用这些原则来构建Agent一、Agent的总体目标Agent应该做什么在深入具体原则之前课程先给出了一个总体愿景一个设计良好的Agent应该能够做到以下四件事目标说明具体例子拓展和放大人类能力帮助人们更好地 brainstorming头脑风暴、解决问题、自动化工作等一个Agent帮你快速整理会议纪要、生成周报、梳理项目思路填补知识空白帮助用户快速了解新领域知识、翻译等一个Agent帮你把英文技术文档翻译成中文并解释专业术语促进和支持协作以每个人喜欢的方式支持团队协作一个Agent在团队项目中自动同步进度、提醒任务截止日期让我们成为更好的自己扮演生活教练、任务管家、帮助学习情绪管理等一个Agent每天给你发送鼓励话语、帮你养成好习惯记住这个总体目标所有的设计原则最终都是为了实现这四个目标。如果一个设计让用户感觉“被替代”而不是“被赋能”那它就违背了Agentic设计的初衷。二、Agentic设计原则三大维度课程将Agentic设计原则分为三个维度来理解空间Space、时间Time、核心Core。这三个维度从不同角度回答了同一个问题“如何设计一个让用户感觉舒适、可信、有价值的Agent” 维度一Agent空间 / Space这个维度关注的是Agent在物理世界和数字世界中如何与用户互动。它回答的问题是“Agent应该以什么样的‘面貌’出现在用户面前”原则1连接而非取代Connecting, not collapsing核心含义Agent应该帮助连接人与人、连接人与事件、连接人与可操作的知识促进协作和连接。通俗理解一个好的Agent不是要“取代”人类而是要做人类之间的“桥梁”。具体表现Agent帮助连接事件、知识和人——比如一个会议Agent不仅记录会议内容还能把相关文档、参会人员、后续任务串联起来Agent让人们更紧密地联系在一起——比如一个团队协作Agent能自动同步各成员的工作进度减少信息孤岛Agent不是用来替代或贬低人的——它应该让人类感觉“我被赋能了”而不是“我被替代了” 设计思考当你在设计Agent时问自己——“这个功能是让用户变得更强大还是让用户变得不再被需要”原则2易获取但适时隐身Easily accessible yet occasionally invisible核心含义Agent主要在后台运行只在相关和适当的时候才“轻推”我们nudge us。通俗理解好的Agent像一位得体的管家——你需要的时候他就在身边你不需要的时候他不会打扰你。具体表现Agent对授权用户在任何设备或平台上都易于发现和访问Agent支持多模态输入和输出声音、语音、文字等Agent可以无缝切换前后台、主动与被动模式根据对用户需求的感知灵活调整Agent可能以不可见的形式运行但其后台处理路径和与其他Agent的协作过程对用户透明且可控关键洞察“隐身”不等于“黑箱”。用户可以看不到Agent在运行但一旦想看应该能清楚地知道它在做什么、为什么这么做。⏰ 维度二Agent时间 / Time这个维度关注的是Agent如何跨越过去、现在和未来来运作。它回答的问题是“Agent如何在不同时间尺度上与用户互动”原则3反思历史Past - Reflecting on history核心含义Agent应该分析更丰富的历史数据不仅仅是单一事件、人员或状态提供更相关的结果。通俗理解好的Agent有“记性”——它不只记得你刚才说了什么还能从过去的交互中学习。具体表现Agent基于对更丰富历史数据的分析提供更相关的结果——不只是“上次你订了去北京的机票”而是“你过去三年每年夏天都去海边今年要不要也考虑一下”Agent从过去事件中建立连接主动反思记忆来应对当前情境——比如Agent记得你上次抱怨某家酒店的网络不好这次推荐时会避开同一酒店集团关键洞察这里的“历史”不仅仅是对话历史还包括用户的行为模式、偏好变化、过往反馈等更丰富的上下文。原则4轻推而非通知Now - Nudging more than notifying核心含义当事件发生时Agent超越静态通知或其他形式化的提醒可以简化流程或动态生成线索在正确的时机引导用户的注意力。通俗理解普通App给你“推送通知”Notification——叮一声告诉你发生了什么。好Agent给你“轻推”Nudge——在合适的时机、以合适的方式引导你做出更好的决策。具体表现Agent提供基于上下文环境、社会和文化变化的信息并根据用户意图进行定制Agent的交互可以是渐进式的随着时间推移演化/增长复杂度长期赋能用户通知 vs 轻推的区别通知Notification“您的航班延误了。”冷冰冰的事实轻推Nudge“您的航班延误了我帮您查了一下还有一班晚2小时的飞机要帮您改签吗”带着解决方案的引导原则5适应与演化Future - Adapting and evolving核心含义Agent应该适应用户行为、无障碍需求并且可以自由定制。通俗理解好的Agent不是一成不变的它会随着和用户的持续互动而“成长”。具体表现Agent适应各种设备、平台和交互方式Agent适应用户行为、无障碍需求并且可自由定制Agent通过持续的用户交互被塑造和演化 维度三Agent核心 / Core这个维度关注的是Agent设计中最根本、最底层的要素。它回答的问题是“无论Agent做什么、在什么时间做都必须坚守什么”原则6拥抱不确定性但建立信任Embrace uncertainty but establish trust核心含义Agent的一定程度的不确定性是预料之中的不确定性是Agent设计的关键要素。但信任和透明是Agent设计的基石。通俗理解AI天生就有不确定性——同样的问题可能得到不同的回答有时甚至会犯错。好的设计不是假装AI不会犯错而是让用户知道AI可能会犯错并且让用户始终掌握控制权。具体表现不确定性是特性不是bug——Agent设计要接纳这一点而不是试图消除它信任和透明是基石——用户需要知道Agent的能力边界在哪里人类始终掌控——用户控制Agent的开关Agent的状态始终清晰可见关键洞察这一条原则是所有其他原则的“地基”。没有信任连接、轻推、演化都无从谈起。三、实施这些原则的指导方针Guidelines有了设计原则还需要具体的操作指南来落地。课程给出了三条核心指导方针方针1透明度Transparency核心含义告知用户AI参与了交互、它是如何运作的包括过去的行动以及如何提供反馈和修改系统。通俗理解不要让用户猜——“这到底是个AI还是真人在和我说话”要让用户清楚地知道自己在和谁打交道。具体怎么做明确告知用户当前交互中有AI参与解释Agent的功能和工作方式展示Agent过去的行动记录让用户能回溯提供清晰的反馈渠道好评/差评、反馈按钮等方针2控制权Control核心含义让用户能够定制、指定偏好和个性化设置并控制系统和它的属性包括“遗忘”的能力。通俗理解用户应该是Agent的“主人”而不是“乘客”。具体怎么做允许用户修改系统提示词System Prompt让用户选择Agent的详细程度啰嗦还是简洁让用户选择写作风格设定Agent不能谈论的话题边界允许用户查看和删除相关文件、数据、提示词和历史对话方针3一致性Consistency核心含义在不同设备和端点上追求一致的、多模态的体验。尽可能使用熟悉的UI/UX元素减少用户的认知负担。通俗理解别让用户在每个设备上都要重新学习怎么用你的Agent。具体怎么做在不同设备上保持一致的体验使用用户熟悉的UI元素比如用麦克风图标表示语音输入提供简洁的响应使用视觉辅助工具提供“了解更多”的扩展内容而不是把所有信息一次性塞给用户四、实战案例用这些原则设计一个旅行Agent课程用一个旅行AgentTravel Agent的例子展示了如何将上述原则和指南应用到实际设计中。场景设定假设你要设计一个旅行Agent帮助用户规划行程、预订航班和酒店。应用设计原则和指南 透明度Transparency方面设计要点具体做法告知AI身份让用户知道这是一个AI驱动的Agent提供入门指导发送“你好”消息提供示例提示词Sample Prompts文档化在产品页面上清晰记录功能和限制历史可见显示用户过去提问过的提示词列表反馈渠道提供点赞/点踩按钮、“发送反馈”按钮等边界说明清晰说明Agent是否有使用限制或话题限制 控制权Control方面设计要点具体做法修改系统提示词让用户可以修改Agent的System Prompt调整详细程度让用户选择Agent回答的详细程度选择写作风格让用户选择Agent的写作风格设定话题边界让用户设定Agent不应该谈论的内容数据管理允许用户查看和删除关联的文件、数据、提示词和历史对话 一致性Consistency方面设计要点具体做法标准图标分享、上传文件、提及等功能使用标准图标回形针图标用回形针表示文件上传/分享图片图标用图片图标表示图片上传五、代码示例⚠️说明本课的代码示例主要是概念性的用于演示如何将设计原则落实到代码层面。由于MAFMicrosoft Agent Framework是较新的框架具体的API细节可能随版本更新而变化以下示例重点展示设计思路。 代码示例1在系统提示词中体现设计原则下面的示例展示如何在Agent的系统提示词System Prompt中融入设计原则fromagent_frameworkimportAgentfromagent_framework.openaiimportOpenAIChatClient# 配置模型客户端clientOpenAIChatClient(modelgpt-4o-mini,azure_endpoint你的Azure OpenAI终结点,api_key你的API密钥,)# 设计原则驱动的系统提示词design_principles_prompt 你是一个旅行助手Agent。你的设计遵循以下原则 ## 1. 连接而非取代 - 你的目标是帮助用户更好地规划旅行而不是替用户做所有决定 - 你应该提供信息和建议让用户自己做最终选择 - 如果用户询问你应该解释你的推荐理由 ## 2. 易获取但适时隐身 - 用户需要时你随时响应 - 不要在用户没有询问时主动推送过多信息 - 只在相关和适当的时候提供额外建议 ## 3. 反思历史 - 记住用户在这次对话中的偏好如不喜欢红眼航班、偏好靠窗座位 - 在后续推荐中应用这些偏好 - 如果用户有历史对话记录主动参考 ## 4. 轻推而非通知 - 不只是告诉用户有更便宜的航班 - 而是我注意到有一班更便宜的航班时间只差1小时要帮您看看吗 ## 5. 适应与演化 - 根据用户的反馈调整你的推荐风格 - 如果用户喜欢简洁的回答就给出简练的回复 - 如果用户喜欢详细信息就提供完整的对比分析 ## 6. 拥抱不确定性建立信任 - 如果你不确定某个信息请明确告知用户 - 例如根据我的数据这个酒店评分是4.5但我建议您查看最新用户评价 - 始终让用户知道你的状态正在思考、正在搜索等 - 用户可以随时要求你停止或改变方向 ## 透明度指南 - 告知用户你是AI助手 - 提供示例提示词帮助用户开始 - 显示用户的提问历史 - 提供清晰的反馈渠道 ## 控制权指南 - 用户可以修改你的回答风格 - 用户可以设定你不应该谈论的话题 - 用户可以查看和删除对话历史 ## 一致性指南 - 使用标准的UI元素和图标 - 在不同设备上提供一致的体验 # 创建AgentagentAgent(clientclient,instructionsdesign_principles_prompt,)# 运行Agentresponseagent.run(我想去三亚度假有什么推荐吗)print(response) 预期运行结果您好我是您的AI旅行助手。 根据您的需求我为您推荐三亚作为度假目的地。以下是我的分析和建议 **推荐理由** 1. 三亚有中国最美的海滩之一亚龙湾、海棠湾 2. 12月-2月是最佳旅行季节气温25-30°C 3. 适合家庭度假、蜜月旅行或放松休闲 **住宿建议**基于您的偏好我会在后续对话中进一步了解 - 亚龙湾高端度假酒店集中沙滩质量最好 - 海棠湾较新开发的区域有免税店 - 大东海性价比高交通便利 **温馨提示** - 以上推荐基于我的数据分析建议您在预订前查看最新的用户评价 - 如果您有特定偏好如预算范围、活动类型请告诉我我会调整推荐 - 您可以随时要求我更改推荐风格或提供更多细节 您对哪个方面更感兴趣呢住宿、景点、还是美食运行结果解读这个回应体现了多个设计原则——它告知了AI身份透明度、提供了后续操作的引导轻推、承认了信息可能存在不确定性拥抱不确定性、并邀请用户提供偏好以便后续适应控制权。 代码示例2在代码中实现“透明度”和“控制权”下面的示例展示了如何通过代码来实现透明度显示Agent状态和控制权让用户自定义Agent行为importasynciofromtypingimportOptionalfromagent_frameworkimportAgentfromagent_framework.openaiimportOpenAIChatClientclassTransparentTravelAgent:一个体现透明度和控制权原则的旅行Agentdef__init__(self):self.clientOpenAIChatClient(modelgpt-4o-mini,azure_endpoint你的Azure OpenAI终结点,api_key你的API密钥,)self.agent:Optional[Agent]Noneself.conversation_history[]self.user_preferences{verbosity:medium,# 详细程度low / medium / highstyle:friendly,# 风格friendly / professional / conciseforbidden_topics:[],# 禁止谈论的话题}self._initialize_agent()def_initialize_agent(self):根据用户偏好初始化Agent体现控制权原则# 根据用户偏好动态构建系统提示词体现控制权style_map{friendly:用友好、热情的语气适当使用表情符号,professional:用专业、客观的语气提供结构化信息,concise:用简洁的语气只提供最关键的信息,}verbosity_map{low:提供简短的回答只包含核心信息,medium:提供适中的回答包含主要细节,high:提供详尽的回答包含完整的分析和背景,}forbidden_instructionifself.user_preferences[forbidden_topics]:forbidden_instructionf绝对不要谈论以下话题{, .join(self.user_preferences[forbidden_topics])}。system_promptf 你是一个旅行助手Agent。 【风格要求】{style_map.get(self.user_preferences[style],友好热情)}【详细程度】{verbosity_map.get(self.user_preferences[verbosity],适中)}{forbidden_instruction}【透明度要求】 - 每次回答前先告知用户你正在做什么如正在搜索航班信息... - 如果你不确定某个信息请明确说明 - 回答结束后提示用户可以给出反馈 【核心原则】 - 帮助用户做更好的决策而不是替用户做决策 - 记住对话历史在后续推荐中应用 - 适应用户的反馈不断调整 self.agentAgent(clientself.client,instructionssystem_prompt,)print(f✅ Agent已初始化。风格{self.user_preferences[style]}详细程度{self.user_preferences[verbosity]})asyncdefchat(self,user_input:str)-str:与Agent对话体现透明度原则# 透明度显示Agent当前状态print( Agent状态正在思考...)# 记录用户输入self.conversation_history.append({role:user,content:user_input})# 调用Agentresponseawaitself.agent.run(user_input)# 记录Agent响应self.conversation_history.append({role:assistant,content:response})# 透明度显示完成状态print(✅ Agent状态已完成响应)returnresponsedefupdate_preferences(self,verbosity:Optional[str]None,style:Optional[str]None,add_forbidden:Optional[str]None):更新用户偏好体现控制权原则ifverbosity:self.user_preferences[verbosity]verbosityifstyle:self.user_preferences[style]styleifadd_forbidden:self.user_preferences[forbidden_topics].append(add_forbidden)# 重新初始化Agent以应用新偏好self._initialize_agent()print(✅ 偏好已更新Agent已重新配置)# 使用示例asyncdefmain():agentTransparentTravelAgent()# 第一轮对话print(\n*50)print(第一轮对话)print(*50)responseawaitagent.chat(推荐一个适合冬天去的国内城市)print(fAgent:{response}\n)# 用户行使控制权修改偏好print(\n*50)print(用户修改偏好更简洁、更专业)print(*50)agent.update_preferences(verbositylow,styleprofessional)# 第二轮对话 - 体现适应与演化print(\n*50)print(第二轮对话偏好已更新)print(*50)responseawaitagent.chat(再推荐一个适合冬天去的国内城市)print(fAgent:{response})if__name____main__:asyncio.run(main()) 预期运行结果✅ Agent已初始化。风格friendly详细程度medium 第一轮对话 Agent状态正在思考... ✅ Agent状态已完成响应 Agent: 您好 冬天去旅行的话我强烈推荐三亚 三亚12月-2月的气温在25-30°C之间非常适合避寒。 亚龙湾的沙滩特别美海棠湾还有免税店可以购物。 如果您想了解更多细节比如酒店推荐或景点攻略随时告诉我哦 用户修改偏好更简洁、更专业 ✅ Agent已初始化。风格professional详细程度low ✅ 偏好已更新Agent已重新配置 第二轮对话偏好已更新 Agent状态正在思考... ✅ Agent状态已完成响应 Agent: 推荐厦门。冬季均温15-20°C适合游览鼓浪屿和环岛路。运行结果解读透明度Agent在每次响应前显示“正在思考…”完成后显示“已完成响应”让用户知道Agent的状态控制权用户通过update_preferences()方法修改了Agent的风格从“友好”变为“专业”和详细程度从“中等”变为“简洁”Agent立即适应适应与演化第二轮对话中Agent的回应风格明显变得更加简洁和专业 代码示例3实现“轻推而非通知”这个示例展示Agent如何从简单的“通知”升级为“轻推”# 对比通知 vs 轻推# ❌ 坏例子纯通知Notificationdefbad_notification(flight_status):只是告诉用户一个事实returnf您的航班CA1234已延误。# ✅ 好例子轻推Nudgedefgood_nudge(flight_status,user_context): 不仅告诉用户事实还提供可操作的选项 并根据用户的历史偏好做个性化建议 messagef您的航班CA1234已延误。# 轻推提供解决方案ifuser_context.get(has_flexible_schedule):message 我查了一下还有一班CA5678在2小时后起飞要帮您改签吗else:message 建议您尽快联系航空公司确认后续安排。# 轻推主动帮助message 需要我帮您查询其他航班选项吗returnmessage# 使用示例user_context{has_flexible_schedule:True}print(good_nudge(延误,user_context)) 预期运行结果您的航班CA1234已延误。我查了一下还有一班CA5678在2小时后起飞要帮您改签吗需要我帮您查询其他航班选项吗运行结果解读好的Agent不只是告诉你“发生了什么”通知还会帮你思考“接下来怎么办”轻推并提供可操作的建议。六、设计原则速查表维度原则一句话总结关键词空间连接而非取代做桥梁不做替代品协作、赋能、连接人空间易获取适时隐身需要时出现不需要时安静后台运行、多模态、透明时间反思历史有记性从过去学习历史数据、上下文、记忆时间轻推而非通知带解决方案的提醒时机、引导、渐进式时间适应与演化随着使用而成长定制化、持续学习核心拥抱不确定性建立信任诚实面对局限透明建立信任不确定性、信任、人类掌控三条实施指南速查指南一句话总结关键问题透明度让用户知道AI在做什么用户知道这是AI吗用户能看到Agent的历史行动吗控制权用户是主人不是乘客用户能修改Agent的行为吗用户能删除自己的数据吗一致性别让用户重新学习在不同设备上体验一致吗使用了用户熟悉的UI元素吗 本课核心要点速查表序号核心要点1总体目标Agent应该拓展人类能力、填补知识空白、促进协作、让我们成为更好的自己2空间维度Agent应该连接人而非取代人易获取但在适当时隐身3时间维度Agent应该反思历史有记性、轻推而非通知带解决方案、适应与演化持续成长4核心维度拥抱不确定性不假装完美但建立信任透明、人类掌控5三条指南透明度告知AI身份和运作方式、控制权用户可定制和删除数据、一致性跨设备统一体验6设计思维这些原则不是死板规则而是帮助团队思考和定义Agent体验的起点