SEO技术

SEO技术

Products

当前位置:首页 > SEO技术 >

NestJS如何使用LangChain的Prompt模板?

96SEO 2026-04-22 16:50 0


作为一名后端开发者,你可NengYi经迫不及待地想在自己的NestJS项目中接入像LangChain这样强大的框架了。说实话,直接把字符串硬编码在代码里发给大模型,虽然刚开始觉得挺爽,但一旦项目复杂起来维护起来简直就是一场灾难。这时候,Prompt Template就成了你的救命稻草。今天咱们就抛开那些枯燥的官方文档,用一种geng接地气的方式,深入聊聊在NestJS环境下到底该怎么优雅地玩转LangChain的Prompt模板。

NestJS如何使用LangChain的Prompt模板?

为什么我们需要Prompt Template?

想象一下你正在开发一个智Neng客服系统。Ru果每次用户提问,你dou要手写一段“请你作为一个客服人员,回答用户关于...的问题”,这不仅累,而且极易出错。Prompt Template本质上就是一种“填空题”的逻辑。它把那些固定的指令封装起来只留出几个“坑”让你在运行时动态填入。这不仅让代码整洁了不少,还Neng复用逻辑,何乐而不为呢?

在LangChain的世界里Zui核心的两种模板形式莫过于 PromptTemplateChatPromptTemplate。虽然它们名字听起来hen像,但用法和适用场景却有着天壤之别。咱们一个一个来拆解。

基础篇:PromptTemplate 的使用

登场的是 PromptTemplate。这是Zui基础的形式,它主要用于生成纯文本字符串。当你不需要区分消息角色,只是单纯想给LLM发送一段指令时它就是你的首选。

在NestJS的服务层中,我们通常会这样引入它:

import { PromptTemplate } from '@langchain/core/prompts';
async demonstrateBasicUsage: Promise {
  // 1. 定义模板字符串,用花括号 {variable} 标记变量位置
  const templateString = '请针对{topic}这个领域,给我写一篇关于{type}的简短介绍。';
  // 2. 实例化模板对象,并告知它有哪些变量需要填充
  const promptTemplate = new PromptTemplate({
    template: templateString,
    inputVariables: ,
  });
  // 3. 使用 format 方法填充变量,生成Zui终的提示词
  // 注意:在NestJS中,format 方法是同步的,不需要 await
  const finalPrompt = promptTemplate.format({
    topic: '量子力学',
    type: '科普向'
  });
  console.log;
  // 输出: 生成的提示词: 请针对量子力学这个领域,给我写一篇关于科普向的简短介绍。
}

kan到这里你可Neng会问,每次dou要 new 一个实例,还要手动列 inputVariables,是不是有点太繁琐了?别急,LangChain也提供了一个geng便捷的静态方法 .fromTemplate,它Neng自动帮你识别模板里的变量名,省去了不少敲键盘的功夫。

const quickTemplate = PromptTemplate.fromTemplate(
  '请简要评价{product}在{aspect}方面的表现。'
);
const promptValue = quickTemplate.format;
进阶篇:ChatPromptTemplate 的角色扮演

现在的LLM大多是基于Chat模型的,它们geng习惯处理“对话”结构,而不是一大段纯文本。这时候,ChatPromptTemplate 就该闪亮登场了。它允许我们定义不同角色的消息,比如 System、Human和 AI。

在NestJS中,构建一个多角色的对话模板非常直观。我们Ke以使用 fromMessages 方法,传入一个元组数组,每个元组定义了角色和内容。

import { 
  ChatPromptTemplate, 
  SystemMessagePromptTemplate, 
  HumanMessagePromptTemplate 
} from '@langchain/core/prompts';
async createChatPrompt {
  // 使用 fromMessages 静态方法构建
  const chatTemplate = ChatPromptTemplate.fromMessages(,
  ]);
  // 调用 invoke 方法,注意这里是异步的!
  // invoke 返回的是一个 ChatPromptValue 对象,里面包含了格式化后的消息数组
  const result = await chatTemplate.invoke({
    name: '阿强',
    question: 'React Hooks 的依赖项数组到底该怎么填?'
  });
  console.log;
}

这里有个细节需要特别注意:invoke 是异步方法,必须使用 await。Ru果你直接打印 result,可Neng会kan到一个 Promise 对象而不是你想要的结果。另外result.messages 就是我们Zui终传给大模型的 BaseMessage 数组,里面包含了 SystemMessage 和 HumanMessage 实例。

三种调用方式的区别

在实际开发中,我发现hen多同学对 ChatPromptTemplate 的几个调用方法容易混淆。其实它们的主要区别在于返回值类型和是否异步:

.invoke: 异步。返回 ChatPromptValue 对象。这是Zui标准的 LangChain Runnable 接口调用方式,适合直接链式传递给 LLM。

.formatMessages: 异步。直接返回 BaseMessage 数组。Ru果你只需要消息列表而不需要包装对象,用这个hen方便。

.format: 同步。返回纯文本字符串。它会将所有消息拼接成一个字符串,通常用于调试或者不需要消息结构的场景。

// 演示三种方式的区别
const template = ChatPromptTemplate.fromMessages(,
]);
// 1. invoke 
const val1 = await template.invoke; 
// 2. formatMessages 
const val2 = await template.formatMessages;
// 3. format 
const val3 = template.format;
高级技巧:部分变量填充

有时候,我们会有这样的需求:一个模板里有五个变量,但其中三个是固定的,只有两个是每次请求dou不一样的。Ru果每次dou要把这三个固定的变量传一遍,那代码冗余度就太高了。

LangChain 提供了 partial 功Neng,专门解决这个问题。我们Ke以预先填充一部分变量,生成一个新的“半成品”模板。

方式一:构造函数中的 partialVariables

在创建模板时就Ke以通过 partialVariables 参数指定预填充的值。

const partialTemplate = new PromptTemplate({
  template: '请评价{product}的优缺点,重点关注{aspect1}和{aspect2}。',
  inputVariables: , // 只需要声明剩余未填充的变量
  partialVariables: {
    aspect1: '电池续航' // 预先固定这个值
  }
});
// 使用时只需传 product 和 aspect2
const promptA = partialTemplate.format({ 
  product: '某品牌手机', 
  aspect2: '屏幕显示' 
});
方式二:链式调用 .partial

Ru果你Yi经有一个完整的模板对象,也Ke以直接调用 .partial 方法。这在动态配置场景下非常有用。

const baseTemplate = PromptTemplate.fromTemplate(
  '请分析{target}在{season}的表现,主要kan{metric}。'
);
// 动态生成一个只关注“春季”和“销售额”的模板
const seasonalTemplate = await baseTemplate.partial({
  season: '春季',
  metric: '销售额'
});
// 后续调用只需传入 target
const promptB = seasonalTemplate.format;
动态消息列表:MessagesPlaceholder

在构建聊天机器人时我们经常需要把用户的“历史聊天记录”塞给模型,让它Neng记住上下文。但是历史记录的长度是不确定的,这时候普通的模板变量就不够用了。

这时候,MessagesPlaceholder 就派上用场了。它就像一个特殊的占位符,告诉模板:“嘿,这里到时候我会塞给你一整个消息列表,你别管有多少条,全部放进去就行。”

import { MessagesPlaceholder } from '@langchain/core/prompts';
async createHistoryPrompt {
  const historyTemplate = ChatPromptTemplate.fromMessages(,
    // 👇 这里放一个占位符,变量名是 'chat_history'
    new MessagesPlaceholder,
  ]);
  const result = await historyTemplate.invoke({
    name: '小智',
    // 这里传入一个包含历史消息的数组
    chat_history: ,
    input: "我刚才说我叫什么?"
  });
  console.log;
}

这种结构非常灵活,因为它允许你在 System 指令和当前用户输入之间,插入任意长度的对话历史。这是实现具备记忆功NengAI应用的关键一步。

少样本提示

除了上述的结构化技巧,LangChain 还支持“少样本提示”。简单来说就是通过给模型kan几个例子,让它学会怎么回答。这在处理复杂任务时效果奇佳。

虽然这部分逻辑稍微复杂一点,通常涉及到 ExampleSelector,但其核心思想依然是模板化。你Ke以把“例子”kan作是一种特殊的变量填充。每个例子通常是一个字典,键对应输入变量,值对应具体的输入和输出。

比如你想让模型学会Zuo“情感分析”,你Ke以构建一个包含正面、负面例子的模板。虽然这里不展开具体的代码实现,但理解了“用例子来教模型”这个逻辑,配合前面提到的 PromptTemplate,你就Neng组合出非常强大的提示词策略。

与避坑指南

在NestJS中使用LangChain的Prompt模板,其实就是在Zuo“结构化”的工作。把混乱的自然语言指令,变成代码中可维护、可复用的对象。

Zui后再强调几个开发中容易踩的坑:

异步与同步的混淆在NestJS里invokeformatMessages 是异步的,千万别忘了 await,否则你拿到的只是一个 Promise 对象,直接传给 LLM 会报错。

变量名匹配模板里的 {variable} 必须与 inputVariables 数组或者调用时传入的对象键名完全一致,少一个字母dou不行。

消息类型的选择Ru果你是在Zuo聊天机器人,优先使用 ChatPromptTemplate;Ru果只是简单的文本补全,用 PromptTemplate 就够了。别把简单的事情复杂化。

掌握了这些,你就Neng在NestJS中构建出既灵活又强大的AI应用了。别光kan,赶紧去你的项目里试试吧!


标签: langchain

SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback