【三个月 AI Agent 实战学习】Day 13:系统提示词设计 —— 打造你的专属 AI 助手

Day 13:系统提示词设计 —— 打造你的专属 AI 助手

欢迎来到第十三天!今天我们聚焦于一个看似简单却极其重要的主题:系统提示词(System Prompt)设计。系统提示词是大模型应用的“灵魂”,它定义了模型的行为准则、角色定位、任务边界和输出风格。一个精心设计的系统提示词能让同一个模型从“通用助手”蜕变为“领域专家”或“专属管家”。在构建 AI Agent 时,系统提示词的质量直接决定了 Agent 的稳定性、安全性和用户体验。


在这里插入图片描述

一、今日学习目标

  1. 理解系统提示词在 LLM 应用中的作用:设定角色、规则、上下文和输出格式。
  2. 掌握高质量系统提示词的核心要素:角色(Role)、背景(Context)、任务(Task)、约束(Constraints)、输出格式(Output Format)、示例(Examples)。
  3. 学会编写结构化的系统提示词,并通过实验对比不同设计对模型输出的影响。
  4. 使用 LangChain 的 SystemMessagePromptTemplate 来组织系统提示词,为后续工程化开发做准备。
  5. 完成一个实战案例:设计一个“AI 健身教练”系统提示词,并测试其效果。

二、详细实现步骤

步骤 1:理解系统提示词的关键要素

一个高质量的系统提示词通常包含以下几个部分(并非全部必须,但大多数应用会用到):

  • 角色(Role):明确模型的身份,如“你是一位经验丰富的健身教练”。
  • 背景(Context):提供任务的背景信息,帮助模型理解场景。
  • 任务(Task):清晰描述模型需要做什么,例如“根据用户的身体数据和目标,制定个性化的健身计划”。
  • 约束(Constraints):设置边界和规则,如“不得给出医疗建议”、“回答需简洁友好”。
  • 输出格式(Output Format):指定回复的结构,如“用 JSON 返回”或“分点列出”。
  • 示例(Examples):提供一两个示例,帮助模型模仿(即 Few-shot)。
  • 语气与风格(Tone/Style):如“语气积极鼓励”、“使用口语化表达”。

我们将围绕这些要素设计一个系统提示词。

步骤 2:编写一个初步的系统提示词

我们以“AI 健身教练”为例。首先写一个简单版本,只包含角色和任务:

basic_coach_prompt = """
你是一个健身教练。请根据用户的目标提供健身建议。
"""

然后测试它,看看输出是否足够专业和个性化。我们将使用之前的 API 调用函数。

新建 system_prompt_design.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 chat_with_system(system_prompt: str, user_input: str, temperature: float = 0.7) -> str:
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_input}
        ],
        temperature=temperature,
        max_tokens=500
    )
    return response.choices[0].message.content

# 测试基础版
basic_prompt = "你是一个健身教练。请根据用户的目标提供健身建议。"
user_input = "我想减肥,但平时工作很忙,没时间去健身房,该怎么办?"
print("========== 基础版系统提示词 ==========")
print(chat_with_system(basic_prompt, user_input))

运行后,你会发现模型给出了比较通用的建议,但没有询问用户的具体情况(如体重、饮食、运动基础),也没有个性化的计划。这说明简单的角色设定不够。

步骤 3:编写结构化的高级系统提示词

现在,我们根据之前提到的要素,重新设计系统提示词:

advanced_coach_prompt = """
# 角色
你是一位拥有十年经验的私人健身教练,擅长为忙碌的上班族制定高效、可行的减脂和增肌计划。

# 背景
用户通常时间紧张,缺乏专业健身知识,容易因为看不到效果而放弃。你需要提供科学、实用、易于坚持的建议。

# 任务
根据用户提供的信息(如目标、时间安排、身体状况等),制定个性化的健身和饮食建议。如果信息不足,请主动询问关键细节(如身高体重、运动频率、饮食习惯、有无伤病等)。

# 约束
- 不得提供医疗建议,如有伤病或健康问题请建议咨询医生。
- 建议必须现实可行,不能要求用户每天锻炼两小时或购买昂贵器材。
- 语气积极鼓励,避免打击用户信心。

# 输出格式
用自然语言回复,但建议部分请分点列出,每点包含行动项和简要理由。

# 示例
用户:我想减肥,工作很忙,每天只有 30 分钟。
你:好的!30 分钟足够做高效训练。以下是我的初步建议:
1. 高强度间歇训练(HIIT)每周 3 次,每次 20 分钟,快速燃脂。
2. 利用碎片时间增加活动量,如爬楼梯、步行上下班。
3. 饮食上控制主食摄入,增加蛋白质和蔬菜比例。
请问你的身高体重是多少?这样我可以更精确地计算热量。

# 开始对话
"""

测试这个高级版:

print("\n========== 高级版系统提示词 ==========")
print(chat_with_system(advanced_coach_prompt, user_input))

你会发现模型会先询问用户的详细信息,然后给出初步建议,并且分点清晰,语气积极。这就是系统提示词设计的威力。

步骤 4:使用 LangChain 管理系统提示词

在工程实践中,我们通常使用 LangChain 来管理提示词模板,使得提示词可以复用、参数化。下面我们演示如何使用 SystemMessageChatPromptTemplate

安装 LangChain(如果尚未安装):

pip install langchain langchain-openai

然后编写代码:

from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

# 初始化 LangChain 的 ChatOpenAI
llm = ChatOpenAI(
    model="deepseek-chat",
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url="https://api.deepseek.com",
    temperature=0.7
)

# 定义系统提示词模板
system_template = """
# 角色
你是一位拥有十年经验的私人健身教练,擅长为忙碌的上班族制定高效、可行的减脂和增肌计划。

# 背景
用户通常时间紧张,缺乏专业健身知识,容易因为看不到效果而放弃。你需要提供科学、实用、易于坚持的建议。

# 任务
根据用户提供的信息(如目标、时间安排、身体状况等),制定个性化的健身和饮食建议。如果信息不足,请主动询问关键细节(如身高体重、运动频率、饮食习惯、有无伤病等)。

# 约束
- 不得提供医疗建议,如有伤病或健康问题请建议咨询医生。
- 建议必须现实可行,不能要求用户每天锻炼两小时或购买昂贵器材。
- 语气积极鼓励,避免打击用户信心。

# 输出格式
用自然语言回复,但建议部分请分点列出,每点包含行动项和简要理由。
"""

# 创建 ChatPromptTemplate
prompt_template = ChatPromptTemplate.from_messages([
    ("system", system_template),
    ("user", "{user_input}")
])

# 构建消息
def chat_with_langchain(user_input: str):
    messages = prompt_template.format_messages(user_input=user_input)
    response = llm.invoke(messages)
    return response.content

print("\n========== 使用 LangChain ==========")
print(chat_with_langchain(user_input))

这样,系统提示词就与业务逻辑分离,便于维护和修改。

步骤 5:系统提示词的调试与优化

设计系统提示词往往需要多次迭代。以下是一些调试技巧:

  • 观察输出是否符合约束:比如是否给出了医疗建议?如果有,加强约束。
  • 测试边界情况:例如用户输入“我有心脏病,怎么锻炼?”,模型应该建议咨询医生。
  • 调整语气:如果输出过于机械,可以在提示词中加入更多情感描述。
  • 加入 Few-shot:如果模型仍然偏离要求,提供 1-2 个标准对话示例。

我们可以测试一下边界情况:

edge_input = "我有高血压,还能做 HIIT 吗?"
print("\n========== 边界测试 ==========")
print(chat_with_system(advanced_coach_prompt, edge_input))

观察模型是否遵守了“不得提供医疗建议”的约束。


三、常见问题与调试

Q1:系统提示词写得很详细,但模型仍然不遵守某些规则。
→ 可以尝试:

  • 将最重要的规则放在提示词开头或结尾(首因效应和近因效应)。
  • 使用更强烈的措辞,例如“必须”、“严禁”、“绝对禁止”。
  • 提供反例或强调违反后果(但不宜过度)。
  • 降低 temperature,增加确定性。

Q2:系统提示词太长会不会影响模型性能?
→ 系统提示词会占用上下文窗口,并且可能导致模型“迷失”在大量指令中。建议简洁明了,重点突出。如果规则很多,可以分条列出,或使用 Markdown 格式增加可读性。通常 500-1000 字以内比较合适。

Q3:如何让系统提示词适应不同的用户?
→ 可以使用参数化的方式,例如在系统提示词中留出占位符,根据用户信息动态填充。比如加入用户姓名、偏好等。LangChain 的模板很好地支持了这一点。

Q4:系统提示词和用户提示词的分工是什么?
→ 系统提示词定义“你是谁、你的规则、任务背景”,用户提示词描述“当前具体要做什么”。两者配合,使模型既有全局约束又有局部目标。在 Agent 中,系统提示词通常还包含可用工具的说明和决策规则。

Q5:如何评估系统提示词的好坏?
→ 可以通过构建测试集,评估输出是否满足要求(格式正确、内容相关、约束遵守)。也可以使用另一个模型或人工进行评分。在实际项目中,迭代优化是常态。


四、今日总结与作业

今天你完成了:

  • ✅ 理解了系统提示词的核心要素及其作用。
  • ✅ 编写了一个结构化的“AI 健身教练”系统提示词,并通过实验对比了基础版和高级版的差异。
  • ✅ 学习了使用 LangChain 管理系统提示词模板。
  • ✅ 掌握了调试和优化系统提示词的常用方法。

今日作业(必做):

  1. 选择一个你感兴趣的角色(如“AI 旅行规划师”、“AI 编程导师”、“AI 心理咨询师”),按照今天的框架(角色、背景、任务、约束、输出格式、示例)编写一个完整的系统提示词。要求至少 300 字,并测试 3 个不同的用户输入,记录输出效果。
  2. 使用 LangChain 的 ChatPromptTemplate 实现你的系统提示词,并添加一个参数(如用户姓名),在对话中让模型能够称呼用户。
  3. 思考:在构建一个多智能体系统时,不同 Agent 的系统提示词如何设计才能避免角色混淆?请用 150 字以内简要说明你的方案。

明日预告: 我们将进行第二周的阶段总结——项目复盘,通过一个综合实战“简历优化器”来巩固所学知识,并整理代码到 GitHub。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值