System、User、Assistant 消息

要点

  • System 消息设定 AI 的行为和约束,是整个对话的基础
  • User 消息是用户的输入,应该清晰、具体
  • Assistant 消息是 AI 的回复,也用于引导对话风格
  • 三种消息角色的合理搭配决定了 AI 的输出质量
  • System Prompt 的设计是 AI 应用的核心竞争力之一
  • 不同场景需要不同的消息组合策略

1. System 消息

1.1 作用

System 消息设定 AI 的「人格」和行为规则:

{
  role: 'system',
  content: '你是一位专业的编程导师,用简单的语言解释概念,多用例子。'
}

1.2 设计原则

明确角色

// ❌ 模糊
{ role: 'system', content: '你是一个助手' }
 
// ✅ 明确
{
  role: 'system',
  content: '你是一位有 10 年经验的全栈工程师,专注于 React 和 Node.js。'
}

设定行为

{
  role: 'system',
  content: `
你是一位编程导师。
 
行为规则:
1. 用简单的语言解释概念
2. 总是提供代码示例
3. 如果用户的问题不清楚,先澄清再回答
4. 鼓励用户思考,而不是直接给答案
5. 回答控制在 200 字以内
`
}

设定约束

{
  role: 'system',
  content: `
你是一位技术写作专家。
 
约束:
- 不使用专业术语,除非必要
- 必须使用中文
- 不使用表情符号
- 不使用反问句
- 回答必须基于事实,不编造信息
`
}

1.3 常见场景

代码审查

{
  role: 'system',
  content: `
你是一位资深的代码审查专家。
 
你的职责:
1. 找出代码中的 bug 和潜在问题
2. 提出性能优化建议
3. 检查代码风格是否符合规范
4. 给出具体的改进建议
 
输出格式:
- 问题:描述问题
- 严重程度:高/中/低
- 建议:如何修复
`
}

客服机器人

{
  role: 'system',
  content: `
你是 XX 公司的客服助手。
 
规则:
1. 友好、专业、耐心
2. 只回答与产品相关的问题
3. 不确定的问题转接人工客服
4. 不讨论竞争对手
5. 不承诺无法实现的功能
 
产品信息:
- 产品 A:价格 99 元/月,功能包括...
- 产品 B:价格 199 元/月,功能包括...
`
}

创意写作

{
  role: 'system',
  content: `
你是一位科幻小说作家,风格类似刘慈欣。
 
特点:
- 宏大的宇宙观
- 硬科幻风格,科学细节准确
- 深刻的人性探讨
- 出人意料的反转
 
写作要求:
- 使用生动的描写
- 注重细节
- 保持逻辑一致性
`
}

2. User 消息

2.1 基本格式

{
  role: 'user',
  content: '什么是闭包?'
}

2.2 多行内容

{
  role: 'user',
  content: `
请审查以下代码:
 
\`\`\`typescript
function add(a, b) {
  return a + b
}
\`\`\`
 
要求:
1. 检查类型安全
2. 提出改进建议
`
}

2.3 提供上下文

{
  role: 'user',
  content: `
我正在开发一个电商网站,使用 Next.js 和 Prisma。
 
问题:如何实现购物车功能?
 
要求:
- 支持未登录用户(使用 localStorage)
- 支持登录用户(保存到数据库)
- 实时同步
`
}

2.4 指定输出格式

{
  role: 'user',
  content: `
分析以下数据,以 JSON 格式返回:
 
数据:
- 产品 A:销量 100,收入 10000
- 产品 B:销量 50,收入 8000
- 产品 C:销量 200,收入 15000
 
输出格式:
{
  "totalSales": number,
  "totalRevenue": number,
  "bestSelling": string,
  "insights": string[]
}
`
}

2.5 使用示例(Few-Shot)

{
  role: 'user',
  content: `
将以下评论分类为正面、负面或中性。
 
示例:
评论:这个产品太棒了!
分类:正面
 
评论:质量很差,失望
分类:负面
 
评论:一般般,没什么特别的
分类:中性
 
现在分类:
评论:${userComment}
分类:
`
}

3. Assistant 消息

3.1 正常的 AI 回复

Assistant 消息通常是 AI 的回复,自动保存在对话历史中:

// AI 的回复
{
  role: 'assistant',
  content: '闭包是指一个函数可以访问其外部作用域中的变量...'
}

3.2 预设回复风格

可以预设 assistant 消息来引导 AI 的回复风格:

const messages = [
  { role: 'system', content: '你是一位编程导师。' },
 
  // 预设一个示例回复,展示期望的风格
  {
    role: 'user',
    content: '什么是变量?'
  },
  {
    role: 'assistant',
    content: '变量就像一个盒子,你可以在里面放东西。比如:\n\n```typescript\nconst name = "Alice"  // name 这个盒子里放着 "Alice"\n```\n\n你想往盒子里放什么都可以!'
  },
 
  // 现在的用户问题
  {
    role: 'user',
    content: '那什么是常量?'
  },
]

AI 会模仿预设回复的风格。

3.3 Function Calling

AI 决定调用工具时,会生成特殊的 assistant 消息:

{
  role: 'assistant',
  content: null,  // 没有文本内容
  tool_calls: [
    {
      id: 'call_abc123',
      type: 'function',
      function: {
        name: 'get_weather',
        arguments: '{"city": "北京"}'
      }
    }
  ]
}

3.4 中间推理过程

某些场景下,可以让 AI 展示推理过程:

{
  role: 'assistant',
  content: '让我一步步思考这个问题...\n\n首先... 然后... 所以...'
}

4. 消息组合策略

4.1 单轮对话

const messages = [
  { role: 'system', content: '你是一位编程导师。' },
  { role: 'user', content: '什么是递归?' },
]

4.2 多轮对话

const messages = [
  { role: 'system', content: '你是一位编程导师。' },
 
  // 历史对话
  { role: 'user', content: '什么是变量?' },
  { role: 'assistant', content: '变量是...' },
 
  { role: 'user', content: '什么是常量?' },
  { role: 'assistant', content: '常量是...' },
 
  // 当前问题
  { role: 'user', content: '它们的区别是什么?' },
]

4.3 RAG(检索增强生成)

const messages = [
  {
    role: 'system',
    content: '根据提供的上下文回答问题。如果上下文中没有答案,说"我不知道"。'
  },
  {
    role: 'user',
    content: `
上下文:
${retrievedContext}
 
问题:${userQuestion}
`
  },
]

4.4 Function Calling

const messages = [
  { role: 'system', content: '你可以使用工具帮助用户。' },
  { role: 'user', content: '北京今天天气怎么样?' },
 
  // AI 决定调用工具
  {
    role: 'assistant',
    tool_calls: [{ id: 'call_1', function: { name: 'get_weather', arguments: '{"city":"北京"}' } }]
  },
 
  // 工具返回结果
  {
    role: 'tool',
    tool_call_id: 'call_1',
    content: '{"temperature": 25, "condition": "晴天"}'
  },
 
  // AI 基于结果回答
  {
    role: 'assistant',
    content: '北京今天晴天,温度 25°C。'
  },
]

5. 最佳实践

5.1 System Prompt 放在最前面

// ✅ 正确
const messages = [
  { role: 'system', content: '...' },
  { role: 'user', content: '...' },
]
 
// ❌ 错误
const messages = [
  { role: 'user', content: '...' },
  { role: 'system', content: '...' },  // 可能不会生效
]

5.2 保持 System Prompt 简洁

// ❌ 太长,可能影响效果
{
  role: 'system',
  content: `
你是一位非常专业的编程导师,你有很多年的经验,你擅长各种编程语言,
包括 JavaScript、Python、Java、C++ 等等。你的任务是帮助用户学习编程,
你非常耐心,总是用简单的语言解释复杂的概念...
(后面还有 500 字)
`
}
 
// ✅ 简洁有力
{
  role: 'system',
  content: '你是资深编程导师,擅长用简单语言解释复杂概念。'
}

5.3 使用结构化格式

// ✅ 使用清晰的格式
{
  role: 'system',
  content: `
# 角色
你是一位技术写作专家。
 
# 任务
将技术内容转化为易懂的教程。
 
# 规则
1. 使用简单的语言
2. 多用例子
3. 避免术语
 
# 输出格式
Markdown 格式,包含标题、段落、代码块。
`
}

5.4 测试不同的组合

// 测试不同的 system prompt
const systemPrompts = [
  '你是一位编程导师。',
  '你是资深工程师,帮助初学者学习编程。',
  '你是编程教练,用鼓励的方式教学。',
]
 
for (const prompt of systemPrompts) {
  const messages = [
    { role: 'system', content: prompt },
    { role: 'user', content: '什么是递归?' },
  ]
 
  const response = await callLLM(messages)
  console.log(`System: ${prompt}`)
  console.log(`Response: ${response}`)
  console.log('---')
}

5.5 动态构建 System Prompt

function buildSystemPrompt(user: User, context: Context) {
  const parts = [
    '你是一位友好的编程导师。',
  ]
 
  // 根据用户水平调整
  if (user.level === 'beginner') {
    parts.push('用户是初学者,请用简单的语言,多用例子。')
  } else if (user.level === 'advanced') {
    parts.push('用户是高级开发者,可以使用专业术语。')
  }
 
  // 根据上下文调整
  if (context.topic === 'security') {
    parts.push('当前话题是安全相关的,请特别注意准确性。')
  }
 
  return parts.join('\n')
}
 
// 使用
const systemPrompt = buildSystemPrompt(user, context)
const messages = [
  { role: 'system', content: systemPrompt },
  { role: 'user', content: userMessage },
]

6. 常见错误

6.1 System Prompt 太模糊

// ❌ 太模糊
{ role: 'system', content: '你是一个助手' }
 
// ✅ 具体
{ role: 'system', content: '你是 React 专家,帮助开发者解决 React 相关问题。' }

6.2 矛盾的规则

// ❌ 矛盾
{
  role: 'system',
  content: `
回答要简洁。
请详细解释每个概念。
`
}
 
// ✅ 一致
{
  role: 'system',
  content: '回答控制在 200 字以内,但重要的概念要解释清楚。'
}

6.3 忽略消息顺序

// ❌ 顺序混乱
const messages = [
  { role: 'user', content: '问题 2' },
  { role: 'assistant', content: '回答 1' },
  { role: 'user', content: '问题 1' },
]
 
// ✅ 按时间顺序
const messages = [
  { role: 'user', content: '问题 1' },
  { role: 'assistant', content: '回答 1' },
  { role: 'user', content: '问题 2' },
]

总结

System、User、Assistant 三种消息角色各有其用途,合理搭配能显著提升 AI 的输出质量。

这一节涉及到的几个实践:

  1. System 消息:设定角色、行为、约束,是整个对话的基础
  2. User 消息:清晰、具体、提供上下文
  3. Assistant 消息:AI 的回复,也可用于引导风格
  4. 消息组合:单轮、多轮、RAG、Function Calling
  5. 最佳实践:简洁、结构化、测试、动态构建
  6. 常见错误:模糊、矛盾、顺序混乱

System Prompt 的设计是 AI 应用的核心竞争力。好的 System Prompt 让 AI 更准确地理解你的需求,产出更高质量的回答。

下一篇看多轮对话上下文——如何管理和优化长对话。