如何在LangChain中添加值到链的状态

86 阅读2分钟

如何在LangChain中添加值到链的状态

在这篇文章中,我们将探讨如何将值添加到LangChain链的状态中。这对于构建复杂任务时管理和传递数据非常有用。

引言

LangChain是一个强大的框架,允许开发者通过组合可运行对象来创建智能应用。在使用LangChain时,有时候需要在不改变链的当前状态下添加新的值。本文将介绍如何使用RunnablePassthrough.assign()方法来实现这一功能。

主要内容

1. 理解RunnablePassthrough.assign()

RunnablePassthrough.assign()方法允许在不改变初始字典的情况下添加新的键值对。这在构建一个阶段性构建输入的字典,传递给后续步骤时非常有用。

2. 使用RunnableParallel

RunnableParallel可以同时处理多个可运行对象,使我们能够并行处理数据。通过这种方式,可以有效地进行数据处理和传递。

3. 示例代码

下面是一个完整的代码示例,展示如何使用RunnablePassthrough.assign()方法:

%pip install --upgrade --quiet langchain langchain-openai

import os
from getpass import getpass

os.environ["OPENAI_API_KEY"] = getpass()  # 提示用户输入OpenAI API密钥

from langchain_core.runnables import RunnableParallel, RunnablePassthrough

# 使用RunnableParallel进行并行计算
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}

在这个示例中,我们使用了RunnablePassthrough.assign()方法来在不改变输入字典的情况下添加一个mult键。

4. 流式处理

这种方法的便利之处在于允许值一旦可用就可以传递。示例代码展示了如何通过检索链立即返回源文档:

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()
)  # 使用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代理服务以提高访问稳定性。
  • 状态管理困难: 在链中管理状态时,确保适当使用RunnablePassthrough.assign()以避免状态覆盖。

总结和进一步学习资源

通过本文,您了解到如何在LangChain中有效地添加并管理链的状态。为了进一步学习,可以参考LangChain的其他教程和文档。

参考资料

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

---END---