一、问题背景
大模型的输入机制与传统问答系统有本质区别。许多用户误将 Prompt 等同于自然语言提问,导致输出结果不可控。实际开发中,模型对输入文本的敏感度远超预期,细微的措辞变化可能引发完全不同的响应模式。这种现象源于语言模型的概率生成机制------模型并非"理解"问题,而是基于上下文概率分布生成最可能的续写。
二、Prompt 的本质:输入程序
将 Prompt 视为程序代码时,其设计需遵循明确的结构化逻辑。例如,在代码生成任务中,包含技术栈声明、代码风格要求的 Prompt 比简单提问"写一个排序函数"产出更优。这种机制类似于 SQL 查询,精心设计的 Prompt 能精准"查询"模型知识库中的特定部分,而模糊提问则可能触发泛化响应。
三、Prompt 的结构
一个完整的 Prompt 可以拆分为四部分:
-
Instruction(指令)
-
Context(上下文)
-
Input(输入)
-
Output Format(输出约束)
例如:
-
Instruction:你是一个Java专家
-
Context:提供相关文档
-
Input:解释HashMap
-
Output:用JSON格式返回
四、角色系统:System / User / Assistant
大模型通常支持三种角色:
-
system:定义行为规则
-
user:用户输入
-
assistant:历史回答
其中,具有最高优先级的System 角色用法包括:
- 设定响应温度参数(temperature=0.3)
- 禁用不安全内容生成
- 声明知识截止日期
OpenAI 的测试显示,合理使用 System 提示可将有害内容生成率降低 72%。
这使得我们可以对模型行为进行强约束。
五、Few-shot:通过示例控制模型
示例的质量比数量更重要:
- 正例:展示理想的输入输出对
- 反例:显式标注不可接受的响应(如:"错误示例:...")
Google Research 实验证明,3-5 个精心设计的示例即可达到 85% 以上的格式一致性。
所以在开发中可以通过示例(Few-shot)来引导模型:
Q: 1+1
A: 2
Q: 2+2
A: 4
这种方式可以显著提高输出稳定性。
六、Prompt 与 Token 的关系
Prompt 最终会被转换为 Token 序列:
-
system → Token
-
context → Token
-
user → Token
因此,Prompt 的设计不仅影响效果,也直接影响成本,对此可以进行优化策略:
- 优先精简 Context 部分
- 使用缩写(如"PEP8"而非"Python Enhancement Proposal 8")
- 避免重复语义
七、Spring AI 中的实现
在 Spring AI 中:
chatClient.prompt()
.system("你是一个Java专家")
.messages(history) // 注入对话历史
.user("解释HashMap")
.call();
本质上就是在构建一个结构化 Prompt。
八、工程实践建议
-
必须使用 system 约束模型行为
-
控制 Prompt 长度,避免 Token 浪费
-
明确输出格式(如 JSON)
-
对 Prompt 进行版本管理和测试