在 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,只需配置自定义的
baseURL和apiKey即可无缝接入。
2. 配置模型的通用参数
无论使用哪家模型,LangChain 都抽象出了一套通用的初始化参数。以 DeepSeek 为例:
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 可以让你优雅地管理多个模型实例:
// 配置多个场景的模型参数
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)
最简单的文本替换,适合单轮指令。
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 等多轮消息。
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)
通过提供少量输入‑输出样例,让模型快速理解任务模式,效果远胜纯文字指令。
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 允许你将独立的模板组合成一个完整对话。
// 专业领域系统提示
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. 实战示例:构建翻译助手
将模型与提示词模板结合,打造一个专业、可配置的翻译工具。
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 等模型,只需更改少量配置。
-
参数调优:
temperature、maxTokens、topP等参数直接影响输出质量,需根据任务类型动态调整。 -
模板多样化:字符串模板、消息模板、Few-shot 模板覆盖了从简单指令到复杂对话的所有场景。
-
模板组合:可以将系统提示、任务指令、约束条件拆分为独立模板,再灵活组装,实现工程化提示管理。
最佳实践建议
- 模板模块化
将频繁使用的提示模板(如翻译、总结、代码生成)抽象为独立模块,便于复用和维护。
- 参数实验
不同任务对创造性的需求不同:
- 创意写作、头脑风暴 → `temperature = 0.8 ~ 1.0`
- 事实问答、信息提取 → `temperature = 0.1 ~ 0.2`
- 代码生成 → `temperature = 0.2 ~ 0.4`