在前几篇文章中,我们详细探讨了如何使用 LangChain 调用大模型以及编写提示词,接下来将进入核心环节——Chain 链。Chain 链作为 LangChain 的关键机制,能够帮助开发者快速搭建标准化的 AI 工作流,让数据在各个组件之间自动流转,无需手动传递,既高效又省力。
不过在深入 Chain 链之前,首先需要理解 Runnable 这个抽象类。它是所有链条的基础,没有它,链条就无法构建。下面我们将对 Runnable 进行详细拆解。
Runnable 究竟是什么?
简单来说,Runnable 是一套标准接口,它使得提示词模板、大模型、输出解析器等各种组件能够以统一的方式被调用和组合。Runnable 本身是一个抽象类,不能直接实例化,我们日常开发中使用的都是它的具体实现类。
例如,下面代码中的 RunnableLambda 就是 Runnable 的一个实现:
const transformInput = RunnableLambda.from((input: { text: string }) => ({text: input.text,wordCount: input.text.split(/s+/).length,characterCount: input.text.length,
}));
// 这里是 Chain 链调用,下一章会聊到
const chain = transformInput.pipe(promptTemplate).pipe(model).pipe(new StringOutputParser());
const text = `LangChain 是一个用于开发由语言模型驱动的应用程序的框架。它提供了一套丰富的工具和组件,使得构建复杂的 LLM 应用变得更加容易。无论是简单的聊天机器人还是复杂的智能袋里,LangChain 都能帮你实现。`.trim();
const result = await chain.invoke({ text });
这里 RunnableLambda.from 接收一个普通匿名函数作为参数,返回一个全新的、支持 Runnable 规范的对象 transformInput。这个对象就能直接用在 Chain 链里了。如果是普通函数,肯定不支持链式调用,但经过 RunnableLambda 一转换,它就变成了一个“Runnable 兼容”的组件。
通用插头
一个 Runnable 对象提供了多种执行方式,能够灵活应对不同的业务场景:
invoke/ainvoke:最基础的调用方式,输入一个参数,返回完整的输出结果。同步与异步版本均支持。batch/abatch:批量处理多个输入,显著提升执行效率。Runnable接口内部已内置了优化的并行处理能力。stream/astream:流式处理,在输出生成的同时逐步返回结果。在聊天类应用中尤为实用,可实现类似“打字机”的实时效果。
// 使用 invoke 返回完整的输出
const result = await runnable.invoke({ topic: "人工智能的未来" });
console.log(result);
// 使用 batch 批量处理多个输入
const runnableInput = RunnableLambda.from(text: string): string => text.toUpperCase());
const inputs = ["hello", "world", "langchain"];
const results = await runnableInput.batch(inputs);
// 使用 stream 逐字输出结果
const result = await runnable.stream({ question: "LangChain是什么" });
for await (const chunk of result) {
process.stdout.write(chunk); // 会像打字一样,逐字输出
}
Runnable 组件
除了模型、提示词等基础组件本身已经实现了 Runnable 接口,LangChain 还内置了多个专用的 Runnable 类,用于处理更复杂的逻辑:
RunnableSequence:按顺序执行一组Runnable,上一个的输出自动成为下一个的输入。通过|创建的链,本质上就是此类。RunnableParallel:并行执行多个Runnable,适用于需要同时获取多维度信息的场景。RunnableLambda:将任意普通函数转换为Runnable,便于在链条中插入自定义逻辑。RunnablePassthrough:透传数据,常用于在链条中传递或附加额外的上下文信息。RunnableBranch:实现条件分支逻辑,根据输入动态选择要执行的Runnable。
总结
以上就是 Runnable 的核心内容。随着 AI 编程工具日益强大,在日常开发中理解这些底层原理依然具有重要价值:当你阅读 AI 生成的代码时,不仅能明白它“在做什么”,更能理解它“为什么这么写”。
