本文翻译自 Spring 官方博客 Spring AI Prompt Engineering Patterns,同时笔者调整案例为 deepseek
前言
随着大语言模型(LLM)的飞速发展,如何有效地设计提示词(Prompt)成为了开发人员必须掌握的一项关键技能。Spring AI 框架为 Java 开发者提供了简洁而强大的 API,使提示工程技术的实现变得简单高效。本文将详细介绍如何使用 Spring AI 实现各种提示工程技巧,帮助您构建更智能、更可靠的 AI 应用程序。
文中的示例和模式基于全面的提示工程指南,展示了如何将理论概念转化为实际可用的 Java 代码实现。
1. 配置与初始化
在深入了解提示工程技术之前,我们先看看如何设置和调整 Spring AI 中的大语言模型配置。
选择 LLM 提供商
Spring AI 的优势之一是支持多种 LLM 提供商(如 OpenAI、Anthropic、Google Vertex AI、AWS Bedrock、Ollama 等),让您可以在不改变应用代码的情况下切换不同的模型提供商。只需添加所需的启动依赖 spring-ai-starter-model-<模型提供商名称> 即可。
例如,添加 Open AI 协议的支持:
1 | <dependency> |
配置连接属性:
1 | spring.ai.openai.api-key=sk-b30f6476fa9645ce8cf7e922073bf499 |
LLM 输出配置
Spring AI 提供了多种配置选项,让您可以通过 ChatOptions 构建器控制模型输出的各个方面。
Temperature(温度)
Temperature 控制模型回答的随机性或”创造性”:
- 较低值 (0.0-0.3):更确定性、更集中的回答,适合事实性问题和分类任务
- 中等值 (0.4-0.7):在确定性和创造性之间取得平衡,适合一般用例
- 较高值 (0.8-1.0):更具创造性、多样性和潜在的惊喜性,适合创意写作和头脑风暴
1 | .options(ChatOptions.builder() |
输出长度(MaxTokens)
maxTokens 参数限制模型在回答中可以生成的标记(词片段)数量:
- 低值 (5-25):适合单个词、短语或分类标签
- 中等值 (50-500):适合段落或简短解释
- 高值 (1000+):适合长篇内容、故事或复杂解释
1 | .options(ChatOptions.builder() |
采样控制(Top-K 和 Top-P)
这些参数提供了对生成过程中标记选择的精细控制:
- Top-K:将标记选择限制在 K 个最可能的下一个标记中
- Top-P(核采样):动态选择累积概率超过 P 的最小标记集
1 | .options(ChatOptions.builder() |
结构化响应格式
除了使用 .content() 获取纯文本响应外,Spring AI 还提供了将 LLM 响应直接映射到 Java 对象的简便方法:
1 | enum Sentiment { |
模型特定选项
虽然通用的 ChatOptions 提供了跨不同 LLM 提供商的一致接口,但 Spring AI 也提供了模型特定的选项类,以便访问提供商特有的功能:
1 | // 使用 OpenAI 特定选项 |
2. 提示工程技术实战
2.1 零样本提示(Zero-Shot Prompting)
零样本提示是指在不提供任何示例的情况下要求 AI 执行任务,测试模型从零开始理解和执行指令的能力。
1 | public void pt_zero_shot_prompting(ChatClient chatClient) { |
零样本提示适用于直接的任务,尤其是当模型在训练中可能已经见过类似示例时。优点是提示简短,但复杂任务的表现可能不稳定。
2.2 少样本提示(Few-Shot Prompting)
少样本提示通过提供几个示例来指导模型理解任务模式,尤其适用于需要特定格式或风格的任务。
1 | public void pt_few_shot_prompting(ChatClient chatClient) { |
少样本提示在需要一致性和特定输出格式的场景中特别有效,例如文本分类、实体提取和结构化数据生成。通过精心选择典型示例,可以显著提高模型性能。
2.3 思维链提示(Chain-of-Thought Prompting)
思维链提示技术鼓励模型逐步思考问题,特别适用于需要推理的复杂任务。
1 | public void pt_chain_of_thought_prompting(ChatClient chatClient) { |
思维链提示通过展示模型的推理过程,不仅提高了解决复杂问题的准确性,还增强了答案的可解释性和可验证性。研究表明,这种方法在数学问题、逻辑推理和多步骤任务中特别有效。
2.4 自一致性提示(Self-Consistency Prompting)
自一致性提示技术通过生成多个独立解决方案并选择最常见答案来提高准确性,特别适用于关键决策场景。
1 | public void pt_self_consistency_prompting(ChatClient chatClient) { |
自一致性提示在需要高准确性的场景中非常有价值,例如数学计算、代码生成和关键决策支持。通过综合多个思考路径,它能有效减少单一推理链中的错误积累。
2.5 思想树提示(Tree-of-Thoughts Prompting)
思想树提示是思维链的扩展,允许模型探索多个推理分支,适用于需要前瞻性思考的复杂问题。
1 | public void pt_tree_of_thoughts_prompting(ChatClient chatClient) { |
思想树提示在解决需要探索多种可能性的问题时尤为有效,例如游戏策略、复杂决策和算法设计。通过系统化地追踪不同解决路径,它可以找到更优的解决方案。
2.6 抽象提示(Abstractions in Prompting)
抽象提示技术鼓励模型首先”退一步”,从更高层次理解问题,然后再提供具体解决方案。
1 | public void pt_abstractions_in_prompting(ChatClient chatClient) { |
抽象提示通过鼓励模型进行高层次思考,帮助解决复杂问题,特别适用于算法设计、系统架构和战略规划等需要全局视角的任务。
2.7 角色提示(Role Prompting)
角色提示让 AI 扮演特定角色,激发其基于角色背景知识的特定能力。
1 | public void pt_role_prompting(ChatClient chatClient) { |
角色提示通过赋予模型特定”身份”,能够激发其在相关领域的专业知识,特别适用于需要特定专业背景、风格或视角的场景。通过精心设计角色,可以获得更专业、更多样化的回答。
2.8 自动提示工程(Automatic Prompt Engineering)
自动提示工程(APE)是一种元级别方法,使用 AI 来优化提示本身。
1 | public void pt_automatic_prompt_engineering(ChatClient chatClient) { |
APE 在优化生产系统的提示、解决手动提示工程难以应对的挑战性任务,以及系统性地提高提示质量方面特别有价值。
2.9 代码提示(Code Prompting)
代码提示专门针对代码相关任务,利用 LLM 理解和生成编程语言的能力。
1 | // 编写代码 |
{code}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
""").param("code", code))
.call()
.content();
}
// 翻译代码
public void pt_code_prompting_translating_code(ChatClient chatClient) {
String bashCode = """
#!/bin/bash
echo "输入文件夹名称:"
read folder_name
if [ ! -d "$folder_name" ]; then
echo "文件夹不存在。"
exit 1
fi
files=( "$folder_name"/* )
for file in "${files[@]}"; do
new_file_name="draft_$(basename "$file")"
mv "$file" "$new_file_name"
done
echo "文件重命名成功。"
""";
String pythonCode = chatClient
.prompt()
.user(u -> u.text("""
将以下 Bash 代码翻译成 Python:
{code}
""").param("code", bashCode))
.call()
.content();
}
代码提示在自动代码文档生成、原型设计、学习编程概念和编程语言转换方面特别有价值。结合少样本提示或思维链等技术可以进一步提高效果。
结语
Spring AI 为实现各种提示工程技术提供了优雅的 Java API。通过结合这些技术与 Spring 强大的实体映射和流畅的 API,开发人员可以构建复杂而高效的 AI 应用程序。
最有效的方法往往是结合多种技术——例如,将系统提示与少样本示例结合,或将思维链与角色提示结合。Spring AI 灵活的 API 使这些组合变得直观且易于实现。
对于生产应用,请记住:
- 测试不同参数(温度、top-k、top-p)下的提示效果
- 考虑对关键决策使用自一致性技术
- 利用 Spring AI 的实体映射实现类型安全的响应
- 使用上下文提示提供应用程序特定知识
通过这些技术和 Spring AI 强大的抽象,您可以创建稳健的 AI 应用,提供一致且高质量的结果。