Appearance
提示词管理
提示词模板 (Prompt Templates)
提示词模板是 LangChain 4J 中用于创建可重用提示词的工具,它允许您定义带有变量的提示词结构:
基本用法
java
import dev.langchain4j.prompt.PromptTemplate;
// 创建提示词模板
PromptTemplate promptTemplate = PromptTemplate.from("请解释 {topic} 的概念,面向 {audience} 受众");
// 应用变量
String prompt = promptTemplate.apply("量子计算", "计算机科学专业学生");
System.out.println(prompt);
// 输出: 请解释 量子计算 的概念,面向 计算机科学专业学生 受众高级模板
支持更复杂的模板结构,包括条件语句和循环:
java
// 带有条件的模板
PromptTemplate conditionalTemplate = PromptTemplate.from("请解释 {topic} 的概念" +
"{{#if includeExamples}},并提供 {examplesCount} 个例子{{/if}}");
// 应用变量
String promptWithExamples = conditionalTemplate.apply(
"量子计算",
true, // includeExamples
3 // examplesCount
);示例选择器 (Example Selectors)
示例选择器用于从示例库中选择相关的示例,以增强模型的输出:
基本示例选择器
java
import dev.langchain4j.prompt.example.Example;
import dev.langchain4j.prompt.example.selector.ExampleSelector;
import dev.langchain4j.prompt.example.selector.similarity.SimilarityExampleSelector;
import dev.langchain4j.embedding.EmbeddingModel;
import dev.langchain4j.embedding.openai.OpenAiEmbeddingModel;
// 创建示例
List<Example> examples = Arrays.asList(
Example.builder()
.input("如何学习 Java?")
.output("学习 Java 的步骤:1. 学习基本语法 2. 练习编程 3. 学习面向对象编程 4. 构建项目")
.build(),
Example.builder()
.input("如何学习 Python?")
.output("学习 Python 的步骤:1. 学习基本语法 2. 练习编程 3. 学习库的使用 4. 构建项目")
.build()
);
// 创建嵌入模型
EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.build();
// 创建示例选择器
ExampleSelector exampleSelector = SimilarityExampleSelector.builder()
.examples(examples)
.embeddingModel(embeddingModel)
.maxExamples(1)
.build();
// 选择相关示例
List<Example> selectedExamples = exampleSelector.select("如何学习 JavaScript?");自定义示例选择器
您可以实现自定义的示例选择器,根据特定的逻辑选择示例:
java
public class CustomExampleSelector implements ExampleSelector {
private final List<Example> examples;
public CustomExampleSelector(List<Example> examples) {
this.examples = examples;
}
@Override
public List<Example> select(String input) {
// 自定义选择逻辑
return examples.stream()
.filter(example -> example.input().contains("学习"))
.limit(1)
.collect(Collectors.toList());
}
}输出解析器 (Output Parsers)
输出解析器用于将模型的原始输出解析为结构化数据:
基本解析器
java
import dev.langchain4j.output.parser.JsonOutputParser;
// 创建 JSON 输出解析器
JsonOutputParser<Person> parser = new JsonOutputParser<>(Person.class);
// 定义提示词,要求模型输出 JSON 格式
PromptTemplate promptTemplate = PromptTemplate.from(
"请提供关于 {name} 的信息,以 JSON 格式输出,包含 name、age、occupation 字段"
);
// 生成并解析输出
String rawOutput = model.generate(promptTemplate.apply("爱因斯坦"));
Person person = parser.parse(rawOutput);
System.out.println(person.getName());
System.out.println(person.getAge());
System.out.println(person.getOccupation());自定义解析器
您可以实现自定义的输出解析器,处理特定格式的输出:
java
public class CustomOutputParser implements OutputParser<CustomResult> {
@Override
public CustomResult parse(String text) {
// 自定义解析逻辑
String[] parts = text.split("\\n");
CustomResult result = new CustomResult();
for (String part : parts) {
if (part.startsWith("Title: ")) {
result.setTitle(part.substring(7));
} else if (part.startsWith("Content: ")) {
result.setContent(part.substring(9));
}
}
return result;
}
}提示词链 (Prompt Chains)
提示词链将多个提示词模板组合在一起,形成一个完整的处理流程:
顺序提示词链
java
// 创建第一个提示词模板
PromptTemplate topicTemplate = PromptTemplate.from("请为 {subject} 生成 3 个相关的讨论话题");
// 创建第二个提示词模板
PromptTemplate detailTemplate = PromptTemplate.from("请详细讨论以下话题:{topic}");
// 生成话题
String topics = model.generate(topicTemplate.apply("人工智能"));
System.out.println("生成的话题:" + topics);
// 详细讨论第一个话题
String firstTopic = topics.split("\\n")[0].replace("1. ", "");
String detail = model.generate(detailTemplate.apply(firstTopic));
System.out.println("详细讨论:" + detail);条件提示词链
根据前一个步骤的结果,选择不同的提示词模板:
java
// 生成初步答案
String initialAnswer = model.generate("请回答:{question}", "什么是量子计算?");
// 根据答案长度选择不同的提示词模板
PromptTemplate followUpTemplate;
if (initialAnswer.length() < 100) {
followUpTemplate = PromptTemplate.from("请详细解释:{answer}");
} else {
followUpTemplate = PromptTemplate.from("请总结:{answer}");
}
// 生成后续答案
String followUpAnswer = model.generate(followUpTemplate.apply(initialAnswer));
System.out.println("后续答案:" + followUpAnswer);最佳实践
- 使用模板:使用提示词模板提高代码的可维护性和重用性
- 优化提示词:精心设计提示词,明确任务要求和输出格式
- 使用示例:提供相关示例,帮助模型更好地理解任务
- 结构化输出:使用输出解析器将模型输出转换为结构化数据
- 迭代优化:根据模型的输出,不断优化提示词和解析逻辑
- 考虑上下文:在提示词中包含足够的上下文信息
- 限制输出:明确指定输出的长度和格式要求
- 测试不同提示词:尝试不同的提示词结构,找到最佳效果