一、角色扮演的原理

角色扮演 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 能力的桥梁:

  1. 深度 > 标签 — 不要只说"你是个专家",而要描述为什么、怎么想的、什么风格
  2. Few-shot 是必选项 — 示例比描述更能约束角色行为
  3. 知识边界要明确 — 说清楚"角色不知道什么"和"知道什么"同样重要
  4. 一致性靠反馈 — 定期重复角色描述,防止长对话漂移
  5. 评估要有标准 — 用评分卡和 A/B 测试量化角色效果

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。