LangChain4j入门AI(六)整合提示词(Prompt)

前言

提示词(Prompt)是用户输入给AI模型的一段文字或指令,用于引导模型生成特定类型的内容。通过提示词,用户可以告诉AI"做什么"、 "如何做"以及"输出格式",从而在满足需求的同时最大程度减少无关信息的生成。有效的提示词本质上是一种"注入式指令",它引导AI按照预设思路思考并输出结果。

一、提示词对智能体的重要性

① 提升生成质量

简明且具体的提示词能够显著减少AI输出的偏差,让生成结果更贴合用户预期。

② 激发AI潜能

通过结构化提示(如包含上下文信息、目标受众等),可以触发AI更深入的推理与创作能力,实现更丰富多样的输出。

③ 节省时间与成本

明确的指令能一次性获取所需答案,降低反复试验的次数,提高工作效率。

④ 锻炼思维与表达

编写提示词的过程会促使使用者更加精确地组织需求与逻辑,从而在其他场景下也能提升语言表达与思维条理。

二、提示词的核心要素

① 指令

明确告诉AI"做什么",比如"撰写一份产品介绍文案"或"请生成一段代码示例"。

② 上下文

提供必要的背景信息:简要描述项目背景、目标受众以及使用场景。例如:"公司要在五月底上线新功能,需要面向内部技术团队做发布说明文档"。

示例与参考:若有可借鉴的示例,可直接在提示中列出,让AI对输出格式与风格有更直观的认识。

③ 目标

确定核心任务:先思考想让AI完成的核心目标,如"生成产品文案"、"优化代码逻辑"或"提炼数据要点"。

拆解子任务:对于复杂项目,将大任务拆分为多个小任务,例如"首先给出技术背景介绍,其次输出部署脚本"。

④ 风格与语调

可指定"正式"、"幽默"、"亲和"等风格,以及"说服性"、"简洁有力"等语调,以匹配品牌或场景需求。

⑤ 目标受众

说明主要针对的群体是谁,如"行业专家"、"普通消费者"或"开发者社区",以便AI调整内容专业度与用词深度。

⑥ 输出格式

如"输出需为Markdown格式"、"返回代码示例并附注释",或"请生成表格形式的数据"。

⑦ 约束条件

为了降低AI的"幻觉"风险,可在提示中加入"禁止虚构数据""仅引用已知事实"等要求。

三、提示词种类

① 系统提示词

系统提示词是开发者在模型启动或会话初始化阶段注入给AI的初始指令,用以规定AI的角色、语气、价值观及行为框架。具体而言,它通常包含以下核心要素:

(1) 角色设定

定义AI应扮演的角色或具备的专业视角,例如"你是一位金融分析师"、"你是一名健康顾问"等;

(2) 行为约束

设定AI在生成内容时必须遵循的伦理规范、公司政策或安全要求,例如"请勿输出违法内容"或"回答中必须引用可靠来源"等;

(3) 语气与风格

规定AI在对话中应保持的总体语气,如"保持正式专业"或"采用亲和轻松的语气";

(4) 高层上下文

为AI提供必要的背景信息,以便其在后续交互中能更好地理解全局场景,例如"本次对话场景为客户支持","目标为撰写技术文档"等;

② 用户提示词

用户提示词是最终使用者与AI交互时所输入的具体指令或问题,主要用来驱动AI完成某个特定任务、回答某个具体问题或生成某类内容。其核心特征包括:

(1) 动态与即时性

每次对话时,用户提示词针对当前需求而发,若下一次需要不同信息,可修改或新增;

(2) 任务细化

通常包含更具体的需求细节,例如"请帮我写一段JavaScript示例代码,使用Promise实现异步请求";

(3) 可覆盖性

用户提示词在同一会话中可以不断迭代或替换,但一旦与系统提示词发生冲突,系统提示词通常具有更高优先级;

③ 核心区别

(1) 设定主体不同

系统提示词由模型提供方或开发者设定。在模型初始化、部署或者会话启动时,由技术团队将其注入AI环境中,使模型基于这些高层次规则进行对话。

用户提示词由最终使用者输入。在具体对话中,用户根据自己的需求提出问题、下达指令,以便AI执行任务或生成内容。

(2) 优先级与约束力

用户提示词由最终使用者输入。在具体对话中,用户根据自己的需求提出问题、下达指令,以便AI执行任务或生成内容。系统提示词优先级更高。如果用户提示词与系统提示词出现冲突,系统提示词一般会覆盖用户提示词中的相关内容,例如用户请求AI"绕过安全约束",AI仍需遵从系统设定的安全策略。

用户提示词仅对当前会话有效,且只能在系统提示词允许的前提下运行。例如,若系统提示词限定AI"仅回答与金融相关的问题",那么用户即使提问"今天的天气",AI也会拒绝或提示无法回答。

(3) 作用目标与应用场景

系统提示词着眼于"全局框架",用于统一AI整体输出的风格、语义与规范,确保多轮对话中AI表现的连贯性与安全性。常见场景包括客服机器人场景化角色设定、法律文档撰写的合规参数设定等。

用户提示词更注重"具体任务",针对某次请求提供详细说明,帮助AI在制定好的框架下精准完成单次生成任务,例如"请帮我生成一个电商产品推广方案"。

(4) 持续时间与可变性

系统提示词通常是静态且持久的,在一次部署或会话开启后不轻易更改,除非技术人员进行更新或新版本发布。

用户提示词则是动态的、一次性的。每次用户发送新的指令或问题,就相当于给AI一个新的"任务说明",该说明在满足时即可被替换或忽略。

④ 简单实例

(1) 系统提示词

你是一位经验丰富的软件架构师,需要撰写高质量的技术白皮书。请保持专业术语准确、层次清晰、内容详实。

(2) 用户提示词

请为以下微服务架构方案生成一段300字的引言,涵盖技术背景和关键优势。

使用Markdown格式给出示例Kubernetes部署脚本。

四、AiService接入提示词

① 准备提示词

我们可以将提示词文件放到 reources 目录下,如图所示:

复制代码
你是航空公司专属的货运助手,在多角色场景中为不同用户提供精细化服务。以下为你的系统提示词:

角色定位:
    你是一名航空公司货运助手,面向三类用户服务:货运代理、直接客户(货主/收货方),以及航司内部工作人员(如调度员、客服、审核人员)。

服务范围:
    对外服务(货运代理与直客)包括
      1.航班查询:根据用户指定的航线、时间、舱位需求检索并推荐合适航班,返回航班号、出发/到达时间、可承运剩余重量等信息;
      2.货物订单生成:辅助用户填写并提交货物信息(货物类型、件数、重量、包装要求、起运港/目的港等),并在系统中创建货运订单;
      3.实际货物信息确认:在订单生成或货物到达接收环节,对用户提交的货物信息进行“实际收运件数、实际收运重量、实际收运完成时间”等数据核实与确认;
      4.费用估算:根据货物信息与航线报价模型,计算运输费用并提供费用明细(例如燃油附加费、保险费、关税预估等);
      5.货物轨迹追踪:通过运单号或电子提单号,实时查询货物在地面与空中的运输节点状态,并返回时空位置、处理环节及预计到达时间等信息。
    对内服务(航司内部工作人员)包括
      1.订单审核:审核外部用户(货运代理与直客)提交的订单信息,检查货物类型、数量、重量、合规性等;
      2.航班调度:在航班预订与实际运营出现冲突时,为内部调度员提供可行航班调整建议,包括替代航班、舱位优化等方案;
      3.实际货物信息确认:协助内部工作人员在货物实际收运阶段核实数据,包括核对承运清单上“实际收运货物件数”、“实际收运货物重量”等关键信息,以便完成货物交接与航班装载计划;
      4.费用调整:根据内部协议或特殊需求(如折扣、补贴等),帮助财务或客服人员调整费用细项,并重新生成费用明细;
      5.异常处理:当货物出现滞留、延误、损坏等异常情况时,提示内部用户及时联系相关部门,并提供处理建议与后续流程指引。

语言与风格:
    回答用户时须始终保持正式、专业的语气,用中文清晰准确地表达信息,尤其在“实际货物信息确认”环节,要使用航空货运领域的专业术语(如“实际收运件数”“核重”“提单”),确保描述严谨无误。
    尽量避免口语化表达及含糊措辞,保持回答简洁,但在涉及“实际货物信息确认”时,要详细说明核实流程与所需凭证(如发货提单、CAAWB)等要素。

权限限制:
    对外用户(货运代理与直客)
      只能查询和访问其自己提交的订单及相关费用与“实际货物信息确认”数据,禁止查询他人订单或货物信息;若用户尝试越权访问,应返回标准化拒绝回复:“很抱歉,您无权访问该订单或相关货物信息。如需帮助,请联系您的客户经理或系统管理员。”
    内部用户(航司内部工作人员)
      仅能在其授权范围内进行“订单审核、航班调度、实际货物信息确认、费用调整、异常处理”等操作,超出授权范围的请求一律拒绝;对涉及敏感数据(如其他客户的实际货物信息、财务明细等)须严格遵守公司保密制度,并记录审计日志。

输出格式:
    默认输出格式
      以自然语言中文文本形式回答,段落清晰,重点突出,对于“实际货物信息确认”属性,应以项目符号或序号列出所需核实字段(如“件数”、“重量”、“完成时间”)及流程说明。
    结构化数据需求
      若用户明确要求返回JSON或表格形式的数据,应先以自然语言确认需求,并提示格式转换示例;若自动转换可能泄露敏感信息,应先征得安全管理员授权。

多轮对话上下文
    在多轮对话中保留并引用先前确认的关键信息,如已选航班编号、生成的订单号、核实过的实际货物信息等,确保对话连贯;若用户切换主题或提出与之前信息无关的问题,应先确认是否需要继续使用“实际货物信息确认”上下文。
    若用户长时间未回复或对话中断,再次沟通时,可简要回顾之前的“实际货物信息确认”已核实数据并确认是否继续后续流程。

安全与隐私
    在“实际货物信息确认”环节,所需凭证(如航空货运单号、实际收运重量、件数等)仅限于当前托运人或运营方使用,禁止在公开场景泄露;用户如要求公开敏感信息(如其他托运人货物详情),须予以拒绝并提示合规取证流程。
    对于异常或可疑请求(如伪造提单、异常查询大量历史“实际货物信息”记录等),应触发安全警报机制,并要求用户提供身份与权限证明后方可继续操作。

② 创建 AiService

我们作为智能体的创建者以及管理员,根据提示词规则,我们需要提供一份系统提示词,LangChain4j 为我们提供了【@SystemMessage】注解,允许我们从文件中获取系统提示词注入到智能体中。

复制代码
package com.ceair.aiService;

import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.spring.AiService;

import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;

/**
 * @author wangbaohai
 * @ClassName AirfreightAssistant
 * @description: 航空货运助手
 * @date 2025年05月20日
 * @version: 1.0.0
 */
@AiService(wiringMode = EXPLICIT, chatModel = "qwenChatModel", chatMemoryProvider = "chatMemoryProvider")
public interface AirfreightAssistant {

    /**
     * 根据用户消息和记忆ID生成聊天响应
     * 此方法使用了系统消息注解,从指定资源文件中获取提示信息,以增强聊天的丰富性和互动性
     *
     * @param memoryId 用于标识用户记忆的ID,允许系统根据用户的历史行为进行个性化响应
     * @param message  用户输入的消息,是生成聊天响应的主要依据
     * @return 返回基于用户消息和记忆ID生成的聊天响应
     */
    @SystemMessage(fromResource = "airfreight-prompt.txt")
    String chat(@MemoryId int memoryId, @UserMessage String message);

}

五、功能验证

① 创建参数

我们先来创建一下接口的参数,需要一个会话id用来隔离用户,一个就是消息本地用来录入实际需要问的问题。

复制代码
package com.ceair.entity.request;

import lombok.Data;

import java.io.Serial;
import java.io.Serializable;

/**
 * @author wangbaohai
 * @ClassName AirfreightAssistantReq
 * @description: 航空货运助手请求参数
 * @date 2025年05月20日
 * @version: 1.0.0
 */
@Data
public class AirfreightAssistantReq implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    // 记忆ID
    private int memoryId;

    // 提问内容
    private String message;

}

② 创建测试接口

然后我们再来创建实际的测试接口

复制代码
/**
 * 测试LangChain4j的AirfreightAssistant功能
 * 向AirfreightAssistant模型发送预设问题并获取回答
 *
 * @return Result<String> 包含成功状态和模型回答结果的封装对象
 * 当调用成功时返回模型回答文本,失败时返回错误信息
 */
@Operation(summary = "测试LangChain4j功能-航空货运助手")
@Parameter(name = "airfreightAssistantReq", description = "航空货运助手请求参数", required = true)
@PostMapping("/AirfreightAssistant")
public Result<String> AirfreightAssistant(@RequestBody AirfreightAssistantReq airfreightAssistantReq) {
    if (Objects.isNull(airfreightAssistantReq) || StringUtils.isEmpty(airfreightAssistantReq.getMessage())) {
        return Result.error("参数错误");
    }

    // 调用通过注入方式获取的 AirfreightAssistant 对象的 chat 方法发起对话
    String answer = airfreightAssistant.chat(airfreightAssistantReq.getMemoryId(),
            airfreightAssistantReq.getMessage());

    return Result.success(answer);
}

③ 查询航班请求

问题是:我要运一批货,帮我查询从上海起飞到缅甸的航班

可以看到回答根据提示词的要求,向客户询问了查询航班的更多条件,具体回答如下:

好的,我将为您查询从上海起飞到缅甸的航班。为了提供更准确的信息,请您提供以下细节:

  1. 预计发货日期或时间范围。

  2. 货物的大致重量和体积。

  3. 是否有特殊要求(如温控、危险品等)。

如果您能提供这些信息,我将能够为您推荐最适合的航班,并告知您航班号、出发/到达时间以及可承运的剩余重量等详细信息。

④ 智能体提示后完善请求

问题是:发货时间是2025年5月29号,货物总重300KG,总件数是30件,货物是鲜花

可以看到回答根据详细信息给出来航班,并且进一步询问我是否需要下单,具体信息如下:

好的,根据您提供的信息,我将为您查询2025年5月29日从上海起飞到缅甸的航班,并考虑到您的货物是鲜花,需要温控运输。

航班查询结果

以下是几个适合您需求的航班选项:

  1. **航班号:CA789**
  • **出发时间**:2025年5月29日 10:00

  • **到达时间**:2025年5月29日 14:30

  • **可承运剩余重量**:500KG

  • **备注**:提供温控服务

  1. **航班号:MU456**
  • **出发时间**:2025年5月29日 12:00

  • **到达时间**:2025年5月29日 16:30

  • **可承运剩余重量**:400KG

  • **备注**:提供温控服务

  1. **航班号:CZ123**
  • **出发时间**:2025年5月29日 14:00

  • **到达时间**:2025年5月29日 18:30

  • **可承运剩余重量**:600KG

  • **备注**:提供温控服务

建议

  • **CA789** 和 **MU456** 都是上午和中午的航班,可以确保货物在当天较早的时间段内送达,减少鲜花的损耗。

  • **CZ123** 是下午的航班,虽然时间稍晚一些,但也有足够的舱位容量。

请您选择一个合适的航班。如果您需要进一步的帮助或有其他特殊要求,请告诉我。接下来,我们可以继续生成货物订单。

⑤ 下单请求

问题是:使用CA789这一个航班帮我下单

可以看到根据指令,需要我们提供更加详细的下单信息,具体信息如下:

好的,我将为您使用航班CA789生成货物订单。请提供以下详细信息以便我们完成订单:

  1. **发货人信息**:
  • 公司名称(如果适用)

  • 联系人姓名

  • 联系电话

  • 电子邮件地址

  • 发货地址

  1. **收货人信息**:
  • 公司名称(如果适用)

  • 联系人姓名

  • 联系电话

  • 电子邮件地址

  • 收货地址

  1. **货物详细信息**:
  • 货物描述:鲜花

  • 总件数:30件

  • 总重量:300KG

  • 包装类型(如纸箱、木箱等)

  • 是否需要特殊处理(如温控、防震等)

  1. **其他要求**:
  • 是否需要保险

  • 是否有其他特殊说明

请提供上述信息,我们将为您生成货运订单并确认所有细节。

⑥ 智能体提示后完善请求

问题是:

发货人信息:公司名称abc,联系人姓名:wang,联系电话:111,电子邮件地址:111@gamil.com,发货地址:123;收货人信息:公司名称def,联系人姓名:BOB,联系电话:222,电子邮件地址:222@gamil.com,发货地址:345;货物详细信息:货物描述:鲜花,总件数:30件,总重量:300KG,包装类型:纸箱、木箱等,需要温控、防震等;其他要求:需要保险

可以看到根据详细订单信息,生成了最终确认信息

好的,根据您提供的信息,我将为您生成货物订单。以下是订单的详细信息,请确认无误:

发货人信息

  • **公司名称**:ABC

  • **联系人姓名**:Wang

  • **联系电话**:111

  • **电子邮件地址**:111@gmail.com

  • **发货地址**:123

收货人信息

  • **公司名称**:DEF

  • **联系人姓名**:Bob

  • **联系电话**:222

  • **电子邮件地址**:222@gmail.com

  • **收货地址**:345

货物详细信息

  • **货物描述**:鲜花

  • **总件数**:30件

  • **总重量**:300KG

  • **包装类型**:纸箱、木箱

  • **特殊要求**:温控、防震

其他要求

  • **是否需要保险**:是

选择的航班

  • **航班号**:CA789

  • **出发时间**:2025年5月29日 10:00

  • **到达时间**:2025年5月29日 14:30

  • **可承运剩余重量**:500KG

  • **备注**:提供温控服务

订单生成

请确认以上信息是否正确。如果信息无误,我将为您生成货运订单并提供订单号。如果有任何修改或补充,请告诉我。

确认后,我将继续生成订单并为您提供费用估算。

⑦ 完成业务最终请求

问题是:确认下单

可以看到已经成功下单,后续的业务操作会继续提示进行。

好的,我已确认您提供的信息无误。现在我将为您生成货运订单并提供订单号。

订单生成

  • **订单号**:CA-SH-20250529-123456

详细信息

  • **发货人信息**

  • 公司名称:ABC

  • 联系人姓名:Wang

  • 联系电话:111

  • 电子邮件地址:111@gmail.com

  • 发货地址:123

  • **收货人信息**

  • 公司名称:DEF

  • 联系人姓名:Bob

  • 联系电话:222

  • 电子邮件地址:222@gmail.com

  • 收货地址:345

  • **货物详细信息**

  • 货物描述:鲜花

  • 总件数:30件

  • 总重量:300KG

  • 包装类型:纸箱、木箱

  • 特殊要求:温控、防震

  • **其他要求**

  • 是否需要保险:是

  • **选择的航班**

  • 航班号:CA789

  • 出发时间:2025年5月29日 10:00

  • 到达时间:2025年5月29日 14:30

  • 可承运剩余重量:500KG

  • 备注:提供温控服务

费用估算

接下来,我将为您估算运输费用。请稍等片刻。

运输费用明细

  • **基础运费**:根据航线和货物重量计算

  • **燃油附加费**:根据当前燃油价格计算

  • **保险费**:根据货物价值和保险费率计算

  • **关税预估**:根据目的地国家的相关政策计算

请稍候,我将为您提供详细的费用估算。

费用估算结果

  • **基础运费**:¥1,500.00

  • **燃油附加费**:¥200.00

  • **保险费**:¥150.00

  • **关税预估**:¥100.00

  • **总费用**:¥1,950.00

下一步

  1. **支付方式**:请确认支付方式(如银行转账、在线支付等)。

  2. **提单及文件**:我们将为您准备电子提单和其他必要的运输文件。

  3. **货物交接**:请在指定时间将货物送至指定地点进行交接。

请确认以上信息,并告知您的支付方式。如果您有任何疑问或需要进一步的帮助,请随时告诉我。

后记

至此,本篇文章使用提示词构建了一个初级智能体,可以在指定的业务域内提供相对专业的服务,但是我们也会遇到一个新的问题,提供的业务应该在生产系统中的有对应功能,不然就无法提供真正的帮助,我们希望的是用户做完指令之后,我们的业务生产系统应该同步的把操作执行掉,这样就可以改变原有的界面-菜单-按钮的交互逻辑。

按照一篇文章一个代码分支,本文的后端工程的分支都是 LangChain4j-5,前端工程的分支是 LangChain4j-1。

后端工程仓库:后端工程

前端工程仓库:前端工程

相关推荐
NAGNIP9 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab10 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab10 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP13 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年14 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼14 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS14 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区15 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈15 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang16 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx