Day 9:角色扮演与风格控制

欢迎来到第九天!今天我们将学习如何通过系统提示(System Prompt)让模型扮演不同的角色,并精确控制输出的语气、风格和内容深度。这项技能在构建 AI Agent 时非常重要,因为不同的场景需要不同的人设:客服需要礼貌耐心,律师需要严谨专业,文案需要活泼创意。掌握角色扮演,你就能让同一个模型变成完全不同的“专家”。


在这里插入图片描述

一、今日学习目标

  1. 理解角色扮演的核心原理:通过 System Prompt 设定人设、知识边界、说话风格和行为准则。
  2. 学会编写高质量的角色设定提示词,包括背景、目标、语气、限制等要素。
  3. 通过实验对比:让同一个模型分别扮演“严肃的法律顾问”和“幽默的脱口秀演员”,对同一则新闻进行解读,观察输出差异。
  4. 掌握使用 Few-shot 示例进一步稳定风格的方法。
  5. 了解如何在实际 Agent 开发中运用角色扮演来提升用户体验和任务效果。

二、详细实现步骤

步骤 1:准备一条新闻素材

我们选择一条近期或经典的新闻作为解读对象,例如:

某科技公司发布了一款新型智能手机,售价高达 19999 元,采用钛合金边框和折叠屏设计,并宣称拥有“革命性的电池技术”。该手机一经发布便引发热议,有人称赞创新,也有人质疑定价过高。

我们将其作为输入文本,让不同角色来评论。

步骤 2:编写基础调用函数

新建 roleplay_demo.py,导入依赖并初始化客户端(与之前相同):

import os
from dotenv import load_dotenv
from openai import OpenAI

load_dotenv()
client = OpenAI(
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url="https://api.deepseek.com"
)

def ask_with_role(role_prompt: str, user_input: str, temperature: float = 0.7, max_tokens: int = 500) -> str:
    """根据角色提示进行对话"""
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": role_prompt},
            {"role": "user", "content": user_input}
        ],
        temperature=temperature,
        max_tokens=max_tokens
    )
    return response.choices[0].message.content
步骤 3:设计两个截然不同的角色 System Prompt

角色 A:严肃的法律顾问

lawyer_prompt = """
你是一位经验丰富的法律顾问,擅长从法律和商业风险角度分析问题。你的回答必须严谨、客观、专业,使用正式书面语。你会指出事件中可能涉及的法律问题、合规风险以及建议。避免使用口语或幽默。你的语气冷静、权威。
"""

# 用户输入将要求其对新闻进行法律视角的评论
user_input = "请从法律和商业风险的角度,分析以下新闻:某科技公司发布了一款新型智能手机,售价高达 19999 元,采用钛合金边框和折叠屏设计,并宣称拥有“革命性的电池技术”。该手机一经发布便引发热议。"

角色 B:幽默的脱口秀演员

comedian_prompt = """
你是一位幽默的脱口秀演员,擅长用夸张、讽刺、比喻等手法来调侃社会现象。你的语言风趣、接地气,经常使用网络流行语和段子。你的任务是用幽默的方式评论新闻,让观众发笑的同时也能引发思考。避免说教,保持轻松活泼的语气。
"""

comedian_input = "用脱口秀的方式吐槽一下这条新闻:某科技公司发布了一款新型智能手机,售价高达 19999 元,采用钛合金边框和折叠屏设计,并宣称拥有“革命性的电池技术”。该手机一经发布便引发热议。"
步骤 4:调用并对比输出
print("========== 法律顾问视角 ==========")
lawyer_response = ask_with_role(lawyer_prompt, user_input, temperature=0.3)  # 法律分析需要低温度
print(lawyer_response)

print("\n========== 脱口秀演员视角 ==========")
comedian_response = ask_with_role(comedian_prompt, comedian_input, temperature=0.9)  # 幽默需要高温度
print(comedian_response)

观察与思考:

  • 法律顾问的输出会包含“可能涉及虚假宣传”、“消费者权益保护法”、“定价策略的法律风险”等专业词汇,语气正式。
  • 脱口秀演员的输出可能包含“这价格是准备让消费者卖肾吗?”、“钛合金边框?我看是钛合金智商税!”等调侃,语言生动,甚至带点夸张。
  • 角色扮演成功的关键在于 System Prompt 中对人设、语气、知识范围的详细描述。
步骤 5:使用 Few-shot 示例强化风格

有时候仅靠描述还不够,我们可以提供一两个示例来让模型更好地模仿风格。例如,对于脱口秀演员,可以加入一个示例:

comedian_prompt_with_example = """
你是一位幽默的脱口秀演员,擅长用夸张、讽刺、比喻等手法来调侃社会现象。你的语言风趣、接地气,经常使用网络流行语和段子。你的任务是用幽默的方式评论新闻,让观众发笑的同时也能引发思考。避免说教,保持轻松活泼的语气。

以下是一个示例:
用户:某公司推出了一款售价 8888 元的保温杯,号称能保温 48 小时。
你:48 小时?这保温杯是准备穿越到冰河世纪用的吧?买它的人估计不是口渴,是缺爱,需要一个杯子来温暖自己冰冷的心。8888 元,够我买一车普通保温杯,每天摔一个听响儿!

现在,请按此风格吐槽以下新闻:
"""

然后调用:

comedian_response2 = ask_with_role(comedian_prompt_with_example, comedian_input, temperature=0.9)
print("\n========== 带示例的脱口秀演员 ==========")
print(comedian_response2)

对比与直接描述的风格差异,通常带示例的输出更贴近预期。

步骤 6:温度对风格的影响

对于角色扮演,温度是一个重要参数:

  • 低温度(0.1~0.3):输出更稳定、保守,适合严肃角色(如律师、医生)。
  • 高温度(0.7~1.0):输出更随机、创造性高,适合幽默、创意角色(如段子手、诗人)。

我们可以简单实验一下:

print("\n========== 不同温度下的脱口秀演员 ==========")
for temp in [0.2, 0.7, 1.2]:
    resp = ask_with_role(comedian_prompt, comedian_input, temperature=temp)
    print(f"温度 {temp}:\n{resp}\n")

观察幽默程度和连贯性的变化。


三、常见问题与调试

Q1:角色扮演不到位,输出仍然很通用。
→ 尝试在 System Prompt 中加入更具体的描述,例如“你曾经在法庭上打过 100 场官司”、“你说话喜欢用‘咱就是说’开头”等。加入 Few-shot 示例通常能显著改善。

Q2:法律顾问输出不够专业怎么办?
→ 可以进一步细化角色背景:“你拥有中国政法大学法学博士学位,专注消费者权益保护法领域 10 年”。同时降低温度,提供法律文书风格的示例。

Q3:幽默风格太过火,出现不适当内容?
→ 在 System Prompt 中明确限制:“不得使用侮辱性语言,不得涉及敏感话题”。如有需要,可在代码层面对输出进行关键词过滤。

Q4:如何让模型在角色中保持一致性?
→ 在多轮对话中,需要将历史消息一起发送,并确保 System Prompt 始终存在。对于长期角色,还可以结合记忆模块(后续会学到)来保存角色设定。

Q5:角色扮演在 Agent 中的实际应用场景?
→ 比如:

  • 客服 Agent:扮演“耐心热情的客服专员”。
  • 教育 Agent:扮演“循循善诱的老师”。
  • 多智能体协作:不同 Agent 扮演不同角色(如 CEO、程序员、测试员)进行分工。

四、今日总结与作业

今天你完成了:

  • ✅ 学会了通过 System Prompt 设定角色和风格。
  • ✅ 通过实验对比了严肃与幽默两种角色的输出差异。
  • ✅ 掌握了使用 Few-shot 示例和温度调节来强化角色风格。
  • ✅ 理解了角色扮演在 Agent 开发中的重要性。

今日作业(必做):

  1. 自己设计一个角色(例如“暴躁的健身教练”、“温柔的心理咨询师”、“毒舌的时尚评论家”),编写 System Prompt,并让它评论一条新闻或一段文字。测试并调整,直到输出符合预期。
  2. 为你的角色添加一个 Few-shot 示例,观察效果提升。
  3. (思考题)在构建一个多智能体系统时,你如何为不同 Agent 设计角色以避免它们输出风格混乱?请用 100 字以内描述你的策略。

明日预告: 我们将学习长文本处理与摘要,了解如何让模型高效处理超出上下文窗口的长文档,为后续 RAG 和记忆机制打下基础。

有任何问题欢迎随时提问!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐