Langchain.js 是 Langchain 框架的 JavaScript 版本,专为前端和后端 JavaScript 环境设计。在最新的 v0.3 版本中,引入了一个强大的接口——Runnable。该接口提供了一个灵活的执行方式,可以与不同类型的模型和逻辑无缝集成。
本文将重点讲解 Runnable 接口,并通过实现一个自定义的 Runnable 来帮助前端人员快速上手。
上一篇文章介绍了如何 利用langchain快速开发llm应用,后续文章将基于此逐步展开 - 不仅是开发应用,而是一起深入学习、开发高质量的应用
一. 什么是 Runnable?
Runnable 是 Langchain.js v0.3 中的一个核心接口,它代表了一个可以被执行的操作。通过这个接口,开发人员可以将模型、处理逻辑或其他任务封装为可执行对象,方便统一管理和使用。
Runnable 的基本特性包括:
输入与输出类型:可以灵活设置输入和输出的数据格式。
链式调用:Runnable 可以被连接起来,形成执行链。
异步支持:它支持异步操作,方便与 API 或模型交互。
简而言之,Runnable 是一个抽象概念,可以帮助我们在复杂的前端应用中更好地组织代码逻辑。
二. Runnable 接口的基本用法
Langchain.js 中的 Runnable 提供了一个基础接口,允许我们定义任何类型的执行逻辑。它的核心方法是 invoke,该方法接收输入数据并返回执行结果。
interface Runnable { invoke(input: any): Promise; }
通过实现这个接口,我们可以将各种自定义逻辑封装到一个 Runnable 中。
举例:自定义 Runnable
假设我们有一个简单的需求:将用户输入的文本进行大写转换,并输出转换后的结果。我们可以通过实现一个自定义的 Runnable 来完成这一任务。
import { Runnable } from 'langchain';
class UppercaseRunnable implements Runnable {
async invoke(input: string): Promise { // 将输入的字符串转换为大写 return
input.toUpperCase();
}
}
在这个例子中,我们创建了一个 UppercaseRunnable 类,它实现了 Runnable 接口,并在 invoke 方法中将输入的字符串转换为大写。
三. 将自定义模型与 Runnable 集成
除了处理简单的字符串操作,我们还可以通过 Runnable 接口将第三方模型或 API 集成到我们的前端应用中。接下来,我们来实现一个稍复杂的例子:通过 Runnable 封装一个自定义的文本分类模型。
实现自定义模型的 Runnable
假设我们有一个文本分类模型,它通过某个 API 进行分类任务。我们可以将这个模型封装到一个 Runnable 中,便于在前端应用中使用。
import { Runnable } from "langchain";
class TextClassificationRunnable implements Runnable {
private apiUrl: string;
constructor(apiUrl: string) {
this.apiUrl = apiUrl;
}
async invoke(input: string): Promise {
const response = await fetch(this.apiUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ text: input }),
});
const data = await response.json();
return data.category;
}
}
在这个示例中,TextClassificationRunnable 类将文本发送到指定的 API 进行分类,并返回分类结果。通过这种方式,我们可以很方便地将模型 API 封装在前端应用中。
使用自定义的 Runnable
现在我们已经实现了两个不同的 Runnable,我们可以将它们结合起来,构建一个简单的执行链。在这个链中,我们将首先将用户输入的文本转换为大写,然后进行文本分类。
async function main() {
const uppercaseRunnable = new UppercaseRunnable();
const textClassificationRunnable = new TextClassificationRunnable(
"https://api.com/v1"
);
const input = "hello world"; // 首先将文本转换为大写
const uppercasedInput = await uppercaseRunnable.invoke(input); // 然后将大写文本发送到分类模型
const category = await textClassificationRunnable.invoke(uppercasedInput);
console.log(分类结果: ${category}
);
}
main();
在这个例子中,我们展示了如何通过 Runnable 接口组合不同的操作,使得代码逻辑更加清晰且可复用。
四 小结
通过 Runnable 接口,Langchain.js v0.3 为前端开发人员提供了一种简洁而强大的方式来封装和管理复杂的逻辑。无论是简单的文本处理任务,还是与第三方模型的集成,Runnable 都能提供足够的灵活性。
对于前端开发人员而言,学习和掌握 Langchain.js 的 Runnable 接口,不仅可以提升开发效率,还可以帮助我们更好地构建现代化的 AI 驱动应用。