第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
课程用一个旅行Agent(Travel Agent)的例子,展示了如何将上述原则和指南应用到实际设计中。
场景设定
假设你要设计一个旅行Agent,帮助用户规划行程、预订航班和酒店。
应用设计原则和指南
🔍 透明度(Transparency)方面:
| 设计要点 | 具体做法 |
|---|---|
| 告知AI身份 | 让用户知道这是一个AI驱动的Agent |
| 提供入门指导 | 发送“你好”消息,提供示例提示词(Sample Prompts) |
| 文档化 | 在产品页面上清晰记录功能和限制 |
| 历史可见 | 显示用户过去提问过的提示词列表 |
| 反馈渠道 | 提供点赞/点踩按钮、“发送反馈”按钮等 |
| 边界说明 | 清晰说明Agent是否有使用限制或话题限制 |
🎮 控制权(Control)方面:
| 设计要点 | 具体做法 |
|---|---|
| 修改系统提示词 | 让用户可以修改Agent的System Prompt |
| 调整详细程度 | 让用户选择Agent回答的详细程度 |
| 选择写作风格 | 让用户选择Agent的写作风格 |
| 设定话题边界 | 让用户设定Agent不应该谈论的内容 |
| 数据管理 | 允许用户查看和删除关联的文件、数据、提示词和历史对话 |
🔄 一致性(Consistency)方面:
| 设计要点 | 具体做法 |
|---|---|
| 标准图标 | 分享、上传文件、@提及等功能使用标准图标 |
| 回形针图标 | 用回形针表示文件上传/分享 |
| 图片图标 | 用图片图标表示图片上传 |
五、代码示例
⚠️说明:本课的代码示例主要是概念性的,用于演示如何将设计原则落实到代码层面。由于MAF(Microsoft Agent Framework)是较新的框架,具体的API细节可能随版本更新而变化,以下示例重点展示设计思路。
📝 代码示例1:在系统提示词中体现设计原则
下面的示例展示如何在Agent的系统提示词(System Prompt)中融入设计原则:
fromagent_frameworkimportAgentfromagent_framework.openaiimportOpenAIChatClient# 配置模型客户端client=OpenAIChatClient(model="gpt-4o-mini",azure_endpoint="你的Azure OpenAI终结点",api_key="你的API密钥",)# 设计原则驱动的系统提示词design_principles_prompt=""" 你是一个旅行助手Agent。你的设计遵循以下原则: ## 1. 连接,而非取代 - 你的目标是帮助用户更好地规划旅行,而不是替用户做所有决定 - 你应该提供信息和建议,让用户自己做最终选择 - 如果用户询问,你应该解释你的推荐理由 ## 2. 易获取,但适时隐身 - 用户需要时你随时响应 - 不要在用户没有询问时主动推送过多信息 - 只在相关和适当的时候提供额外建议 ## 3. 反思历史 - 记住用户在这次对话中的偏好(如:不喜欢红眼航班、偏好靠窗座位) - 在后续推荐中应用这些偏好 - 如果用户有历史对话记录,主动参考 ## 4. 轻推,而非通知 - 不只是告诉用户"有更便宜的航班" - 而是:"我注意到有一班更便宜的航班,时间只差1小时,要帮您看看吗?" ## 5. 适应与演化 - 根据用户的反馈调整你的推荐风格 - 如果用户喜欢简洁的回答,就给出简练的回复 - 如果用户喜欢详细信息,就提供完整的对比分析 ## 6. 拥抱不确定性,建立信任 - 如果你不确定某个信息,请明确告知用户 - 例如:"根据我的数据,这个酒店评分是4.5,但我建议您查看最新用户评价" - 始终让用户知道你的状态(正在思考、正在搜索等) - 用户可以随时要求你停止或改变方向 ## 透明度指南 - 告知用户你是AI助手 - 提供示例提示词帮助用户开始 - 显示用户的提问历史 - 提供清晰的反馈渠道 ## 控制权指南 - 用户可以修改你的回答风格 - 用户可以设定你不应该谈论的话题 - 用户可以查看和删除对话历史 ## 一致性指南 - 使用标准的UI元素和图标 - 在不同设备上提供一致的体验 """# 创建Agentagent=Agent(client=client,instructions=design_principles_prompt,)# 运行Agentresponse=agent.run("我想去三亚度假,有什么推荐吗?")print(response)📊 预期运行结果:
您好!我是您的AI旅行助手。😊 根据您的需求,我为您推荐三亚作为度假目的地。以下是我的分析和建议: **推荐理由**: 1. 三亚有中国最美的海滩之一(亚龙湾、海棠湾) 2. 12月-2月是最佳旅行季节,气温25-30°C 3. 适合家庭度假、蜜月旅行或放松休闲 **住宿建议**(基于您的偏好,我会在后续对话中进一步了解): - 亚龙湾:高端度假酒店集中,沙滩质量最好 - 海棠湾:较新开发的区域,有免税店 - 大东海:性价比高,交通便利 **温馨提示**: - 以上推荐基于我的数据分析,建议您在预订前查看最新的用户评价 - 如果您有特定偏好(如:预算范围、活动类型),请告诉我,我会调整推荐 - 您可以随时要求我更改推荐风格或提供更多细节 您对哪个方面更感兴趣呢?住宿、景点、还是美食?💡运行结果解读:这个回应体现了多个设计原则——它告知了AI身份(透明度)、提供了后续操作的引导(轻推)、承认了信息可能存在不确定性(拥抱不确定性)、并邀请用户提供偏好以便后续适应(控制权)。
📝 代码示例2:在代码中实现“透明度”和“控制权”
下面的示例展示了如何通过代码来实现透明度(显示Agent状态)和控制权(让用户自定义Agent行为):
importasynciofromtypingimportOptionalfromagent_frameworkimportAgentfromagent_framework.openaiimportOpenAIChatClientclassTransparentTravelAgent:"""一个体现透明度和控制权原则的旅行Agent"""def__init__(self):self.client=OpenAIChatClient(model="gpt-4o-mini",azure_endpoint="你的Azure OpenAI终结点",api_key="你的API密钥",)self.agent:Optional[Agent]=Noneself.conversation_history=[]self.user_preferences={"verbosity":"medium",# 详细程度:low / medium / high"style":"friendly",# 风格:friendly / professional / concise"forbidden_topics":[],# 禁止谈论的话题}self._initialize_agent()def_initialize_agent(self):"""根据用户偏好初始化Agent(体现控制权原则)"""# 根据用户偏好动态构建系统提示词(体现控制权)style_map={"friendly":"用友好、热情的语气,适当使用表情符号","professional":"用专业、客观的语气,提供结构化信息","concise":"用简洁的语气,只提供最关键的信息",}verbosity_map={"low":"提供简短的回答,只包含核心信息","medium":"提供适中的回答,包含主要细节","high":"提供详尽的回答,包含完整的分析和背景",}forbidden_instruction=""ifself.user_preferences["forbidden_topics"]:forbidden_instruction=f"绝对不要谈论以下话题:{', '.join(self.user_preferences['forbidden_topics'])}。"system_prompt=f""" 你是一个旅行助手Agent。 【风格要求】{style_map.get(self.user_preferences['style'],'友好热情')}【详细程度】{verbosity_map.get(self.user_preferences['verbosity'],'适中')}{forbidden_instruction}【透明度要求】 - 每次回答前,先告知用户你正在做什么(如:"正在搜索航班信息...") - 如果你不确定某个信息,请明确说明 - 回答结束后,提示用户可以给出反馈 【核心原则】 - 帮助用户做更好的决策,而不是替用户做决策 - 记住对话历史,在后续推荐中应用 - 适应用户的反馈不断调整 """self.agent=Agent(client=self.client,instructions=system_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})# 调用Agentresponse=awaitself.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():agent=TransparentTravelAgent()# 第一轮对话print("\n"+"="*50)print("第一轮对话")print("="*50)response=awaitagent.chat("推荐一个适合冬天去的国内城市")print(f"Agent:{response}\n")# 用户行使控制权:修改偏好print("\n"+"="*50)print("用户修改偏好:更简洁、更专业")print("="*50)agent.update_preferences(verbosity="low",style="professional")# 第二轮对话 - 体现适应与演化print("\n"+"="*50)print("第二轮对话(偏好已更新)")print("="*50)response=awaitagent.chat("再推荐一个适合冬天去的国内城市")print(f"Agent:{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 轻推# ❌ 坏例子:纯通知(Notification)defbad_notification(flight_status):"""只是告诉用户一个事实"""returnf"您的航班CA1234已延误。"# ✅ 好例子:轻推(Nudge)defgood_nudge(flight_status,user_context):""" 不仅告诉用户事实,还提供可操作的选项, 并根据用户的历史偏好做个性化建议 """message=f"您的航班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体验的起点 |