什么是LangChain?
想象这个场景: 你有一个很聪明的AI助手(比如ChatGPT),但它有几个问题:
- 每次聊天都像第一次见面,不记得之前说过什么
- 只能聊天,不能帮你查天气、算数学、读文件
- 复杂的任务需要你一步一步指导,很麻烦
LangChain 就是解决这些问题的"超级工具箱"!
它让AI助手能够:
✅ 记住之前的对话
✅ 使用各种工具(计算器、搜索引擎等)
✅ 自动分解复杂任务
✅ 处理你的个人文件和数据
一句话:LangChain 就是一个帮助你快速构建 AI 应用的框架。
它将复杂的 LLM 程序拆分为可组合的模块,例如:
- Prompt(提示词)
- Model(模型 API)
- Memory(记忆)
- Tools(工具调用)
- Agent(智能体)
- Retriever(知识检索)
- RAG(检索增强生成)
你就可以像搭积木一样构建应用,而不是从零写一堆 glue code。
为什么需要 LangChain?它解决了什么问题?
| 痛点 | LangChain 如何解决? |
|---|---|
| 每次调用 LLM 都要写重复的 API 代码 | 提供统一的 Model 封装 |
| Prompt 管理困难 | 提供 PromptTemplate |
| 想 chaining(把多个步骤串起来)很麻烦 | 提供 Chain 机制 |
| 对话需要记忆 | 提供 Memory 模块 |
| 想让 AI 调用工具 / API | 提供 Tool + Agent |
| 想做知识库问答 | 提供 VectorStore + Retriever |
| 想搭建完整 RAG 系统 | 提供 LangGraph / LCEL 流程图式执行 |
可以把 LangChain 看作 AI 应用的 Spring / Flask。
LangChain 核心架构(图示)
如何使用LangChain?
# 打开终端(Windows用CMD或PowerShell,Mac用终端)
mkdir my-first-langchain
cd my-first-langchain
步骤2:初始化项目
npm init -y
步骤3:安装必要的包
# 核心包
npm install langchain
# 环境变量管理(保护你的API密钥)
npm install dotenv
# 如果需要使用OpenAI
npm install @langchain/openai
# 社区工具包
npm install @langchain/community
步骤4:获取API密钥
- 访问 OpenAI官网 ;
注意:国内可能用不了openai的api,我们可以直接使用国内的,比如DeepSeek
- 注册账号并获取API密钥
- 创建 .env 文件(注意前面有个点!)
步骤5:创建基础文件结构
my-first-langchain/
├── .env # 存放API密钥(不要上传到GitHub!)
├── package.json
├── 01-basic-llm.js # 基础AI调用
├── 02-chat-model.js # 聊天模式
├── 03-prompt-templates.js # 提示模板
└── utils.js # 工具函数
demo.js
/**
* 主要是为了实现一个简单的对话程序,使用DeepSeek API进行对话
* 步骤:
* 1. 创建一个对话历史数组,用于存储用户和助手之间的对话记录
* 2. 创建一个函数,用于调用DeepSeek API获取助手的回复
* 3. 创建一个函数,用于处理用户输入并调用API
* 4. 创建一个函数,用于显示对话统计信息
* 5. 启动对话程序
*
*/
// 导入dotenv库,用于从.env文件加载环境变量
// 导入readline库,用于读取命令行输入
import * as dotenv from "dotenv";
import readline from "readline";
// 加载.env文件中的环境变量
dotenv.config();
// 创建读取命令行输入的接口,允许程序与用户进行交互
// input: 指定输入流为标准输入(键盘)
// output: 指定输出流为标准输出(控制台)
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// 初始化对话历史数组,用于存储用户和助手之间的对话记录
// 包含系统提示词,设定助手的行为模式
let conversationHistory = [
{
role: "system",
content: "你是一个有用的助手,请用中文回答用户的问题。"
}
];
/**
* 调用DeepSeek API的异步函数
* @param {string} userInput - 用户输入的内容
* @returns {Promise<string|null>} 返回API响应结果或null(如果出错)
*/
async function callDeepSeekDirect(userInput) {
// 从环境变量中获取DeepSeek API密钥
const apiKey = process.env.DEEPSEEK_API_KEY;
// DeepSeek API的端点URL
const url = "https://api.deepseek.com/v1/chat/completions";
// 将用户输入添加到对话历史中,保持上下文连贯性
conversationHistory.push({
role: "user",
content: userInput
});
// 构建请求体参数
const requestBody = {
model: "deepseek-chat", // 指定使用的模型
messages: conversationHistory, // 传递完整的对话历史
temperature: 0.7, // 控制生成文本的随机性,0.7是较为平衡的值
max_tokens: 2000, // 设置生成文本的最大token数量
stream: false // 设置为false表示不使用流式传输
};
try {
// 在控制台显示思考中的提示信息
console.log("🤔 思考中...");
// 发送POST请求到DeepSeek API
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${apiKey}` // 使用Bearer Token进行身份验证
},
body: JSON.stringify(requestBody) // 将请求体转换为JSON字符串
});
// 检查API响应状态
if (!response.ok) {
// 如果响应不成功,获取错误详情
const errorText = await response.text();
console.log("❌ API 返回错误:");
console.log(errorText);
// 特别处理认证失败的情况
if (response.status === 401) {
console.log("\n🔐 认证失败!请检查:");
console.log(" 1. 是否从 DeepSeek 平台获取了正确的 API 密钥");
console.log(" 2. 密钥是否在 .env 文件中正确设置");
}
return null;
}
// 解析成功的API响应
const data = await response.json();
// 提取助手的回复内容
const assistantReply = data.choices[0].message.content;
// 将助手回复添加到对话历史中,维持对话上下文
conversationHistory.push({
role: "assistant",
content: assistantReply
});
// 返回助手的回复内容
return assistantReply;
} catch (error) {
// 处理网络请求或其他异常情况
console.log("❌ 请求失败:", error.message);
return null;
}
}
/**
* 启动对话流程的函数
*/
function startConversation() {
// 显示欢迎信息和使用说明
console.log("🎯 DeepSeek 对话助手已启动!");
console.log("💡 输入你的问题开始对话,输入 '退出' 或 'exit' 结束对话");
console.log("=".repeat(50)); // 输出分隔线以增强可读性
// 开始询问用户问题
askQuestion();
}
/**
* 询问用户问题的函数
*/
function askQuestion() {
// 使用readline接口询问用户输入
rl.question("\n👤Holin: ", async (userInput) => {
// 检查用户是否想要退出程序
if (userInput.toLowerCase() === '退出' || userInput.toLowerCase() === 'exit') {
console.log("\n👋 再见!感谢使用 DeepSeek 助手");
rl.close(); // 关闭readline接口
return;
}
// 检查用户输入是否为空
if (userInput.trim() === '') {
console.log("⚠️ 请输入有效内容");
askQuestion(); // 重新询问
return;
}
// 显示加载指示器,提升用户体验
process.stdout.write("🤖 DeepSeek: ");
// 调用DeepSeek API获取回复
const reply = await callDeepSeekDirect(userInput);
if (reply) {
// 清除"思考中..."并显示助手的回复
console.log(`\r🤖 DeepSeek: ${reply}`);
} else {
// 处理API调用失败的情况
console.log("\r❌ 抱歉,我遇到了一些问题,请稍后再试");
}
// 继续下一个问题循环
askQuestion();
});
}
/**
* 显示对话统计信息的函数
*/
function showConversationStats() {
// 统计用户发送的消息数量
const userMessages = conversationHistory.filter(msg => msg.role === 'user').length;
// 统计助手回复的消息数量
const assistantMessages = conversationHistory.filter(msg => msg.role === 'assistant').length;
// 显示对话统计数据
console.log("\n" + "=".repeat(50));
console.log(`📊 对话统计:`);
console.log(` 用户消息: ${userMessages} 条`);
console.log(` 助手回复: ${assistantMessages} 条`);
console.log(` 总对话轮数: ${userMessages + assistantMessages} 轮`);
console.log("=".repeat(50));
}
// 监听readline接口关闭事件,在程序退出前显示统计信息
rl.on('close', () => {
showConversationStats();
console.log("✨ 对话已保存,程序结束");
process.exit(0); // 正常退出程序
});
// 启动整个对话流程
startConversation();
直接在终端执行:
node demo.js
运行结果: