在使用 LangChain 构建大模型应用时,提示词(Prompt)设计是第一步。但直接写死字符串容易出错、复用性差,也不利于维护。这时候就该用上 LangChain 提供的 Prompt Template —— 一个专为语言模型设计的提示词模板工具。
快速上手#
无变量,纯字符串模板
import { PromptTemplate } from '@langchain/core/prompts'
// 创建一个最简单的提示模板const prompt = new PromptTemplate({ inputVariables: [], // 变量列表 template: 'Hello, AI!', // 模板})
// 使用 format 方法格式化模板(此处无变量)const result = await prompt.format()
console.log(result) // Hello, AI!有变量,嵌入到字符串模板
import { PromptTemplate } from '@langchain/core/prompts'
// 创建一个包含变量的提示模板const prompt = new PromptTemplate({ inputVariables: ['user'], // 在这个数组里面,声明有哪些变量 template: 'Hi, {user}!', // 使用了 {} 作为变量名的容器})
// 使用 format 方法替换变量// 需要提供变量的值const output = await prompt.format({ user: 'Alex',})
console.log(output) // Hi, Alex!嵌入多个变量:
import { PromptTemplate } from '@langchain/core/prompts'
// 定义一个多变量模板const prompt = new PromptTemplate({ inputVariables: ['period', 'user'], // 会用到2个变量 template: 'Good {period}, {user}!',})
// 提供对应的变量值进行格式化const result = await prompt.format({ period: 'evening', user: 'Lynn',})
console.log(result) // Good evening, Lynn!如果你想在最终结果中保留 {} 字符,比如输出 {debug} 或 {info},可以使用 {{}} 进行转义:
import { PromptTemplate } from '@langchain/core/prompts'
// 创建一个包含变量的提示模板const prompt = new PromptTemplate({ inputVariables: ['info'], template: '{{debug}}: 当前调试的信息为{info}',})
// 使用 format 方法替换变量// 需要提供变量的值const output = await prompt.format({ info: '日志已经上传至数据库',})
console.log(output)这样就不会被当作变量解析,而是原样输出 {debug}。
静态方法#
PromptTemplate.fromTemplate() 用来快速创建模板:
import { PromptTemplate } from '@langchain/core/prompts'
const pt = PromptTemplate.fromTemplate( '你是一位精通{subject}的专家,请用{language}来回答用户的问题')console.log(pt.inputVariables) // [ 'subject', 'language' ]
const result = await pt.format({ subject: '生物学', language: '中文',})console.log(result) // 你是一位精通生物学的专家,请用中文来回答用户的问题通过这种方式,我们无需手动声明 inputVariables,LangChain 会自动从模板字符串中识别 {} 包裹的变量,是构建快速模板的理想选择。
prompt.inputVariables // ["subject", "language"]部分填充#
我们有时并不会一次性拿到所有的变量数据。这时就可以先传入一部分变量,生成一个“部分填充”的模板,后续再继续补全 —— 这与函数式编程中的柯里化(Currying)思路非常相似。
import { PromptTemplate } from '@langchain/core/prompts'
const pt = PromptTemplate.fromTemplate( '你是一位精通{subject}的专家,请用{language}来回答用户的问题:{info}')const pt2 = await pt.partial({ subject: '生物学',})const pt3 = await pt2.partial({ language: '中文',})const result = await pt3.format({ info: '大象的鼻子为什么那么长',})console.log(result)动态生成变量值#
在某些场景下,我们希望在模板格式化时动态生成变量值,比如当前时间、随机数或用户上下文。
此时可以在 partial 方法中传入一个函数,而不是固定的值。
之后在调用 .format() 时,函数会自动执行,生成实际变量内容。
import { PromptTemplate } from '@langchain/core/prompts'
// 定义一个函数,获取当前的日期const getToday = () => new Date().toLocaleDateString()
const pt = PromptTemplate.fromTemplate('今天是{date},今天的活动是:{event}')
const pt2 = await pt.partial({ date: getToday,})
const result = await pt2.format({ event: '出去郊游',})console.log(result)另外一个示例:
import { PromptTemplate } from '@langchain/core/prompts'
// 获取当前日期const getDate = () => new Date().toLocaleDateString()
function createGreeting(period) { const date = getDate() // 获取了当前的日期 if (period === '早上') return `${date},早上好` if (period === '下午') return `${date},下午好` if (period === '晚上') return `${date},晚上好` return `${date},你好`}
// 定义提示模板const prompt = new PromptTemplate({ template: '{greeting}!欢迎回来。', inputVariables: ['greeting'],})
// 设置当前时间段const timePeriod = '下午'
// 传入函数,而不是字符串const partialPrompt = await prompt.partial({ greeting: createGreeting(timePeriod),})
const result = await partialPrompt.format()
console.log(result) // 8/6/2025,下午好!欢迎回来。构建少样本提示词#
🤔什么是少样本提示词?
少样本学习(few-shot learning),也称之为少样本提示,这是一种范式,在这种范式中,模型通过提示词获得你希望模型执行的任务示例。
示例:
例子:评论:这个产品真不错,用得很顺手! → 情感:正面评论:完全失望,质量太差了。 → 情感:负面评论:快递到了。 → 情感:中性
评论:外观还行,性能一般般。 → 情感:例子:句子:马云是阿里巴巴的创始人。实体:[马云: 人名], [阿里巴巴: 组织]
句子:乔布斯出生在旧金山。实体:[乔布斯: 人名], [旧金山: 地点]
句子:李雷明天去北京出差。实体:PromptTemplate.fromExamples() 已经不推荐使用,在 @langchain/core@0.3.x 版本中已经逐步转向使用 FewShotPromptTemplate
import { PromptTemplate, FewShotPromptTemplate } from '@langchain/core/prompts'
const examples = [ { input: 'apple', output: '苹果' }, { input: 'banana', output: '香蕉' }, { input: 'orange', output: '橙子' },]
// 每个示例的模板const examplePt = PromptTemplate.fromTemplate( '输入: {input} --- 输出: {output}')
const pt = new FewShotPromptTemplate({ examples, // 示例的数组 examplePrompt: examplePt, // 示例的模板 suffix: '输入: {fruit} --- 输出: ', inputVariables: ['fruit'],})
const result = await pt.format({ fruit: 'grape',})console.log(result)课堂练习
生成情感反馈的 few-shot 提示词
参考答案
import { PromptTemplate, FewShotPromptTemplate } from '@langchain/core/prompts'
const examples = [ { comment: '这个产品真不错,用得很顺手!', sentiment: '正面' }, { comment: '完全失望,质量太差了。', sentiment: '负面' }, { comment: '快递到了。', sentiment: '中性' },]
// 每个示例的模板const examplePt = PromptTemplate.fromTemplate( '评论:{comment} → 情感:{sentiment}')
const pt = new FewShotPromptTemplate({ examples, // 示例的数组 examplePrompt: examplePt, // 示例的模板 suffix: '评论:{comment} → 情感: ', inputVariables: ['comment'],})
const result = await pt.format({ comment: '外观还行,性能一般般',})console.log(result)