LangChain4j框架(三)核心接口使用(3)Prompt 构建(指令对话)

一、Prompt

1、定义

LangChain4j 或大语言模型(LLM)的使用中,Prompt 指的是给模型的输入文本,用来告诉模型"你要做什么、怎么做"。它是 LLM 工作的核心,因为模型的输出完全依赖于你给的 prompt。

使用建议:

  • 清晰明确:越具体,模型输出越准确

  • 指令 + 上下文结合:系统指令 + 用户消息 + 记忆

  • 可复用模板 :用 PromptTemplate 可以批量生成 prompt,提高开发效率

  • 控制长度:避免 prompt 太长导致 token 超限

2、核心作用

  • 定义任务:告诉模型你想要做什么(生成文本、回答问题、翻译、摘要、代码等)

  • 提供上下文:包含对话历史、系统指令或外部信息

  • 控制风格/格式:指定输出的语气、格式或结构(如 JSON、Markdown、代码块等)

3、常用场景

场景 Prompt 的作用 示例
问答 给模型问题和上下文,让它回答 "请根据下面的文档回答问题:..."
翻译 指定源语言、目标语言 "将下面英文翻译成中文:..."
摘要 告诉模型对文本做压缩总结 "请将以下文章总结成 3 点要点:..."
代码生成/辅助编程 指定功能或需求,让模型生成代码 "请用 Java 写一个 HTTP 请求工具类:..."
多轮对话 提供对话历史,让模型延续上下文 "用户: ... AI: ... 用户: ... 继续回答"
格式化输出 指定输出格式,如 JSON 或表格 "请将以下数据转成 JSON:..."
指令执行 让模型执行某种操作或决策 "你是一个数学老师,请解释这个公式:..."

4、类型

  • 系统级 Prompt(System Prompt)

    • 定义模型角色和行为

    • 示例:"你是一个经验丰富的 Java 开发专家"

  • 用户级 Prompt(User Prompt)

    • 用户提问或请求的内容

    • 示例:"帮我写一个快速排序的实现"

  • 上下文 Prompt(Context / Memory)

    • 来自 Memory 的对话历史或外部数据

    • 示例:模型在生成回答时参考最近 5 条消息或摘要

  • 模板 Prompt(PromptTemplate)

    • 可以用变量动态生成 Prompt

    • 示例:"请将文本 {text} 翻译成中文",然后替换 {text}

5、实现方法

复制代码
简单地说,就是把上面的mode.generate改成model.chat,
  • chat() = 对话专用,更容易处理上下文和多轮

  • generate() = 生成专用,灵活且可处理非对话任务

特性 chat() generate()
主要用途 对话 / 聊天 通用文本生成
输入 单条 prompt 或消息列表(Message) prompt 或 PromptSequence
输出 单条文本 / ChatResult Generation 对象,可包含多条候选
支持多轮对话 ✅ (结合 Memory) ❌ (一般用于单轮生成)
适用场景 聊天机器人、对话应用 批量文本生成、问答、指令执行、填空任务

5.1 单轮Prompt

复制代码
import dev.langchain4j.model.chat.ChatMessage;
import dev.langchain4j.model.chat.openai.OpenAiChatModel;

public class PromptExample {

    public static void main(String[] args) {
        OpenAiChatModel model = OpenAiChatModel.builder()
                .apiKey("你的OPENAI_API_KEY")
                .model("gpt-3.5-turbo")
                .build();

        // 用户 Prompt
        String prompt = "请帮我写一段 Java 方法,用于计算数组的平均值";

        // 调用模型
        String response = model.chat(prompt).getText();

        System.out.println("模型输出:\n" + response);
    }
}

5.2 多轮对话 + 窗口记忆

复制代码
import dev.langchain4j.memory.MessageWindowMemory;
import dev.langchain4j.model.chat.openai.OpenAiChatModel;

public class MultiTurnPromptExample {

    public static void main(String[] args) {
        OpenAiChatModel model = OpenAiChatModel.builder()
                .apiKey("你的OPENAI_API_KEY")
                .model("gpt-3.5-turbo")
                .build();

        // 创建短期记忆,保存最近5条消息
        MessageWindowMemory memory = new MessageWindowMemory(5);

        // 用户第一条消息
        String userMessage1 = "你好,请帮我写一个 Java 方法计算数组平均值";
        memory.addUserMessage(userMessage1);

        // 调用模型
        String response1 = model.chat(memory.getMessages(), "生成方法代码").getText();
        memory.addAiMessage(response1);

        System.out.println("AI 第一次输出:\n" + response1);

        // 用户第二条消息
        String userMessage2 = "请加上异常处理,如果数组为空返回0";
        memory.addUserMessage(userMessage2);

        // 调用模型,传入 memory.getMessages() 保持上下文
        String response2 = model.chat(memory.getMessages(), "修改方法代码").getText();
        memory.addAiMessage(response2);

        System.out.println("AI 第二次输出:\n" + response2);
    }
}

5.3 PromptTemplate动态模板生成

复制代码
import dev.langchain4j.prompt.PromptTemplate;

PromptTemplate template = PromptTemplate.builder()
        .template("请将下面的文本翻译成中文:\n{text}")
        .build();

String text = "Hello, how are you?";
String prompt = template.format(Map.of("text", text));

// 然后像之前一样调用模型
String response = model.chat(prompt).getText();
System.out.println(response);

二、demo

前面的代码,使用prompt看下效果:

再把generate改成chat

相关推荐
零雲几秒前
java面试:怎么保证消息队列当中的消息丢失、重复问题?
java·开发语言·面试
冬夜戏雪1 分钟前
【java学习日记】【12.11】【11/60】
java·开发语言
在坚持一下我可没意见6 分钟前
Spring 后端安全双剑(下篇):JWT 无状态认证 + 密码加盐加密实战
java·开发语言·spring boot·后端·安全·spring
Daily Mirror6 分钟前
Day 32 类的定义和方法
python
秋刀鱼 ..13 分钟前
第五届机电一体化、自动化与智能控制国际学术会议(MAIC 2025)
运维·人工智能·python·机器人·自动化·制造·新人首发
deng-c-f21 分钟前
C/C++内置库函数(3):future、promise的用法
c语言·开发语言·c++
2501_9216494921 分钟前
亚太股票数据API:日股、韩股、新加坡股票、印尼股票市场实时行情,实时数据API-python
开发语言·后端·python·websocket·金融
Hello.Reader22 分钟前
用 Python 跑通第一个 Flink ML 项目KMeans 聚类从本地到集群实战
python·flink·kmeans
Wiktok26 分钟前
【WIT】解决导入pywinauto相关库会导致程序UI界面(tkinter/pyside6)浏览文件等操作卡住问题
python·ui·pywinauto
chaodaibing26 分钟前
【Java】一个批量更新插入数据到MySQL的工具类
java·开发语言·mysql