用Langchain彻底改变NLP摘要:克服大型文档处理和信息融合的挑战
#python #nlp #langchain #summarization

在自然语言处理领域(NLP)中,总结了广泛或多个文档提出了巨大的挑战。庞大的数据量通常会导致处理时间和内存限制较慢,因此需要对高性能计算基础架构进行投资。但是,朗链的出现通过将大型文件分解成较小的块,为创新解决方案提供了创新的解决方案。通过基于所选链类型的同时或串行处理,Langchain有效地消除了处理最大令牌问题的负担。

除了处理大量信息的细节之外,还结合了来自多个文档的见解来创建一个凝聚的摘要,这构成了另一个障碍。术语差异,数据冲突和该主题的不同方面阻碍了内容的有效融合。幸运的是,兰班救援队进行了救援。通过在当前文档中存储相关信息,它可以建立一系列互连文档的综合链。这种智能方法赋予了NLP汇总模型,以将信息进行环境化,证实其重要性并维护摘要内容中的适当句子顺序。

在本文中,我们将更深入地深入了解Langchain的开创性能力,探讨它如何彻底改变NLP的摘要。我们将开发一个摘要应用程序作为教程的一部分,以展示兰班的力量来汇总PDF内容。

入门

目录

  • 什么是Langchain
  • Langchain的组件
  • 使用Langchain的文本摘要
  • 如何使用langchain创建PDF摘要应用

什么是Langchain

由哈里森·蔡斯(Harrison Chase)开发的创新框架Langchain已成为语言模型领域(LLM)应用程序领域的游戏改变者。自2022年10月作为开源项目最初发行以来,Langchain引起了极大的关注,在Github上积累了令人印象深刻的41,900颗星,并吸引了一个由800多名贡献者组成的充满活力的社区。

Langchain充当LLM型号(例如OpenAI和HuggingFace Hub)以及Google,Wikipedia,Intion和Wolfram等外部数据源之间的桥梁。通过无缝连接这些资源,Langchain使开发人员能够利用一系列抽象和工具。其中包括提供结构化工作流的链条和代理,以及及时的模板,内存管理,文档加载程序和输出解析器,所有这些都促进了文本输入和输出之间的平稳互动。

Langchain的组成部分

Langchain的七个关键模块如下:

  • 模型:封闭或开源LLMS的集成
  • 提示:基于模板的用户输入和LLM模型的输出格式
  • 索引:与LLM模型最佳相互作用的数据结构和制备
  • 内存:使链条或代理保持与用户的短期和长期互动
  • 链条:将多个组件或链组合到一个流线型处理中
  • 代理:基于输入的可用工具和数据的决策实体
  • 回调:触发功能在LLM执行期间执行特定操作

使用Langchain的文本摘要

让我们尝试使用兰链摘要链来汇总文本内容。

设置环境

  • 通过执行以下命令来创建和激活虚拟环境。
python -m venv venv
source venv/bin/activate #for ubuntu
venv/Scripts/activate #for windows
  • 使用PIP安装OpenAi,Langchain,Tiktoken库。
pip install openai langchain tiktoken

创建OpenAi键

  • 需要OpenAI键才能访问Langchain。请按照创建新的OpenAi密钥的步骤。
  • Open Platform.openai.com。
  • 单击位于页面右上角的您的名称或图标选项,然后选择“ API键”或单击链接Account API Keys — OpenAI API
  • 单击创建新的秘密键按钮以创建一个新的OpenAI键。

构建应用程序

  • 创建一个文件main.py并向其添加以下代码。
from langchain.llms import OpenAI
from langchain.chains.summarize import load_summarize_chain
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains.mapreduce import MapReduceChain
from langchain.docstore.document import Document
import textwrap

import os
import openai
os.environ["OPENAI_API_KEY"] = "your-openai-key"

llm = OpenAI(model_name="text-davinci-003")

text_splitter = CharacterTextSplitter()
with open("data.txt") as f:
    data = f.read()
texts = text_splitter.split_text(data)

docs = [Document(page_content=t) for t in texts[:3]]

chain = load_summarize_chain(llm, chain_type="map_reduce")
output_summary = chain.run(docs)

wrapped_text = textwrap.fill(output_summary, width=120)
print(wrapped_text)
了解代码:
  • 从langchain导入必要的库,例如for llm,load_summarize_chain用于摘要,targintextsplitter用于文本拆分和mapreducechain,用于汇总文档。
  • 在环境变量中指定youropenai_api_key。
  • 将LLM初始化为OpenAi(model_name = text-davinci-003”)
  • 加载文本文件并使用split_text()。
  • 将文本分开
  • 使用load_summarize_chain()链总结文本文档。
  • 使用TextWrap库格式化结果。

运行代码

请注意,我创建了一个文本文档,其中包含一些与https://www.tata.com/business/tcs的TC相关的信息。您可以使用自己的内容进行总结。使用以下命令运行main.py脚本。

python main.py

您将获得如下输出,
output1

摘要链

Langchain提供了汇总内容的各种链条。使用最广泛的链是map_reduce,材料和精炼。

MAP_REDUCE

MAP_REDUCE链利用了单个数据块上的初始提示的功能,以生成摘要或仅基于文档的特定部分的答案。通过采用独特的提示,将初始输出结合起来,从而进一步迈出了一步,从而导致了整个文档的全面且具有凝聚力的摘要或答案。这种方法展示了其毫不费力地处理最广泛,最复杂的文档的能力,从而提供了有效,准确的结果。

东西

填充方法涉及在提示中包含所有相关数据作为上下文,从而将其传递给语言模型。这是一种直接的方法,可有效地处理较小的数据。但是,随着数据零件数量的增加,此方法变得不切实际且不适合。

精炼

精炼方法以第一个数据块的初始提示开始,以生成输出。然后将此输出与后续文档一起传递给语言模型,并通过合并文档中的新信息来指示其完善输出。这种迭代过程允许随着更多文档的处理,可以逐步改进和增强输出。

如何使用Langchain创建PDF Summarizer应用程序

在上一节中,我们使用兰链摘要链创建了一个基本的文本摘要应用程序。在本节中,我们将创建一个用于总结PDF文件的摘要应用程序。

安装依赖项

安装Lanchain,OpenAI,Grough,Pypdfand Tikkkan库使用PIP。

pip install langchain openai gradio pypdf tiktoken

导入所需的库

创建一个名为main.pyusing以下代码段的脚本。导入必要的库并初始化LLM以汇总文档。

import gradio as gr
from langchain import OpenAI, PromptTemplate
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains.summarize import load_summarize_chain
from langchain.document_loaders import PyPDFLoader

import os
import openai
os.environ["OPENAI_API_KEY"] = "your-openai-key"

llm = OpenAI(temperature=0)

定义汇总功能

summarize_pdf函数接受PDF文档的文件路径,并利用PyPDFLoader加载PDF的内容。它进一步将内容分为较小的部分。随后,调用load_summarize_chain函数以创建摘要链。最后,将生成的链应用于输入文本,从而产生简洁的摘要。

def summarize_pdf(path):
    summary = ""
    try:
        loader = PyPDFLoader(path.name)
        docs = loader.load_and_split()
        chain = load_summarize_chain(llm, chain_type="map_reduce")
        summary = chain.run(docs)
        prompt_template = """

        {text}

        SUMMARY:"""
        PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
        chain = load_summarize_chain(llm, chain_type="map_reduce", 
                                    map_prompt=PROMPT, combine_prompt=PROMPT)
    except:
        summary = "Something went wrong. \nPlease try with some other document."
    return summary

使用Gradio设置用户界面

在主函数中,通过配置输入和输出元素来建立gradio接口。

def upload_file(file):
    return file.name

def main():
    global input_pdf_path
    with gr.Blocks() as demo:
        file_output = gr.File()
        upload_button = gr.UploadButton("Click to Upload a File", file_types=["pdf"])
        upload_button.upload(upload_file, upload_button, file_output)

    output_summary = gr.Textbox(label="Summary")

    interface = gr.Interface(
        fn=summarize_pdf,
        inputs=[upload_button],
        outputs=[output_summary],
        title="PDF Summarizer",
        description="",
    )

    interface.launch()

if __name__ == "__main__":
    main()

最终代码

该应用的最终代码如下,

import gradio as gr
from langchain import OpenAI, PromptTemplate
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains.summarize import load_summarize_chain
from langchain.document_loaders import PyPDFLoader

import os
import openai
os.environ["OPENAI_API_KEY"] = "your-openai-key"

llm = OpenAI(temperature=0)

def summarize_pdf(path):
    summary = ""
    try:
        loader = PyPDFLoader(path.name)
        docs = loader.load_and_split()
        chain = load_summarize_chain(llm, chain_type="map_reduce")
        summary = chain.run(docs)
        prompt_template = """

        {text}

        SUMMARY:"""
        PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
        chain = load_summarize_chain(llm, chain_type="map_reduce", 
                                    map_prompt=PROMPT, combine_prompt=PROMPT)
    except:
        summary = "Something went wrong. \nPlease try with some other document."
    return summary

def upload_file(file):
    return file.name

def main():
    global input_pdf_path
    with gr.Blocks() as demo:
        file_output = gr.File()
        upload_button = gr.UploadButton("Click to Upload a File", file_types=["pdf"])
        upload_button.upload(upload_file, upload_button, file_output)

    output_summary = gr.Textbox(label="Summary")

    interface = gr.Interface(
        fn=summarize_pdf,
        inputs=[upload_button],
        outputs=[output_summary],
        title="PDF Summarizer",
        description="",
    )

    interface.launch()

if __name__ == "__main__":
    main()

运行应用程序

使用以下命令运行应用程序,

python main.py

打开终端中指定的URL以查看输出。总结一下,使用了一份名为《生成AI:Stanford Hai的观点:Generative_AI_HAI_Perspectives.pdf (stanford.edu)的观点》的研究论文。

output

那里有!您在Python中的第一个基于Langchain的摘要应用程序:)

感谢您阅读本文。

感谢Gowri M Bhatt审查了内容。

如果您喜欢这篇文章,请单击“心脏”按钮 - 分享以帮助其他人找到它!

可以在此处找到本教程的完整源代码,

GitHub - codemaker2015/langchain-pdf-summarizer

本文也可在Medium上找到。

这是一些有用的链接: