老铁们,今天咱们来聊聊在 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—