如何在 LangChain 中链式运行 Runnables

老铁们,今天咱们来聊聊在 LangChain 中如何实现 runnables 的链式运行。这个技术点其实不难,只要你对 LangChain 表达式语言 (LCEL)、prompt templates、chat models 和 output parsers 有一定的了解,就能轻松上手。

技术背景介绍

在 LangChain 中,任何两个 runnables 都可以通过管道操作符 (|) 或更明确的 .pipe() 方法进行“链式”连接。前一个 runnable 的 invoke() 方法的输出会被传递给下一个 runnable 作为输入。生成的 RunnableSequence 也是 runnable,这意味着它可以像任何其他 runnable 一样被调用、流式处理或进一步链式连接。这种链式连接的好处在于高效的流式处理(序列会在可用时立即流式输出)以及可以通过 LangSmith 等工具进行调试和跟踪。

原理深度解析

我们通过一个常见的 LangChain 模式来展示这一点:使用 prompt 模板将输入格式化为 chat model,最后通过 output parser 将聊天消息输出转换为字符串。

实战代码演示

以下是如何实现这一流程的代码示例:

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI

# 假设已设置好API Key
model = ChatOpenAI(model="gpt-4o-mini")
prompt = ChatPromptTemplate.from_template("tell me a joke about {topic}")

chain = prompt | model | StrOutputParser()

result = chain.invoke({"topic": "bears"})
print(result)

输出将是一个有趣的笑话,例如:

"Here's a bear joke for you:\n\nWhy did the bear dissolve in water?\nBecause it was a polar bear!"

优化建议分享

这里我们可以进一步优化和扩展这个链。比如,我们可以添加一个新的 chain,来评估生成的笑话是否有趣。这需要我们对输入格式进行一些调整,以确保下一个链能够正确处理。

代码示例:

analysis_prompt = ChatPromptTemplate.from_template("is this a funny joke? {joke}")

composed_chain = {"joke": chain} | analysis_prompt | model | StrOutputParser()

result = composed_chain.invoke({"topic": "bears"})
print(result)

补充说明和总结

通过将函数转化为 runnable,我们可以在链中加入自定义逻辑。这种方法同样适用于管道方法 .pipe(),它提供了一种更具扩展性和灵活性的链式运行方法。

from langchain_core.runnables import RunnableParallel

composed_chain_with_pipe = (
    RunnableParallel({"joke": chain})
    .pipe(analysis_prompt)
    .pipe(model)
    .pipe(StrOutputParser())
)

result = composed_chain_with_pipe.invoke({"topic": "battlestar galactica"})
print(result)

今天的技术分享就到这里,希望对大家有帮助。开发过程中遇到问题也可以在评论区交流~

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值