跳到主要内容
📖 本章预览

本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。

第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 章完整内容 + 持续更新
  • ✅ 配套源码 + 实战项目
  • ✅ 一对一答疑 + 面试辅导
  • ✅ 简历优化 + 内推机会

📚 本章完整目录

以下为本章完整目录结构,加入知识星球即可解锁全部内容。

4.2.2 UserMessage(用户消息)

4.2.3 AssistantMessage(助手消息)

4.2.4 消息组合与对话构建

4.3 PromptTemplate 模板引擎

4.3.1 模板引擎机制

4.3.2 从资源文件加载模板

4.3.3 模板与 SystemMessage 结合

4.3.4 模板管理最佳实践

4.4 结构化 Prompt 设计模式

4.4.1 角色设定模式(Role Prompting)

4.4.2 少样本提示(Few-Shot Prompting)

4.4.3 思维链提示(Chain-of-Thought, CoT)

4.4.4 其他高级 Prompt 模式

4.5 Prompt 版本管理与 A/B 测试

4.5.1 为什么需要 Prompt 版本管理

4.5.2 方案一:Git 管理模板文件(推荐)

4.5.3 方案二:数据库存储 + 版本号

4.5.4 A/B 测试实践

4.6 流式响应处理

4.7 实战练习

练习1:构建多角色客服 Prompt

练习2:Few-Shot 实现文本分类

练习3:CoT 实现复杂推理 + 结构化输出