当前位置: 首页 > news >正文

[LangChain] 09.LCEL

LangChain Expression Language,是 LangChain 提供的一种声明式构建 链式 调用流程的方式。它允许开发者用 .pipe() 操作符将不同的模块(如提示模板、模型、解析器等)连接起来,形成一个完整的“链(Chain)”。

LCEL 的设计理念:

  • 所有模块都实现统一接口:Runnable
  • 任意模块之间都可以 .pipe() 链接组合
  • 逻辑更清晰、组合更自由、调试也更友好

下面是一个快速上手示例:

import { ChatOllama } from "@langchain/ollama";
import { PromptTemplate } from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";// 创建模块:提示词模块、模型模块、解析器模块// 1. 创建提示词
const pt = PromptTemplate.fromTemplate("请严格使用中文解释:{question}");// 2. 创建模型
const model = new ChatOllama({model: "llama3",temperature: 0.7,
});// 3. 创建一个解析器
const parser = new StringOutputParser();// 4. 将上面的 3 个模块连接起来:pipe
// 相当于创建了一个链条
const chain = pt.pipe(model).pipe(parser);// 5. 使用 chain 这个链条
const res = await chain.invoke({question: "什么是闭包",
});console.log(res);

可以把 .pipe() 理解成模块之间的数据通道

  • pt 接收原始输入,并生成提示文本
  • model 根据提示生成回答
  • parser模型响应格式化成字符串输出
image-20250811104531989

从输入到输出,整个流程结构清晰、逻辑统一,而且每个环节都可以随时替换或插拔,非常适合真实项目开发。在 LCEL 中,所有组件都抽象为一种“可执行单元”,都实现了统一的 Runnable 接口,从而都都变成可以链式组合的模块。

核心方法

1. invoke

这是最常用的同步执行方式,该方法会执行整条链,返回完整结果。

import { ChatOllama } from "@langchain/ollama";
import { PromptTemplate } from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";// 创建模块
const prompt = PromptTemplate.fromTemplate("请使用中文解释:{topic}");
const llm = new ChatOllama({ model: "llama3", temperature: 0.7 });
const parser = new StringOutputParser();// 构建链式流程
const chain = prompt.pipe(llm).pipe(parser);// 执行链式调用
const result = await chain.invoke({ topic: "闭包(closure)是什么?" });console.log("LLM 输出:", result);

2. pipe

这是用于 组合模块 的方法,会将输出“接入”下一个模块,主要用于拼接模块构建 chain,比如:

Prompt -> 模型 -> 解析器

例如我们上面例子中的:

const chain = prompt.pipe(llm).pipe(parser);
// 你可以继续 pipe 更多环节,比如日志记录、后处理

本质上 .pipe() 会返回一个新的 Runnable,你可以链式无限拼接。换句话说,只要模块实现了 Runnable 接口,就可以进行相互拼接。

3. stream

该方法用于获取流式结果,逐块返回 LLM 输出,适合实现 ChatGPT 风格对话输出。

import { ChatOllama } from "@langchain/ollama";
import { PromptTemplate } from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";const pt = PromptTemplate.fromTemplate("请用一定用中文解释:{question}");const model = new ChatOllama({model: "llama3",temperature: 0.7,
});const parser = new StringOutputParser();const chain = pt.pipe(model).pipe(parser);const res = chain.streamEvents({ question: "什么是AI" }, { version: "v2" });for await (const event of res) {console.log(event);if (event.event === "on_chat_model_stream") {process.stdout.write(event.data?.chunk?.content || "");}
}

4. batch

该方法用于同时处理多个输入,适合批量问答、摘要等场景,返回一个结果数组

import { ChatOllama } from "@langchain/ollama";
import { PromptTemplate } from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";// 创建模块:提示词模块、模型模块、解析器模块// 1. 创建提示词
const pt = PromptTemplate.fromTemplate("请严格使用中文解释:{question}");// 2. 创建模型
const model = new ChatOllama({model: "llama3",temperature: 0.7,
});// 3. 创建一个解析器
const parser = new StringOutputParser();// 4. 将上面的 3 个模块连接起来:pipe
// 相当于创建了一个链条
const chain = pt.pipe(model).pipe(parser);// 5. 多条输入
const inputs = [{ question: "闭包" },{ question: "原型链" },{ question: "事件循环" },
];const res = await chain.batch(inputs);// console.log(res);
res.forEach((r, idx) => {console.log(`第${idx + 1}条结果:`, r);
});

🤔 这个时候,有的同学可能会想:能不能一边批量处理多个输入(batch),一边使用流式输出(stream)逐条显示结果?

很遗憾这是不行的,因为:

chain.batch()chain.stream() 不是同一套返回范式,不能在一次调用里既 batch 又拿到 token 级别的流。

  • batch() 返回的是“多个完整结果”的 Promise<string[]>
  • stream() 返回的是“单输入的异步迭代器(token 流)

那有没有办法实现“批量 + 流式”呢?当然也可以,我们可以自己来控制并发。下节课介绍。


-EOF-

http://www.zskr.cn/news/30869.html

相关文章:

  • 算法与数据结构 9 - 重链剖分
  • 2025 年 10 月 AI 写标书系统最新推荐,技术实力与市场口碑深度解析
  • Spring Cloud Gateway网关路由配置 - AlanLee
  • 重构学习认知:从听讲、践行到教学的启示
  • 域登录态分享(类sso)
  • MPK(Mirage Persistent Kernel)源码笔记(2)--- 多层结构化图模型
  • day000 ML串讲
  • cmd运行python文件
  • 事倍功半是蠢蛋57 typora相对路径图片上传到github
  • 2025 年 10 月门窗十大品牌综合实力权威推荐榜单,聚焦产能、专利与环保的实力品牌深度解析
  • 以“听”为基,以“做”为翼
  • 解码Linux文件IO之中文字库原理与应用
  • 完整教程:突破NER性能瓶颈:BERT与LLM协同的混合架构实践
  • AVCodecContext,AVFormatContext区别
  • 题解:P5853 [USACO19DEC] Tree Depth P
  • idea或pycharm工具报python packaging tools not found. install packaging tools
  • [K230学习笔记 02] I2C - Ze
  • javascript 学习笔记(有c++基础)(更新中)
  • MCP Router使用学习
  • 人生八要(摘抄)
  • 20232322 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 2025年上海久宙集团:深度解析技术护城河与行业话语权
  • 2025年欧那德语深度解析:十二年在线小班模式全透视
  • LangChain简单介绍
  • LLM-提示词
  • 图像分类,从网络构建到断点续训,TF2版本实现
  • C0427 【20251025】2025 CSP-J 联测5 总结
  • 2025 年 10 月贵州旅游旅行社最新推荐,精准检测与稳定性能深度解析
  • PyTorch API 详细中文文档,基于PyTorch2.5
  • 20232417 2025-2026-1 《网络与系统攻防技术》实验三实验报告