本文将演练如何使用 LLM(大语言模型) 提取文本摘要。

本次演练使用 qwen2.5:7b 开源大模型。

概述

从文本中提取摘要的核心问题是如何将文档传递到 LLM 的提示词中。两种常用方法是:

  • 填充:简单地将所有文档 填充 到单个提示中。这是最简单的方法(本文将使用 create_stuff_documents_chain 演示此过程)。

  • Map-Reduce:在 Map 步骤中对每个文档进行单独摘要,然后将摘要 Reduce 为最终摘要(有关此方法使用的 MapReduceDocumentsChain 的更多信息,请参阅此处)。
    当子文档不依赖于先前的上下文时,Map-Reduce 尤其有效。例如,在汇总包含许多较短文档的语料库时。在其他情况下,例如汇总具有固有序列的小说或正文时,迭代细化可能更有效。

用一次调用提取摘要

摘要文档不太大:用它组成的提示词不超过 LLMtoken 限制 时,可以使用 create_stuff_documents_chain

create_stuff_documents_chainlangchain 框架中用来快速创建处理多文档输入(Documents)的一种链(Chain)的方法

简单说,它的作用是:

  • 把一批 Document(通常是文本块)塞到一起(stuff),
  • 然后把所有内容一次性提交给大模型(LLM)处理,
  • 输出回答。
"""
1. 加载文档
"""

loader = WebBaseLoader("http://wfcoding.com/articles/practice/03%E6%9C%AC%E5%9C%B0%E5%A4%A7%E6%A8%A1%E5%9E%8B%E7%BC%96%E7%A8%8B%E5%AE%9E%E6%88%98/")
docs = loader.load()

from langchain_ollama import ChatOllama
llm = ChatOllama(model="qwen2.5",temperature=0.3, verbose=True)

"""
2. 用一次调用提取摘要
"""

from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate

# 定义提示词
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "请简明扼要地概括以下内容:\\n\\n{context}")
    ]
)

# 初始化 chain
chain = create_stuff_documents_chain(llm, prompt)

def sum_single_llm_call() :    

    # 调用 chain
    result = chain.invoke({"context": docs})
    print(result)

sum_single_llm_call()

代码很简洁,我们调用 sum_single_llm_call() 方法,看看 LLM 提取的摘要内容:

该内容介绍了如何在普通电脑上使用编程实现基于大语言模型的任务。主要包括以下几个方面:

1. **环境配置**:在Visual Studio Code中配置虚拟环境。
2. **本地大模型使用**:利用本地部署的Llama3.1模型完成任务,如翻译、语义检索等。
3. **功能实现**:
   - 翻译功能
   - 语义检索(包括使用本地矢量数据库)
   - 文本标签与信息提取
   - 聊天机器人及提示词优化
   - 外部工具交互,如人工审核和参数注入
   - 智能体Agent的实现
   - 基于SQL数据构建问答系统
4. **RAG系统的开发**:使用langchain、智能体和langgraph实现检索增强生成。

该系列文章旨在通过实战演练帮助读者掌握本地大模型编程技术。

流式输出

我们也可以逐个 token 地流式传输结果:

def sum_single_llm_call_stream() :    

    for token in chain.stream({"context": docs}):
        print(token, end="|")

来看看 LLM大语言模型 的能力:

该|内容|介绍了|如何|在|普通|电脑|上|使用|本地|部署|的大|语言|模型|(|以|L|lama| |3|.|1|为例|)|完成|各种|任务|,|主要|通过|Lang|chain|和|Lang|graph|库|实现|。|文章|涵盖了|从|基本|配置|到|高级|应用|的|多个|方面
|,|包括|但不限于|:

...

|这些|实践|旨在|帮助|读者|掌握|本地|大|模型|的|编程|技巧|,|内容|丰富|且|具有|实际|操作|性|。||

总结

基于 LLM(语言模型),利用 langchain 对文本提取摘要并不复杂。当对大量文本提取摘要时,情况可能就复杂多了,可能用用 langgraph 构建比较复杂的工作流了。


代码

本文涉及的所有代码以及相关资源都已经共享,参见:

为便于找到代码,程序文件名称最前面的编号与本系列文章的文档编号相同。

参考

🪐感谢您观看,祝好运🪐