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

一、今日学习目标
- 理解角色扮演的核心原理:通过 System Prompt 设定人设、知识边界、说话风格和行为准则。
- 学会编写高质量的角色设定提示词,包括背景、目标、语气、限制等要素。
- 通过实验对比:让同一个模型分别扮演“严肃的法律顾问”和“幽默的脱口秀演员”,对同一则新闻进行解读,观察输出差异。
- 掌握使用 Few-shot 示例进一步稳定风格的方法。
- 了解如何在实际 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 开发中的重要性。
今日作业(必做):
- 自己设计一个角色(例如“暴躁的健身教练”、“温柔的心理咨询师”、“毒舌的时尚评论家”),编写 System Prompt,并让它评论一条新闻或一段文字。测试并调整,直到输出符合预期。
- 为你的角色添加一个 Few-shot 示例,观察效果提升。
- (思考题)在构建一个多智能体系统时,你如何为不同 Agent 设计角色以避免它们输出风格混乱?请用 100 字以内描述你的策略。
明日预告: 我们将学习长文本处理与摘要,了解如何让模型高效处理超出上下文窗口的长文档,为后续 RAG 和记忆机制打下基础。
有任何问题欢迎随时提问!
更多推荐


所有评论(0)