如何在LangChain中添加值到链的状态
在这篇文章中,我们将探讨如何将值添加到LangChain链的状态中。这对于构建复杂任务时管理和传递数据非常有用。
引言
LangChain是一个强大的框架,允许开发者通过组合可运行对象来创建智能应用。在使用LangChain时,有时候需要在不改变链的当前状态下添加新的值。本文将介绍如何使用RunnablePassthrough.assign()方法来实现这一功能。
主要内容
1. 理解RunnablePassthrough.assign()
RunnablePassthrough.assign()方法允许在不改变初始字典的情况下添加新的键值对。这在构建一个阶段性构建输入的字典,传递给后续步骤时非常有用。
2. 使用RunnableParallel
RunnableParallel可以同时处理多个可运行对象,使我们能够并行处理数据。通过这种方式,可以有效地进行数据处理和传递。
3. 示例代码
下面是一个完整的代码示例,展示如何使用RunnablePassthrough.assign()方法:
%pip install --upgrade --quiet langchain langchain-openai
import os
from getpass import getpass
os.environ["OPENAI_API_KEY"] = getpass() # 提示用户输入OpenAI API密钥
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
# 使用RunnableParallel进行并行计算
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}
在这个示例中,我们使用了RunnablePassthrough.assign()方法来在不改变输入字典的情况下添加一个mult键。
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()
) # 使用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代理服务以提高访问稳定性。
- 状态管理困难: 在链中管理状态时,确保适当使用
RunnablePassthrough.assign()以避免状态覆盖。
总结和进一步学习资源
通过本文,您了解到如何在LangChain中有效地添加并管理链的状态。为了进一步学习,可以参考LangChain的其他教程和文档。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---