如何使用LangChain链式运行Runnables

137 阅读3分钟

如何使用LangChain链式运行Runnables

引言

在构建复杂的AI应用时,我们常常需要将多个任务串联起来,比如将一个prompt模板的输出传递给一个聊天模型,再将聊天模型的输出解析成字符串。LangChain提供了一种名为LangChain Expression Language (LCEL)的语言,它不仅支持这种链式运行,还能够提高效率。本文将通过示例详细讲解如何使用LCEL链式运行runnables,并讨论潜在的挑战和解决方案。

主要内容

LCEL中的链式运行

LangChain Expression Language允许将两个runnables“链式”连接起来,即将前一个runnables的invoke()输出作为下一个runnables的输入。你可以使用管道操作符|或者pipe()方法来实现这一点。最终生成的RunnableSequence也是一个runnable,可以被调用、流式处理或进一步链式连接。

为什么要链式运行Runnables

链式运行runnables提供了几个优势:

  1. 高效的流式处理:序列会尽快流式输出,提高处理效率。
  2. 便捷的调试和跟踪:结合LangSmith等工具,可以方便地进行调试和跟踪。

示例:从Prompt模板到字符串的转换

我们将展示一个常见的LangChain模式,使用一个prompt模板格式化输入,再将其传递给聊天模型,最后使用输出解析器将聊天消息转换为字符串。

先来看看具体代码:

# 使用API代理服务提高访问稳定性
pip install -qU langchain-openai

import os
from getpass import getpass

os.environ["OPENAI_API_KEY"] = getpass("Enter OpenAI API Key: ")

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

# 设置模型
model = ChatOpenAI(api_key=os.environ["OPENAI_API_KEY"], model="gpt-4o-mini")

# 创建Prompt模板
prompt = ChatPromptTemplate.from_template("tell me a joke about {topic}")

# 链接Prompt、模型和输出解析器
chain = prompt | model | StrOutputParser()

# 调用链式runnables
result = chain.invoke({"topic": "bears"})
print(result)
# 输出: "Here's a bear joke for you: Why did the bear dissolve in water? Because it was a polar bear!"

常见问题和解决方案

网络限制和API访问

由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。例如,你可以在执行API请求时通过配置代理服务器来解决这一问题。

输入输出格式化

在将多个链条组合时,确保输入输出格式匹配非常重要。例如,如果我们想创建一个新的链条来评估生成的笑话是否有趣,我们需要使用正确的输入输出格式。

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

# 创建新的Prompt模板用于评估笑话
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)
# 输出评价: "Haha, that\'s a clever play on words! Using "polar" to imply the bear dissolved or became polar/polarized..."

自定义逻辑

你还可以在链条中添加自定义函数逻辑,这样可以实现更复杂的处理:

composed_chain_with_lambda = (
    chain
    | (lambda input: {"joke": input})
    | analysis_prompt
    | model
    | StrOutputParser()
)

result = composed_chain_with_lambda.invoke({"topic": "beets"})
print(result)
# 输出笑话评价

总结和进一步学习资源

通过本文,你应该掌握了如何使用LangChain链式运行runnables。这种方法不仅提高了开发效率,还使得复杂任务的管理更加简洁和高效。为了进一步学习,你可以参考以下资源:

参考资料

  1. LangChain Expression Language
  2. LangSmith

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---