跳到主要内容

LangChain.js 核心组件指南

基于 LangChain.js v1.2.x

目录

  1. Models 模型
  2. Messages 消息
  3. Prompts 提示词模板
  4. Tools 工具
  5. Agents 代理
  6. Memory 记忆
  7. Middleware 中间件

1. Models 模型

安装

pnpm add @langchain/openai @langchain/core

ChatOpenAI

import { ChatOpenAI } from "@langchain/openai";

const model = new ChatOpenAI({
model: "gpt-4o", // 模型名称
temperature: 0.7, // 创造性 (0-1)
maxTokens: 2000, // 最大输出 token
apiKey: "sk-xxx", // API Key
configuration: {
baseURL: "https://api.openai.com/v1", // 自定义端点
},
});

兼容 OpenAI API 的服务

// 阿里云百炼
const model = new ChatOpenAI({
model: "qwen-turbo",
apiKey: process.env.API_KEY,
configuration: {
baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1",
},
});

// Ollama 本地
const model = new ChatOpenAI({
model: "llama3",
configuration: {
baseURL: "http://localhost:11434/v1",
},
});

2. Messages 消息

消息类型

import {
HumanMessage, // 用户消息
AIMessage, // AI 回复
SystemMessage, // 系统提示
ToolMessage, // 工具返回
} from "@langchain/core/messages";

使用示例

const messages = [
new SystemMessage("你是一个助手"),
new HumanMessage("你好"),
new AIMessage("你好!有什么可以帮你的?"),
new HumanMessage("今天天气怎么样"),
];

const response = await model.invoke(messages);
console.log(response.content);

Tool Calls

// AI 返回的 tool_calls
if (response.tool_calls && response.tool_calls.length > 0) {
for (const toolCall of response.tool_calls) {
console.log(toolCall.name); // 工具名
console.log(toolCall.args); // 参数
console.log(toolCall.id); // 调用 ID
}
}

// 返回工具结果
const toolMessage = new ToolMessage({
tool_call_id: toolCall.id,
content: "工具执行结果",
});

3. Prompts 提示词模板

PromptTemplate

基础变量插值模板。

import { PromptTemplate } from "@langchain/core/prompts";

const template = PromptTemplate.fromTemplate(
`请将以下文本翻译成{language}:

{text}`
);

const prompt = await template.format({
language: "英文",
text: "你好世界",
});
// 输出: "请将以下文本翻译成英文:\n\n你好世界"

ChatPromptTemplate

用于构建对话消息序列。

import { ChatPromptTemplate, MessagesPlaceholder } from "@langchain/core/prompts";

const chatTemplate = ChatPromptTemplate.fromMessages([
["system", "你是一个{role}"],
new MessagesPlaceholder("history"), // 历史消息占位符
["human", "{input}"],
]);

const messages = await chatTemplate.formatMessages({
role: "翻译助手",
history: [
new HumanMessage("你好"),
new AIMessage("Hello!"),
],
input: "谢谢",
});

FewShotPromptTemplate

带示例的提示模板,提升输出质量。

import { FewShotPromptTemplate, PromptTemplate } from "@langchain/core/prompts";

const examplePrompt = PromptTemplate.fromTemplate(
`输入: {input}
输出: {output}`
);

const examples = [
{ input: "happy", output: "开心" },
{ input: "sad", output: "悲伤" },
{ input: "angry", output: "愤怒" },
];

const fewShotTemplate = new FewShotPromptTemplate({
examples,
examplePrompt,
prefix: "将英文情感词翻译成中文:",
suffix: "输入: {word}\n输出:",
inputVariables: ["word"],
});

const prompt = await fewShotTemplate.format({ word: "excited" });
// 输出包含示例,引导模型输出格式

4. Tools 工具

定义工具

import { tool } from "@langchain/core/tools";
import { z } from "zod";

const myTool = tool(
async (input) => {
// 工具逻辑
return `结果: ${input.param}`;
},
{
name: "tool_name", // 唯一标识
description: "工具描述", // LLM 根据此决定是否调用
schema: z.object({ // Zod schema 定义参数
param: z.string().describe("参数说明"),
}),
}
);

绑定工具到模型

const tools = [calculator, getWeather, searchWeb];
const modelWithTools = model.bindTools(tools);

const response = await modelWithTools.invoke(messages);

// 检查是否有工具调用
if (response.tool_calls?.length > 0) {
// 执行工具...
}

工具调用循环

async function runAgentLoop(messages, model, tools) {
let currentMessages = [...messages];
const maxIterations = 5;

for (let i = 0; i < maxIterations; i++) {
const response = await model.invoke(currentMessages);
currentMessages.push(response);

if (response.tool_calls?.length > 0) {
// 执行每个工具调用
for (const toolCall of response.tool_calls) {
const tool = tools.find(t => t.name === toolCall.name);
const result = await tool.invoke(toolCall.args);

currentMessages.push(new ToolMessage({
tool_call_id: toolCall.id,
content: result,
}));
}
} else {
// 无工具调用,返回最终响应
return response.content;
}
}
}

5. Agents 代理

createAgent (LangChain v1.2+)

import { createAgent } from "langchain";

const agent = createAgent({
model: "gpt-4o", // 或 ChatOpenAI 实例
tools: [tool1, tool2],
systemPrompt: "你是一个助手",
});

const result = await agent.invoke({
messages: [{ role: "user", content: "你好" }],
});

流式输出

const stream = await agent.stream(
{ messages: [{ role: "user", content: "搜索新闻" }] },
{ streamMode: "values" }
);

for await (const chunk of stream) {
const lastMsg = chunk.messages.at(-1);
if (lastMsg?.content) {
console.log(lastMsg.content);
}
}

6. Memory 记忆

MemorySaver (LangGraph)

import { MemorySaver } from "@langchain/langgraph";

const checkpointer = new MemorySaver();

const agent = createAgent({
model: "gpt-4o",
tools: [],
checkpointer, // 启用记忆
});

// 使用 thread_id 追踪会话
await agent.invoke(
{ messages: [{ role: "user", content: "我叫小明" }] },
{ configurable: { thread_id: "user_123" } }
);

// 后续对话,同一 thread_id 会记住上下文
await agent.invoke(
{ messages: [{ role: "user", content: "我叫什么?" }] },
{ configurable: { thread_id: "user_123" } }
);
// AI 回复: 你叫小明

自定义 Memory Store

class InMemoryStore {
private store = new Map();

get(threadId: string) {
return this.store.get(threadId)?.messages || [];
}

set(threadId: string, messages: BaseMessage[]) {
this.store.set(threadId, {
messages: this.trimMessages(messages),
updatedAt: new Date(),
});
}

// 自动裁剪旧消息
private trimMessages(messages: BaseMessage[]) {
const maxMessages = 20;
if (messages.length <= maxMessages) return messages;
return [messages[0], ...messages.slice(-maxMessages + 1)];
}
}

7. Middleware 中间件

createMiddleware

import { createMiddleware } from "langchain";

const loggingMiddleware = createMiddleware({
name: "Logging",
beforeModel: (state) => {
console.log("Before model:", state.messages.length);
},
afterModel: (state) => {
console.log("After model:", state.messages.at(-1)?.content);
},
});

Tool Error Handling

const toolErrorMiddleware = createMiddleware({
name: "ToolErrorHandler",
wrapToolCall: async (toolCall, toolFn) => {
try {
return await toolFn(toolCall);
} catch (error) {
console.error(`Tool ${toolCall.name} failed:`, error);
return new ToolMessage({
tool_call_id: toolCall.id,
content: `Error: ${error.message}`,
});
}
},
});

const agent = createAgent({
model: "gpt-4o",
tools: [myTool],
middleware: [toolErrorMiddleware],
});

Trim Messages

import { RemoveMessage } from "@langchain/core/messages";
import { REMOVE_ALL_MESSAGES } from "@langchain/langgraph";

const trimMiddleware = createMiddleware({
name: "TrimMessages",
beforeModel: (state) => {
if (state.messages.length <= 10) return;

const systemMsg = state.messages[0];
const recent = state.messages.slice(-8);

return {
messages: [
new RemoveMessage({ id: REMOVE_ALL_MESSAGES }),
systemMsg,
...recent,
],
};
},
});

8. Structured Output 结构化输出

强制模型返回符合 Schema 的结构化 JSON。

两种策略

import { createAgent, toolStrategy, providerStrategy } from "langchain";
import { z } from "zod";

const schema = z.object({
name: z.string(),
age: z.number(),
});

// 方式1: Provider Strategy(模型原生支持)
const agent1 = createAgent({
model: "gpt-4o",
responseFormat: providerStrategy(schema),
});

// 方式2: Tool Strategy(通过工具调用实现)
const agent2 = createAgent({
model: "gpt-4o",
responseFormat: toolStrategy(schema),
});

使用示例

const ContactSchema = z.object({
name: z.string().describe("姓名"),
email: z.string().optional().describe("邮箱"),
phone: z.string().optional().describe("电话"),
});

const agent = createAgent({
model: createLLM(),
tools: [],
responseFormat: toolStrategy(ContactSchema),
});

const result = await agent.invoke({
messages: [{ role: "user", content: "提取: 张三, zhang@example.com" }],
});

console.log(result.structuredResponse);
// { name: "张三", email: "zhang@example.com" }

错误处理

const agent = createAgent({
model: createLLM(),
responseFormat: toolStrategy(schema, {
handleError: true, // 自动重试(默认)
// handleError: false, // 不重试,抛出异常
// handleError: (err) => `请修正: ${err.message}`, // 自定义
}),
});

常用包

包名用途
langchain核心库,createAgent 等
@langchain/core消息、工具、提示词基础类
@langchain/openaiOpenAI / 兼容 API 模型
@langchain/langgraph状态图、记忆、Checkpointer
zodSchema 验证(工具参数)

参考链接