LangChain入门指南

59 阅读4分钟

什么是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 核心架构(图示)

image.png

如何使用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密钥
  1. 访问  OpenAI官网 ;

注意:国内可能用不了openai的api,我们可以直接使用国内的,比如DeepSeek

  1. 注册账号并获取API密钥
  1. 创建  .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

运行结果:

image.png