[LangChian] 05.结构化提示词

news/2025/10/21 13:45:37/文章来源:https://www.cnblogs.com/Answer1215/p/19154839

在跟各种 聊天模型 交互的时候,在构建聊天信息时,不仅仅包含了像上文中的文本内容,也需要与每条消息关联的角色信息。

例如这条信息是由 人类、AI、还是给 chatbot 指定的 system 信息,这种结构化的消息输入有助于模型更好地理解对话的上下文和流程,从而生成更准确、更自然的回应。

为了方便地构建和处理这种结构化的聊天消息,LangChain.js 提供了专门的结构化提示模板系统,来帮助我们方便地构造这类消息:

类名 用途
ChatPromptTemplate 构造整个多轮提示词结构
SystemMessagePromptTemplate 设置系统规则 / 行为模式
HumanMessagePromptTemplate 模拟用户输入
AIMessagePromptTemplate 模拟模型输出(上下文中使用)

角色的概念对 LLM 理解和构建整个对话流程非常重要,相同的内容由不同的 role 发送出来的意义是不同的。

  • system 角色的消息通常用于设置对话的上下文或指定模型采取特定的行为模式。这些消息不会直接显示在对话中,但它们 对模型的行为有指导作用。 可以理解成模型的元信息,权重非常高,在这里有效的构建 prompt 能取得非常好的效果。
  • user 角色代表真实用户在对话中的发言。这些消息通常是问题、指令或者评论,反映了用户的意图和需求。
  • assistant 角色的消息代表AI模型的回复。这些消息是模型根据system的指示和user的输入生成的。

快速上手

import {ChatPromptTemplate,SystemMessagePromptTemplate,HumanMessagePromptTemplate,
} from "@langchain/core/prompts";// 构建系统提示
const systemPrompt = SystemMessagePromptTemplate.fromTemplate("你是一位专业导游,负责用中文向游客介绍北京特产。"
);// 构建用户提示
const humanPrompt = HumanMessagePromptTemplate.fromTemplate("{question}");// 组合为 ChatPromptTemplate
const chatPrompt = ChatPromptTemplate.fromMessages([systemPrompt, humanPrompt]);// 填充变量,生成最终结构
const messages = await chatPrompt.formatMessages({question: "北京有哪些值得推荐的特产?",
});
console.log("生成的消息结构:", messages);

执行结果如下:

[SystemMessage {"content": "你是一位中国的专业导游,请使用中文向游客介绍中国的某些地区的特产","additional_kwargs": {},"response_metadata": {}},HumanMessage {"content": "我想问:北京的特产有哪些","additional_kwargs": {},"response_metadata": {}}
]

这是 LangChain.js 中 标准的聊天消息对象结构,每条消息都表示一次对话中的一轮发言(具有角色和内容),它们会传递给聊天模型进行推理。各个字段的意思如下:

字段名 类型 含义与作用
SystemMessage / HumanMessage 类实例 表示消息的角色类型
content string 消息正文,即这条消息说了什么
additional_kwargs object 额外的模型参数(可选),如工具调用、函数定义、引用等
response_metadata object 模型生成后自动附加的元信息(如 token 用量、日志信息等)

一个完整的示例:

  1. 生成结构化提示词
  2. 将结构化提示词喂给大模型
import {SystemMessagePromptTemplate,HumanMessagePromptTemplate,ChatPromptTemplate,
} from "@langchain/core/prompts";
import { ChatOllama } from "@langchain/ollama";function buildPrompt(sysTemplate, userTemplate) {const sysPt = SystemMessagePromptTemplate.fromTemplate(sysTemplate);const hPt = HumanMessagePromptTemplate.fromTemplate(userTemplate);return ChatPromptTemplate.fromMessages([sysPt, hPt]);
}// 1. 系统提示词
const sysTemplate ="你是一位中国的专业导游,请一定使用中文向游客介绍{location}的{topic}。记住:一定要使用中文来介绍";// 2. 用户输入提示词
const userTemplate = "当前用户的问题:{question}";// 3. 拿到最终组合的提示词模板
const pt = buildPrompt(sysTemplate, userTemplate);// 4. 做一个填充
const result = await pt.formatMessages({location: "北京",topic: "特产",question: "北京有哪些值得推荐的特产",
});// 5. 创建模型实例
const model = new ChatOllama({model: "llama3",stream: true,temperature: 0.7,
});const stream = await model.stream(result);for await (const chunk of stream) {process.stdout.write(chunk.content);
}

组合多个提示词

在实际工程中,我们常常需要根据多个变量、多个上下文来源,动态拼接出一个结构复杂、逻辑清晰的 Prompt。此时,如果把所有逻辑都写在一个大模板里,会让 Prompt 难以维护、难以复用。

这就是 PipelinePromptTemplate 的用武之地,它允许我们将多个小的 Prompt 模板,按顺序组合成一个“流水线式”的大模板,既能 模块化构建,又能 复用逻辑片段

PipelinePromptTemplate 中,有两个重要组成部分:

  • pipelinePrompts:一个数组,每一项都是一个小模板(Prompt),执行后会产出一个变量,供后续模板使用
  • finalPrompt:最终的主模板,引用前面生成的变量,拼装成完整 Prompt

可以想象每个 pipelinePrompt 是一个工序,负责“加工”一段文本,finalPrompt 则是总装线,拼出最终成品。

import {PromptTemplate,PipelinePromptTemplate,
} from "@langchain/core/prompts";// 获取当前日期字符串
const getDate = () => new Date().toLocaleDateString();// 1. 创建一个主模板
const mainPt = PromptTemplate.fromTemplate(`你是一个智能助理,今天是 {date},主人的信息是 {userInfo},请根据上下文完成以下任务:{todo}`
);// 2. 创建子模板
const timePl = PromptTemplate.fromTemplate("{date},现在是 {time}");
const filledTimePl = await timePl.partial({date: getDate,
});const userTpl = PromptTemplate.fromTemplate("姓名:{name},性别:{gender}");
const taskTpl = PromptTemplate.fromTemplate(`我想吃 {time} 的 {dish}。请再次确认我的信息:{userInfo}`);// 3. 可以将子模板填充到主模板里面
const finalPt = new PipelinePromptTemplate({pipelinePrompts: [{name: "date",prompt: filledTimePl,},{name: "userInfo",prompt: userTpl,},{name: "todo",prompt: taskTpl,},],finalPrompt: mainPt,
});
const result = await finalPt.format({time: "12:01",name: "张三",gender: "男",dish: "煎蛋",
});
console.log(result);

有了 pipelinePrompts,我们可以极大程度的复用和管理 prompt template,从而让 llm app 的开发更加工程化。


-EOF-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/942226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#获取文件md5码

C#获取文件md5码代码/// <summary> /// 原文链接:https://blog.csdn.net/makenothing/article/details/39493779 /// </summary> /// <param name="fileName"></param> /// <re…

2025年10月防腐木凉亭厂家对比评测榜:江西纳美领衔五强深度解析

一、引言 防腐木凉亭作为市政园林、地产配套与私家庭院的高频采购单元,其耐候性、结构安全与景观表现力直接决定项目整体品质与后期维护成本。2025年10月,北方进入施工收尾、南方仍处旺季的交叉时段,采购者面临“工…

2025通风天窗实力厂家推荐,正鑫专业制造与定制服务保障

2025通风天窗实力厂家推荐,正鑫专业制造与定制服务保障 当前通风天窗领域的技术挑战与行业现状 工业厂房通风系统作为保障生产环境安全的重要设施,其技术性能直接影响着企业的生产效率和员工健康。在当前的通风天窗、…

2025工业清洗设备实力厂家推荐:无锡瑞仕达精密CNC高压去毛刺清洗机

2025工业清洗设备实力厂家推荐:无锡瑞仕达精密CNC高压去毛刺清洗机 在工业制造领域,清洗环节一直是影响产品质量和生产效率的关键工序。随着制造业向高精度、高质量方向发展,传统清洗方式已难以满足复杂零部件的高清…

2025年10月治鼻炎产品推荐:权威对比评测榜助您精准选购

一、引言 秋季花粉、尘螨浓度在10月达到年度次高峰,鼻炎患者鼻塞、喷嚏、流涕症状集中爆发,创业者若计划布局鼻腔护理赛道、药店采购者欲更新货架、消费者希望快速缓解不适,都面临同一痛点:如何在同质化严重的市场…

git提PR时很多别人的commit,清理多余的commit

在自己的分支上git pull后git push提PR时,有时除了自己的commit,会把很多别人的commit也带进去,因为自己的分支落后主分支太多 如何把提的PR里很多别人的commit清除掉?git checkout mybranch git fetch origin mai…

Visual Studio 使用小知识记录

Visual Studio 使用小知识记录 使用 CodeLens 显示类,函数或者属性的引用和修改信息 在 "选项" -> "文本编辑器" -> "所有语言"-> "CodeLens" 设置启用codeLens功能…

2025数控锯床厂家推荐无锡正川,专业立式锯床制造企业

2025数控锯床行业深度解析:专业立式锯床的技术革新与市场前景 当前锯床行业面临的技术挑战与突破 随着制造业向智能化、精密化方向快速发展,数控锯床作为金属加工领域的关键设备,正面临着前所未有的技术挑战。根据行…

DeepSeek-OCR:让 AI “一眼看懂” 的黑科技

一张包含1000个文字的文档图片,只需要不到100个视觉token就能精准识别,这就是DeepSeek-OCR带来的革命性突破。最近,DeepSeek-AI团队发布了一款名为DeepSeek-OCR的新模型。这不是一个普通的文字识别工具,而是一种全…

生成一张图,苹果logo是透明冰块,安卓小机器人撒尿到苹果logo,冲出一个豁口

生成一张图,苹果logo是透明冰块,安卓小机器人撒尿到苹果logo,冲出一个豁口安卓机器人身高高于苹果logo,JJ和豁口齐平机器人腿太长了比例不协调

kafka2.8出现NotLeaderOrFollowerException

具体错误信息: org.apache.kafka.common.errors.NotLeaderOrFollowerException: For requests intended only for the leader, this error indicates that the broker is not the current leader. For requests inten…

IEC 61850 ICD文件解析

一、IEC 61850 IEC 61850是电力系统自动化领域的国际通信标准,由国际电工委员会第57技术委员会于2004年颁布。该标准通过定义变电站三层通信架构(站控层、间隔层、过程层)实现智能变电站工程标准化,其核心特点包括…

2025安全光栅厂家推荐安一光电,超薄无盲区设计守护工业安全

2025安全光栅厂家推荐安一光电,超薄无盲区设计守护工业安全 工业安全防护的技术挑战与创新需求 在现代工业生产环境中,安全光栅作为重要的防护设备,面临着日益复杂的技术挑战。随着自动化程度的提高和生产线速度的不…

用poi导入Excel

1每天多努力一点,你将会变得更好。

2025无锡新梅赛智能设备厂家推荐:全自动视觉定位点胶机专业制造商

2025无锡新梅赛智能设备厂家推荐:全自动视觉定位点胶机专业制造商 技术挑战与行业痛点 在现代制造业中,点胶工艺作为精密生产的关键环节,面临着前所未有的技术挑战。随着产品微型化、精密化趋势的加速,传统点胶设备…

2025石头纸设备厂家权威推荐:鼎浩包装科技环保吹塑机制造专家

2025石头纸设备厂家权威推荐:鼎浩包装科技环保吹塑机制造专家 技术挑战与行业现状 在环保材料快速发展的今天,石头纸设备行业面临着多重技术挑战。根据行业数据显示,传统造纸工艺每年消耗大量木材资源,而石头纸技术…

实用指南:【ATBS with Python】QA Chap2 If-else and Flow Control

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

用 Python 轻松克服 PDF 指定页替换为图片的痛点难题

用 Python 轻松克服 PDF 指定页替换为图片的痛点难题2025-10-21 13:21 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; dis…

Java面试题总结

一、Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java 1.2提出了囊括所有集合接口、实现和算法的集…