7. 提示词工程篇:《写给AI的"需求文档":Java风格的Prompt模板管理》
给Java开发者的提示词实战指南
大家好!今天我要教你们怎么用最简单的方式管理Prompt,就像写Java代码一样简单明了。
一、什么是Prompt?(1句话理解)
Prompt就是你给AI的”说明书”,告诉AI你想要什么、怎么回答。
二、最简单的实现思路
你问AI → AI回答↓你写说明书 → AI按照说明书回答
三、项目结构(极简)
prompt-simple/├── src/main/java/│ ├── PromptDemo.java # 主程序│ └── templates/ # 模板类├── prompts/ # 模板文件└── config.properties # 配置文件
四、第一步:添加依赖(只需要2个)
创建pom.xml:
<?xml version="1.0" encoding="UTF-8"?><project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>prompt-simple</artifactId><version>1.0</version><dependencies><!-- 1. 调用AI的库 --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-deepseek</artifactId><version>0.29.1</version></dependency><!-- 2. HTTP客户端 --><dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.2.1</version></dependency></dependencies></project>
五、第二步:配置文件
创建config.properties:
# DeepSeek API配置deepseek.api.key=你的API密钥deepseek.model=deepseek-chatdeepseek.url=https://api.deepseek.com# 模板目录template.dir=prompts/
六、第三步:创建模板文件
在项目根目录创建prompts文件夹,里面放模板文件:
1. `java_coder.txt` – 代码生成模板
请以Java专家的身份回答。任务:{{task}}使用框架:{{framework}}要求:代码要有注释,格式规范。只返回代码,不要解释。
2. `tech_help.txt` – 技术问答模板
请以技术顾问的身份回答。问题:{{question}}要求:回答要专业但易懂,给出实际解决方案。用中文回答。
3. `code_review.txt` – 代码审查模板
请以代码审查专家的身份审查代码。代码:{{code}}要求:指出问题,给出改进建议。分点说明,格式清晰。
七、第四步:创建Prompt模板类
import java.io.IOException;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;import java.util.HashMap;import java.util.Map;/** * 最简单的Prompt模板类 */publicclassSimplePrompt{private String template; // 模板内容private Map<String, String> variables = new HashMap<>();/** * 创建模板 */publicstatic SimplePrompt create(String templateName){ SimplePrompt prompt = new SimplePrompt();try {// 从文件读取模板 Path path = Paths.get("prompts/" + templateName + ".txt"); String content = Files.readString(path); prompt.template = content; } catch (IOException e) { System.err.println("读取模板文件失败: " + e.getMessage());// 使用内置模板 prompt.template = getBuiltinTemplate(templateName); }return prompt; }/** * 内置模板(以防文件不存在) */privatestatic String getBuiltinTemplate(String name){switch (name) {case"java_coder":return"请以Java专家的身份回答。\n任务:{{task}}\n使用框架:{{framework}}\n要求:代码要有注释,格式规范。\n只返回代码,不要解释。";case"tech_help":return"请以技术顾问的身份回答。\n问题:{{question}}\n要求:回答要专业但易懂,给出实际解决方案。\n用中文回答。";case"code_review":return"请以代码审查专家的身份审查代码。\n代码:{{code}}\n要求:指出问题,给出改进建议。\n分点说明,格式清晰。";default:return"请回答问题:{{question}}"; } }/** * 设置变量 */public SimplePrompt set(String key, String value){ variables.put(key, value);returnthis; // 支持链式调用 }/** * 渲染模板(替换变量) */public String render(){ String result = template;for (Map.Entry<String, String> entry : variables.entrySet()) { String placeholder = "{{" + entry.getKey() + "}}"; result = result.replace(placeholder, entry.getValue()); }return result; }/** * 快速生成代码的方法 */publicstatic String generateCode(String task, String framework){return SimplePrompt.create("java_coder") .set("task", task) .set("framework", framework) .render(); }/** * 快速技术问答的方法 */publicstatic String askTech(String question){return SimplePrompt.create("tech_help") .set("question", question) .render(); }}
八、第五步:创建AI调用类
import dev.langchain4j.model.chat.ChatLanguageModel;import dev.langchain4j.model.deepseek.DeepSeekChatModel;import java.util.Properties;import java.io.FileInputStream;/** * 调用DeepSeek的类 */publicclassDeepSeekClient{private String apiKey;private String model;publicDeepSeekClient(){// 读取配置try { Properties props = new Properties(); props.load(new FileInputStream("config.properties"));this.apiKey = props.getProperty("deepseek.api.key");this.model = props.getProperty("deepseek.model", "deepseek-chat");if (apiKey == null || apiKey.trim().isEmpty()) { System.err.println("⚠️ 警告:未设置API密钥,请在config.properties中设置"); } } catch (Exception e) { System.err.println("读取配置文件失败: " + e.getMessage()); } }/** * 简单调用AI */public String ask(String prompt){if (apiKey == null || apiKey.trim().isEmpty()) {return"❌ 错误:请先设置DeepSeek API密钥"; }try { System.out.println("🤖 正在调用DeepSeek...");// 创建DeepSeek模型 ChatLanguageModel model = DeepSeekChatModel.builder() .apiKey(apiKey) .modelName(this.model) .build();// 调用AI String response = model.generate(prompt); System.out.println("✅ AI回答完成");return response; } catch (Exception e) { System.err.println("调用AI失败: " + e.getMessage());return"抱歉,AI服务暂时不可用。"; } }/** * 使用模板调用AI */public String askWithTemplate(String templateName, Map<String, String> variables){// 创建模板 SimplePrompt prompt = SimplePrompt.create(templateName);// 设置变量for (Map.Entry<String, String> entry : variables.entrySet()) { prompt.set(entry.getKey(), entry.getValue()); }// 渲染模板 String renderedPrompt = prompt.render(); System.out.println("📝 生成的Prompt:\n" + renderedPrompt);// 调用AIreturn ask(renderedPrompt); }}
九、第六步:主程序
import java.util.HashMap;import java.util.Map;import java.util.Scanner;/** * 主程序 - 使用示例 */publicclassPromptDemo{privatestatic DeepSeekClient aiClient = new DeepSeekClient();publicstaticvoidmain(String[] args){ System.out.println("🚀 AI Prompt模板管理系统"); System.out.println("=====================\n"); Scanner scanner = new Scanner(System.in);while (true) { System.out.println("\n请选择功能:"); System.out.println("1. 生成代码"); System.out.println("2. 技术问答"); System.out.println("3. 代码审查"); System.out.println("4. 自定义模板"); System.out.println("5. 退出"); System.out.print("请选择(1-5): "); String choice = scanner.nextLine();switch (choice) {case"1": generateCode(scanner);break;case"2": askTechQuestion(scanner);break;case"3": reviewCode(scanner);break;case"4": customTemplate(scanner);break;case"5": System.out.println("👋 再见!"); scanner.close();return;default: System.out.println("❌ 无效选择,请重试"); } } }/** * 功能1:生成代码 */privatestaticvoidgenerateCode(Scanner scanner){ System.out.println("\n💻 代码生成功能"); System.out.print("请输入任务(如:实现用户登录功能): "); String task = scanner.nextLine(); System.out.print("请输入框架(如:Spring Boot): "); String framework = scanner.nextLine(); System.out.println("\n⏳ 正在生成代码...");// 方法1:使用快速方法// String prompt = SimplePrompt.generateCode(task, framework);// String answer = aiClient.ask(prompt);// 方法2:使用模板方法 Map<String, String> variables = new HashMap<>(); variables.put("task", task); variables.put("framework", framework); String answer = aiClient.askWithTemplate("java_coder", variables); System.out.println("\n✅ 生成的代码:"); System.out.println("===================="); System.out.println(answer); System.out.println("====================\n"); System.out.print("按回车键继续..."); scanner.nextLine(); }/** * 功能2:技术问答 */privatestaticvoidaskTechQuestion(Scanner scanner){ System.out.println("\n❓ 技术问答功能"); System.out.print("请输入技术问题: "); String question = scanner.nextLine(); System.out.println("\n⏳ 正在思考..."); Map<String, String> variables = new HashMap<>(); variables.put("question", question); String answer = aiClient.askWithTemplate("tech_help", variables); System.out.println("\n💡 回答:"); System.out.println("===================="); System.out.println(answer); System.out.println("====================\n"); System.out.print("按回车键继续..."); scanner.nextLine(); }/** * 功能3:代码审查 */privatestaticvoidreviewCode(Scanner scanner){ System.out.println("\n🔍 代码审查功能"); System.out.println("请输入要审查的代码(输入空行结束):"); StringBuilder code = new StringBuilder(); String line;while (!(line = scanner.nextLine()).isEmpty()) { code.append(line).append("\n"); }if (code.length() == 0) { System.out.println("❌ 代码不能为空");return; } System.out.println("\n⏳ 正在审查代码..."); Map<String, String> variables = new HashMap<>(); variables.put("code", code.toString()); String answer = aiClient.askWithTemplate("code_review", variables); System.out.println("\n📋 审查报告:"); System.out.println("===================="); System.out.println(answer); System.out.println("====================\n"); System.out.print("按回车键继续..."); scanner.nextLine(); }/** * 功能4:自定义模板 */privatestaticvoidcustomTemplate(Scanner scanner){ System.out.println("\n🎨 自定义模板功能"); System.out.println("当前可用模板:"); System.out.println("1. java_coder - 代码生成"); System.out.println("2. tech_help - 技术问答"); System.out.println("3. code_review - 代码审查"); System.out.print("\n请输入模板名称(直接输入名字): "); String templateName = scanner.nextLine();// 读取变量 Map<String, String> variables = new HashMap<>(); System.out.println("\n请设置变量(格式:变量名=值,输入done结束):");while (true) { System.out.print("变量(或输入done): "); String input = scanner.nextLine();if (input.equalsIgnoreCase("done")) {break; }if (input.contains("=")) { String[] parts = input.split("=", 2);if (parts.length == 2) { variables.put(parts[0].trim(), parts[1].trim()); System.out.println("✅ 已设置变量: " + parts[0].trim() + " = " + parts[1].trim()); } } }if (variables.isEmpty()) { System.out.println("❌ 没有设置任何变量");return; } System.out.println("\n⏳ 正在处理..."); String answer = aiClient.askWithTemplate(templateName, variables); System.out.println("\n✨ 结果:"); System.out.println("===================="); System.out.println(answer); System.out.println("====================\n"); System.out.print("按回车键继续..."); scanner.nextLine(); }}
十、第七步:运行准备
1. 创建配置文件
在项目根目录创建config.properties:
deepseek.api.key=sk-你的API密钥deepseek.model=deepseek-chatdeepseek.url=https://api.deepseek.comtemplate.dir=prompts/
2. 创建模板文件夹
创建prompts文件夹,放入三个模板文件。
3. 获取API密钥
-
访问:https://platform.deepseek.com/
-
注册账号
-
在API Keys页面创建密钥
-
复制到配置文件中
十一、第八步:编译运行
编译命令:
javac -cp ".:lib/*" *.java
运行命令:
java -cp ".:lib/*" PromptDemo
十二、使用示例
场景1:生成代码
请选择(1-5): 1请输入任务:实现用户登录功能请输入框架:Spring Boot🤖 正在调用DeepSeek...✅ 生成的代码:====================// UserController.java@RestController@RequestMapping("/api/users")public class UserController { @PostMapping("/login") public ResponseEntity<LoginResponse> login(@RequestBody LoginRequest request) { // 实现登录逻辑 }}====================
场景2:技术问答
请选择(1-5): 2请输入技术问题:Redis和MySQL有什么区别?🤖 正在调用DeepSeek...💡 回答:====================1. 数据类型:Redis是键值存储,MySQL是关系型数据库2. 性能:Redis内存存储更快,MySQL磁盘存储3. 用途:Redis适合缓存,MySQL适合持久化存储====================
十三、进阶:模板管理类
如果你想更专业一点,可以添加模板管理:
import java.io.File;import java.util.*;/** * 模板管理器 */publicclassTemplateManager{private Map<String, String> templates = new HashMap<>();private String templateDir = "prompts/";publicTemplateManager(){ loadTemplates(); }/** * 加载所有模板 */privatevoidloadTemplates(){ File dir = new File(templateDir);if (!dir.exists()) { dir.mkdirs(); System.out.println("📁 创建了模板目录: " + templateDir); createDefaultTemplates(); } File[] files = dir.listFiles((d, name) -> name.endsWith(".txt"));if (files != null) {for (File file : files) {try { String name = file.getName().replace(".txt", ""); String content = Files.readString(file.toPath()); templates.put(name, content); System.out.println("📄 加载模板: " + name); } catch (Exception e) { System.err.println("加载模板失败: " + file.getName()); } } } }/** * 创建默认模板 */privatevoidcreateDefaultTemplates(){// 创建三个默认模板文件 String[] defaultTemplates = {"java_coder.txt","tech_help.txt", "code_review.txt" };// ... 创建文件代码 ... }/** * 获取模板 */public String getTemplate(String name){return templates.getOrDefault(name, "模板不存在: " + name); }/** * 添加新模板 */publicvoidaddTemplate(String name, String content){ templates.put(name, content);try {// 保存到文件 Path path = Paths.get(templateDir + name + ".txt"); Files.writeString(path, content); System.out.println("✅ 模板已保存: " + name); } catch (Exception e) { System.err.println("保存模板失败: " + e.getMessage()); } }/** * 列出所有模板 */publicvoidlistTemplates(){ System.out.println("\n📋 可用模板列表:");for (String name : templates.keySet()) { System.out.println(" • " + name); } System.out.println("总计: " + templates.size() + " 个模板"); }}
十四、简单总结
今天你学会了:
-
✅ Prompt是什么:给AI的说明书
-
✅ 模板文件:把常用的Prompt存成文件
-
✅ 变量替换:用{{变量名}}实现个性化
-
✅ 调用AI:用DeepSeek API获取回答
-
✅ 简单界面:命令行交互
核心代码回顾:
// 1. 创建模板SimplePrompt prompt = SimplePrompt.create("java_coder") .set("task", "写登录功能") .set("framework", "Spring Boot");// 2. 渲染模板String rendered = prompt.render();// 3. 调用AIString answer = aiClient.ask(rendered);
记住这几点:
-
模板要具体:越具体,AI回答越好
-
变量要灵活:用{{}}实现模板复用
-
角色要明确:告诉AI以什么身份回答
-
格式要指定:告诉AI怎么输出
十五、下一步改进建议
如果你想进一步优化:
-
添加更多模板:比如SQL生成、文档编写
-
保存历史记录:把问答保存到文件
-
图形界面:做成桌面应用
-
Web API:做成服务供其他程序调用
十六、完整项目结构
text
prompt-simple/├── config.properties # 配置文件├── prompts/ # 模板目录│ ├── java_coder.txt # 代码生成模板│ ├── tech_help.txt # 技术问答模板│ └── code_review.txt # 代码审查模板├── src/│ ├── SimplePrompt.java # 模板类│ ├── DeepSeekClient.java # AI客户端│ ├── TemplateManager.java # 模板管理器(可选)│ └── PromptDemo.java # 主程序├── lib/ # 依赖库└── README.md # 说明文件
现在,你已经有了一个简单可用的Prompt模板系统!快去试试吧!
夜雨聆风
