📖 本章预览
本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。
第4章 Prompt 工程化 — 原理讲解与代码示例
4.1 Prompt 基础概念
4.1.1 什么是 Prompt Engineering
Prompt 是你与大模型之间的"接口协议"。传统编程中,我们通过函数签名、参数类型来约束输入输出;而在 LLM 世界里,Prompt 就是那个"函数签名"——它决定了模型理解什么、输出什么。
核心认知:
- Prompt 不是"问问题",而是"编程"——你在用自然语言编写一段程序
- 同一个模型,Prompt 不同,输出质量可能天差地别
- Prompt Engineering 的本质是:用最少的 Token 传递最精确的意图
4.1.2 Spring AI 中的 Prompt 抽象
Spring AI 将 Prompt 抽象为三层结构:
Prompt
├── List<Message> // 消息列表(对话上下文)
└── ChatOptions // 模型参数(temperature、maxTokens 等)
最简单的一次调用:
@Autowired
private ChatModel chatModel;
public String simpleCall() {
// 最基础的调用方式:直接传字符串
String response = chatModel.call("你好,请介绍一下 Spring AI");
return response;
}
使用 Prompt 对象的调用方式:
public String callWithPrompt() {
// 构建 Prompt 对象,可以携带多条消息和参数配置
Prompt prompt = new Prompt(
List.of(new UserMessage("请用一句话解释什么是 RAG")),
DashScopeChatOptions.builder()
.withModel("qwen-plus")
.withTemperature(0.7)
.build()
);
ChatResponse response = chatModel.call(prompt);
return response.getResult().getOutput().getText();
}
4.2 消息体系详解
4.2.1 SystemMessage(系统消息)
原理: SystemMessage 是对话的"宪法",它在整个对话过程中持续生效,定义了模型的角色、行为边界和输出规范。模型会将 SystemMessage 作为最高优先级的指令来遵循。
关键特性:
- 在消息列表中通常放在第一位
- 整个对话过程中只需设置一次
- 对模型输出风格、格式、安全边界有决定性影响
// 示例1:基础角色设定
public String basicSystemMessage() {
SystemMessage systemMessage = new SystemMessage(
"你是一位资深的 Java 架构师,擅长 Spring 生态。" +
"回答问题时请简洁专业,必要时给出代码示例。"
);
UserMessage userMessage = new UserMessage("Spring Bean 的生命周期是怎样的?");
Prompt prompt = new Prompt(List.of(systemMessage, userMessage));
return chatModel.call(prompt).getResult().getOutput().getText();
}
// 示例2:严格约束输出格式
public String formatConstraint() {
SystemMessage systemMessage = new SystemMessage("""
你是一个 API 文档生成器。
用户会给你一个 Java 方法签名,你需要生成对应的文档。
输出格式必须严格遵循:
- 第一行:方法用途(一句话)
- 第二行:参数说明(每个参数一行,格式:@param 参数名 说明)
- 第三行:返回值说明(格式:@return 说明)
不要输出任何多余内容。
""");
UserMessage userMessage = new UserMessage(
"public List<User> findByAgeGreaterThan(int minAge, int limit)"
);
Prompt prompt = new Prompt(List.of(systemMessage, userMessage));
return chatModel.call(prompt).getResult().getOutput().getText();
}
🔒 解锁完整内容
本章剩余内容需要解锁后查看
以上仅为本章部分预览内容,完整内容包含更多深度源码解析、实战代码和面试要点。
加入知识星球你将获得:
- ✅ 全部 26 章完整内容 + 持续更新
- ✅ 配套源码 + 实战项目
- ✅ 一对一答疑 + 面试辅导
- ✅ 简历优化 + 内推机会
📚 本章完整目录
以下为本章完整目录结构,加入知识星球即可解锁全部内容。