LangChain.js 实战入门:从模型调用到函数调用详解
LangChain.js 是一个用于快速开发大模型应用的框架,提供了一系列强大的功能和工具,使得开发者能够更加高效地构建复杂的人工智能应用程序。本文旨在介绍在实际项目中使用 LangChain.js 时的核心方法和技巧,涵盖基础配置、模型调用、流式传输及高级功能。
LangChain.js 是构建大模型应用的框架,提供模型调用、流式传输、函数调用等功能。本文介绍了环境准备、ChatModel 实例化、消息处理、流式响应实现、JSON Mode 配置及函数调用流程。内容涵盖基于 Zod 的 Schema 定义、链式编排示例以及错误处理策略,帮助开发者掌握从入门到实战的核心技术点,实现高效的大模型应用开发。

LangChain.js 是一个用于快速开发大模型应用的框架,提供了一系列强大的功能和工具,使得开发者能够更加高效地构建复杂的人工智能应用程序。本文旨在介绍在实际项目中使用 LangChain.js 时的核心方法和技巧,涵盖基础配置、模型调用、流式传输及高级功能。
在开始之前,请确保你的开发环境已安装 Node.js(推荐 v16+)。通过 npm 或 yarn 安装必要的依赖包。
npm install langchain @langchain/openai
对于 TypeScript 项目,建议同时安装类型定义文件:
npm install --save-dev @types/node
环境变量配置是管理 API Key 的最佳实践。在项目根目录创建 .env 文件,避免将敏感信息硬编码在代码中。
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx
AZURE_OPENAI_API_KEY=your_azure_key
AZURE_OPENAI_API_INSTANCE_NAME=your_instance_name
AZURE_OPENAI_API_DEPLOYMENT_NAME=your_deployment_name
在代码中加载环境变量,可使用 dotenv 库或在运行时直接读取 process.env。
LangChain.js 新架构区分了两种主要调用方式:LLM 和 ChatModel。虽然本质都是调用模型接口,但 ChatModel 更适合处理对话场景,支持多轮上下文交互,因此推荐使用后者。
以 OpenAI 为例,实例化 ChatModel 需要传入 API Key 或其他认证参数。Key 可以直接在构造函数中传入,也可以自动从环境变量中读取。
import { ChatOpenAI } from "@langchain/openai";
const chatModel = new ChatOpenAI({
openAIApiKey: process.env.OPENAI_API_KEY,
modelName: "gpt-3.5-turbo",
});
如果是 Azure OpenAI,则需要配置额外的连接参数:
const azureChatModel = new ChatOpenAI({
azureOpenAIApiKey: process.env.AZURE_OPENAI_API_KEY,
azureOpenAIApiInstanceName: process.env.AZURE_OPENAI_API_INSTANCE_NAME,
azureOpenAIApiDeploymentName: process.env.AZURE_OPENAI_API_DEPLOYMENT_NAME,
azureOpenAIApiVersion: "2023-07-01-preview",
});
LangChain.js 提供了标准的消息类,如 SystemMessage 和 HumanMessage。系统消息用于设定 AI 的角色或指令,用户消息则是具体的问题。
import { SystemMessage, HumanMessage } from "@langchain/core/messages";
const messages = [
new SystemMessage("你是一位专业的技术文档助手,请用简洁的语言回答。"),
new HumanMessage("LangChain.js 的核心优势是什么?"),
];
// 使用 invoke 方法调用模型
const response = await chatModel.invoke(messages);
console.log(response.content);
invoke() 方法返回一个 Promise,解析后即为模型的回复内容。这种方式比旧版的 call() 更统一且易于维护。
流式传输是大模型应用提升用户体验的关键功能。它允许客户端实时接收生成的文本片段,而不是等待整个响应完成。
早期版本主要依赖回调函数来处理流式输出。
const chat = new ChatOpenAI({
streaming: true,
});
await chat.call([new HumanMessage("讲个笑话")], {
callbacks: [
{
handleLLMNewToken(token) {
process.stdout.write(token);
},
},
],
});
每当模型生成新的 token 时,handleLLMNewToken 会被触发。
新版 LangChain.js 推荐使用 .stream() 方法,配合 for await 循环,代码更简洁且符合现代 JavaScript 规范。
const stream = await chat.stream([new HumanMessage("解释一下量子计算")]);
for await (const chunk of stream) {
if (chunk.content) {
process.stdout.write(chunk.content);
}
}
stream 对象是一个 AsyncIterableIterator,可以方便地在浏览器或 Node.js 环境中遍历数据流。
JSON Mode 允许控制 AI 模型的输出格式,使其严格遵循指定的 JSON Schema。这对于需要将 LLM 集成到后端逻辑中的场景非常有用。
目前仅部分模型(如 gpt-4-1106-preview 及更新版本)支持此功能。需设置 response_format 为 json_object。
const jsonModeModel = new ChatOpenAI({
modelName: "gpt-4-1106-preview",
}).bind({
response_format: {
type: "json_object",
},
});
注意:在某些实现中,SystemMessage 必须明确包含 "JSON" 字样以强制模型进入该模式。
const res = await jsonModeModel.invoke([
["system", "Only return JSON output."],
["human", "提取以下文本的情感:今天天气真好。"],
]);
const parsed = JSON.parse(res.content);
console.log(parsed);
函数调用是 AI 应用与外部程序交互的重要协议。它允许 AI 根据用户意图选择并执行特定的函数,从而实现联网搜索、数据库查询等能力。
OpenAI 使用 JSON Schema 来定义函数结构。可以使用原生对象或 zod 库来简化定义。
import { z } from "zod";
import { zodToJsonSchema } from "zod-to-json-schema";
const extractionFunctionSchema = {
name: "extractor",
description: "Extracts fields from the input text.",
parameters: zodToJsonSchema(
z.object({
tone: z.enum(["positive", "negative"]).describe("The overall tone"),
word_count: z.number().describe("Number of words"),
chat_response: z.string().describe("Response to user"),
})
),
};
将定义的函数绑定到模型,并指定是否强制调用特定函数。
const model = new ChatOpenAI({
modelName: "gpt-4",
}).bind({
functions: [extractionFunctionSchema],
function_call: { name: "extractor" },
});
const result = await model.invoke([new HumanMessage("What a beautiful day!")]);
if (result.additional_kwargs?.function_call) {
const args = JSON.parse(result.additional_kwargs.function_call.arguments);
console.log("Function Args:", args);
// 在此处执行实际的业务逻辑
}
LangChain 的核心价值在于将多个组件串联成工作流。通过 Chains,可以将提示词模板、模型调用和后处理逻辑组合在一起。
最简单的链是将提示词模板与模型连接起来。
import { PromptTemplate } from "@langchain/core/prompts";
import { LLMChain } from "langchain/chains";
const prompt = PromptTemplate.fromTemplate("你好,我是{role},很高兴见到你");
const chain = new LLMChain({ llm: chatModel, prompt });
const result = await chain.run({ role: "人工智能助手" });
console.log(result);
对于复杂任务,可以使用 SequentialChain 按顺序执行多个步骤。
import { SequentialChain } from "langchain/chains";
const firstPrompt = PromptTemplate.fromTemplate("翻译这句话:{input}");
const secondPrompt = PromptTemplate.fromTemplate("总结翻译结果:{translation}");
const chain1 = new LLMChain({ llm: chatModel, prompt: firstPrompt, outputKey: "translation" });
const chain2 = new LLMChain({ llm: chatModel, prompt: secondPrompt, outputKey: "summary" });
const sequentialChain = new SequentialChain({
chains: [chain1, chain2],
inputVariables: ["input"],
outputVariables: ["summary"],
});
const finalResult = await sequentialChain({ input: "Hello world" });
console.log(finalResult.summary);
在实际生产中,网络波动或模型异常可能导致调用失败。建议添加重试机制。
import { RetryError } from "langchain/errors";
try {
const response = await chatModel.invoke(messages);
} catch (error) {
if (error instanceof RetryError) {
console.error("请求失败,稍后重试...");
} else {
console.error("其他错误:", error.message);
}
}
此外,建议对输入内容进行清洗,防止注入攻击;对输出内容进行校验,确保符合预期格式。定期监控 Token 消耗,优化 Prompt 以减少成本。
本文详细介绍了 LangChain.js 的基础用法和进阶功能。从环境搭建到模型调用,再到流式输出和函数调用,涵盖了构建 AI 应用所需的核心技能。通过合理使用 Chains 和 Prompt 模板,开发者可以大幅降低大模型集成的复杂度。随着 AI 技术的迭代,建议持续关注官方文档的更新,以利用最新的功能特性。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online