Spring AI的提示工程技术详解
Spring AI的提示工程技术详解
本文中的示例和模式基于全面的提示工程指南,该指南涵盖了有效的提示工程的理论、原则和模式。本文展示了如何使用Spring AI流畅的ChatClient API将这些概念转化为可运行的Java代码。
为方便起见,示例的结构遵循原始指南中概述的相同模式和技术。本文中使用的演示源代码可在以下地址获取:
- https://github.com/spring-projects/spring-ai-examples/tree/main/prompt-engineering/prompt-engineering-patterns
1. 配置
配置部分概述了如何使用Spring AI设置和调整大型语言模型(LLM)。它涵盖了为你的用例选择合适的LLM提供商,以及配置控制模型输出质量、风格和格式的重要生成参数。
LLM提供商选择
对于提示工程,你首先要选择一个模型。Spring AI支持多个LLM提供商(如OpenAI、Anthropic、Google Vertex AI、AWS Bedrock、Ollama等),这使你无需更改应用程序代码即可切换提供商,只需更新配置。只需添加所选的启动器依赖项spring-ai-starter-model-<MODEL-PROVIDER-NAME>
。例如,以下是启用Anthropic Claude API的方法:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-anthropic</artifactId>
</dependency>
同时还需要一些连接属性:spring.ai.anthropic.api-key=${ANTHROPIC_API_KEY}
你可以这样指定特定的LLM模型名称:
.options(ChatOptions.builder()
.model("claude-3-7-sonnet-latest") // 使用Anthropic的Claude模型
.build())
在参考文档中可以找到启用和配置首选AI模型的详细信息。
LLM输出配置
在深入探讨提示工程技术之前,了解如何配置大型语言模型(LLM)的输出行为至关重要。Spring AI 提供了多个配置选项,通过 ChatOptions 构建器可以控制生成过程的各个方面。
所有配置都可以通过编程方式应用,如下面的示例所示,也可以在启动时通过 Spring 应用程序属性进行配置。
温度
温度控制模型响应的随机性或 “创造性”。
- 较低的值(0.0 - 0.3):响应更具确定性和针对性。适用于事实性问题、分类或对一致性要求较高的任务。
- 中等的值(0.4 - 0.7):在确定性和创造性之间取得平衡。适用于一般用例。
- 较高的值(0.8 - 1.0):响应更具创造性、多样性,可能会带来惊喜。适用于创意写作、头脑风暴或生成多样化的选项。
.options(ChatOptions.builder()
.temperature(0.1) // 非常确定的输出
.build())
理解温度对于提示工程至关重要,因为不同的技术受益于不同的温度设置。
输出长度(MaxTokens)
maxTokens
参数限制模型在响应中可以生成的令牌(词元)数量。
- 较低的值(5 - 25):适用于单个单词、短短语或分类标签。
- 中等的值(50 - 500):适用于段落或简短解释。
- 较高的值(1000+):适用于长篇内容、故事或复杂解释。
.options(ChatOptions.builder()
.maxTokens(250) // 中等长度的响应
.build())
设置合适的输出长度对于确保获得完整的响应且不过于冗长非常重要。
采样控制(Top-K和Top-P)
这些参数使你能够在生成过程中对令牌选择过程进行精细控制。
- Top-K:将令牌选择限制为接下来最可能的K个令牌。较高的值(例如40 - 50)会引入更多的多样性。
- Top-P(核采样):动态地从累积概率超过P的最小令牌集中进行选择。常见的值如0.8 - 0.95。
.options(ChatOptions.builder()
.topK(40) // 仅考虑前40个令牌
.topP(0.8) // 从覆盖80%概率质量的令牌中采样
.build())
这些采样控制与温度一起作用,塑造响应的特征。
结构化响应格式
除了纯文本响应(使用.content()
)之外,Spring AI还通过.entity()
方法轻松地将LLM响应直接映射到Java对象。
enum Sentiment {
POSITIVE, NEUTRAL, NEGATIVE
}
Sentiment result = chatClient.prompt("...")
.call()
.entity(Sentiment.class);
当与指示模型返回结构化数据的系统提示结合使用时,此功能特别强大。
特定模型选项
虽然可移植ChatOptions
为不同的LLM提供商提供了一致的接口,但Spring AI还提供特定模型的选项类,这些类公开了提供商特定的功能和配置。这些特定模型的选项使你能够利用每个LLM提供商的独特功能。
// 使用OpenAI特定的选项
OpenAiChatOptions openAiOptions = OpenAiChatOptions.builder()
.model("gpt-4o")
.temperature(0.2)
.frequencyPenalty(0.5) // OpenAI特定的参数
.presencePenalty(0.3) // OpenAI特定的参数
.responseFormat(new ResponseFormat("json_object")) // OpenAI特定的JSON模式
.seed(42) // OpenAI特定的确定性生成
.build();
String result = chatClient.prompt("...")
.options(openAiOptions)
.call()
.content();
// 使用Anthropic特定的选项
AnthropicChatOptions anthropicOptions = AnthropicChatOptions.builder()
.model("claude-3-7-sonnet-latest")
.temperature(0.2)
.topK(40) // Anthropic特定的参数
.thinking(AnthropicApi.ThinkingType.ENABLED, 1000) // Anthropic特定的思考配置
.build();
String result = chatClient.prompt("...")
.options(anthropicOptions)
.call()
.content();
每个模型提供商都有自己的聊天选项实现(例如OpenAiChatOptions
、AnthropicChatOptions
、MistralAiChatOptions
),这些实现公开了提供商特定的参数,同时仍然实现了通用接口。这种方法使你可以灵活地使用可移植选项以实现跨提供商的兼容性,或者在需要访问特定提供商的独特功能时使用特定模型的选项。 请注意,当使用特定模型的选项时,你的代码会与该特定提供商绑定,降低了可移植性。这是在访问高级提供商特定功能与保持应用程序中提供商独立性之间的权衡。
2. 提示工程技术
以下每个部分都实现了指南中的一种特定提示工程技术。通过同时遵循 “提示工程” 指南和这些实现,你将不仅深入了解可用的提示工程技术,还将了解如何在生产Java应用程序中有效地实现它们。
2.1 零样本提示
零样本提示是指在不提供任何示例的情况下要求AI执行任务。这种方法测试模型从零开始理解和执行指令的能力。大型语言模型在大量文本语料库上进行训练,使它们能够理解 “翻译”、“总结” 或 “分类” 等任务的含义,而无需明确的演示。 零样本提示适用于简单直接的任务,在这些任务中模型可能在训练期间见过类似的示例,并且当你希望最小化提示长度时也适用。然而,性能可能会因任务的复杂性以及指令的制定方式而有所不同。
// 实现第2.1节:通用提示/零样本(第15页)
public void pt_zero_shot(ChatClient chatClient) {
enum Sentiment {
POSITIVE, NEUTRAL, NEGATIVE
}
Sentiment reviewSentiment = chatClient.prompt("""
将电影评论分类为积极、中性或消极。
评论:“《她》是一部令人不安的研究作品,揭示了如果人工智能不受控制地继续发展,人类将走向何方。我希望有更多像这部杰作一样的电影。
情感:
""")
.options(ChatOptions.builder()
.model("claude-3-7-sonnet-latest")
.temperature(0.1)
.maxTokens(5)
.build())
.call()
.entity(Sentiment.class);
System.out.println("Output: " + reviewSentiment);
}
此示例展示了如何在不提供示例的情况下对电影评论的情感进行分类。注意使用较低的温度(0.1)以获得更具确定性的结果,以及直接使用.entity(Sentiment.class)
映射到Java枚举。
参考文献:Brown, T. B., 等人 (2020). "Language Models are Few-Shot Learners." arXiv:2005.14165. https://arxiv.org/abs/2005.14165
2.2 一样本和少样本提示
少样本提示为模型提供一个或多个示例,以帮助指导其响应,这对于需要特定输出格式的任务特别有用。通过向模型展示所需的输入 - 输出对示例,它可以学习模式并将其应用于新的输入,而无需进行显式的参数更新。
一样本提供单个示例,当示例成本高昂或模式相对简单时很有用。少样本使用多个示例(通常为3 - 5个),以帮助模型更好地理解更复杂任务中的模式,或说明正确输出的不同变体。
// 实现第2.2节:一样本和少样本(第16页)
public void pt_ones_shot_few_shots(ChatClient chatClient) {
String pizzaOrder = chatClient.prompt("""
将客户的披萨订单解析为有效的JSON格式。
示例1:
我想要一个小披萨,加奶酪、番茄酱和意大利辣香肠。
JSON响应:
```
{
"size": "small",
"type": "normal",
"ingredients": ["cheese", "tomato sauce", "pepperoni"]
}
```
示例2:
我能点一个大披萨吗,加番茄酱、罗勒和马苏里拉奶酪。
JSON响应:
```
{
"size": "large",
"type": "normal",
"ingredients": ["tomato sauce", "basil", "mozzarella"]
}
```
现在,我想要一个大披萨,一半加奶酪和马苏里拉奶酪,另一半加番茄酱、火腿和菠萝。
""")
.options(ChatOptions.builder()
.model("claude-3-7-sonnet-latest")
.temperature(0.1)
.maxTokens(250)
.build())
.call()
.content();
}
少样本提示对于需要特定格式设置、处理边缘情况的任务特别有效,或者当任务定义在没有示例的情况下可能不明确时也很有用。示例的质量和多样性会显著影响性能。
参考文献:Brown, T. B., 等人 (2020). "Language Models are Few-Shot Learners." arXiv:2005.14165. https://arxiv.org/abs/2005.14165
2.3 系统提示、上下文提示和角色提示
系统提示
系统提示为语言模型设置了整体上下文和目的,定义了模型应该执行的 “大局”。它为模型的响应建立了行为框架、约束和高级目标,与特定的用户查询分开。
系统提示在整个对话中充当持久的 “使命声明”,使你能够设置全局参数,如输出格式、语气、道德边界或角色定义。与专注于特定任务的用户提示不同,系统提示框架了所有用户提示应如何被解释。
// 实现第2.3.1节:系统提示
public void pt_system_prompting_1(ChatClient chatClient) {
String movieReview = chatClient
.prompt()
.system("将电影评论分类为积极、中性或消极。仅以大写形式返回标签。")
.user("""
评论:“《她》是一部令人不安的研究作品,揭示了如果人工智能不受控制地继续发展,人类将走向何方。它太令人不安了,我看不下去。
情感:
""")
.options(ChatOptions.builder()
.model("claude-3-7-sonnet-latest")
.temperature(1.0)
.topK(40)
.topP(0.8)
.maxTokens(5)
.build())
.call()
.content();
}
当系统提示与Spring AI的实体映射功能结合使用时特别强大:
// 实现第2.3.1节:带有JSON输出的系统提示
record MovieReviews(Movie[] movie_reviews) {
enum Sentiment {
POSITIVE, NEUTRAL, NEGATIVE
}
record Movie(Sentiment sentiment, String name) {
}
}
MovieReviews movieReviews = chatClient
.prompt()
.system("""
将电影评论分类为积极、中性或消极。返回有效的JSON格式。
""")
.user("""
评论:“《她》是一部令人不安的研究作品,揭示了如果人工智能不受控制地继续发展,人类将走向何方。它太令人不安了,我看不下去。
JSON响应:
""")
.call()
.entity(MovieReviews.class);
系统提示对于多轮对话特别有价值,可确保在多个查询中行为一致,并用于建立适用于所有响应的格式约束,如JSON输出。
参考文献:OpenAI. (2022). "System Message." https://platform.openai.com/docs/guides/chat/introduction
角色提示
角色提示指示模型采用特定的角色或身份,这会影响它生成内容的方式。通过为模型分配特定的身份、专业知识或视角,你可以影响其响应的风格、语气、深度和框架。
角色提示利用了模型模拟不同专业领域和通信风格的能力。常见的角色包括专家(例如,“你是一位经验丰富的数据科学家”)、专业人士(例如,“扮演一名导游”)或风格化角色(例如,“像莎士比亚一样解释”)。
// 实现第2.3.2节:角色提示
public void pt_role_prompting_1(ChatClient chatClient) {
String travelSuggestions = chatClient
.prompt()
.system("""
我希望你扮演一名导游。我会告诉你我的位置,你要给我推荐附近3个可以参观的地方。在某些情况下,我还会告诉你我要参观的地方类型。
""")
.user("""
我的建议:“我在阿姆斯特丹,我只想参观博物馆。”
旅游建议:
""")
.call()
.content();
}
角色提示可以通过风格指令进行增强:
// 实现第2.3.2节:带有风格指令的角色提示
public void pt_role_prompting_2(ChatClient chatClient) {
String humorousTravelSuggestions = chatClient
.prompt()
.system("""
我希望你扮演一名导游。我会告诉你我的位置,你要以幽默的风格给我推荐附近3个可以参观的地方。
""")
.user("""
我的建议:“我在阿姆斯特丹,我只想参观博物馆。”
旅游建议:
""")
.call()
.content();
}
这种技术对于专业领域知识、在响应中实现一致的语气以及与用户创建更引人入胜、个性化的交互特别有效。
参考文献:Shanahan, M., 等人 (2023). "Role-Play with Large Language Models." arXiv:2305.16367. https://arxiv.org/abs/
2.4 退后提示(Step-Back Prompting)
退后提示通过首先获取背景知识,将复杂请求分解为更简单的步骤。该技术鼓励模型在回答具体问题之前,先“退后一步”,考虑更广泛的上下文、基本原理或与问题相关的一般知识。
通过将复杂问题分解为更易管理的部分并首先建立基础知识,模型能够对困难问题提供更准确的回答。
// 实现 2.4 节:退后提示
public void pt_step_back_prompting(ChatClient.Builder chatClientBuilder) {
// 为聊天客户端设置通用选项
var chatClient = chatClientBuilder
.defaultOptions(ChatOptions.builder()
.model("claude-3-7-sonnet-latest")
.temperature(1.0)
.topK(40)
.topP(0.8)
.maxTokens(1024)
.build())
.build();
// 首先获取高层次概念
String stepBack = chatClient
.prompt("""
基于流行的第一人称射击动作游戏,列出
5 个虚构的关键场景设置,这些设置有助于
创建一个具有挑战性和吸引力的第一人称射击
视频游戏关卡故事情节。
""")
.call()
.content();
// 然后在主要任务中使用这些概念
String story = chatClient
.prompt()
.user(u -> u.text("""
为第一人称射击视频游戏的新关卡编写一个
具有挑战性和吸引力的单段落故事情节。
上下文:{step-back}
""")
.param("step-back", stepBack))
.call()
.content();
}
退后提示在复杂推理任务、需要专业领域知识的问题以及希望获得更全面和深思熟虑的回答而非即时答案 时尤其有效。
参考文献: Zheng, Z., 等 (2023)。《退后一步:通过抽象激发大型语言模型的推理》。arXiv:2310.06117。 https://arxiv.org/abs/2310.06117
2.5 思维链(Chain of Thought, CoT)
思维链提示鼓励模型通过逐步推理来解决问题,从而提高复杂推理任务的准确性。通过明确要求模型展示其工作过程或以逻辑步骤思考问题,可以显著提升需要多步推理的任务表现。 CoT 通过鼓励模型在生成最终答案之前生成中间推理步骤,类似于人类解决复杂问题的方式。这使得模型的思考过程显式化,并帮助其得出更准确的结论。
// 实现 2.5 节:思维链(CoT) - 零样本方法
public void pt_chain_of_thought_zero_shot(ChatClient chatClient) {
String output = chatClient
.prompt("""
当我3岁时,我的伙伴是我的3倍年龄。现在,
我20岁了。我的伙伴多大?
让我们一步步思考。
""")
.call()
.content();
}
// 实现 2.5 节:思维链(CoT) - 少样本方法
public void pt_chain_of_thought_singleshot_fewshots(ChatClient chatClient) {
String output = chatClient
.prompt("""
问题:当我弟弟2岁时,我是他的两倍年龄。现在
我40岁了。我弟弟多大?让我们一步步思考。
回答:当我弟弟2岁时,我是 2 * 2 = 4 岁。
我们的年龄差是2岁,我比他大。现在我40岁,
所以我弟弟是 40 - 2 = 38 岁。答案是38。
问题:当我3岁时,我的伙伴是我的3倍年龄。现在,
我20岁了。我的伙伴多大?让我们一步步思考。
回答:
""")
.call()
.content();
}
关键短语“让我们一步步思考”触发模型展示其推理过程。CoT 对于数学问题、逻辑推理任务以及任何需要多步推理的问题尤其有价值。它通过显式化中间推理步骤来减少错误。
参考文献: Wei, J., 等 (2022)。《思维链提示激发大型语言模型的推理》。arXiv:2201.11903。 https://arxiv.org/abs/2201.11903
2.6 自我一致性(Self-Consistency)
自我一致性涉及多次运行模型并聚合同一问题的结果,以获得更可靠的答案。该技术通过为同一问题采样不同的推理路径并通过多数投票选择最一致的答案,解决了大型语言模型输出的变异性。 通过使用不同的温度或采样设置生成多个推理路径,然后聚合同一问题的最终答案,自我一致性提高了复杂推理任务的准确性。这本质上是一种针对语言模型输出的集成方法。
// 实现 2.6 节:自我一致性
public void pt_self_consistency(ChatClient chatClient) {
String email = """
您好,
我看到您使用 WordPress 搭建了网站。一个很棒的开源
内容管理系统。我过去也用过它。它带有许多优秀的
用户插件,设置起来也相当简单。
我注意到联系表单中有一个错误,当选择姓名字段时会
出现问题。请查看附件中我在姓名字段输入文本的截图。
注意我触发的 JavaScript 警告框。
但其他方面这是一个很棒的网站。我喜欢阅读它。可以
选择保留网站中的这个错误,因为它让我有更多有趣的
内容可读。
祝好,
哈里·黑客。
""";
record EmailClassification(Classification classification, String reasoning) {
enum Classification {
IMPORTANT, NOT_IMPORTANT
}
}
int importantCount = 0;
int notImportantCount = 0;
// 对同一输入运行模型 5 次
for (int i = 0; i < 5; i++) {
EmailClassification output = chatClient
.prompt()
.user(u -> u.text("""
电子邮件:{email}
将上述电子邮件分类为 IMPORTANT 或 NOT IMPORTANT。
让我们一步步思考并解释原因。
""")
.param("email", email))
.options(ChatOptions.builder()
.temperature(1.0) // 较高温度以增加变异性
.build())
.call()
.entity(EmailClassification.class);
// 统计结果
if (output.classification() == EmailClassification.Classification.IMPORTANT) {
importantCount++;
} else {
notImportantCount++;
}
}
// 通过多数投票确定最终分类
String finalClassification = importantCount > notImportantCount ?
"IMPORTANT" : "NOT IMPORTANT";
}
自我一致性在高风险决策、复杂推理任务以及需要比单一响应更自信的答案时尤其有价值。代价是由于多次 API 调用而增加的计算成本和延迟。
参考文献: Wang, X., 等 (2022)。《自我一致性改进语言模型中的思维链推理》。arXiv:2203.11171。 https://arxiv.org/abs/2203.11171
2.7 思维树(Tree of Thoughts, ToT)
思维树(ToT)是一种高级推理框架,通过同时探索多个推理路径扩展了思维链。它将问题解决视为搜索过程,模型生成不同的中间步骤,评估其潜力,并探索最有前景的路径。
该技术对于具有多种可能方法或需要探索各种替代方案以找到最优路径的复杂问题尤其强大。
注意:原始的“提示工程”指南未提供 ToT 的实现示例,可能是因为其复杂性。以下是一个简化的示例,展示其核心概念。 游戏解决 ToT 示例:
// 实现 2.7 节:思维树(ToT) - 游戏解决示例
public void pt_tree_of_thoughts_game(ChatClient chatClient) {
// 步骤 1:生成多个初始走法
String initialMoves = chatClient
.prompt("""
你正在玩一盘国际象棋,棋盘处于初始位置。
生成 3 种不同的可能开局走法。对于每种走法:
1. 用代数记谱法描述走法
2. 解释该走法的战略思考
3. 从 1-10 评分该走法的强度
""")
.options(ChatOptions.builder()
.temperature(0.7)
.build())
.call()
.content();
// 步骤 2:评估并选择最有前景的走法
String bestMove = chatClient
.prompt()
.user(u -> u.text("""
分析这些开局走法并选择最强的一种:
{moves}
逐步解释你的推理,考虑:
1. 位置控制
2. 发展潜力
3. 长期战略优势
然后选择单一最佳走法。
""").param("moves", initialMoves))
.call()
.content();
// 步骤 3:从最佳走法探索未来游戏状态
String gameProjection = chatClient
.prompt()
.user(u -> u.text("""
基于选定的开局走法:
{best_move}
预测双方接下来的 3 步棋。对于每个潜在分支:
1. 描述走法和应对走法
2. 评估结果位置
3. 确定最有前景的延续
最后,确定最有利的走法序列。
""").param("best_move", bestMove))
.call()
.content();
}
参考文献: Yao, S., 等 (2023)。《思维树:使用大型语言模型进行深思熟虑的问题解决》。arXiv:2305.10601。 https://arxiv.org/abs/2305.10601
2.8 自动提示工程(Automatic Prompt Engineering)
自动提示工程利用 AI 生成和评估替代提示。这种元技术利用语言模型本身来创建、优化和基准测试不同的提示变体,以找到特定任务的最优表述。 通过系统地生成和评估提示变体,自动提示工程可以找到比手动工程更有效的提示,特别是在复杂任务中。这是一种利用 AI 提升自身表现的方法。
// 实现 2.8 节:自动提示工程
public void pt_automatic_prompt_engineering(ChatClient chatClient) {
// 生成同一请求的变体
String orderVariants = chatClient
.prompt("""
我们有一个乐队周边 T 恤网店,为了训练
聊天机器人,我们需要多种订购方式:“一件
Metallica T 恤,尺寸 S”。生成 10 种变体,
语义相同但保持相同含义。
""")
.options(ChatOptions.builder()
.temperature(1.0) // 高温度以增加创造性
.build())
.call()
.content();
// 评估并选择最佳变体
String output = chatClient
.prompt()
.user(u -> u.text("""
请对以下变体进行 BLEU(双语评估替代)评估:
----
{variants}
----
选择评估得分最高的指令候选。
""").param("variants", orderVariants))
.call()
.content();
}
自动提示工程对于优化生产系统中的提示、解决手动提示工程已达极限的挑战性任务以及系统性地大规模提升提示质量尤其有价值。
参考文献: Zhou, Y., 等 (2022)。《大型语言模型是人类级别的提示工程师》。arXiv:2211.01910。 https://arxiv.org/abs/2211.01910
2.9 代码提示(Code Prompting)
代码提示是指针对代码相关任务的专门技术。这些技术利用大型语言模型理解和生成编程语言的能力,使其能够编写新代码、解释现有代码、调试问题以及在不同语言之间翻译。
有效的代码提示通常涉及明确的规格、适当的上下文(库、框架、风格指南),有时还包括类似代码的示例。温度设置通常较低(0.1-0.3),以获得更确定的输出。
// 实现 2.9.1 节:编写代码的提示
public void pt_code_prompting_writing_code(ChatClient chatClient) {
String bashScript = chatClient
.prompt("""
编写一个 Bash 代码片段,提示输入文件夹名称。
然后获取该文件夹的内容,并将所有文件重命名,
在文件名前面添加“draft”。
""")
.options(ChatOptions.builder()
.temperature(0.1) // 低温度以获得确定性代码
.build())
.call()
.content();
}
// 实现 2.9.2 节:解释代码的提示
public void pt_code_prompting_explaining_code(ChatClient chatClient) {
String code = """
#!/bin/bash
echo "Enter the folder name: "
read folder_name
if [ ! -d "$folder_name" ]; then
echo "Folder does not exist."
exit 1
fi
files=( "$folder_name"/* )
for file in "${files[@]}"; do
new_file_name="draft_$(basename "$file")"
mv "$file" "$new_file_name"
done
echo "Files renamed successfully."
""";
String explanation = chatClient
.prompt()
.user(u -> u.text("""
向我解释以下 Bash 代码:
```
{code}
```
""").param("code", code))
.call()
.content();
}
// 实现 2.9.3 节:翻译代码的提示
public void pt_code_prompting_translating_code(ChatClient chatClient) {
String bashCode = """
#!/bin/bash
echo "Enter the folder name: "
read folder_name
if [ ! -d "$folder_name" ]; then
echo "Folder does not exist."
exit 1
fi
files=( "$folder_name"/* )
for file in "${files[@]}"; do
new_file_name="draft_$(basename "$file")"
mv "$file" "$new_file_name"
done
echo "Files renamed successfully."
""";
String pythonCode = chatClient
.prompt()
.user(u -> u.text("""
将以下 Bash 代码翻译为 Python 代码片段:
{code}
""").param("code", bashCode))
.call()
.content();
}
代码提示对于自动化代码文档、原型设计、学习编程概念以及在编程语言之间翻译尤其有价值。结合少样本提示或思维链等技术可以进一步增强其效果。
参考文献: Chen, M., 等 (2021)。《评估在代码上训练的大型语言模型》。arXiv:2107.03374。 https://arxiv.org/abs/2107.03374
结论
Spring AI 提供了一个优雅的 Java API,用于实现所有主要的提示工程技术。通过将这些技术与 Spring 强大的实体映射和流畅的 API 结合,开发者可以构建复杂且易于维护的 AI 驱动应用程序。 最有效的方法通常是将多种技术结合使用,例如使用系统提示结合少样本示例,或将思维链与角色提示结合。Spring AI 的灵活 API 使这些组合易于实现。
对于生产应用程序,请记住:
- 使用不同参数(温度、top-k、top-p)测试提示
- 考虑在关键决策中使用自我一致性
- 利用 Spring AI 的实体映射实现类型安全的响应
- 使用上下文提示提供特定于应用程序的知识
凭借这些技术和 Spring AI 强大的抽象,开发者可以创建提供一致、高质量结果的强大 AI 驱动应用程序。如果您学习过程中如遇困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!更多Spring专题技术分享点击直达!,欢迎收藏与转发支持!