[LangChain] 09. Runnable接口 - 1
在 LCEL 中,幾乎所有的模塊:
- 提示詞模板
- 模型
- 解析器
都是實現了 Runnable 接口的,可以將這些模塊稱之為 Runnable 類型。這種類型的模塊可以快速插入到鏈條里面。
RunnableLambda
RunnableLambda 是 LangChain.js 提供的一種輕量級工具,它能把 普通函數 封裝成符合 Runnable 接口規范的實例,從而讓該函數能夠無縫參與到 LCEL 的鏈式調用與流式處理流程中。
-
快速上手案例
import { RunnableLambda } from "@langchain/core/runnables"; const fn = (text) => { return text.toUpperCase(); }; const runnableFn = RunnableLambda.from(fn); const res = await runnableFn.invoke("hello"); console.log(res); -
關鍵詞高亮插件
閉包-->*&*閉包*&*import { ChatOllama } from "@langchain/ollama"; import { PromptTemplate } from "@langchain/core/prompts"; import { StringOutputParser } from "@langchain/core/output_parsers"; import { RunnableLambda } from "@langchain/core/runnables"; // 1. 創建一個提示詞模板 const pt = PromptTemplate.fromTemplate("請使用中文解釋下面的概念:{topic}"); // 2. 創建模型 const model = new ChatOllama({ model: "llama3", temperature: 0.7, }); // 3. 解析器 const parser = new StringOutputParser(); // 4. 創建一個鏈條 let chain = pt.pipe(model).pipe(parser); // 5. 創建一個簡單的插件 const fn = (text) => text.replace(/閉包/g, "*&*閉包*&*"); const highlight = RunnableLambda.from(fn); chain = chain.pipe(highlight); const res = await chain.invoke({ topic: "閉包", }); console.log(res);
更多場景:
- 插入日志收集模塊
- 插入翻譯模塊(調用外部 API)
- 插入開關:判斷某個條件是否中斷執行
- 格式調整、結構清洗、敏感詞過濾
pipe() 方法可接受的三種類型:
-
Runnable 實例:這是最常用的,也是最推薦的
-
普通函數:LCEL 內部會自動用
RunnableLambda.from(fn)包裝成一個Runnable。 -
對象:將上游的輸入(或結果)分別傳給多個 runnable,然后返回一個對象。
import { ChatOllama } from "@langchain/ollama"; import { PromptTemplate } from "@langchain/core/prompts"; import { StringOutputParser } from "@langchain/core/output_parsers"; import { RunnableLambda } from "@langchain/core/runnables"; // 創建模型 const model = new ChatOllama({ model: "llama3", temperature: 0.7, }); // 解析器 const parser = new StringOutputParser(); // 創建兩個子鏈 const chain1 = PromptTemplate.fromTemplate( "請用中文用 2-3 句概括以下主題的核心含義:{input}" ) .pipe(model) .pipe(parser); const chain2 = PromptTemplate.fromTemplate( "請用中文從以下主題中提取 5 個關鍵詞,以逗號分隔:{input}" ) .pipe(model) .pipe(parser); let chain = RunnableLambda.from((x) => x); chain = chain.pipe({ summary: chain1, keywords: chain2, }); const res = await chain.invoke({ input: "閉包", }); console.log(res);
RunnableMap
RunnableMap(也叫 RunnableParallel),它可以讓多個鏈條 并發執行,并返回一個結構化的對象結果。
RunnableMap.from({ ... }) 會并發執行多個子鏈,并將它們的結果組合成一個對象返回。
import { ChatOllama } from "@langchain/ollama";
import { PromptTemplate } from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";
import { RunnableMap } from "@langchain/core/runnables";
// 創建模型
const model = new ChatOllama({
model: "llama3",
temperature: 0.7,
});
// 解析器
const parser = new StringOutputParser();
const chain1 = PromptTemplate.fromTemplate("用中文講一個關于 {topic} 的笑話")
.pipe(model)
.pipe(parser);
const chain2 = PromptTemplate.fromTemplate("用中文寫一首關于 {topic} 的兩行詩")
.pipe(model)
.pipe(parser);
const chain = RunnableMap.from({
joke: chain1,
poem: chain2,
});
const res = await chain.invoke({
topic: "小狗",
});
console.log(res);
-EOF-

浙公網安備 33010602011771號