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 的输出质量。
这一节涉及到的几个实践:
- System 消息:设定角色、行为、约束,是整个对话的基础
- User 消息:清晰、具体、提供上下文
- Assistant 消息:AI 的回复,也可用于引导风格
- 消息组合:单轮、多轮、RAG、Function Calling
- 最佳实践:简洁、结构化、测试、动态构建
- 常见错误:模糊、矛盾、顺序混乱
System Prompt 的设计是 AI 应用的核心竞争力。好的 System Prompt 让 AI 更准确地理解你的需求,产出更高质量的回答。
下一篇看多轮对话上下文——如何管理和优化长对话。