【手搓 AI Agent 从 0 到 1】第二课:一句话让 AI 变身任何角色
📦 本文配套完整源码 + 系统提示词模板库 + 10种角色预设代码,已打包整理
👇 关注公众号「开源情报局」,回复「Agent」一键领取(含下期预告提前看)
前言:为什么同一个模型能"变成"不同的人?
你可能已经注意到了一个神奇的现象:
- 同一个模型,有时候像个严谨的教授,有时候又像个话痨
- 问同样的问题,回复风格可以天差地别
秘密就在系统提示词(System Prompt)。
它是你在和模型对话之前,悄悄塞给它的"人设说明书"。模型拿到说明书之后,就会按照你设定的角色来回答。
💡 系统提示词 = 给 AI 发的"入职岗位描述"
你告诉它:“你是 Python 老师”,它就循循善诱。
你告诉它:“你是代码审查员”,它就开始挑毛病。
今天这课学什么?
| 目标 | 说明 |
|---|---|
| 🎯 本课产出 | 一个可切换角色的 AI 助手脚本 |
| 🔧 核心技能 | 编写 System Prompt、控制模型行为 |
| ⏱ 预计耗时 | 15 分钟跟着操作 |
前置要求: 已完成 第一课 的环境搭建(Ollama + Qwen2.5:7B)
🔧 还没装好环境?关注公众号「开源情报局」回复「Agent」,领取第一课完整源码包快速上手。
第一步:理解 System Prompt 的原理
模型怎么"听"到你的指令?
大多数大模型都理解这个指令层级:
| 层级 | 名称 | 作用 | 优先级 |
|---|---|---|---|
| ① | System Prompt(系统提示词) | 定义角色、语气、行为规范 | ⭐⭐⭐ 最高 |
| ② | User Prompt(用户提示词) | 用户实际提出的问题或请求 | ⭐⭐ |
| ③ | Assistant Output(输出) | 模型在上述两层约束下的回答 | ⭐ |
示例:
| 层级 | 内容 |
|---|---|
| ① System Prompt | "你是 Python 编程老师,用简单的话解释概念" |
| ② User Prompt | "什么是装饰器?" |
| ③ Assistant Output | "装饰器就像给函数穿了一件外衣..." |
System Prompt 有更高的"优先级" — 它指导模型如何理解和回应用户的问题。
关键认知:行为 ≠ 智能
同一个模型,换不同的 System Prompt:
| System Prompt | 回复风格 | 本质变化? |
|---|---|---|
| “你是技术专家” | 专业、精确、带术语 | ❌ 没有 |
| “你是小学老师” | 简单、通俗、用类比 | ❌ 没有 |
| “只允许1-2句话回答” | 极简、不展开 | ❌ 没有 |
模型没变,变的是对输出的约束。 就像同一个人穿上不同的工装,干不同的活。
第二步:写你的第一个 System Prompt
先感受一下效果。下面是 3 个经典角色设定,每个都会让模型的回复产生截然不同的风格:
🎓 角色一:Python 编程老师
你是一位冷静、精准的老师,总是用简单的方式解释概念。解释技术话题时务必使用代码示例。
✍️ 角色二:像跟5岁小孩解释(ELI5)
你用简单的词语和日常类比来解释复杂主题。绝不使用未经解释的专业术语。
🔍 角色三:严格代码审查员
你是一位高级软件工程师,负责审查代码中的 bug 和安全问题。指出每一个潜在问题并给出具体的改进建议。
第三步:用代码实现(基础版)
下面是核心实现方式 — 把 System Prompt 通过 messages 参数注入到对话中。
先理解 messages 的结构
Ollama 兼容 OpenAI 的消息格式,用 messages 数组来组织一次完整的对话。每条消息有 role(角色)和 content(内容)两个字段:
| role | 含义 | 对应什么 | 示例 |
|---|---|---|---|
"system" |
系统提示词 | 给模型的人设/行为规范 | "你是Python老师" |
"user" |
用户输入 | 读者实际问的问题 | "什么是装饰器?" |
"assistant" |
模型输出 | 模型生成的回复(多轮时用到) | (不需要我们填,模型自动生成) |
关键点: messages 是一个列表,顺序很重要 — system 放最前面,然后是 user 的提问。模型会按照这个顺序"阅读"所有消息后生成回复。
完整代码
把上面三种角色的 System Prompt 分别作为 role: "system" 的消息发出去,再配上同一个 user 问题:
def generate_with_role(system_prompt: str, user_input: str, model="qwen2.5:7b"):
"""
使用 System Prompt 控制模型行为的对话函数
"""
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama"
)
# 👇 核心:把角色设定放在 system 角色,用户问题放在 user 角色
response = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": system_prompt}, # ← 第一步:告诉AI它是什么角色
{"role": "user", "content": user_input} # ← 第二步:发送用户的问题
],
stream=False
)
return response.choices[0].message.content
# ====== 测试:同一问题,三种角色 ======
question = "什么是 AI Agent?"
# 角色1:编程老师
teacher_prompt = "你是一位耐心的编程老师,用简单的话解释概念。"
print("【老师模式】")
print(generate_with_role(teacher_prompt, question))
print()
# 角色2:大白话解释
eli5_prompt = "你用最简单的大白话和日常比喻来解释事物。"
print("【大白话模式】")
print(generate_with_role(eli5_prompt, question))
print()
# 角色3:极简回答
concise_prompt = "你最多用2句话回答,绝不多说。"
print("【极简模式】")
print(generate_with_role(concise_prompt, question))
运行效果对比:
| 模式 | 输出 |
|---|---|
| 🎓 老师模式 | “AI Agent 就是一个能够自主决策和行动的人工智能程序或系统。想象一下,你有一个虚拟助手,它可以帮你完成一些任务或者解决一些问题,这就是一个简单的 AI Agent。…” |
| 🗣 大白话模式 | “AI Agent 就像是一个能自主做决定的小机器人。想象一下,你在玩电子游戏里有一个小角色,…” |
| ⚡ 极简模式 | “AI Agent是具有自主功能的智能实体,能在环境中感知并行动。” |
相同的问题,相同的模型,完全不同的回复。 只是因为 messages[0] 里那条 system 角色的内容不一样。这就是 System Prompt 的力量。
🎁 进阶内容:完整项目源码 + 更多玩法
上面是基础版,让你快速理解原理。要做出真正实用的东西,你还需要:
公众号源码包中包含的内容:
| 内容 | 说明 | 文件 |
|---|---|---|
| 📦 完整 Agent 类封装 | Agent 类,支持动态切换角色、流式输出、历史记忆管理 |
agent.py |
| 🎭 10 种预设角色模板 | Python老师 / 代码审查员 / 产品经理 / 翻译官 / 创意写作… | roles.py |
| 🔧 命令行交互程序 | 运行后可随时切换角色进行对话的完整 CLI 工具 | complete_example.py |
| ⚙️ 高级技巧:冲突指令处理 | 当 System Prompt 内部矛盾时,谁会赢?实验报告 | 技巧文档 |
| 🐛 Debug 手册 | “模型忽略我的提示词怎么办?”“回复不一致怎么调?” | FAQ文档 |
| 📊 System Prompt 最佳实践清单 | 长度控制 / 温度调节 / 格式约束的完整指南 | 实践指南 |
👇 关注公众号「开源情报局」,回复「Agent」一键获取全部资源包:
System Prompt 设计模式速查
掌握了原理之后,这里有 4 种常用设计模式,直接套用就行:
模式一:角色定义
You are a [role] who [behavior].
例:你是一个资深前端工程师,擅长发现 UI 问题并给出改进方案。
模式二:约束设置
You must [requirement]. You never [prohibition].
例:你必须用 Markdown 格式回复代码块。你绝不使用 emoji。
模式三:输出格式控制
Always respond with [format]. Use [style].
例:每次回复必须包含:1) 直接答案 2) 示例 3) 注意事项 三段式结构。
模式四:组合拳(推荐)
你是一个有帮助的技术导师。
你用清晰的步骤和代码示例解释概念。
除非被要求展开,否则将回复控制在150字以内。
每次回答最后加一句总结性的"一句话要点"。
💡 组合模式效果最好 — 同时定义角色 + 约束 + 格式,模型的行为一致性最高。
常见踩坑(FAQ)
❓ 模型完全无视我的 System Prompt 怎么办?三个排查方向:
- 模型能力差异 — 有些模型比其他模型更遵循指令。Qwen2.5:7B 的指令跟随能力已经不错了
- 不够具体 — “你要专业一点” 太模糊 → 改为 “你用学术语言,每段引用至少一个概念”
- 语气太弱 — “尝试…” → 改为 “你必须…”
这是正常的!LLM 本质是概率性的。想要更高的一致性:
- 降低
temperature参数(建议 0.3~0.5) - System Prompt 里加更硬性的格式约束
- 第三课我们会讲结构化输出,进一步解决一致性问题
- 建议 100~200 字以内
- 太长会占用上下文窗口,留给用户输入的空间就少了
- 太短则约束力不足,模型容易"跑偏"
🔧 更多实战经验和调试技巧,已整理到源码包 Debug 手册中。
练习任务
自己动手试一试,感受 System Prompt 的魔力:
- ✅ 用上面的基础代码跑通三种角色切换
- ✅ 写一个让 AI **只回答"是/否"**的极端约束 Prompt
- ✅ 写一个让 AI 每次回复都超过500字的详细模式 Prompt
- 🔥 挑战题: 尝试在同一个 Prompt 中设置两个互相矛盾的指令,观察哪个会赢?(答案在公众号源码包中有完整实验记录)
下期预告
第三课:让 AI 说"人话" — 结构化输出
学完这课,你将能让 AI 的回复:
- 📋 变成可靠的 JSON 格式,程序可以直接解析
- ✅ 带字段验证,不再出现格式错误
- 🔄 实现稳定的数据提取,为后续工具调用打基础
从自由文本到结构化数据,这是从"聊天玩具"到"实用工具"的关键一步。
📢 获取完整源码 + 全套资源包
第一步: 扫码或搜索关注公众号 「开源情报局」
第二步: 在公众号后台回复关键字 「Agent」
第三步: 自动收到完整资源包(含 第一课+第二课 全部源码 + 10种角色模板 + Debug 手册 + API速查表)
⚡ 回复后秒发,不用等待审核。
如果你觉得这篇教程有帮助,点个「在看」让更多人看到~
本文为《手搓 AI Agent 从 0 到 1》系列教程第 2 课,持续更新中。回复「Agent」不错过每一课
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)