如何使用LangChain链式运行Runnables
引言
在构建复杂的AI应用时,我们常常需要将多个任务串联起来,比如将一个prompt模板的输出传递给一个聊天模型,再将聊天模型的输出解析成字符串。LangChain提供了一种名为LangChain Expression Language (LCEL)的语言,它不仅支持这种链式运行,还能够提高效率。本文将通过示例详细讲解如何使用LCEL链式运行runnables,并讨论潜在的挑战和解决方案。
主要内容
LCEL中的链式运行
LangChain Expression Language允许将两个runnables“链式”连接起来,即将前一个runnables的invoke()输出作为下一个runnables的输入。你可以使用管道操作符|或者pipe()方法来实现这一点。最终生成的RunnableSequence也是一个runnable,可以被调用、流式处理或进一步链式连接。
为什么要链式运行Runnables
链式运行runnables提供了几个优势:
- 高效的流式处理:序列会尽快流式输出,提高处理效率。
- 便捷的调试和跟踪:结合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。这种方法不仅提高了开发效率,还使得复杂任务的管理更加简洁和高效。为了进一步学习,你可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---