想要基于LangChain的LLMChain组件实现文本摘要功能,核心是通过LLMChain串联「提示词模板+大语言模型」,实现对任意文本的自动化摘要(支持短文本直接摘要、长文本分段摘要)。以下是完整的可运行代码,包含基础版(短文本)和进阶版(长文本),注释详尽,新手可直接复刻。

一、核心设计思路

LLMChain的核心是“提示词模板(PromptTemplate) + 大模型(LLM)”的流水线,实现文本摘要的逻辑:

  1. 定义摘要提示词模板:明确告诉模型“要做什么”(如“简洁摘要、提取核心信息”);
  2. 初始化大模型:选择GPT-3.5/4或国内模型(文心一言);
  3. 构建LLMChain:将模板和模型串联,形成“输入文本→生成摘要”的闭环;
  4. 长文本适配:若文本超出模型上下文窗口,先分段→逐段摘要→合并总摘要。

二、前置准备

1. 安装依赖

# 核心依赖(OpenAI模型)
pip install langchain langchain-openai python-dotenv

# 国内模型适配(可选,文心一言)
pip install langchain-ernie

2. 配置API密钥

  • 方式1:创建.env文件(推荐,避免硬编码)

    # .env文件内容
    OPENAI_API_KEY="你的OpenAI API密钥"
    # 国内用户可选:文心一言密钥
    # ERNIE_API_KEY="你的文心一言API Key"
    # ERNIE_SECRET_KEY="你的文心一言Secret Key"
  • 方式2:代码内直接配置(测试用)

    import os
    os.environ["OPENAI_API_KEY"] = "你的OpenAI API密钥"

三、完整实现代码

版本1:基础版(短文本摘要,核心LLMChain实现)

适用于单段短文本(≤2000字),直接通过LLMChain生成摘要:

"""
基于LLMChain实现短文本摘要(核心版)
"""
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# 加载环境变量(读取.env中的API密钥)
load_dotenv()

# ===================== 1. 配置核心组件 =====================
# 初始化大模型(GPT-3.5,速度快、成本低)
llm = ChatOpenAI(
    model="gpt-3.5-turbo",
    temperature=0.3,  # 0.3保证摘要稳定、不发散
    max_tokens=500     # 限制摘要长度
)

# 定义摘要提示词模板(核心:明确摘要要求)
# {text}为待摘要文本的变量,可自定义摘要规则(如字数、风格)
summary_prompt = PromptTemplate(
    input_variables=["text"],
    template="""请你对以下文本进行简洁、准确的摘要,要求:
1. 提取核心信息(主题、关键观点、核心结论);
2. 字数控制在100字以内;
3. 语言简洁,不添加额外内容;

待摘要文本:
{text}"""
)

# ===================== 2. 构建LLMChain =====================
# LLMChain = 提示词模板 + 大模型
summary_chain = LLMChain(
    llm=llm,
    prompt=summary_prompt,
    verbose=True  # 开启verbose,可查看Chain执行日志(新手调试用)
)

# ===================== 3. 测试文本摘要 =====================
if __name__ == "__main__":
    # 待摘要的短文本(示例:LangChain介绍)
    raw_text = """
    LangChain是一个用于构建大语言模型应用的开源框架,核心功能包括提示词工程、链(Chains)、代理(Agents)、记忆(Memory)和检索增强生成(RAG)。
    它支持对接OpenAI、文心一言、Llama3等主流大模型,还提供了丰富的工具集成(如数据库、API调用),帮助开发者快速搭建智能问答、文本摘要、知识库等应用。
    """

    # 调用LLMChain生成摘要(传入待摘要文本)
    result = summary_chain.run(text=raw_text)

    # 输出结果
    print("\n===== 文本摘要结果 =====")
    print(result)

版本2:进阶版(长文本分段摘要)

适用于长文本(>2000字),解决模型上下文窗口不足的问题,逻辑:文本分段→逐段摘要→合并总摘要

"""
基于LLMChain实现长文本分段摘要(进阶版)
"""
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# 加载环境变量
load_dotenv()

# ===================== 1. 工具函数:文本分段 =====================
def split_long_text(text: str, chunk_size: int = 1000) -> list:
    """
    将长文本按固定长度分段(避免超出模型上下文窗口)
    :param text: 原始长文本
    :param chunk_size: 每段最大字符数(可根据模型调整)
    :return: 分段后的文本列表
    """
    chunks = []
    start = 0
    text_length = len(text)
    
    while start < text_length:
        end = start + chunk_size
        # 避免截断句子(简单处理:按句号分割)
        if end < text_length:
            end = text.rfind('。', start, end) + 1  # 找到最后一个句号,保证句子完整
            if end <= start:  # 没找到句号,直接截断
                end = start + chunk_size
        chunks.append(text[start:end].strip())
        start = end
    
    return chunks

# ===================== 2. 初始化组件 =====================
# 大模型配置
llm = ChatOpenAI(
    model="gpt-3.5-turbo",
    temperature=0.3,
    max_tokens=300
)

# 分段摘要提示词模板
chunk_summary_prompt = PromptTemplate(
    input_variables=["text_chunk"],
    template="""请摘要以下文本片段的核心信息,要求:
1. 提取该片段的关键内容,不遗漏重要信息;
2. 字数控制在50字以内;
3. 仅输出摘要内容,无其他废话。

文本片段:
{text_chunk}"""
)

# 总摘要提示词模板(合并分段摘要)
total_summary_prompt = PromptTemplate(
    input_variables=["chunk_summaries"],
    template="""请将以下多个文本片段的摘要合并为一个完整、连贯的总摘要,要求:
1. 整合所有核心信息,逻辑清晰;
2. 字数控制在200字以内;
3. 语言流畅,无重复内容。

各片段摘要:
{chunk_summaries}"""
)

# 构建两个LLMChain:分段摘要链 + 总摘要链
chunk_chain = LLMChain(llm=llm, prompt=chunk_summary_prompt)
total_chain = LLMChain(llm=llm, prompt=total_summary_prompt)

# ===================== 3. 长文本摘要主逻辑 =====================
def long_text_summary(long_text: str) -> str:
    """
    长文本摘要主函数
    :param long_text: 原始长文本
    :return: 最终总摘要
    """
    # 步骤1:分段
    text_chunks = split_long_text(long_text, chunk_size=1000)
    print(f"长文本分段完成,共{len(text_chunks)}段")
    
    # 步骤2:逐段摘要
    chunk_summaries = []
    for i, chunk in enumerate(text_chunks):
        print(f"\n正在摘要第{i+1}段...")
        chunk_summary = chunk_chain.run(text_chunk=chunk)
        chunk_summaries.append(chunk_summary)
        print(f"第{i+1}段摘要:{chunk_summary}")
    
    # 步骤3:合并总摘要
    chunk_summaries_str = "\n".join([f"{i+1}. {s}" for i, s in enumerate(chunk_summaries)])
    total_summary = total_chain.run(chunk_summaries=chunk_summaries_str)
    
    return total_summary

# ===================== 4. 测试长文本摘要 =====================
if __name__ == "__main__":
    # 待摘要的长文本(示例:LangChain核心功能介绍)
    long_raw_text = """
    LangChain是2022年推出的开源大模型应用开发框架,旨在简化基于LLM的复杂应用构建。其核心设计理念是“模块化”,将大模型应用的核心环节拆分为可复用的组件。
    首先是模型层(Models),LangChain支持对接几乎所有主流大模型,包括闭源的OpenAI GPT系列、Anthropic Claude,开源的Llama3、Qwen2,以及国内的文心一言、讯飞星火等。开发者只需通过统一的接口,即可切换不同模型,无需修改核心代码。
    其次是提示词工程(Prompts),LangChain提供了丰富的PromptTemplate模板,支持动态变量替换、提示词优化,还内置了FewShotPromptTemplate等高级模板,帮助开发者快速构建高质量提示词。
    链(Chains)是LangChain的核心组件之一,LLMChain是最基础的链,用于串联提示词和模型;SequentialChain可将多个链按顺序执行;RouterChain能根据输入自动选择合适的链,满足复杂任务需求。
    代理(Agents)则是LangChain的进阶功能,它让模型具备“自主决策”能力——能分析用户需求,选择合适的工具(如数据库查询、API调用、代码执行),并迭代执行直到完成任务,典型应用包括智能编程助手、自动化数据分析工具等。
    记忆(Memory)模块用于维护对话上下文,支持短期记忆(上下文窗口)和长期记忆(向量库存储),让大模型应用具备“记忆能力”,能理解跨轮对话中的指代和上下文关联。
    此外,LangChain还提供了检索增强生成(RAG)相关组件,包括文档加载器、文本分割器、向量存储、检索器等,帮助开发者快速搭建知识库问答系统,解决大模型“幻觉”问题。
    LangChain的生态还在不断扩展,目前已支持Python和JavaScript两种主流语言,并有丰富的第三方插件和集成工具,成为大模型应用开发的主流框架之一。
    """

    # 调用长文本摘要函数
    final_summary = long_text_summary(long_raw_text)

    # 输出最终结果
    print("\n===== 长文本总摘要 =====")
    print(final_summary)

四、核心代码解析

1. LLMChain的核心构建

LLMChain的初始化仅需两个核心参数:

summary_chain = LLMChain(llm=llm, prompt=summary_prompt)
  • llm:大模型实例(如GPT-3.5),负责生成文本;
  • prompt:提示词模板,定义摘要的规则和格式,是摘要质量的关键。

2. 提示词模板设计要点

好的提示词模板需明确:

  • 任务目标:“对文本进行简洁、准确的摘要”;
  • 约束条件:“字数控制在100字以内”“提取核心信息”;
  • 输入变量{text}{text_chunk},用于接收待摘要文本。

3. 长文本分段逻辑

  • 原因:GPT-3.5-turbo的上下文窗口为4096 tokens(约3000字),长文本直接输入会截断;
  • 关键:split_long_text函数通过“找最后一个句号”避免截断句子,保证分段后的文本语义完整;
  • 流程:分段→逐段摘要→合并总摘要,既适配上下文窗口,又保证总摘要的完整性。

4. 运行方式

# 运行基础版
python short_text_summary.py

# 运行进阶版
python long_text_summary.py

五、输出示例

基础版输出(短文本)

===== 文本摘要结果 =====
LangChain是开源大语言模型应用开发框架,支持对接主流大模型,提供提示词工程、链、代理、记忆、RAG等核心功能,可快速搭建智能问答、文本摘要等应用。

进阶版输出(长文本)

长文本分段完成,共3段

正在摘要第1段...
第1段摘要:LangChain是2022年推出的开源大模型应用开发框架,核心设计为模块化,拆分大模型应用核心环节为可复用组件。

正在摘要第2段...
第2段摘要:LangChain支持对接主流大模型,提供丰富提示词模板,核心组件包括链、代理、记忆模块,满足不同开发需求。

正在摘要第3段...
第3段摘要:LangChain还提供RAG相关组件,支持Python/JS语言,生态丰富,是大模型应用开发主流框架。

===== 长文本总摘要 =====
LangChain是2022年推出的开源大模型应用开发框架,核心为模块化设计,支持对接各类主流大模型,提供提示词模板、链、代理、记忆等组件,还包含RAG相关功能,支持Python/JS语言,是大模型应用开发的主流框架。

六、适配国内模型(文心一言)

若无法访问OpenAI,可替换为文心一言模型,仅需修改大模型初始化部分:

from langchain_ernie import ChatErnie

# 初始化文心一言模型
llm = ChatErnie(
    model_name="ernie-3.5",
    api_key="你的文心一言API Key",
    secret_key="你的文心一言Secret Key",
    temperature=0.3
)

总结

关键点回顾

  1. LLMChain实现文本摘要的核心是“提示词模板 + 大模型”,模板决定摘要质量,模型决定生成效果;
  2. 短文本可直接用LLMChain.run()生成摘要,长文本需先分段再合并;
  3. 提示词模板需明确约束条件(字数、核心信息),避免摘要发散;
  4. 可无缝切换OpenAI/文心一言等模型,核心逻辑无需修改。

AIAgent研究
7.2k 声望12.8k 粉丝

一群有AI的人 研究AI-Agent的开发,做优秀的AI应用;