掌握AI摘要技术解锁个人第二大脑

简介: 掌握AI摘要技术解锁个人第二大脑

使用Streamlit和Hugging Face的免费LLM摘要解锁个人第二大脑:构建在 PC 上运行的 Python Web 应用程序。

作为开发者就是要习惯不停的学习,如果正在阅读本文,那就意味着你和许多开发者一样,想要学习更多,想了解很多有意思的东西是如何运作的,它们是如何连接的。

而在学习的过程中,需要处理大量的信息,阅读大量的书籍:有时候,会不会觉得时间不够用,效率不高?

的确如此,通常需要处理大量的开发文档,需要尽可能多地阅读,以了解这个被称为人工智能的新世界。如果想管理好工作、兴趣和家庭,就需要一个策略。

开始总结材料(文章、电子书籍、博客文章等等),然后在笔记中将它们分类。总结一些列内容的主题,然后快速反馈是否需要深入研究。

在本文中,将展示如何使用HuggingFace和Python使用免费大语言模型(LLM)来构建一个Summarization 应用程序:使用自己日常没有GPU的电脑。整个过程涉及以下几个步骤:

  1. 下载 LaMini 模型
  2. 准备 Python 环境并安装依赖
  3. 测试汇总 Pipeline
  4. 使用 Streamlit 准备并测试图形界面
  5. 将逻辑和图形界面整合

代码仓库:github.com/QuintionTan…

1.下载 LaMini 模型

将使用 Hugging Face 的 LaMini-LM:这是基于 Flan-T5 系列的小型模型。它拥有 248M 参数,在下游 NLP 任务(文本生成、QnA 和摘要)上与 Aplaca-7BLLaMa-7B 的性能相同。

  • 为项目创建一个新文件夹 ai-summarization
  • 在项目目录中创建一个子文件夹 model

点击 Hugging Face 存储库 LaMini-Flan-T5–248M,并将目录中的所有文件下载到刚刚创建的 model 文件夹中。

image.png

2. 准备Python环境并安装依赖

有很多库需要安装,注意,与 Hugging Face 模型交互的核心是 torch 和 Transformers 库,有关详细信息,请参阅上面提到的链接

  • ai-summarization 目录中,创建一个虚拟环境并激活它:


python3 -m venv venv
source venv/bin/activate # ubuntu/Mac
venv\Scripts\activate # windows
  • venv 处于激活状态的情况下,安装以下内容:


pip install mkl mkl-include # MAC 使用CPU必须安装 
pip install torch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 # 核心
# 安装 Hugging Face Transformer库,需要与LLM进行交互
pip install git+https://github.com/huggingface/transformers 
# 这些将在下面用于与文档交互
pip install langchain==0.0.173 
pip install faiss-cpu==1.7.4
pip install unstructured==0.6.8
pip install pytesseract==0.3.10
pip install pypdf==3.9.0
pip install pdf2image==1.16.3
pip install sentence_transformers==2.2.2
# 只需要在CPU上运行
pip install accelerate==0.19.0
# 对于GUI和web应用程序
pip install streamlit
  • 在主目录 ai-summarization 中创建一个新 python 文件main.py ,将验证所有库是否已正确安装。


from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
from transformers import pipeline
import torch
import streamlit

转到终端,在激活 venv 状态下运行 python3 main.py。如果没有看到任何错误,则表示一切都安装成功了。

可能会出现以下异常:


ImportError: accelerate>=0.20.3 is required for a normal functioning of this module, but found accelerate==0.19.0.

可以重新安装包:


pip install accelerate==0.20.3

3. 测试摘要管道

进行摘要的方法有很多种:这里将使用管道方法。来自 Transformers 库的 Pipelines 是专用于特定任务(命名实体识别、屏蔽语言建模、情感分析、特征提取和问答)的工具。使用所需的所有导入和管道的初始化更新 main.py 文件。


########### GUI IMPORTS ################
import streamlit as st
#### IMPORTS FOR AI PIPELINES ###############
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
from transformers import pipeline
from transformers import AutoModel, T5Tokenizer, T5Model
from transformers import T5ForConditionalGeneration
from langchain.llms import HuggingFacePipeline
import torch

模型存储在 checkpoint(对于本项目来说是目录 model):它作为编码器-解码器模型,因此将其进行初始化:


# 设置 model 路径
checkpoint = "./model/"  # 实际上是LaMini-Flan-T5-248M
# 初始化标记器和模型
tokenizer = T5Tokenizer.from_pretrained(checkpoint)
base_model = T5ForConditionalGeneration.from_pretrained(
                                            checkpoint,
                                            device_map='auto',
                                            torch_dtype=torch.float32)

管道指定希望 LLM 执行的任务:设置模型标记器并添加一些特定参数(摘要的 max_lengthmin_length)。


# 初始化管道
pipe_sum = pipeline('summarization', 
                    model = base_model,
                    tokenizer = tokenizer,
                    max_length = 350, 
                    min_length = 25)

为了更好的测试它,将沿着文本分配给一个字符串变量,然后将在其上执行管道:


text = "It was way back in 2011 when the game L.A. Noire came out with absolutely amazing life-like facial animations that seemed so ahead of every other game. Now, almost a decade later, we still haven’t seen many other games come anywhere close to matching its level in terms of delivering realistic facial expressions.This is because the facial scanning technology used in the development of this game, called MotionScan, was extremely expensive and the file sizes of the captured animations was too big, which is why it made it impractical for most publishers to adopt this technology for their games.Let’s take a look at the architecture of this Deep Learning Framework in the figure below. It consists of a Motion Module and an Appearance Module. The driving video is the input to the Motion Module and the Source Image is our target object which is the input to the Appearance Module.The Motion Module consists of an encoder that learns a latent representation containing sparse keypoints of high importance in relation to the motion of the object, which is a face in this scenario. The movement of these keypoints across the different frames of the driving video generate a motion field, which is driven by a function that we want our model to learn. The authors use Taylor Expansion to approximate this function to the first order that creates this motion field. According to the authors, this is the first time first order approximation has been used to model motion. Moreover, learned affine transformations of these keypoints are combined to produce Dense Motion Field. The dense motion field predicts the motion of every individual pixel of the frame, as opposed to focusing on just the keypoints in the sparse motion field. Next, the motion module also produces an Occlusion Map, which highlights the pixels of the frame that need to be in-painted, arising from the movements of the head w.r.t. the background.The Appearance Module uses an encoder to encode the source image, which is then combined with the Motion Field and the Occlusion Map to animate the source image. A Generator model is used for this purpose. During the self-supervised training process, a still frame from the driving video is used as the source image and the learned motion field is used to animate this source image. The actual frames of the video act as the ground truth for the generated motion, hence it is self-supervised training. During the testing/inference phase, this source image can be replaced with any other image from the same object category, and doesn’t have to arrive from the driving video.I wanted to explore how well this model works on some virtually designed faces of game characters. The authors have shared its code and an easy-to-use Google Colab notebook to test this out. Here’s how their trained model looks when tested on different characters from the game Grand Theft Auto.As you can see, it is extremely easy to create life-like animations with this AI, and I think it will be used by almost every game artist for creating facial animations in games. Moreover, in order to perform Mo-Cap with this technique, all we need now is one camera and any average computer with a GPU and this AI will take care of the rest, making it extremely cheap and feasible for game animators to use this tech on a large scale. This is why I’m excited about the massive improvements that can be brought by this AI in the development of future games."
# 在文本上运行管道并打印结果
result = pipe_sum(text)
print(result)

venv 处于激活状态的情况下,从终端运行 python3 main.py,将会看到下面这样的结果。

image.png

由于是一个小的测试,存在一些错误:


Token indices sequence length is longer than the specified maximum sequence length for this model (758 > 512). Running this sequence through the model will result in indexing errors

这是因为原文长度有点长,稍后会对其进行切割。请注意,管道的结果是一个带有字典的列表:因此,要仅调用文本字符串,应该使用 [0] 作为列表中的第一个项目,而 ['summary_text'] 是想要的值(字符串)的键。


print(result[0]['summary_text'])

4. 使用 Streamlit 准备并测试图形界面

现在逻辑部分已经完成(除了文本分割器),接下来将深入研究 Streamlit 应用程序。

Streamlit 是一个用于构建数据 Web 应用程序的库,无需了解任何前端技术(例如 HTML 和 CSS)。如果想了解更多信息,请点击此处查看文档

创建一个名为 TextSummarizer-webui.py 的 python 文件:首先创建 GUI 的主干,然后将元素与逻辑结合起来。


import streamlit as st
############# Displaying images on the front end #################
st.set_page_config(page_title="Mockup for single page webapp",
                   page_icon='💻',
                   layout="centered",  #or wide
                   initial_sidebar_state="expanded",
                   menu_items={
                        'Get Help': 'https://docs.streamlit.io/library/api-reference',
                        'Report a bug': "https://www.extremelycoolapp.com/bug",
                        'About': "# This is a header. This is an *extremely* cool app!"}
                        )
# Load image placeholder from the web
st.image('./images/header.png', width=750)
# Set a Descriptive Title
st.title("My AI Summarizer")
st.divider()
your_future_text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras rhoncus massa sit amet est congue dapibus. Duis dictum ac nulla sit amet sollicitudin. In non metus ac neque vehicula egestas. Vestibulum quis justo id enim vestibulum venenatis. Cras gravida ex vitae dignissim suscipit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis efficitur, lorem ut fringilla commodo, lacus orci lobortis turpis, sit amet consequat ante diam ut libero."
st.text_area('Summarized text', your_future_text, 
              height = 150, key = 'result')
  • 导入 streamlit 后,第一条语句必须是 set_page_config(如果将其放在程序中的其他位置,则会抛出错误):参数是 webapp 页面的总体布局的设置。
  • 然后设置 header image:这里用到的图是AI生成的。
  • st.text_area是另一个 Stramlit 小部件:它创建一个带有标题和内容的文本区域。在这里的例子中,内容将由字符串 your_future_text 中的文本填充。
  • 最后一个参数是 key = 'result':将用它来调用 session_states (应用程序运行时可以调用和更新变量的方式)


# Set 2 colums to make the Buttons wider
col1, col2 = st.columns(2)
btn1 = col1.button(" :star: Click ME ", use_container_width=True, type="secondary")
btn2 = col2.button(" :smile: Click ME ", use_container_width=True, type="primary")
if btn1:
    st.warning('You pressed the wrong one!', icon="⚠️")
if btn2:
    st.success('Good Choice!', icon="⚠️")  
st.divider()
  • 对于本示例,仅在此定义 2 列,并在每一列中放置一个按钮。当在容器(列)内时,调用的小部件不带 st.。使用 use_container_width=True 将 Button 的宽度扩展到列之一。
  • 保存所有内容,在终端并运行 Streamlit 应用程序类型:streamlit run TextSummarizer-webui.py

默认浏览器将在默认地址 http://localhost:8501 打开。

image.png

5.将逻辑和界面联调起来

简单介绍完 Streamlit 之后,再来说逻辑部分(AI pipeline)和图形用户界面部分(Streamlit)。不用担心代码:可以在 GitHub 存储库中找到它。

重命名之前的文件 main.py 并创建一个新文件 AI-TextSummarizer.py,代码如下:


########### GUI IMPORTS ################
import streamlit as st
import ssl
############# Displaying images on the front end #################
st.set_page_config(page_title="Summarize and Talk ot your Text",
                   page_icon='📖',
                   layout="centered",  #or wide
                   initial_sidebar_state="expanded",
                   menu_items={
                        'Get Help': 'https://docs.streamlit.io/library/api-reference',
                        'Report a bug': "https://www.extremelycoolapp.com/bug",
                        'About': "# This is a header. This is an AI text summarizer!"
                                },
                   )
########### SSL FOR PROXY ##############
ssl._create_default_https_context = ssl._create_unverified_context
#### IMPORTS FOR AI PIPELINES ###############
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
from transformers import pipeline
from transformers import AutoModel, T5Tokenizer, T5Model
from transformers import T5ForConditionalGeneration
from langchain.llms import HuggingFacePipeline
import torch
import datetime
#############################################################################
#               SIMPLE TEXT2TEXT GENERATION INFERENCE
#           checkpoint = "./models/LaMini-Flan-T5-783M.bin" 
# ###########################################################################
checkpoint = "./model/"  # 实际上是 LaMini-Flan-T5-248M

到目前为止没有什么新的。将在以下代码块中将函数和交互式 Streamlit widt 放在一起,并解释构建块。


######################################################################
#     SUMMARIZATION FROM TEXT STRING WITH HUGGINGFACE PIPELINE       #
######################################################################
def AI_SummaryPL(checkpoint, text, chunks, overlap):
    """
    checkpoint is in the format of relative path
    example:  checkpoint = "/content/model/"  #it is actually LaMini-Flan-T5-248M   #tested fine
    text it is either a long string or a input long string or a loaded document into string
    chunks: integer, lenght of the chunks splitting
    ovelap: integer, overlap for cor attention and focus retreival
    RETURNS full_summary (str), delta(str) and reduction(str)
    post_summary14 = AI_SummaryPL(LaMini,doc2,3700,500)
    USAGE EXAMPLE:
    post_summary, post_time, post_percentage = AI_SummaryPL(LaMini,originalText,3700,500)
    """
    from langchain.text_splitter import RecursiveCharacterTextSplitter
    text_splitter = RecursiveCharacterTextSplitter(
        # 设置一个非常小的块大小,只是为了显示
        chunk_size = chunks,
        chunk_overlap  = overlap,
        length_function = len,
    )
    texts = text_splitter.split_text(text)
    checkpoint = checkpoint
    tokenizer = T5Tokenizer.from_pretrained(checkpoint)
    base_model = T5ForConditionalGeneration.from_pretrained(checkpoint,
                                                        device_map='auto',
                                                        torch_dtype=torch.float32)
    ### INITIALIZING PIPELINE
    pipe_sum = pipeline('summarization', 
                        model = base_model,
                        tokenizer = tokenizer,
                        max_length = 350, 
                        min_length = 25
                        )
    ## START TIMER
    start = datetime.datetime.now()  
    ## START CHUNKING
    full_summary = ''
    for cnk in range(len(texts)):
      result = pipe_sum(texts[cnk])
      full_summary = full_summary + ' '+ result[0]['summary_text']
    stop = datetime.datetime.now()  
    ## TIMER STOPPED AND RETURN DURATION
    delta = stop-start  
    ### Calculating Summarization PERCENTAGE
    reduction = '{:.1%}'.format(len(full_summary)/len(text))
    print(f"Completed in {delta}")
    print(f"Reduction percentage: ", reduction)
    return full_summary, delta, reduction

这是主要的功能,接下来需要一个函数,因为单击正确的按钮时将开始汇总(对于此方法,需要一个函数来调用)


from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
    # 设置一个非常小的块大小,只是为了显示
    chunk_size = chunks,
    chunk_overlap  = overlap,
    length_function = len,
)
texts = text_splitter.split_text(text)

LangChain 库是一个非常强大的工具箱:可以使用外部文档和来源与语言模型进行交互。LangChain TextSplitters 的方法不止一种。 RecursiveCharacterSplitter 是推荐的一种,用于将长通用文本分割成小块(称为块),并且不超过 token 限制。


## 开始组块
full_summary = ''
for cnk in range(len(texts)):
   result = pipe_sum(texts[cnk])
   full_summary = full_summary + ' '+ result[0]['summary_text']

块存储在列表中:迭代列表中的项目并将每个块提供给摘要管道。然后将所有字符串连接在一起以获得 final_summary


### HEADER section
st.image('./images/header.png', width=750)
st.title("My AI Summarizer")
st.divider()
title = st.text_area('Insert here your Copy/Paste text', "", height = 350, key = 'copypaste')
btt = st.button("1. Start Summarization")
txt = st.empty()
timedelta = st.empty()
text_lenght = st.empty()
redux_bar = st.empty()
st.divider()
down_title = st.empty()
down_btn = st.button('2. Download Summarization') 
text_summary = ''

可以看到一些 st.empty()。这是一个占位符:正在页面布局中预订一个位置,稍后将填充该位置。


def start_sum(text):
    if st.session_state.copypaste == "":
        st.warning('You need to paste some text...', icon="⚠️")
    else:
        with st.spinner('Initializing pipelines...'):
            st.success(' AI process started', icon="🤖")
            print("Starting AI pipelines")
            text_summary, duration, reduction = AI_SummaryPL(LaMini,text,3700,500)
        txt.text_area('Summarized text', text_summary, height = 350, key='final')
        timedelta.write(f'Completed in {duration}')
        text_lenght.markdown(f"Initial length = {len(text.split(' '))} words / summarization = **{len(text_summary.split(' '))} words**")
        redux_bar.progress(len(text_summary)/len(text), f'Reduction: **{reduction}**')
        down_title.markdown(f"## Download your text Summarization")

当按下 btt = st.button("1. Start Summarization") 时将调用此函数,开始对粘贴在 text_area 中的文本进行摘要。


if btt:
    start_sum(st.session_state.copypaste)
if down_btn:
    def savefile(generated_summary, filename):
        st.write("Download in progress...")
        with open(filename, 'w') as t:
            t.write(generated_summary)
        t.close()
        st.success(f'AI Summarization saved in {filename}', icon="✅")
    savefile(st.session_state.final, 'text_summarization.txt')
    txt.text_area('Summarized text', st.session_state.final, height = 350)

请注意,start_sum 的唯一参数是 session_state

Session State 是一种在每个用户会话的重新运行之间共享变量的方法。除了存储和持久状态的能力之外,Streamlit 还公开了使用回调操作状态的能力。会话状态也会在多页面应用程序内的应用程序之间持续存在。

venv 处于活动状态时,从终端运行:

arduino

复制代码

streamlit run AI-TextSummarizer.py

粘贴想要总结的文章文本,然后按按钮。

image.png

下面尝试增加一些自定义样式:

custom_style = """
    <style>
        .stButton>button {
            border-radius:0px;
            padding:5px 20px;
        }
        .stTextArea textarea {
            border-radius:0px;
            padding:5px;
            line-height:1.6
        }
        .stTextArea .st-br{
            border-radius:0px;
        }
        .stTextArea>label p{
            line-height:2
        }
        .block-container{
            max-width:780px
        }
    </style>
"""
st.markdown(custom_style, unsafe_allow_html=True)

效果如下:

image.png

总结

管道 Pipelines 是惊人的。即使硬件很少,也可以在计算机上运行我们想要的所有内容(LaMini-LM 也仅使用 CPU 运行)。尝试不同的设置以提高摘要的质量。


相关文章
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术深度解析:从基础到应用的全面介绍
人工智能(AI)技术的迅猛发展,正在深刻改变着我们的生活和工作方式。从自然语言处理(NLP)到机器学习,从神经网络到大型语言模型(LLM),AI技术的每一次进步都带来了前所未有的机遇和挑战。本文将从背景、历史、业务场景、Python代码示例、流程图以及如何上手等多个方面,对AI技术中的关键组件进行深度解析,为读者呈现一个全面而深入的AI技术世界。
67 10
|
3天前
|
机器学习/深度学习 人工智能 物联网
AI赋能大学计划·大模型技术与应用实战学生训练营——湖南大学站圆满结营
12月14日,由中国软件行业校园招聘与实习公共服务平台携手魔搭社区共同举办的AI赋能大学计划·大模型技术与产业趋势高校行AIGC项目实战营·湖南大学站圆满结营。
AI赋能大学计划·大模型技术与应用实战学生训练营——湖南大学站圆满结营
|
7天前
|
人工智能 安全 算法
深度剖析 打造大模型时代的可信AI:技术创新与安全治理并重
2024年12月11日,由中国计算机学会计算机视觉专委会主办的“打造大模型时代的可信AI”论坛在上海举行。论坛汇聚了来自多家知名学术机构和企业的顶尖专家,围绕AI的技术风险与治理挑战,探讨如何在大模型时代确保AI的安全性和可信度,推动技术创新与安全治理并行。论坛重点关注计算机视觉领域的最新进展,提出了多项技术手段和治理框架,为AI的健康发展提供了有力支持。
43 8
深度剖析 打造大模型时代的可信AI:技术创新与安全治理并重
|
7天前
|
机器学习/深度学习 人工智能 运维
阿里云技术公开课直播预告:基于阿里云 Elasticsearch 构建 AI 搜索和可观测 Chatbot
阿里云技术公开课预告:Elastic和阿里云搜索技术专家将深入解读阿里云Elasticsearch Enterprise版的AI功能及其在实际应用。
阿里云技术公开课直播预告:基于阿里云 Elasticsearch 构建 AI 搜索和可观测 Chatbot
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
AI自己长出了类似大脑的脑叶?新研究揭示LLM特征的惊人几何结构
近年来,大型语言模型(LLM)的内部运作机制备受关注。麻省理工学院的研究人员在论文《The Geometry of Concepts: Sparse Autoencoder Feature Structure》中,利用稀疏自编码器(SAE)分析LLM的激活空间,揭示了其丰富的几何结构。研究发现,特征在原子、大脑和星系三个尺度上展现出不同的结构,包括晶体结构、中尺度模块化结构和大尺度点云结构。这些发现不仅有助于理解LLM的工作原理,还可能对模型优化和其他领域产生重要影响。
50 25
|
7天前
|
机器学习/深度学习 传感器 人工智能
AI视频监控系统在养老院中的技术实现
AI视频监控系统在养老院的应用,结合了计算机视觉、深度学习和传感器融合技术,实现了对老人体征、摔倒和异常行为的实时监控与分析。系统通过高清摄像头和算法模型,能够准确识别老人的动作和健康状况,并及时向护理人员发出警报,提高护理质量和安全性。
43 14
|
8天前
|
传感器 机器学习/深度学习 人工智能
AI视频监控卫士技术介绍:智能化河道管理解决方案
AI视频监控卫士系统,通过高清摄像头、智能传感器和深度学习技术,实现河道、水库、城市水务及生态保护区的全天候、全覆盖智能监控。系统能够自动识别非法行为、水质变化和异常情况,并实时生成警报,提升管理效率和精准度。
43 13
|
6天前
|
存储 人工智能 运维
AI-Native的路要怎么走?一群技术“老炮儿”指明了方向
上世纪70年代,沃兹尼亚克、乔布斯等人成立Homebrew Computer Club,推动个人电脑普及。如今,创原会承袭这一精神,由CNCF执行董事Priyanka Sharma等构建,聚焦云原生和AI技术,汇聚各行业技术骨干,探索前沿科技。2024年创原会年度峰会达成“全面拥抱AI-Native”共识,解决算力与存储瓶颈,推动AI原生应用开发,助力千行万业智能化转型,成为行业创新风向标。
|
7天前
|
人工智能 计算机视觉
幻觉不一定有害,新框架用AI的幻觉优化图像分割技术
在图像分割领域,传统方法依赖大量手动标注数据,效率低下且难以适应复杂场景。为解决这一问题,研究人员提出了“任务通用可提示分割”方法,利用多模态大型语言模型(MLLM)生成实例特定提示。然而,MLLM常出现幻觉,影响分割精度。为此,研究团队开发了“Prompt-Mask Cycle”(ProMaC)框架,通过迭代生成和验证提示及掩码,有效利用幻觉信息,提高了分割精度和效率。实验结果表明,ProMaC在多个基准数据集上表现出色,为图像分割技术的发展提供了新思路。
22 6
|
13天前
|
机器学习/深度学习 人工智能 监控
AI视频监控技术的核心优势与实践
AI视频监控技术结合了计算机视觉、深度学习和大数据分析,能够实时分析监控画面,识别异常行为和场景变化。其核心在于从“被动记录”转型为“主动识别”,提升监控效率并减少安全隐患。主要应用场景包括泳池管理、健身器械区域、人员密度预警和异常事件检测。系统架构支持多种摄像头设备,采用边缘计算和Docker部署,具备实时性、高准确率和扩展性等优势。未来将优化复杂场景适应性和实时计算负载,进一步提高系统性能。

热门文章

最新文章