LangChain 学习指南(TypeScript 版):从入门到精通

本文基于 NestJS + LangChain 实战项目,通过 14 个循序渐进的示例,带你掌握 LangChain 的核心概念和使用方法。

前言

在 AI 应用开发领域,LangChain 已经成为最流行的 LLM 应用开发框架之一。它提供了一套完整的工具链,让开发者可以轻松构建复杂的 AI 应用,如聊天机器人、知识库问答、智能助手等。

本文将通过 14 个实战示例,从最基础的 LLM 调用开始,逐步深入到 RAG(检索增强生成)等高级功能。每个示例都配有完整的代码和详细的解释,帮助你快速上手 LangChain。

你将学到什么

  • 如何使用 LangChain 调用 LLM
  • 如何实现多轮对话和记忆功能
  • 如何让 AI 调用外部工具
  • 如何使用 LCEL 链式调用
  • 如何实现 RAG 知识库问答
  • 如何解析和处理文档

技术栈

技术 说明
NestJS 10 Node.js 框架,提供 HTTP 服务
LangChain LLM 应用开发框架
TypeScript 类型安全,提升开发体验
PostgreSQL + pgvector 向量数据库,存储 Embedding
智谱 AI (GLM-5.2) 国产大语言模型

一、入门篇


入门篇介绍 LangChain 最基础的使用方式,适合零基础的开发者。

1. 最基础的 LLM 调用

学习 LangChain 的第一步,是了解如何调用 LLM。LangChain 提供了统一的接口,可以调用 OpenAI、智谱、Anthropic 等多种模型。

import { ChatOpenAI } from '@langchain/openai';
import { HumanMessage } from '@langchain/core/messages';

// 创建模型实例
// LangChain 使用 OpenAI 兼容接口,智谱 AI 也支持
const model = new ChatOpenAI({
  modelName: 'glm-5.2',
  openAIApiKey: 'your-api-key',
  configuration: { baseURL: 'https://open.bigmodel.cn/api/paas/v4' },
});

// 调用模型
// invoke() 是同步调用方法,传入消息数组
const response = await model.invoke([new HumanMessage('你好')]);

// response.content 是 AI 的回复内容
console.log(response.content);
// 输出:你好!有什么可以帮你的吗?

核心概念:

  • ChatOpenAI:聊天模型类,LangChain 使用 OpenAI 兼容接口
  • HumanMessage:用户消息,表示用户说的话
  • invoke():同步调用方法,传入消息数组,返回 AI 响应

什么时候用?

  • 简单的单轮对话
  • 文本生成、翻译、摘要等任务

2. 带系统提示的对话

系统提示(System Prompt)用于定义 AI 的角色和行为。比如让 AI 扮演老师、翻译官、程序员等角色。

import { SystemMessage, HumanMessage } from '@langchain/core/messages';

// SystemMessage 定义 AI 的角色
// HumanMessage 是用户的问题
const response = await model.invoke([
  new SystemMessage('你是一个专业的Python教师,请用简单易懂的中文解释概念。'),
  new HumanMessage('什么是变量?'),
]);

console.log(response.content);
// 输出:变量就像一个盒子,可以用来存放数据…

消息类型说明:

类型 作用 示例
SystemMessage 定义 AI 角色和行为 “你是一个助手”
HumanMessage 用户的问题或指令 “什么是变量?”
AIMessage AI 的回复 “变量是…”

消息顺序很重要:

System → Human → AI → Human → AI → …

什么时候用?

  • 需要特定角色的 AI(如老师、医生、律师)
  • 需要控制 AI 的回答风格
  • 需要设置回答的语言、长度等约束

3. 多轮对话(手动管理历史)

真实的对话场景需要记住之前的聊天内容。LangChain 提供了多种方式管理对话历史,这里介绍最基础的手动管理方式。

import { SystemMessage, HumanMessage, AIMessage } from '@langchain/core/messages';

// 对话历史(可以存储在数据库中)
const history = [
  { role: 'user', content: '我叫张三' },
  { role: 'assistant', content: '你好张三!' },
];

// 构建消息数组
const messages = [new SystemMessage('你是一个友好的助手。')];

// 添加历史消息
for (const msg of history) {
  if (msg.role === 'user') messages.push(new HumanMessage(msg.content));
  else if (msg.role === 'assistant') messages.push(new AIMessage(msg.content));
}

// 添加当前问题
messages.push(new HumanMessage('我叫什么?'));

const response = await model.invoke(messages);
console.log(response.content);
// 输出:你叫张三!

为什么需要管理历史?

  • LLM 没有记忆,每次调用都是独立的
  • 需要手动传递历史消息,AI 才能理解上下文
  • 历史消息越多,AI 理解越准确,但 token 消耗也越大

什么时候用?

  • 聊天机器人
  • 客服系统
  • 任何需要上下文的对话场景

二、进阶篇


进阶篇介绍 LangChain 的核心功能,包括工具调用、记忆、链式调用等。

4. Tool 工具调用

让 LLM 调用外部函数,是 LangChain 最强大的功能之一。比如让 AI 调用计算器、查询数据库、发送邮件等。

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

// 定义工具
// tool() 函数接收两个参数:
// 1. 工具函数(执行具体逻辑)
// 2. 工具配置(名称、描述、参数 schema)
const calculator = tool(
  ({ a, b, operation }: { a: number; b: number; operation: string }) => {
    switch (operation) {
      case 'add': return `${a} + ${b} = ${a + b}`;
      case'sub': return `${a} - ${b} = ${a - b}`;
      case'mul': return `${a} × ${b} = ${a * b}`;
      case 'div': return b!== 0? `${a} ÷ ${b} = ${a / b}` : '错误:除数不能为0';    
      default: return '未知操作';
    }
  },
  {
    name: 'calculator',
    description: '计算器工具,支持加减乘除',
    schema: z.object({
      a: z.number().describe('第一个数'),
      b: z.number().describe('第二个数'),
      operation: z.enum(['add','sub','mul', 'div']).describe('运算类型'),
    }),
  },
);

// 创建 Agent
// Agent 会根据用户问题,自动决定是否调用工具
const agent = createAgent({
  model: this.model,
  tools: [calculator],
});

// 运行 Agent
const result = await agent.invoke({
  messages: [
    { role:'system', content: '你是一个数学助手,使用计算器工具来计算。' },
    { role: 'user', content: question },
  ],
});
// Agent 会自动调用 calculator 工具,返回结果

Agent 的工作流程:

用户问题 → Agent 分析 → 需要工具? → 调用工具 → 返回结果
            ↓ 不需要
            直接回答

核心概念:

  • tool():定义工具函数
  • z.object():使用 Zod 定义参数类型和描述
  • createAgent():创建 Agent,自动决定何时调用工具

什么时候用?

  • 需要调用外部 API
  • 需要查询数据库
  • 需要执行计算或转换
  • 需要访问文件系统

5. Memory 记忆

Memory 让 Agent 记住之前的对话内容,实现真正的多轮对话。

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

// 创建记忆存储(类级别,全局共享)
// MemorySaver 是内存存储,重启后丢失
// 生产环境可以用 Redis、PostgreSQL 等持久化存储
this.checkpointer = new MemorySaver();

// 定义工具
const getWeather = tool(
  ({ city }: { city: string }) => `${city}今天天气晴朗,温度25°C!`,
  {
    name: 'get_weather',
    description: '获取城市天气',
    schema: z.object({
      city: z.string().describe('城市名称'),
    }),
  },
);

// 创建带记忆的 Agent
const agent = createAgent({
  model: this.model,
  tools: [getWeather],
  checkpointer: this.checkpointer, // 启用记忆
});

// 第一次对话(thread_id = "user-1")
await agent.invoke(
  {
    messages: [
      { role:'system', content: '你是天气助手,使用工具查询天气。记住用户之前说过的话。' },
      { role: 'user', content: '我叫张三' },
    ],
  },
  { configurable: { thread_id: 'user-1' } },
);

// 第二次对话(同一个 thread_id,Agent 会记住之前的内容)
const result = await agent.invoke(
  {
    messages: [
      { role:'system', content: '你是天气助手,使用工具查询天气。记住用户之前说过的话。' },
      { role: 'user', content: '我叫什么?' },
    ],
  },
  { configurable: { thread_id: 'user-1' } },
);
// Agent 会回答:你叫张三!

Memory 的工作原理:

thread_id = "user-1" 的对话历史:
├── 用户:我叫张三
├── AI:你好张三!
└── 用户:我叫什么? ← Agent 记得之前说过

核心概念:

  • MemorySaver:记忆存储器
  • thread_id:对话 ID,区分不同用户或对话
  • 记忆是自动管理的,无需手动维护

什么时候用?

  • 聊天机器人
  • 客服系统
  • 需要记住用户偏好的场景

6. Chains (LCEL 链式调用)

LCEL(LangChain Expression Language)是 LangChain 的核心特性,使用 .pipe() 方法链式连接组件,类似 Unix 管道。

import { ChatPromptTemplate } from '@langchain/core/prompts';
import { StringOutputParser } from '@langchain/core/output_parsers';

// 创建 prompt 模板
// {topic} 是变量占位符
const prompt = ChatPromptTemplate.fromMessages([
  ['system', '你是一个专业的技术写作助手,用简洁的中文回答。'],
  ['user', '请用一句话介绍 {topic}'],
]);

// 创建链: prompt -> model -> parser
//.pipe() 连接组件,数据自动流向下一个
const chain = prompt.pipe(this.model).pipe(new StringOutputParser());

// 调用链
const result = await chain.invoke({ topic: 'TypeScript' });

LCEL 执行流程:

{ topic: 'TypeScript' }
    ↓
prompt.invoke() → 生成消息数组
    ↓
model.invoke() → 调用 LLM
    ↓
parser.invoke() → 解析输出
    ↓
"TypeScript 是 JavaScript 的超集…"

三种链式模式:

// 1. 简单链(单步)
const simpleChain = prompt.pipe(this.model).pipe(new StringOutputParser());
const simpleResult = await simpleChain.invoke({ topic });

// 2. 串联链(多步骤,顺序执行)
const titleChain = titlePrompt.pipe(this.model).pipe(new StringOutputParser());
const summaryChain = summaryPrompt.pipe(this.model).pipe(new StringOutputParser());
const title = await titleChain.invoke({ topic });
const summary = await summaryChain.invoke({ title });

// 3. 并行链(同时执行多个任务)
const translateChain = translatePrompt.pipe(this.model).pipe(new StringOutputParser());
const keywordsChain = keywordsPrompt.pipe(this.model).pipe(new StringOutputParser());
const [translation, keywords] = await Promise.all([
  translateChain.invoke({ text: simpleResult }),
  keywordsChain.invoke({ text: simpleResult }),
]);

核心概念:

  • .pipe():链式连接组件,数据自动传递
  • ChatPromptTemplate:提示词模板,支持变量
  • StringOutputParser:字符串输出解析器

什么时候用?

  • 任何需要多步骤处理的场景
  • 需要复用的处理流程
  • 需要并行处理的任务

7. Output Parsers 输出解析器

输出解析器把 LLM 返回的原始文本转成程序可用的数据结构。

import {
  StringOutputParser,
  JsonOutputParser,
  CommaSeparatedListOutputParser,
} from '@langchain/core/output_parsers';

// 1. 字符串解析器(最基础)
// 直接返回 LLM 的文本输出
const stringPrompt = ChatPromptTemplate.fromMessages([
  ['user', '用一句话介绍:{topic}'],
]);
const stringChain = stringPrompt.pipe(this.model).pipe(new StringOutputParser());
const stringResult = await stringChain.invoke({ topic });

// 2. JSON 解析器
// 自动解析 LLM 返回的 JSON 字符串
const jsonPrompt = ChatPromptTemplate.fromMessages([
  ['system', `请严格按照 JSON 格式返回,不要添加其他文字:
{
  "name": "名称",
  "description": "描述",
  "features": ["特性1", "特性2", "特性3"]
}
`],
  ['user', '{topic}'],
]);
const jsonChain = jsonPrompt.pipe(this.model).pipe(new JsonOutputParser());
const jsonResult = await jsonChain.invoke({ topic });
// 返回:{ name: "…", description: "…", features: […] }

// 3. 列表解析器
// 解析逗号分隔的列表
const listPrompt = ChatPromptTemplate.fromMessages([
  ['system', '请用逗号分隔列出3-5个关键词,不要添加其他文字'],
  ['user', '{topic}'],
]);
const listChain = listPrompt.pipe(this.model).pipe(new CommaSeparatedListOutputParser());
const listResult = await listChain.invoke({ topic });
// 返回:["关键词1", "关键词2", "关键词3"]

常用解析器对比:

解析器 输入 输出 用途
StringOutputParser LLM 文本 string 纯文本回答
JsonOutputParser JSON 字符串 object 结构化数据
CommaSeparatedListOutputParser “a,b,c” string[] 关键词列表

什么时候用?

  • 需要结构化数据(JSON、列表)
  • 需要进一步处理 LLM 输出
  • 需要保证输出格式一致

8. 结构化输出

让 LLM 返回指定格式的数据,是 Output Parser 的高级用法。

// 使用提示词让 LLM 返回 JSON(兼容所有模型)
const response = await this.model.invoke([
  new SystemMessage(`你是一个信息整理助手。请严格按照 JSON 格式返回信息,不要添加任何其他文字。

返回格式:
{
  "title ": "标题",
  "summary": "摘要,不超过50字",
  "keywords ": ["关键词1", "关键词2", "关键词3"],
  "difficulty": "简单|中等|困难"
}

只返回 JSON,不要返回其他内容!`),
  new HumanMessage(`主题:${topic}`),
]);

// 提取 JSON(处理可能的前后文字)
const content = response.content as string;
const jsonMatch = content.match(//{[/s/S]*/}/);
let result;
if (jsonMatch) {
  result = JSON.parse(jsonMatch[0]);
} else {
  result = { raw: content, error: '无法解析 JSON' };
}

为什么需要结构化输出?

  • LLM 默认返回自由文本,格式不确定
  • 程序需要固定格式的数据才能处理
  • 结构化输出可以保证数据一致性

什么时候用?

  • 需要提取特定信息(如标题、关键词)
  • 需要分类或评分
  • 需要生成配置或代码

9. Streaming 流式输出

流式输出可以实时显示 AI 的回复,提升用户体验。

// 使用 stream 方法获取流式响应
const stream = await this.model.stream([
  new SystemMessage('你是一个助手,请简洁回答。'),
  new HumanMessage(question),
]);

// 收集所有 chunks
const chunks: string[] = [];
for await (const chunk of stream) {
  if (chunk.content) {
    chunks.push(chunk.content as string);
  }
}

// chunks 包含逐字输出的片段,适合实时展示
const fullResponse = chunks.join('');

流式 vs 非流式:

方式 响应时间 用户体验 适用场景
非流式 等待完整响应 有延迟 短文本、API 调用
流式 立即开始输出 实时显示 长文本、聊天界面

什么时候用?

  • 聊天界面
  • 长文本生成
  • 需要实时反馈的场景

三、高级篇


“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。【保证100%免费】🆓

CSDN粉丝独家福利

这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以扫描下方二维码&点击下方CSDN官方认证链接免费领取 【保证100%免费】
在这里插入图片描述

(👆👆👆安全链接,放心点击)

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

👉1.大模型入门学习思维导图👈

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

对于从来没有接触过AI大模型的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。(全套教程文末领取哈)
在这里插入图片描述

👉2.AGI大模型配套视频👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。
在这里插入图片描述

在这里插入图片描述

👉3.大模型实际应用报告合集👈

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(全套教程文末领取哈)

在这里插入图片描述

👉4.大模型实战项目&项目源码👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战项目来学习。(全套教程文末领取哈)
在这里插入图片描述

👉5.大模型经典学习电子书👈

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(全套教程文末领取哈)
在这里插入图片描述

👉6.大模型面试题&答案👈

截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(全套教程文末领取哈)
在这里插入图片描述

为什么分享这些资料?

只要你是真心想学AI大模型,我这份资料就可以无偿分享给你学习,我国在这方面的相关人才比较紧缺,大模型行业确实也需要更多的有志之士加入进来,我也真心希望帮助大家学好这门技术,如果日后有什么学习上的问题,欢迎找我交流,有技术上面的问题,我是很愿意去帮助大家的!

这些资料真的有用吗?

这份资料由我和鲁为民博士共同整理,鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位,在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利,同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

在这里插入图片描述
在这里插入图片描述

CSDN粉丝独家福利

这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以扫描下方二维码&点击下方CSDN官方认证链接免费领取 【保证100%免费】![
这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

在这里插入图片描述
在这里插入图片描述

CSDN粉丝独家福利

这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以扫描下方二维码&点击下方CSDN官方认证链接免费领取 【保证100%免费】![
s://i-blog.csdnimg.cn/direct/01c8d6cbd2fe455da34b0d10b53dfbc5.jpeg#pic_center)

CSDN粉丝独家福利

这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以扫描下方二维码&点击下方CSDN官方认证链接免费领取 【保证100%免费】![
这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

在这里插入图片描述
在这里插入图片描述

CSDN粉丝独家福利

这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以扫描下方二维码&点击下方CSDN官方认证链接免费领取 【保证100%免费】

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐