1. LangChain.js 快速入门指南
作为一名长期从事AI应用开发的工程师,我最近在多个项目中使用了LangChain.js这个强大的工具库。它极大地简化了基于大语言模型(LLM)的应用程序开发流程。今天我想分享一些实战经验,帮助开发者快速上手这个工具。
LangChain.js最新版本(V1.2.13)提供了对主流AI平台的全面支持,包括千问、DeepSeek、Kimi等国内平台,以及OpenAI、Anthropic等国际服务。通过统一的API接口,开发者可以轻松切换不同的大模型提供商,而无需重写大量代码。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与安装
2.1 系统要求
LangChain.js基于TypeScript开发,对运行环境有明确要求:
- Node.js 18.x/19.x/20.x(推荐20+版本)
- 支持ESM和CommonJS模块系统
- 需要安装fetch polyfill(如果使用Node.js 16)
注意:官方已明确表示不支持Node.js 16,如果必须使用16版本,需要自行解决fetch兼容性问题。
2.2 安装步骤
安装LangChain.js非常简单,只需执行以下命令:
bash复制npm install langchain @langchain/core
建议同时安装对应平台集成包,以阿里云千问为例:
bash复制npm install @langchain/openai
安装完成后,可以通过以下命令验证版本:
bash复制npm list langchain
2.3 版本迁移注意事项
如果你从0.0.52之前的版本升级,需要注意以下重大变更:
-
模块导入路径调整:
javascript复制// 旧版 import { OpenAI } from "langchain/llms/openai"; // 新版 import { OpenAI } from "@langchain/openai"; -
工具类路径变更:
javascript复制// 旧版 import { Calculator } from "langchain/tools"; // 新版 import { Calculator } from "langchain/tools/calculator"; -
加载器路径变更:
javascript复制// 旧版 import { loadLLM } from "langchain/llms"; // 新版 import { loadLLM } from "langchain/llms/load";
3. 基础使用教程
3.1 项目初始化
首先创建一个新项目并配置环境:
-
初始化项目:
bash复制mkdir langchain-demo && cd langchain-demo npm init -y -
添加type模块支持(package.json):
json复制{ "type": "module", "dependencies": { "@langchain/core": "^1.1.32", "@langchain/openai": "^1.2.13", "dotenv": "^17.3.1", "langchain": "^1.2.32" } } -
创建.env文件存储API密钥:
code复制QWEN_API_KEY=your_api_key_here
3.2 创建聊天模型实例
以下是创建千问大模型实例的完整代码:
javascript复制import dotenv from "dotenv";
import { ChatOpenAI } from "@langchain/openai";
// 加载环境变量
dotenv.config();
// 创建模型实例
const llm = new ChatOpenAI({
model: "qwen-plus",
apiKey: process.env.QWEN_API_KEY,
temperature: 0.7,
configuration: {
baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1"
}
});
关键参数说明:
temperature:控制生成文本的随机性(0-1)maxTokens:限制生成内容的最大长度maxRetries:设置API调用失败时的重试次数timeout:设置API调用超时时间
3.3 基本调用方式
3.3.1 非流式调用
javascript复制const response = await llm.invoke([
{
role: "system",
content: "你是一个专业的AI助手"
},
{
role: "user",
content: "请用中文解释量子计算的基本概念"
}
]);
console.log(response.content);
3.3.2 使用消息类封装
javascript复制import { HumanMessage, SystemMessage } from "@langchain/core/messages";
const messages = [
new SystemMessage("你是一个专业的AI助手"),
new HumanMessage("请用中文解释量子计算的基本概念")
];
const response = await llm.invoke(messages);
console.log(response.content);
3.4 高级功能
3.4.1 流式响应
流式响应可以显著提升用户体验:
javascript复制const stream = await llm.stream("请用简单的中文解释区块链技术");
let fullResponse = "";
for await (const chunk of stream) {
process.stdout.write(chunk.content);
fullResponse += chunk.content;
}
3.4.2 批量处理
javascript复制const questions = [
"解释相对论的基本概念",
"什么是深度学习",
"如何学习编程"
];
const responses = await llm.batch(questions, {
maxConcurrency: 3
});
responses.forEach(res => {
console.log(res.content);
});
3.4.3 结构化输出
使用Zod定义输出结构:
javascript复制import { z } from "zod";
const BookSchema = z.object({
title: z.string().describe("书名"),
author: z.string().describe("作者"),
year: z.number().describe("出版年份"),
rating: z.number().describe("评分(1-10)")
});
const structuredModel = llm.withStructuredOutput(BookSchema);
const bookInfo = await structuredModel.invoke("请提供《三体》的基本信息");
console.log(bookInfo);
4. 实战技巧与问题排查
4.1 性能优化建议
-
合理设置temperature:
- 创造性任务:0.7-0.9
- 事实性回答:0.1-0.3
-
控制maxTokens:
- 对话场景:300-500
- 内容生成:800-1200
-
使用批处理:
- 适合处理大量相似请求
- 注意控制maxConcurrency参数
4.2 常见问题解决
-
API调用失败:
- 检查API密钥是否正确
- 验证网络连接是否正常
- 确认服务端是否可用
-
响应速度慢:
- 降低temperature值
- 减少maxTokens设置
- 检查网络延迟
-
内容不符合预期:
- 优化prompt设计
- 调整temperature参数
- 添加更明确的系统指令
4.3 监控与统计
javascript复制// 获取token使用情况
console.log(response.response_metadata.tokenUsage);
// 典型输出
// {
// promptTokens: 28,
// completionTokens: 120,
// totalTokens: 148
// }
5. 深入应用场景
5.1 构建对话系统
javascript复制const conversation = [
new SystemMessage("你是一个专业的IT技术顾问")
];
async function chat(userInput) {
conversation.push(new HumanMessage(userInput));
const response = await llm.invoke(conversation);
conversation.push(response);
return response.content;
}
// 使用示例
await chat("如何学习Python?");
await chat("应该从哪些方面入手?");
5.2 内容生成应用
javascript复制async function generateArticle(topic) {
const prompt = `请以专业记者的身份,撰写一篇关于${topic}的800字文章。
要求:
1. 结构清晰,包含引言、正文和结论
2. 使用专业但易懂的语言
3. 包含实际案例`;
return await llm.invoke(prompt);
}
5.3 数据处理与分析
javascript复制const DataSchema = z.object({
keywords: z.array(z.string()).describe("关键词列表"),
sentiment: z.enum(["positive", "neutral", "negative"]).describe("情感倾向"),
summary: z.string().describe("内容摘要")
});
async function analyzeText(text) {
const analyzer = llm.withStructuredOutput(DataSchema);
return await analyzer.invoke(`分析以下文本:\n${text}`);
}
在实际项目中,我发现合理设计prompt和系统消息对输出质量影响很大。建议花时间优化这些提示词,它们相当于给AI的"工作说明书"。另外,对于中文场景,适当调整temperature参数可以获得更符合预期的结果。
