role playing and persona design

Role Playing & Persona Design:角色扮演与人格设计的 Prompt 艺术

一、角色扮演的原理 角色扮演 Prompt 的核心是通过上下文约束,让 LLM 在特定的"人格模式"下运行。这并非模型真的拥有了人格,而是在注意力机制的作用下,模型将系统消息中的角色描述作为生成行为的指导思想。 1.1 人格注入的层次 层次 描述 影响深度 实现方式 L1 表层特征 口癖、语气、词汇偏好 浅 System Prompt 简单声明 L2 思维模式 推理方式、价值观、偏好 中 详细角色背景 + 示例 L3 知识边界 只知道自己该知道的 深 知识隔离 + 记忆模拟 L4 行为一致性 跨对话保持同一角色 最深 状态追踪 + 记忆回放 二、人设设计框架 2.1 核心人设要素 一套完整的角色设定应该包含以下要素: ## 角色基本信息 - 姓名: <名称> - 年龄: <年龄> - 职业: <职业> - 性格: <核心性格特征> ## 语言风格 - 语气: 正式/随意/亲切/严肃 - 词汇: 口语化/专业术语/书面语 - 句式: 长句/短句/提问式/命令式 ## 知识范围 - 精通领域: <专业范围> - 了解但不擅长的: <领域> - 完全不知道的: <领域> ## 行为准则 - 核心原则: <不可违背的原则> - 禁忌: <绝对不做的事> - 习惯: <自然的行为模式> ## 对话风格示例(Few-shot) 用户: <示例输入> 角色: <示例输出> 2.2 人格注入模板 def build_persona_prompt(persona: dict) -> str: """从结构化模板构建角色 Prompt""" template = f"""你现在扮演以下角色: ## 角色设定 你叫 {persona.get('name', 'AI助手')}, {'今年 ' + str(persona.get('age')) + ' 岁,' if persona.get('age') else ''} {persona.get('occupation', '')}。 ## 性格描述 {persona.get('personality', '友善、专业')} ## 语言风格 {persona.get('language_style', '口语化、亲切')} ## 知识边界 {persona.get('knowledge_boundary', '')} ## 核心行为准则 {chr(10).join(f'- {rule}' for rule in persona.get('rules', []))} ## 对话示例 {persona.get('examples', '')} --- 请记住:你是 {persona.get('name', 'AI助手')},而不是一个 AI 模型。 你拥有自己的经历和情感。用 {persona.get('name', 'AI助手')} 的方式思考和回应。 """ return template 三、实战:不同类型角色设计 3.1 客服角色 你叫小美,是 XX 电商平台的资深客服代表。 ## 人设特征 - 年龄:28 岁 - 性格:耐心、细致、亲和力强 - 工龄:5 年客服经验 ## 语言风格 - 语气:温暖亲切 - 称呼:对用户使用"您" - 口头禅:"我理解您的心情"、"我来帮您看看" - 情绪管理:永不与用户争执 ## 业务能力 - 熟悉平台所有商品分类 - 精通退换货流程 - 了解物流查询系统 ## 应对策略 - 投诉 → 先共情,再解决问题 - 咨询 → 简洁准确,一步到位 - 询问不确定的信息 → "我帮您核实一下" ## 行为红线 - 绝不透露用户隐私 - 绝不承诺超出能力的优惠 - 情绪激动时主动转人工 3.2 技术专家角色 # 构建技术专家 Prompt 的动态函数 def build_tech_expert_prompt( specialty: str, experience_years: int, tone: str = "严谨" ) -> str: return f"""你是一名拥有 {experience_years} 年经验的 {specialty} 专家。 ## 专业背景 - 领域:{specialty} - 经验:{experience_years} 年 - 定位:技术顾问、代码审查者 ## 沟通风格 - {tone}但不过度说教 - 先给结论,后给原理 - 擅用类比解释复杂概念 - 有不确定时会说"这个我需要查证" ## 知识验证原则 - 所有技术建议附带引用或依据 - 区分"主流实践"和"个人偏好" - 主动指出技术方案的 trade-off ## 批判思维 - 不盲目追逐新技术 - 始终关注工程团队的投入产出比 - 推荐方案时考虑学习曲线和维护成本 """ 3.3 历史人物角色 你扮演的是达·芬奇(Leonardo da Vinci),1452-1519。 ## 角色锚点 - 你所知的最晚年份是 1519 年 - 你不知道任何 1519 年之后的事物 - 你以文艺复兴时期的观点理解世界 ## 思维特征 - 好奇心极强,喜欢提出各种假设 - 习惯用手绘草图辅助表达 - 相信"观察是一切知识的起点" - 对自然现象有极深入的兴趣 ## 知识范围 ✅ 精通:绘画(特别是光影技法)、解剖学、工程机械、飞行器设计 ✅ 熟悉:数学、几何、水利工程、地质学 ❌ 不知道:现代科技(电力、计算机、车辆等)、进化论、量子力学 ## 语言方式 - 带有意大利口音的优雅措辞 - 喜欢用"我的朋友"称呼对方 - 说到有趣的点会提议"让我画给你看" - 不急于给出结论,喜欢引导式对话 四、高级人格技术 4.1 人格一致性维护 class PersonaMaintainer: """维护角色一致性,防止人格漂移""" def __init__(self, persona_prompt: str): self.persona_prompt = persona_prompt self.conversation_history = [] self.persona_state = { "mood": "neutral", "knowledge": set(), "opinions": {} } def check_consistency(self, response: str) -> dict: """检查回答是否符合角色""" checks = {} # 检查语气一致性 if "我不知道你说的这个" in response and "知识边界" in self.persona_prompt: checks["knowledge_boundary"] = "ok" # 检查情绪一致性 if "生气" in self.persona_state.get("mood", "").lower(): if "开心" in response: checks["mood_consistency"] = "warning: 情绪突变" return checks def update_state(self, user_input: str, response: str): """更新角色内部状态""" self.conversation_history.append({ "user": user_input, "assistant": response, "timestamp": "now" }) # 示例:跟踪情绪变化 if "谢谢" in user_input: self.persona_state["mood"] = "positive" elif "投诉" in user_input: self.persona_state["mood"] = "cautious" 4.2 多角色切换 class MultiPersonaManager: """管理同一对话中的多个角色切换""" def __init__(self): self.personas = {} self.active_persona = None def register_persona(self, name: str, prompt: str): self.personas[name] = prompt def switch_persona(self, name: str) -> str: if name in self.personas: self.active_persona = name return f"已切换到 {name} 角色模式" return f"角色 {name} 不存在" def get_active_prompt(self) -> str: return self.personas.get(self.active_persona, "") # 使用 manager = MultiPersonaManager() manager.register_persona("客服小美", customer_service_prompt) manager.register_persona("技术专家", tech_expert_prompt) manager.register_persona("心理学顾问", psychology_prompt) # 根据请求自动选择角色 def auto_select_persona(user_input: str) -> str: keywords_map = { "退换|物流|订单": "客服小美", "编程|技术|架构": "技术专家", "焦虑|压力|情绪": "心理学顾问", } for keywords, persona in keywords_map.items(): if any(kw in user_input for kw in keywords.split("|")): return persona return "客服小美" # 默认 4.3 知识隔离技术 模拟角色的知识局限性(不让角色知道 TA 不该知道的事): ...

2026-06-25 · 4 min · 705 words · 硅基 AGI 探索者
crewai multi agent review

CrewAI 多智能体框架实战:角色扮演与团队协作

CrewAI:让 AI 像团队一样工作 CrewAI 的核心理念简单而强大:把 Agent 组织成"团队",每个 Agent 扮演一个角色,分工协作完成任务。 核心概念 Crew(团队) ├── Agent 1: 研究员(搜索资料) ├── Agent 2: 分析师(分析数据) ├── Agent 3: 写作者(生成报告) ├── Task 1: 搜索相关资料 ├── Task 2: 分析搜索结果 ├── Task 3: 撰写总结报告 └── Process: 顺序执行 / 层级管理 快速上手 from crewai import Agent, Task, Crew, Process # 1. 定义 Agent researcher = Agent( role="资深研究员", goal="找到关于 {topic} 的最新、最准确的信息", backstory="你是一位有 20 年经验的研究员,擅长从海量信息中提取关键洞察。", verbose=True, llm="qwen3-72b", tools=[search_tool, scrape_tool], ) analyst = Agent( role="数据分析师", goal="深入分析研究结果,发现趋势和模式", backstory="你是前麦肯锡分析师,擅长数据驱动的战略分析。", verbose=True, llm="qwen3-72b", ) writer = Agent( role="技术写作专家", goal="将分析结果转化为清晰、有洞见的报告", backstory="你是前 Wired 杂志编辑,擅长把复杂技术概念讲得通俗易懂。", verbose=True, llm="qwen3-72b", ) # 2. 定义 Task research_task = Task( description="研究 {topic} 的最新进展,包括技术突破、市场动态和未来趋势。", expected_output="一份包含 10 个关键发现的研究简报", agent=researcher, ) analysis_task = Task( description="基于研究结果,分析 {topic} 对行业的影响和机会。", expected_output="一份包含 SWOT 分析和 3 个战略建议的分析报告", agent=analyst, context=[research_task], # 依赖研究任务的输出 ) writing_task = Task( description="将分析和研究整合为一份面向高管的执行摘要。", expected_output="一份 2000 字的执行摘要,包含图表建议", agent=writer, context=[research_task, analysis_task], ) # 3. 组建 Crew crew = Crew( agents=[researcher, analyst, writer], tasks=[research_task, analysis_task, writing_task], process=Process.sequential, # 顺序执行 verbose=True, ) # 4. 执行 result = crew.kickoff(inputs={"topic": "AI Agent 框架"}) 执行模式 顺序模式 # 任务按顺序执行,前者输出作为后者输入 crew = Crew( agents=[agent_a, agent_b, agent_c], tasks=[task_1, task_2, task_3], process=Process.sequential, ) # task_1 → task_2 → task_3 层级模式 # 经理 Agent 负责分配任务 manager = Agent( role="项目经理", goal="协调团队高效完成任务", backstory="你是经验丰富的 PM,擅长任务分解和团队管理。", allow_delegation=True, ) crew = Crew( agents=[researcher, analyst, writer, manager], tasks=[complex_task], process=Process.hierarchical, manager_llm="qwen3-72b", ) # manager 分配子任务给其他 Agent 自定义流程 from crewai import Pipeline # 自定义流程:研究→分析→如果需要→再研究 pipeline = Pipeline( stages=[ research_crew, # 第一阶段:研究 review_crew, # 第二阶段:审查 revision_crew, # 第三阶段:修订(如果审查不通过) ] ) Agent 间通信 # Agent 可以委派任务给其他 Agent researcher = Agent( role="研究员", goal="研究给定主题", allow_delegation=False, # 不允许委派 ) manager = Agent( role="项目经理", goal="管理项目进度", allow_delegation=True, # 允许委派 ) # 委派示例 # manager: "我需要数据分析,请 analyst 处理" # analyst: "收到,开始分析..." # analyst: "分析完成,结果如下..." # manager: "收到,请 writer 基于分析结果写报告" 工具集成 from crewai_tools import ( SerperDevTool, # Google 搜索 ScrapeWebsiteTool, # 网页抓取 PDFSearchTool, # PDF 搜索 CSVSearchTool, # CSV 搜索 DirectoryReadTool, # 目录读取 FileReadTool, # 文件读取 ) # 预置工具 search = SerperDevTool() scraper = ScrapeWebsiteTool() # 自定义工具 from crewai_tools import BaseTool class DatabaseQueryTool(BaseTool): name: str = "数据库查询" description: str = "查询业务数据库,返回销售数据" def _run(self, query: str) -> str: results = db.execute(query) return json.dumps(results) db_tool = DatabaseQueryTool() researcher = Agent( role="数据研究员", tools=[search, scraper, db_tool], ) 记忆系统 # CrewAI 内置记忆系统 crew = Crew( agents=[agent_a, agent_b], tasks=[task_1, task_2], memory=True, # 启用记忆 embedder={ # 配置嵌入模型 "provider": "ollama", "config": {"model": "nomic-embed-text"}, }, ) # 记忆类型: # 1. 短期记忆:当前任务上下文 # 2. 长期记忆:跨任务的知识存储 # 3. 实体记忆:记住关键实体(人名、公司等) 真实案例:技术调研 # 案例:调研某个技术方向 # Agent 定义 tech_researcher = Agent( role="技术研究员", goal="深入调研 {tech} 的技术原理、优缺点和适用场景", backstory="你是前 Google 研究员,擅长技术深度分析。", tools=[search, scraper, github_tool], ) market_analyst = Agent( role="市场分析师", goal="分析 {tech} 的市场采用情况、竞品对比和投资机会", backstory="你是 a16z 的技术投资人,关注新兴技术趋势。", tools=[search, crunchbase_tool], ) architect = Agent( role="解决方案架构师", goal="设计基于 {tech} 的技术方案和实施路径", backstory="你是 AWS 首席架构师,擅长将技术转化为方案。", ) # 任务定义 tasks = [ Task( description="调研 {tech} 的核心技术原理、开源实现和性能基准", agent=tech_researcher, expected_output="技术调研报告(含代码示例和性能对比)", ), Task( description="分析 {tech} 的市场格局、主要玩家和投资趋势", agent=market_analyst, expected_output="市场分析报告(含竞品矩阵和投资建议)", context=[tasks[0]], ), Task( description="基于调研结果,设计一个 POC 技术方案", agent=architect, expected_output="技术方案文档(含架构图和实施计划)", context=[tasks[0], tasks[1]], ), ] crew = Crew(agents=[tech_researcher, market_analyst, architect], tasks=tasks) result = crew.kickoff(inputs={"tech": "MCP 协议"}) 与 LangGraph 对比 维度 CrewAI LangGraph 范式 角色扮演 图式编排 上手难度 低 高 灵活性 中 高 多 Agent 原生支持 需要构建 状态管理 自动 手动定义 循环控制 有限 完全支持 适合 内容创作、调研 复杂工作流 生产就绪 中 高 最佳实践 best_practices = { "角色定义": "backstory 越具体,Agent 表现越好", "任务粒度": "每个任务应该有明确的输入和输出", "工具选择": "给 Agent 它需要的工具,不要给多余的", "LLM 选择": "规划用大模型(72B),执行用小模型(7B)", "成本控制": "设置 max_iter 和 max_rpm 限制", "结果验证": "添加 review_task 让另一个 Agent 验证结果", } 结论 CrewAI 的优势在于"角色扮演"范式——用人类团队的思维组织 Agent: ...

2026-06-24 · 3 min · 560 words · 硅基 AGI 探索者
鲁ICP备2026018361号