LangChain:从基础调用到流程编排,打造可复用的AI工程化系统

60 阅读7分钟

引言


在大语言模型(LLM)爆发的时代,我们不再只是写代码的人——我们正在成为AI流程的建筑师。而在这场变革中,LangChain 扮演了至关重要的角色:它不仅是连接大模型与业务系统的桥梁,更是一种全新的工程化思维方式

本文将以 三个递进式实战案例 为主线,从最基础的提示词调用,到链式工作流,再到多阶段流程编排,层层剖析 LangChain 的核心能力与独特思路。你会发现,LangChain 的真正价值,不在于封装 API,而在于:

把模糊的 Prompt 工程,变成清晰、可拆解、可组合、可复用的 Chain 工程。


🔹 阶段一:基础调用 —— 用 PromptTemplate 实现动态提示词管理

很多开发者使用 LLM 时,习惯直接拼接字符串作为 prompt。但当变量增多、逻辑变复杂时,这种方式极易出错且难以维护。

LangChain 提供了 PromptTemplate,让提示词具备结构化、参数化、可测试的能力。

✅ 示例代码:1.js

import 'dotenv/config'; // 加载环境变量
import { ChatDeepSeek } from '@langchain/deepseek';
import { PromptTemplate } from '@langchain/core/prompts';

// 定义结构化提示词模板
const prompt = PromptTemplate.fromTemplate(`
你是一个{role}.
请用不超过{limit}字回答以下问题:
{question}
`);

// 动态填充变量
const promptStr = await prompt.format({
  role: '前端面试官',
  limit: '50',
  question: '什么是闭包'
});

// 初始化 DeepSeek 模型
const model = new ChatDeepSeek({
  model: 'deepseek-reasoner',
  temperature: 0.7 // 控制创造性输出
});

// 调用模型并获取结果
const res = await model.invoke(promptStr);
console.log(res.content);

🧠 关键洞察:为什么这很重要?

传统做法LangChain 做法
字符串硬编码,容易遗漏占位符使用 fromTemplate 自动校验变量
修改需求需全局搜索替换模板独立,一处修改处处生效
无法单元测试可对 format() 输出进行断言测试

💡 LangChain 思路
"prompt" 当成数据结构来管理,而不是文本片段。这是迈向工程化的第一步。


🔹 阶段二:链式调用 —— 使用 pipe() 构建声明式工作流

单步调用只是开始。真正的生产力提升,来自组件的串联与复用

LangChain 引入了 pipe() 方法,灵感来源于 Unix 管道思想 —— “一个程序只做一件事,并做好它”。

✅ 示例代码:2.js

import 'dotenv/config';
import { ChatDeepSeek } from '@langchain/deepseek';
import { PromptTemplate } from '@langchain/core/prompts';

const model = new ChatDeepSeek({
  model: 'deepseek-reasoner',
  temperature: 0.5
});

const prompt = PromptTemplate.fromTemplate(`
你是一个前端专家,用一句话解释:{topic}
`);

// 🔗 核心操作:通过 pipe 连接两个组件
const chain = prompt.pipe(model);

// 执行链条
const response = await chain.invoke({ topic: '闭包' });
console.log(response.text);

🌟 亮点解析:pipe() 到底强在哪?

prompt.pipe(model) 
// 相当于:
input => prompt.format(input).then(formatted => model.invoke(formatted))
  • 自动传递数据:无需手动 format 再 invoke
  • 类型安全:TypeScript 下能推导中间输入输出类型
  • 职责分离prompt 负责格式化,model 负责生成
  • 可复用性增强:这个 chain 可以被其他模块导入使用

⚙️ LangChain 设计哲学
让每个组件都实现统一接口(Runnable),从而支持像搭积木一样自由组合。这就是所谓的 “可运行对象(Runnable Object)”范式


🔹 阶段三:流程编排 —— 使用 RunnableSequence 处理多阶段任务

现实中的 AI 应用往往不是“问一个问题得一个答案”,而是包含多个处理阶段,比如:

用户提问 → 拆解意图 → 查询知识库 → 生成草稿 → 摘要提炼 → 输出最终回复

LangChain 提供了 RunnableSequence,让你可以显式定义多步骤流程,实现真正的 AI 流程自动化。

✅ 示例代码:3.js

import { ChatDeepSeek } from '@langchain/deepseek';
import { PromptTemplate } from '@langchain/core/prompts';
import 'dotenv/config';
import { RunnableSequence } from '@langchain/core/runnables';

const model = new ChatDeepSeek({
  model: 'deepseek-reasoner',
  temperature: 0.5
});

// 第一阶段:详细解释
const explainPrompt = PromptTemplate.fromTemplate(`
  你是一个前端专家,请详细介绍以下概念:{topic}
  要求:覆盖定义、原理、使用方式,不超过300字
`);

// 第二阶段:核心要点总结
const summaryPrompt = PromptTemplate.fromTemplate(`
  请将以下前端概念解释总结为3个核心要点(每点不超过20字):
  {explanation}
`);

// 构建两个子链条
const explainChain = explainPrompt.pipe(model);
const summaryChain = summaryPrompt.pipe(model);

// 组合成完整流程:先解释 → 后总结
const fullChain = RunnableSequence.from([
  // 步骤1:执行解释链
  (input) => explainChain.invoke({ topic: input.topic }).then(res => res.text),
  // 步骤2:将解释结果传给总结链
  (explanation) => summaryChain.invoke({ explanation }).then(res => 
    `知识点:${explanation}\n\n总结:${res.text}`
  )
]);

// 执行全流程
const response = await fullChain.invoke({ topic: '闭包' });
console.log(response);

🎯 进阶优势分析

特性说明
步骤解耦解释和总结是两个独立模块,可单独调试或替换
数据流明确输入 → 中间结果 → 最终输出,流程可视化程度极高
扩展性强如需增加“翻译”、“校对”等环节,只需插入新函数即可
错误隔离若总结失败,不影响解释部分的结果捕获

🔄 想象一下未来扩展

const finalChain = [
  input => preprocess(input),           // 预处理
  explainChain.invoke.bind(explainChain),
  summaryChain.invoke.bind(summaryChain),
  translateChain.invoke.bind(translateChain), // 新增翻译
  postProcess                            // 后处理
].reduce((prev, curr) => prev.pipe(curr));

🏗️ 工程化视角:LangChain 的三大核心设计理念

通过以上三个层次的演进,我们可以提炼出 LangChain 在 AI 工程化领域的三大支柱:


1️⃣ 接口标准化:一切皆 Runnable

LangChain 定义了一个核心接口 —— Runnable,要求所有组件(Prompt、Model、Tool、Chain)都遵循统一的行为规范:

interface Runnable {
  invoke(input: any): Promise<any>;
  pipe(next: Runnable): Runnable;
}

这意味着:

  • ✅ 你可以随意替换底层模型(如从 ChatDeepSeek 换成 ChatOpenAI),只要它们都实现了 Runnable
  • ✅ 所有组件都可以无缝串联,形成任意复杂的流程
  • ✅ 第三方插件生态得以繁荣发展(目前已有超 80+ 官方和社区集成)

📦 这就是 LangChain 生态强大的根本原因:标准统一,插件即插即用。


2️⃣ 流程可视化:代码即流程图

传统 AI 脚本往往是“黑盒式”的:

const result = await callLLM(`请你解释闭包...然后总结成三点`);

而 LangChain 的代码本身就是流程说明书

promptA → model → promptB → model → output

这种声明式编程风格让团队协作更高效:

  • 新人一眼看懂业务逻辑
  • QA 可针对每个节点做测试验证
  • PM 能根据代码反推功能设计

🖼️ 你的代码,就是文档。


🚀 为什么你应该用 LangChain?不只是工具,更是思维升级!

很多开发者还在停留在“写 prompt → 调 API → 得结果”的原始阶段,而 LangChain 帮助我们完成了关键跃迁:

层级名称特征工具代表
L1Prompt Scripting单次调用,脚本化fetch + template string
L2Prompt Engineering优化提示词,提高效果PromptFoo、DSPy
L3Chain Engineering拆解流程,模块组装LangChain
L4Agent System自主决策,工具调用AutoGPT、BabyAGI

🌟 LangChain 的本质,是推动我们进入 Level 3 的关键引擎。


🎯 实战建议:如何在项目中落地 LangChain?

✅ 推荐使用场景

场景是否适合 LangChain
简单问答机器人✅ 强烈推荐
多轮对话系统✅ 支持 Memory 和 Session
文档智能摘要✅ 结合 Document Loader + Text Splitter
自动化客服工单处理✅ 可编排分类 → 分析 → 回复生成
个人玩具项目❌ 可能过度设计,直接调 API 更快

🛠 最佳实践 Tips

  1. 从小链做起:先做一个 prompt.pipe(model),再逐步扩展
  2. 命名清晰summaryChainvalidationChainchain1 更具可读性
  3. 日志追踪:利用 .withConfig({ runName: 'Explain Step' }) 添加调试信息
  4. 异步友好:所有方法返回 Promise,合理使用 Promise.all 并行处理
  5. 错误处理:包裹 try/catch 或使用 .transformStreamWithErrorHandling()

📣 结语:从“调 API 的人”,到“设计 AI 流程的工程师”

LangChain 的出现,标志着 AI 开发进入了工业化时代

它让我们不再只是“向模型提问的人”,而是成为了:

AI 工作流的设计师、组件的建造者、智能系统的架构师。

当你学会用 pipe() 组装模块,用 RunnableSequence 编排流程,你就已经掌握了下一代软件开发的核心技能。