LangChain 核心组件深度解析:模型与提示词模板

在 LangChain 的应用开发中,模型(Models)提示词模板(Prompt Templates) 是最基础、最关键的组件。掌握它们,你就掌握了与大型语言模型高效交互的核心方法。本文将深入剖析这两个组件,从多模型管理到高级提示词工程,带你彻底理解 LangChain 的设计哲学与最佳实践。

模型(Models)

LangChain 为各类 LLM 提供了统一的调用接口,你可以像插拔 USB 设备一样,在不同的模型提供商之间轻松切换。

1. 模型提供商的多样性

下表列出了 LangChain 支持的部分主流模型提供商,每个都需要单独安装对应的集成包。

提供商 安装命令 典型用途
OpenAI(GPT系列) npm install @langchain/openai 通用对话,功能全面
DeepSeek(兼容OpenAI) 使用 @langchain/openai 高性价比,中文优化
Anthropic(Claude) npm install @langchain/anthropic 长文本,逻辑推理
Google(Gemini) npm install @langchain/google 多模态,谷歌生态
Ollama(本地模型) npm install @langchain/ollama 本地部署,隐私保护
Azure OpenAI npm install @langchain/openai 企业级,Azure云服务

注意:DeepSeek 使用 OpenAI 兼容的 SDK,只需配置自定义的 baseURLapiKey 即可无缝接入。

2. 配置模型的通用参数

无论使用哪家模型,LangChain 都抽象出了一套通用的初始化参数。以 DeepSeek 为例:

js 复制代码
import { ChatOpenAI } from "@langchain/openai";

const model = new ChatOpenAI({
  // 必需参数
  apiKey: process.env.DEEPSEEK_API_KEY,
  model: "deepseek-chat", // 或 "deepseek-coder" 用于代码任务
  baseURL: "https://api.deepseek.com/v1",

  // 核心调优参数
  temperature: 0.7,      // 创造性:0(确定)~ 1(随机)
  maxTokens: 1000,       // 输出最大 token 数
  timeout: 30000,        // 超时时间(毫秒)
  maxRetries: 2,        // 失败重试次数

  // 流式输出
  streaming: false,     // 是否启用流式输出

  // 其他高级参数
  topP: 1,              // 核采样:0~1
  frequencyPenalty: 0,  // 频率惩罚:-2~2
  presencePenalty: 0,   // 重复惩罚:-2~2
});

3. 同时管理多个模型配置

在实际项目中,你往往需要根据不同的场景(创意写作、事实问答、代码生成)使用不同的模型参数。LangChain 可以让你优雅地管理多个模型实例:

js 复制代码
// 配置多个场景的模型参数
const modelConfigs = {
  creative: {
    modelName: "deepseek-chat",
    temperature: 0.9,
    maxTokens: 500,
  },
  precise: {
    modelName: "deepseek-chat",
    temperature: 0.1,
    maxTokens: 200,
  },
  coder: {
    modelName: "deepseek-coder", // 代码专用模型
    temperature: 0.3,
    maxTokens: 1000,
  },
};

// 分别创建实例
const creativeModel = new ChatOpenAI({
  ...modelConfigs.creative,
  apiKey: process.env.DEEPSEEK_API_KEY,
  baseURL: "https://api.deepseek.com/v1",
});

const preciseModel = new ChatOpenAI({
  ...modelConfigs.precise,
  apiKey: process.env.DEEPSEEK_API_KEY,
  baseURL: "https://api.deepseek.com/v1",
});

const coderModel = new ChatOpenAI({
  ...modelConfigs.coder,
  apiKey: process.env.DEEPSEEK_API_KEY,
  baseURL: "https://api.deepseek.com/v1",
});

// 根据场景动态调用
async function generateContent(type: "creative" | "precise" | "coder", prompt: string) {
  const modelMap = {
    creative: creativeModel,
    precise: preciseModel,
    coder: coderModel,
  };
  return await modelMap[type].invoke(prompt);
}

提示词模板(Prompt Templates):让提示词可复用、可组合

硬编码提示词不仅难以维护,更无法适应复杂多变的业务需求。LangChain 的提示词模板系统提供了多种构建方式,让你像搭积木一样组装高质量的 Prompt。

1. 创建模板的多种方式

方式1:基础字符串模板(PromptTemplate

最简单的文本替换,适合单轮指令。

js 复制代码
import { PromptTemplate } from "@langchain/core/prompts";

const basicTemplate = PromptTemplate.fromTemplate(
  "写一篇关于{topic}的{style}风格短文,字数约{wordCount}字。"
);

const formattedPrompt = await basicTemplate.format({
  topic: "人工智能",
  style: "科普",
  wordCount: 300,
});

console.log(formattedPrompt);
// 输出:写一篇关于人工智能的科普风格短文,字数约300字。

方式2:消息数组模板(ChatPromptTemplate

面向对话场景,可灵活定义系统、人类、AI 等多轮消息。

js 复制代码
import { ChatPromptTemplate } from "@langchain/core/prompts";

const chatTemplate = ChatPromptTemplate.fromMessages([
  ["system", "你是{role}。你的回答风格:{style}"],
  ["human", "问题:{question}"],
  ["ai", "我之前说过:{history}"],
  ["human", "现在请回答:{currentQuery}"],
]);

const messages = await chatTemplate.invoke({
  role: "资深技术专家",
  style: "简洁明了,带一点幽默",
  question: "什么是LangChain?",
  history: "LangChain是一个开发LLM应用的框架",
  currentQuery: "它有什么核心优势?",
});

console.log(messages);

方式3:Few-shot 示例模板(FewShotPromptTemplate

通过提供少量输入‑输出样例,让模型快速理解任务模式,效果远胜纯文字指令。

js 复制代码
import { FewShotPromptTemplate, PromptTemplate } from "@langchain/core/prompts";

// 定义示例
const examples = [
  { input: "今天天气真好", output: "这是一个关于天气的正面评价。" },
  { input: "这个电影太糟糕了", output: "这是一个关于电影的负面评价。" },
];

// 示例的格式化模板
const exampleTemplate = PromptTemplate.fromTemplate("输入:{input}\n分类:{output}");

// 构建 Few-shot 模板
const fewShotTemplate = new FewShotPromptTemplate({
  examples,
  examplePrompt: exampleTemplate,
  prefix: "将以下文本分类为正面或负面评价:",
  suffix: "输入:{userInput}\n分类:",
  inputVariables: ["userInput"],
});

const result = await fewShotTemplate.format({
  userInput: "这个产品性价比很高",
});
console.log(result);

2. 模板组合与复用

复杂任务往往需要多个提示片段拼接。LangChain 允许你将独立的模板组合成一个完整对话。

js 复制代码
// 专业领域系统提示
const systemTemplate = PromptTemplate.fromTemplate(
  "你是{domain}领域的专家。你的专业知识级别:{level}。"
);

// 任务指令模板
const taskTemplate = PromptTemplate.fromTemplate(
  "请以{format}格式回答以下问题:\n问题:{question}"
);

// 格式/约束模板
const formatTemplate = PromptTemplate.fromTemplate(
  "要求:{requirements}\n请确保回答{constraints}。"
);

// 组合成 ChatPromptTemplate
const combinedPrompt = ChatPromptTemplate.fromMessages([
  ["system", await systemTemplate.format({ domain: "机器学习", level: "资深" })],
  ["human", await taskTemplate.format({ 
    format: "分步解答", 
    question: "解释过拟合和欠拟合的区别" 
  })],
  ["system", await formatTemplate.format({
    requirements: "使用比喻帮助理解",
    constraints: "不超过200字"
  })],
]);

const finalMessages = await combinedPrompt.invoke({});
console.log(finalMessages);

3. 实战示例:构建翻译助手

将模型与提示词模板结合,打造一个专业、可配置的翻译工具。

js 复制代码
import { ChatOpenAI } from "@langchain/openai";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";

// 1. 配置翻译专用模型(低 temperature,高准确性)
const translatorModel = new ChatOpenAI({
  apiKey: process.env.DEEPSEEK_API_KEY,
  model: "deepseek-chat",
  baseURL: "https://api.deepseek.com/v1",
  temperature: 0.1,
  maxTokens: 500,
});

// 2. 创建多功能翻译模板
const translationTemplate = ChatPromptTemplate.fromMessages([
  ["system", "你是一位专业翻译。根据要求翻译文本。"],
  ["human", `
翻译要求:
- 目标语言:{targetLanguage}
- 文本类型:{textType}
- 翻译风格:{style}
- 特殊要求:{specialInstructions}

待翻译文本:{text}
  `],
]);

// 3. 构建翻译链
const translationChain = translationTemplate
  .pipe(translatorModel)
  .pipe(new StringOutputParser());

// 4. 实际调用
async function runTranslation() {
  const result = await translationChain.invoke({
    targetLanguage: "英语",
    textType: "技术文档",
    style: "正式、准确",
    specialInstructions: "保持技术术语一致",
    text: "LangChain是一个用于开发大语言模型应用的框架,它提供了模块化组件和链式调用能力。",
  });
  console.log("技术文档翻译:", result);

  const poeticResult = await translationChain.invoke({
    targetLanguage: "日语",
    textType: "诗歌",
    style: "优美、文学性",
    specialInstructions: "保留意境",
    text: "春江潮水连海平,海上明月共潮生。",
  });
  console.log("诗歌翻译:", poeticResult);
}

runTranslation();

总结与最佳实践

核心知识点回顾

  • 模型管理:LangChain 的统一接口让你可以无缝切换 OpenAI、DeepSeek、Claude 等模型,只需更改少量配置。

  • 参数调优temperaturemaxTokenstopP 等参数直接影响输出质量,需根据任务类型动态调整。

  • 模板多样化:字符串模板、消息模板、Few-shot 模板覆盖了从简单指令到复杂对话的所有场景。

  • 模板组合:可以将系统提示、任务指令、约束条件拆分为独立模板,再灵活组装,实现工程化提示管理。

最佳实践建议

  1. 模板模块化

将频繁使用的提示模板(如翻译、总结、代码生成)抽象为独立模块,便于复用和维护。

  1. 参数实验

不同任务对创造性的需求不同:

ini 复制代码
-   创意写作、头脑风暴 → `temperature = 0.8 ~ 1.0`
-   事实问答、信息提取 → `temperature = 0.1 ~ 0.2`
-   代码生成 → `temperature = 0.2 ~ 0.4`
相关推荐
狗哥哥1 小时前
微前端架构下的平台级公共组件资源体系设计
前端·架构
MQliferecord1 小时前
首屏轮播图使用cdn加载webp图片的代码案例
前端
菜鸟shuai1 小时前
如何在老项目中使用AI实现智能问答
前端
我是何平1 小时前
js中,什么是快速排序(Quick Sort)
前端
用户5191495848451 小时前
Cisco SMA 暴露面检测工具 - 快速识别CVE-2025-20393风险
人工智能·aigc
爱勇宝1 小时前
别再混用了!import.meta.env 与 process.env 的本质差异一次讲透
前端·javascript·vue.js
清粥油条可乐炸鸡2 小时前
tanstack query的基本使用
前端·axios
路修远i2 小时前
基于SSE的AI对话流式结构
前端·javascript
攀登的牵牛花2 小时前
前端向架构突围系列 - 跨端技术 [11 - 1]:JSBridge 原理与 Hybrid设计
前端