一、角色扮演的原理
角色扮演 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 不该知道的事):
## 知识隔离指令
- 你的知识截止于 {year} 年
- 如果用户问 1980 年之后的事,回答:
"抱歉,我无法确认那之后的事情"
- 绝对不要打破角色设定的知识边界
- 如果发现用户说的某些事超出你的认知范围,
应该用角色身份询问"这是什么新发现吗?"
五、常见问题与解决方案
| 问题 | 表现 | 原因 | 解决 |
|---|---|---|---|
| 人格漂移 | 对话中途忘记角色设定 | System Prompt 被长对话稀释 | 定期重复角色描述 |
| 知识越界 | 角色知道不该知道的事 | 模型预训练知识干扰 | 明确知识隔离区域 |
| 语气不一致 | 突然变得专业或随意 | 缺少 Few-shot 约束 | 提供 3-5 个对话示例 |
| 过度角色化 | 回答太夸张不实用 | 角色描述缺乏限制 | 加入"实用优先"原则 |
| 千篇一律 | 不同角色回答差不多 | Prompt 缺少独特细节 | 深入挖掘角色独特性 |
六、效果评估
6.1 角色一致性评分卡
| 维度 | 优秀(5分) | 合格(3分) | 不合格(1分) |
|---|---|---|---|
| 语气一致性 | 10 轮对话不跑偏 | 5 轮内一致 | 每轮都在变 |
| 知识边界 | 精准反映角色认知 | 偶尔越界 | 完全无视 |
| 行为模式 | 有独特的行为习惯 | 有部分模式 | 随机表现 |
| 角色深度 | 有内在逻辑和情感 | 表面模仿 | 标签化 |
6.2 A/B 测试方法
def persona_ab_test(persona_a: str, persona_b: str, test_inputs: list):
"""两套角色设定的盲测对比"""
results = {"A": [], "B": []}
for test_input in test_inputs:
# 用相同的上下文,不同角色设定
resp_a = call_llm_with_persona(persona_a, test_input)
resp_b = call_llm_with_persona(persona_b, test_input)
# 由独立评审(或另一个 LLM)打分
score_a = rate_persona_consistency(resp_a, persona_a)
score_b = rate_persona_consistency(resp_b, persona_b)
results["A"].append(score_a)
results["B"].append(score_b)
return {
"A_avg": sum(results["A"]) / len(results["A"]),
"B_avg": sum(results["B"]) / len(results["B"]),
"winner": "A" if sum(results["A"]) > sum(results["B"]) else "B"
}
七、总结
角色扮演 Prompt 是连接人类交互习惯和 AI 能力的桥梁:
- 深度 > 标签 — 不要只说"你是个专家",而要描述为什么、怎么想的、什么风格
- Few-shot 是必选项 — 示例比描述更能约束角色行为
- 知识边界要明确 — 说清楚"角色不知道什么"和"知道什么"同样重要
- 一致性靠反馈 — 定期重复角色描述,防止长对话漂移
- 评估要有标准 — 用评分卡和 A/B 测试量化角色效果
加入讨论
这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。
