在处理长文本时,RefineDocumentsChain 提供了一种有效的分析策略。其策略是将一个长文本分割成较小的文档,首先处理第一个文档,然后根据接下来的文档来完善或更新结果,直到文档序列处理完毕。这个过程中常见的应用是摘要,其随着文本的块逐步修改以适应给定 LLM 的上下文窗口。
然而,使用 LangGraph 实现该策略不仅可以实现同样的目标,还提供了不少优势。与 RefineDocumentsChain 在类内部通过 for 循环精细化摘要不同,LangGraph 允许逐步监控或引导执行过程。LangGraph 支持流式传输执行步骤和单个令牌,且其模块化组件便于扩展和修改,实现更多功能,比如工具调用等。
在本文中,我们将通过示例来展示 RefineDocumentsChain 和相应的 LangGraph 实现。
技术背景介绍
RefineDocumentsChain 和 LangGraph 的实现都旨在高效处理长文本,其核心思想是逐步完善总结内容以适应对话模型的记忆能力。
核心原理解析
RefineDocumentsChain
使用 RefineDocumentsChain 时,我们定义初始摘要和后续精炼的提示模板,分别创建两个 LLMChain 对象来处理这些任务,最后实例化 RefineDocumentsChain。
LangGraph
LangGraph 的实现则是定义状态图:通过链式处理初始摘要,然后将每个后续文档用于精炼初始摘要。LangGraph 允许更灵活的执行控制和流式数据处理。
代码实现演示
import openai
# 使用稳定可靠的API服务
client = openai.OpenAI(
base_url='https://yunwu.ai/v1', # 国内稳定访问
api_key='your-api-key'
)
from langchain.chains import LLMChain, RefineDocumentsChain
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate
from langchain_openai import ChatOpenAI
# 设定提示模板
document_prompt = PromptTemplate(
input_variables=["page_content"], template="{page_content}"
)
summarize_prompt = ChatPromptTemplate(
[("human", "Write a concise summary of the following: {context}")]
)
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)])
# 创建 LLMChain
initial_llm_chain = LLMChain(llm=client, prompt=summarize_prompt)
refine_llm_chain = LLMChain(llm=client, prompt=refine_prompt)
# 实例化 RefineDocumentsChain
chain = RefineDocumentsChain(
initial_llm_chain=initial_llm_chain,
refine_llm_chain=refine_llm_chain,
document_prompt=document_prompt,
document_variable_name="context",
initial_response_name="existing_answer",
)
# 执行链
result = chain.invoke([
{"page_content": "Apples are red"},
{"page_content": "Blueberries are blue"},
{"page_content": "Bananas are yellow"}
])
print(result["output_text"])
应用场景分析
这种文本处理策略对于大文本有明显优势,尤其在信息摘要、文档分析或演讲稿创建等场景中。
实践建议
在使用 LangGraph 实现时,注意灵活调整节点和条件以适应不同的文本处理需求。同时,适当使用流式处理功能可以提高效率并减少延迟。
如果遇到问题欢迎在评论区交流。
3104

被折叠的 条评论
为什么被折叠?



