在深度学习和自然语言处理的应用中,构建可复用的处理链是一种常见需求。在这些链中,不同的步骤可能需要共享或传递数据。LangChain为此提供了一个方便的工具:RunnablePassthrough
。本文将深入解析如何使用RunnablePassthrough
在LangChain中传递参数。
技术背景介绍
LangChain是一个强大的框架,用于构建复杂的自然语言处理管道。其核心理念是通过可复用的"步骤"(runnables)来实现灵活的组合操作。在构建多步骤链时,RunnablePassthrough
类允许轻松传递之前步骤的数据以供后续步骤使用。
核心原理解析
RunnablePassthrough
可以与RunnableParallel
结合使用,以保持数据的原样传递。RunnableParallel
允许并行执行多个runnables,RunnablePassthrough
则可以无修改地传递输入数据。其典型使用场景是在构建需要多步骤的数据处理链时,让一些未修改的数据顺利传递给后续步骤。
代码实现演示
以下是一个如何使用RunnablePassthrough
的例子,通过它来传递前一步的数据:
# 安装必需的库
%pip install -qU langchain langchain-openai
import os
from getpass import getpass
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
# 设置OpenAI API Key
os.environ["OPENAI_API_KEY"] = getpass("Enter your OpenAI API Key: ")
# 创建RunnableParallel对象
runnable = RunnableParallel(
passed=RunnablePassthrough(),
modified=lambda x: x["num"] + 1,
)
# 执行并查看输出
result = runnable.invoke({"num": 1})
print(result)
在上述代码中,passed
键的值通过RunnablePassthrough()
被简单地传递,而modified
键则通过一个lambda函数将num
值加1。
应用场景分析
在实际应用中,一个常见的场景是根据上下文精确地回答问题,比如在一个聊天机器人中使用知识库来回答用户问题:
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()
)
# 执行并查看输出
result = retrieval_chain.invoke("where did harrison work?")
print(result)
在这个例子中,RunnablePassthrough
用于将问题直接传递给提示步骤,而上下文由检索步骤生成。
实践建议
- 使用
RunnablePassthrough
在数据流中传递不需要修改的数据,以保持代码的清晰性。 - 在遇到并发需求时,结合使用
RunnableParallel
以提高执行效率。 - 确保理解每个步骤之间的数据结构和转换关系,这对于构建一个稳定的处理链至关重要。
如果遇到问题欢迎在评论区交流。
—END—