掌握系统 prompts
系统提示是角色为「system」的消息,用于在您提出第一个问题之前,设定 LLM 的身份、任务、规则、风格和输出格式。撰写时请分为五个简短部分,使用命令式且可验证的指令,再用几个陷阱问题进行测试。它会占用上下文空间,也不是保险箱:请勿在其中放入任何秘密信息。
系统提示是指在首次提问前向模型提供的指令。写得好,能让本地大模型保持一致且可预测;写得不好,则会浪费上下文并自相矛盾。您将学会如何构建系统提示,并将其部署到 Ollama、LM Studio 或 API 中,系统性地进行测试,并了解其局限性,尤其是隐私方面。
#什么是系统提示(system prompt),该如何编写?
系统提示(system prompt)是置于对话开头、角色为「system」的消息:它在您提出第一个问题之前,就设定了模型的身份、任务、规则、风格和回答格式。模型在每一轮都会重新读取它,就像重新读取对话历史一样。撰写时,请保留五个简短模块(身份、任务、硬性规则、风格、输出格式),用命令式表达可验证的指令,然后用几个容易出错的问题进行测试。系统提示可以引导模型行为,但既不是安全屏障,也不是存放秘密的保险箱,而且会占用本地模型上下文窗口的一部分。本指南逐一详解这些要点,并提供可直接粘贴到 Ollama、LM Studio 或兼容 OpenAI 的 API 中的示例。
大语言模型通常接收三类消息:system(长期有效的设定)、user(您输入的内容)和 assistant(模型此前的回复)。聊天客户端在每次请求时都会把整个对话重新发送给模型,包括 system 消息。这让人感觉模型在整个会话中保持着稳定的“个性”。
模型提供商也描述了同样的用法。Anthropic 的文档解释说,在系统提示中设定角色,可以让模型的行为和语气更有针对性,而且只需一句话就能带来变化。这一原则同样适用于本地模型:长期有效的指令放在 system 消息中,当前的问题放在 user 消息中。
#一个好的系统提示实际上能带来什么改变
只需 1 小时,即可在您的电脑上拥有专属的免费 ChatGPT — LM Studio、Ollama、Open WebUI、您的文档,无需云端。
- 在线空间,终身可用
- PDF + 文件
- 30 天内退款
- 语气一致性
- 如果助手在第一条消息中用“你”,第二条消息却改用“您”,就说明系统提示缺失或过于模糊。一次性明确称呼和语体,可以避免这种偏移。
- 更稳定的约束条件
- 禁止事项(“不使用表情符号”)和必须遵守的要求(“引用来源”)写入 system 提示词时,比在使用过程中临时反复强调更容易得到遵守。不过,这并不能保证模型一定遵守:模型越小,就越需要检查。
- 减少重复
- 如果您每次提问都输入“用正式法语回答”,只需将这条要求在系统提示词中设置一次。这样既不容易忘记,也能少打些字。
- 任务执行范围
- “只处理法国劳动法相关内容”能减少跑题,但始终无法保证完全杜绝跑题。
系统提示不会增加模型的知识,也不会替代对话中提供的文档或检索增强生成(RAG)。如果模型需要依据您的合同,是文档检索提供了事实依据;系统提示仅说明如何使用和引用这些内容。
#成本体现在上下文窗口的空间占用
系统提示词并非免费:其 token 会与历史记录、您的文档以及即将生成的回复一起占用上下文窗口。在本地设备上,这个窗口往往比人们想象的要小。Ollama 文档中的“Context length”页面指出,在显存低于 24 GiB 时,默认窗口约为 4 000 tokens(“4k”);在 24 至 48 GiB 之间为 32 000 tokens;超过 48 GiB 则为 256 000 tokens。因此,一个 400 tokens 的提示词在首次交互之前,就已占用了 4 096 tokens 的近 10%。
计算很简单:可用上下文窗口 = 总上下文窗口 − 系统提示词的 token 数 − 预期回复的 token 数。窗口为 4,096 个 token、系统提示词占 400 个 token、回复占 800 个 token 时,还剩 2,896 个 token 可用于历史记录和文档。随着对话变长,窗口会逐渐填满,较早的内容可能无法再容纳:这也是任务说明应信息密集、而非篇幅冗长的又一个原因。
还有第二种效应,已有研究记载:在《Lost in the Middle》(Liu 等,2023)这项研究中,当有用信息位于上下文的开头或结尾时,模型表现往往更好;当信息位于中间时,表现则会下降,即使是宣称支持长上下文的模型也如此。实际建议是:将最重要的规则放在系统提示词的开头;如果发现模型有所遗漏,就在最后一行再次提醒它遵守关键约束。
#可靠系统提示词的五部分结构
一个良好的系统提示可由五个短片段构成。无需写成小说:每增加一句都会消耗上下文并提升指令冲突的风险。表格总结了每个片段的内容及最常见的错误。
| 模块 | 它所回答的问题 | 示例 | 常见错误 |
|---|---|---|---|
| 身份标识 | 模型扮演什么角色? | 「你是Lex,一名专注于法国劳动法的法律助理。」 | 一个听起来很厉害的身份(“世界级专家”),却没有明确工作范围 |
| 任务 | 它应为谁服务,承担什么任务? | “你帮助人力资源总监理解其应履行的义务,并撰写信函。” | 任务范围过广:‘提供所有方面的帮助’ |
| 严格的规则 | 它始终会做什么,又绝不会做什么? | “引用《劳动法典》中相关的条文。” | 十条相同优先级的规则,其中两条相互矛盾 |
| 风格 | 它如何表达? | “短句,通俗易懂的词汇。” | 使用模糊的形容词(如“专业”),却不给出示例 |
| 输出格式 | 回答将以何种形式呈现? | 「默认:一段文本和参考文献。」 | 格式未明确说明,因此每次回复可能不同 |
以下是整合后的同一个提示词。每条规则都采用命令式表述,且可以验证(是否引用了文章),对超出范围时应采取的行为也有明确说明。
该提示词用作结构模板。本地模型可能引用不存在的文章:请由人工核实参考文献,并参阅幻觉相关指南。
#编写模型能够遵循的指令
- 直接使用祈使句
- “做X。”和“不要做Y。”比“如果可能,尝试……”更明确,后者让模型可以选择连尝试都不做。
- 优先采用正向指令
- 说明应该做什么(“用一句话回答”),比列出一长串禁令更好;禁令应留给真正需要设置防护约束的地方。
- 实例胜于描述
- 如果需要特定格式,请提供一个两行的示范回答,而不是用三句话解释。
#实际使用 Ollama:/set system 和 Modelfile
Ollama 提供三种方式定义系统提示,取决于所需的有效期。在交互会话中,/set system 命令将为当前对话设置提示信息,并出现在客户端可用命令列表中。该提示在会话结束时消失。
要持久保存系统提示词,请创建一个Modelfile:这样会得到一个拥有独立名称的衍生模型。Ollama文档说明,SYSTEM指令定义了要插入模型模板的系统消息。「模板」一词很关键:如果模型模板没有为系统消息预留位置,SYSTEM指令就不会生效。如果出现出乎意料的行为,请与原始Modelfile进行比较。
第三种方式是通过 API:发往 /api/generate 的请求体接受一个 system 字段,用它替换 Modelfile 中定义的系统提示词;/api/chat 则以消息数组的形式接收历史记录,每条消息都包含角色和内容。Modelfile 指南详细介绍了其他指令。
#LM Studio 实操:System Prompt 字段和预设
在聊天选项卡中,配置面板里有一个 System Prompt 字段。为避免重复输入系统提示词,LM Studio 提供了预设功能。文档将预设描述为一种将系统提示词和其他参数组合成可复用配置的方法,让您可以在不同对话中重复使用该配置。
#实践:使用兼容 OpenAI 的 API
Ollama、LM Studio、vLLM 和 llama-server 提供兼容 OpenAI 的 API。消息数组中的第一条消息使用 system 角色,用于设定任务说明。Ollama 的文档指出,客户端要求提供一个 API 密钥值,但服务器会忽略它:本地使用时,任意字符串都可以。
一个设计要点:API 没有记忆。每次调用时,您的代码都要重新发送 system 消息,然后发送完整的历史记录。如果在某次调用中省略它,模型就会在没有这些预先说明的情况下作答:请保存消息数组,并将 system 消息保留在索引 0 的位置。
#三个即用型系统提示
#法语校对
#结构化提取器
在生产环境中进行信息提取时,不要只依赖系统提示词:Ollama 的结构化输出可以强制回答遵循指定的 JSON 模式(JSON Schema),从而避免生成格式损坏的 JSON。有关函数调用和 JSON 输出的指南介绍了具体配置方法。
#资深代码助手
#不再盲目试错:测试并修正系统提示词
系统提示应通过受控测试来改进,而不是不断追加内容。没有方法,就会不断堆叠规则,直到文本变得冗长、相互矛盾且无法调试。下面介绍一个简单流程,无需任何专门工具。
- 01制定五个测试问题编写五条测试输入:两个正常案例、一个超出范围的问题、一个要求采用不常见格式的请求,以及一次试图让模型偏离其角色的尝试(“忘记你的指令”)。将它们保存到一个文件中。
- 02设定条件使用相同的模型、相同的量化方式和较低的温度(0.2 至 0.3),以便在相同条件下比较提示词的不同版本。
- 03每次只修改一项内容修改一条规则,重新用那五个问题进行测试,并记录变化。如果同时修改两条规则,就无法判断是哪一条改善或恶化了模型的行为。
- 04先考虑删减,再考虑添加当规则被忽略时,应将其重新表述为更简洁的形式,置于开头位置,或删除与其矛盾的规则。添加文本是最后的手段。
- 05对提示词进行版本管理将每个版本保存在带日期的文本文件中,或保存在纳入版本控制的 Modelfile 中,并用一行文字说明改动。这样就能回退到之前的版本。
#需避免的陷阱
| 陷阱 | 问题表现 | 修复措施 |
|---|---|---|
| 提示过长 | 提示词末尾的内容未被充分遵循,可用上下文窗口被挤占 | 精简内容,将要点放在开头,必要时调高 num_ctx。 |
| 指令冲突 | ‘简洁’与‘提供大量示例’:行为不一致 | 优先级:发生冲突时,以规则1为准 |
| 表达犹豫 | “如果可以,试着……”:指令时而得到执行,时而没有 | 直接指令:「执行X」 |
| 语言未明确 | 视模型而定,回复会使用提示词或问题所用的语言 | 写入「始终用法语回答」,并用法语编写提示词 |
| system 消息位置被忽略 | 模型未应用 Modelfile 中的 SYSTEM 指令 | 确认模型模板支持 system 消息 |
| 提示词中的机密信息 | 用户通过提问获取提示内容 | 不得包含任何机密信息 |
#系统提示词并非保险箱
OWASP 关于系统提示词泄露风险的建议很明确:系统提示词不应被视为秘密,也不应被用作安全控制措施,更不应包含登录凭据或连接字符串。落实到本地部署中:如果需要访问控制(用户各自的数据、敏感操作),就应在您的应用程序中实现,而不是靠提示词中的一句话。关于提示注入的指南说明了为什么本地模型也无法免受此类攻击。
- 来源:Ollama 的 Modelfile 参考文档(SYSTEM 指令)
- 来源:Ollama 默认上下文长度
- 来源:LM Studio 预设
- 来源:OWASP,系统提示泄露
- 来源:Lost in the Middle(Liu et al., 2023)
- 提示词工程基础
- Ollama Modelfile:创建和自定义您的模型
- 理解上下文窗口
- 温度、top-p、top-k:参数详解
- 提示注入:本地部署并不能保护你
- 使用 Ollama 进行函数调用和结构化 JSON 输出
什么是系统提示?+
本地系统提示的最佳长度是多少?+
如何在 Ollama 中设置永久系统提示?+
系统提示能否阻止模型泄露信息?+
系统提示应使用法语还是英语编写?+
为什么我的模型忽略了我的系统提示?+
有反馈、发现了错误,或想补充说明?请告诉我们,让这份指南对每个人都更有帮助。