大模型生成PPT大纲优化方案:基于 nVidia NIM 平台的递归结构化生成

news2024/10/9 15:02:02

大模型生成PPT大纲优化方案:基于 nVidia NIM 平台的递归结构化生成

待解决的问题

生成PPT大纲是一种大模型在办公场景下应用的常见需求。

然而:

  • 目前直接让大模型生成大纲往往是非结构化的,输出格式多样,难以统一和规范,这使得大纲后续的分析与利用变得复杂。
  • 生成过程中的层级深度和每层的颗粒度无法灵活控制,导致生成内容有时过于简单,有时又过于复杂,缺乏可控性。
  • 由于大模型是基于自回归的,在生成细粒度大纲时首层大纲并没有生成完,和人类规划大纲自顶向下的方法不同,导致大纲的层级之间往往存在模糊和重叠,无法有效传达不同层次的重点内容。

为了解决上述问题,本文提出了一种递归结构化生成的方法,通过分层递归控制大模型生成大纲的过程,不仅能使大纲结构清晰,而且可以灵活控制各层的深度和颗粒度。这样生成的大纲不仅层次分明,内容也更加贴合实际应用需求,避免了层级模糊和内容重叠的现象。

本项目基于NVIDIA NIM平台,使用 LLaMA 3.1 70B 作为基座模型。NVIDIA NIM 平台提供了强大的自然语言处理等人工智能能力,能够方便、高效地调用各种预训练模型,甚至进行定制化的推理。

在这里插入图片描述

核心方案

该项目的核心是递归生成PPT大纲,逐层递进,确保大纲的层次清晰、内容具体,避免生成结果的模糊和重叠问题。核心流程如下:

  1. 第一层生成:首先,通过模型生成第一层的PPT大纲内容,确保初始大纲框架具有明确的层次。
  2. 递归生成:在生成初始层之后,递归生成每个子级的内容,逐层递进。每一级的生成都是基于上一层的大纲内容进行细化和补充,保证了层次结构的清晰和逻辑性。
  3. 递归终止条件:当生成到达指定的层级时,递归终止,输出完整的结构化大纲。

具体的 prompt 将在下一节讲解。

第一层大纲生成 (generate_first_level_outlines)

这个函数负责生成大纲的第一层内容,基于用户输入的主题调用大模型生成初始的大纲框架。

def generate_first_level_outlines(idea):
    first_level_template = FIRST_LEVEL_PROMPT.format(
        few_shot=FIRST_LEVEL_EXAMPLE,
        idea=idea,
    )
    response = client.chat.completions.create(
        model="meta/llama-3.1-70b-instruct",
        messages=[{"role": "user", "content": first_level_template}],
        temperature=0.7,
        max_tokens=1024,
    )
    return extract_outlines(response.choices[0].message.content.strip())

注意,调用模型后,通过extract_outlines函数对生成的结果进行处理,去掉不必要的空白行,得到大纲的第一层结构化内容。extract_outlines函数具体详见下一节。

递归生成下一级大纲 (generate_next_level_outline)

当生成了第一层的大纲后,系统需要递归生成各个子级内容。generate_next_level_outline函数根据上一层的大纲内容,生成当前层的细化内容。

模型生成后,如果当前层级达到了目标层(target_layer),则返回当前层的大纲内容。否则,函数将继续递归调用自己,为每个子项生成更深层的大纲内容,直到达到目标层。

def generate_next_level_outline(
    idea: str,
    current_level: int,
    previous_outline: str,
    previous_list: list[str],
    target_layer: int,
):
    formatted_previous_list = ', '.join(previous_list)
    next_level_template = NEXT_LEVEL_PROMPT.format(
        few_shot=NEXT_LEVEL_EXAMPLE,
        idea=idea,
        formatted_previous_list=formatted_previous_list,
        previous_outline=previous_outline,
        current_level=current_level,
    )
    response = client.chat.completions.create(
        model="meta/llama-3.1-70b-instruct",
        messages=[{"role": "user", "content": next_level_template}],
        temperature=0.7,
        max_tokens=1024,
    )

    outlines = extract_outlines(response.choices[0].message.content.strip())

    if target_layer == current_level:
        return outlines
    else: 
        return {
            text: generate_next_level_outline(
                idea, current_level + 1, text, outlines, target_layer
            ) for text in outlines
        }

注意,prompt 中会将上一级的内容和当前的层次信息整合,让模型有更充分的信息生成该层的大纲内容。

递归结构化大纲生成 (recursive_outline)

这个函数是整个递归生成过程的核心,通过逐层调用generate_next_level_outline函数,生成每一层的大纲,直到生成目标层的所有内容。

def recursive_outline(idea, target_layer: int):
    first_level = generate_first_level_outlines(idea)
    return {
        text: generate_next_level_outline(
            idea, 2, text, first_level, target_layer
        ) for text in first_level
    }

实现细节

prompt

本项目的 prompt 明确告知模型生成PPT大纲的任务,提供主题信息(idea)和所需层级(layer),确保模型能够聚焦于特定主题,并生成相应层次的内容。此外,通过提供多个生成示例,向模型展示了预期的输出格式和内容结构。通过示例提供了明确的上下文,同时引入了对重复内容的避免,还引入了上一层的内容,帮助模型了解需要避免重复的信息。

BASE_PROMPT = """请你根据主题:“{idea}”生成{layer}层的PPT大纲:\n"""

FIRST_LEVEL_EXAMPLE = """请你根据
技术是一把双刃剑,它既能推动社会向前发展,也可能因不当使用而造成伤害。比如数字鸿沟现象。
生成大纲第1层,一行一个条目,生成在<>中,无需其他解释和内容:
<信息爆炸的时代>
<科技革命与产业变革>
<社会影响日益凸显>
<人类应未雨绸缪,趋利避害>
<发展趋势及前景,结论>

请你根据
为什么我们要好好学习?在快速变化的世界中,持续学习是实现自我价值和社会贡献的关键。
生成大纲第1层,一行一个条目,生成在<>中,无需其他解释和内容:
<引言>
<学习对个人成长的意义>
<学习对社会的责任>
<如何有效学习>

请你根据
在单身的黄金年代我们如何面对爱情:要勇敢地去追求爱情
生成大纲第1层,一行一个条目,生成在<>中,无需其他解释和内容:
<何为单身的黄金时代>
<爱情对人们的意义>
<目前人的生存和处境更加复杂>
<爱情存在肌无力>
<最温暖的东西是人和人之间的感情>
<要勇敢地追求爱情>
"""

FIRST_LEVEL_PROMPT = """{few_shot}
上面是几个生成大纲第一层的例子。请你根据
{idea}
生成大纲第1层,一行一个条目,生成在<>中,无需其他解释和内容:"""

NEXT_LEVEL_EXAMPLE = """请你根据
技术是一把双刃剑,它既能推动社会向前发展,也可能因不当使用而造成伤害。比如数字鸿沟现象。
不要和上一层的 信息爆炸的时代, 科技革命与产业变革, 人类应未雨绸缪,趋利避害, 发展趋势及前景,结论 重复,
生成“社会影响日益凸显”下的大纲第2层内容,一行一个条目,生成在<>中,无需其他解释和内容:
<举例:数字鸿沟现象>
<各种问题普遍存在>
<对人类各方面产生深远影响>

请你根据
在单身的黄金年代我们如何面对爱情:要勇敢地去追求爱情
不要和上一层的 何为单身的黄金时代, 爱情对人们的意义, 目前人的生存和处境更加复杂, 爱情存在肌无力, 最温暖的东西是人和人之间的感情 重复,
生成“要勇敢地追求爱情”下的大纲第2层内容,一行一个条目,生成在<>中,无需其他解释和内容:
<必须树立目标>
<提升心灵的力量>
<走合法的途径去获取>

请你根据
为什么我们要好好学习?在快速变化的世界中,持续学习是实现自我价值和社会贡献的关键。
不要和上一层的 理解自己的权利与义务, 正确价值观和社会责任感 重复,
生成“知识是推动社会发展的关键力量”下的大纲第3层内容,一行一个条目,生成在<>中,无需其他解释和内容:
<科技创新与经济发展>
<社会治理与公共政策>
<文化传承与发展>
"""

NEXT_LEVEL_PROMPT = """{few_shot}
上面是几个生成大纲具体层的例子。请你根据
{idea}
不要和上一层的 {formatted_previous_list} 重复,
生成“{previous_outline}”下的大纲第{current_level}层内容,一行一个条目,生成在<>中,无需其他解释和内容:
"""

大纲文本提取

简单的提取方法,将模型输出按行分割并去除空白行和格式字符。

def extract_outlines(model_output: str):
    return [
        line.strip().strip('<').strip('>')
        for line in model_output.split('\n')
        if line.strip()
    ]

baseline 对比、全局变量和简易用户界面

简易的 web 用户界面是基于 gradio 构建的。复现时记得更换为自己的NVIDIA_API_KEY

借助Gradio构建用户友好的交互界面,用户只需输入一个主题和层数,本项目会生成两个版本的PPT大纲,一个是直接生成的,一个是递归生成的,并将两者进行对比展示。

大纲生成的基本过程通过调用 nVidia NIM 平台 的接口,将主题与层级信息传入模型生成器,控制输出大纲的层级深度和层次内容。

import gradio as gr
from openai import OpenAI

import json

client = OpenAI(
    base_url="https://integrate.api.nvidia.com/v1",
    api_key=NVIDIA_API_KEY
)

def generate_outline(input_text, layer: int):
    prompt = BASE_PROMPT.format(idea=input_text, layer=layer)
    completion = client.chat.completions.create(
        model="meta/llama-3.1-70b-instruct",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.7,
        max_tokens=1024,
    )
    return completion.choices[0].message.content.strip()


def compare_outlines(input_text, layers):
    direct = generate_outline(input_text, int(layers))
    recursive = recursive_outline(input_text, int(layers))
    return direct, json.dumps(recursive, ensure_ascii=False, indent=8)

iface = gr.Interface(
    fn=compare_outlines,
    inputs=["text", gr.Number()],
    outputs=["text", "text"],
    title="PPT大纲生成对比",
    description="输入一个句子,比较直接生成和递归生成的PPT大纲效果。"
)

iface.launch()

项目效果

运行后,在浏览器中打开项目前端,输入要生成的主题和期望的层数,可以得到普通方法生成和本方法生成的结果。

在这里插入图片描述
如图所示,递归结构化生成的效果不仅结构清晰、方便利用,而且相对于普通方法,生成了正确的层次深度,大纲对于主题的分析更加深入和全面,有更多的信息量和参考价值。

通过采用递归结构化生成的方法,本项目能够有效地解决传统PPT大纲生成中遇到的各种问题,为用户提供更清晰、有条理的内容。希望本项目的实践经验能够为更多相关应用的探索与优化提供启示和借鉴。

完整代码:


import gradio as gr
from openai import OpenAI

from __env import NVIDIA_API_KEY
import json

client = OpenAI(
    base_url="https://integrate.api.nvidia.com/v1",
    api_key=NVIDIA_API_KEY
)

BASE_PROMPT = """请你根据主题:“{idea}”生成{layer}层的PPT大纲:\n"""

FIRST_LEVEL_EXAMPLE = """请你根据
技术是一把双刃剑,它既能推动社会向前发展,也可能因不当使用而造成伤害。比如数字鸿沟现象。
生成大纲第1层,一行一个条目,生成在<>中,无需其他解释和内容:
<信息爆炸的时代>
<科技革命与产业变革>
<社会影响日益凸显>
<人类应未雨绸缪,趋利避害>
<发展趋势及前景,结论>

请你根据
为什么我们要好好学习?在快速变化的世界中,持续学习是实现自我价值和社会贡献的关键。
生成大纲第1层,一行一个条目,生成在<>中,无需其他解释和内容:
<引言>
<学习对个人成长的意义>
<学习对社会的责任>
<如何有效学习>

请你根据
在单身的黄金年代我们如何面对爱情:要勇敢地去追求爱情
生成大纲第1层,一行一个条目,生成在<>中,无需其他解释和内容:
<何为单身的黄金时代>
<爱情对人们的意义>
<目前人的生存和处境更加复杂>
<爱情存在肌无力>
<最温暖的东西是人和人之间的感情>
<要勇敢地追求爱情>
"""

FIRST_LEVEL_PROMPT = """{few_shot}
上面是几个生成大纲第一层的例子。请你根据
{idea}
生成大纲第1层,一行一个条目,生成在<>中,无需其他解释和内容:"""

NEXT_LEVEL_EXAMPLE = """请你根据
技术是一把双刃剑,它既能推动社会向前发展,也可能因不当使用而造成伤害。比如数字鸿沟现象。
不要和上一层的 信息爆炸的时代, 科技革命与产业变革, 人类应未雨绸缪,趋利避害, 发展趋势及前景,结论 重复,
生成“社会影响日益凸显”下的大纲第2层内容,一行一个条目,生成在<>中,无需其他解释和内容:
<举例:数字鸿沟现象>
<各种问题普遍存在>
<对人类各方面产生深远影响>

请你根据
在单身的黄金年代我们如何面对爱情:要勇敢地去追求爱情
不要和上一层的 何为单身的黄金时代, 爱情对人们的意义, 目前人的生存和处境更加复杂, 爱情存在肌无力, 最温暖的东西是人和人之间的感情 重复,
生成“要勇敢地追求爱情”下的大纲第2层内容,一行一个条目,生成在<>中,无需其他解释和内容:
<必须树立目标>
<提升心灵的力量>
<走合法的途径去获取>

请你根据
为什么我们要好好学习?在快速变化的世界中,持续学习是实现自我价值和社会贡献的关键。
不要和上一层的 理解自己的权利与义务, 正确价值观和社会责任感 重复,
生成“知识是推动社会发展的关键力量”下的大纲第3层内容,一行一个条目,生成在<>中,无需其他解释和内容:
<科技创新与经济发展>
<社会治理与公共政策>
<文化传承与发展>
"""

NEXT_LEVEL_PROMPT = """{few_shot}
上面是几个生成大纲具体层的例子。请你根据
{idea}
不要和上一层的 {formatted_previous_list} 重复,
生成“{previous_outline}”下的大纲第{current_level}层内容,一行一个条目,生成在<>中,无需其他解释和内容:
"""


def generate_outline(input_text, layer: int):
    prompt = BASE_PROMPT.format(idea=input_text, layer=layer)
    completion = client.chat.completions.create(
        model="meta/llama-3.1-70b-instruct",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.7,
        max_tokens=1024,
    )
    return completion.choices[0].message.content.strip()


def extract_outlines(model_output: str):
    # 简单的提取方法,将模型输出按行分割并去除空白行
    return [
        line.strip().strip('<').strip('>')
        for line in model_output.split('\n')
        if line.strip()
    ]


def generate_first_level_outlines(idea):
    first_level_template = FIRST_LEVEL_PROMPT.format(
        few_shot=FIRST_LEVEL_EXAMPLE,
        idea=idea,
    )
    response = client.chat.completions.create(
        model="meta/llama-3.1-70b-instruct",
        messages=[{"role": "user", "content": first_level_template}],
        temperature=0.7,
        max_tokens=1024,
    )
    return extract_outlines(response.choices[0].message.content.strip())


def generate_next_level_outline(
    idea: str,
    current_level: int,
    previous_outline: str,
    previous_list: list[str],
    target_layer: int,
):

    formatted_previous_list = ', '.join(previous_list)
    next_level_template = NEXT_LEVEL_PROMPT.format(
        few_shot=NEXT_LEVEL_EXAMPLE,
        idea=idea,
        formatted_previous_list=formatted_previous_list,
        previous_outline=previous_outline,
        current_level=current_level,
    )
    response = client.chat.completions.create(
        model="meta/llama-3.1-70b-instruct",
        messages=[{"role": "user", "content": next_level_template}],
        temperature=0.7,
        max_tokens=1024,
    )

    outlines = extract_outlines(response.choices[0].message.content.strip())

    if target_layer == current_level:
        return outlines
    else: 
        return {
            text: generate_next_level_outline(
                idea, current_level + 1, text, outlines, target_layer
            ) for text in outlines
        }


def recursive_outline(idea, target_layer: int):

    first_level = generate_first_level_outlines(idea)

    return {
        text: generate_next_level_outline(
            idea, 2, text, first_level, target_layer
        ) for text in first_level
    }


def compare_outlines(input_text, layers):
    direct = generate_outline(input_text, int(layers))
    recursive = recursive_outline(input_text, int(layers))
    return direct, json.dumps(recursive, ensure_ascii=False, indent=8)


iface = gr.Interface(
    fn=compare_outlines,
    inputs=["text", gr.Number()],
    outputs=["text", "text"],
    title="PPT大纲生成对比",
    description="输入一个句子,比较直接生成和递归生成的PPT大纲效果。"
)

iface.launch()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2199313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ZBrush入门使用介绍——17、FiberMesh

大家好&#xff0c;我是阿赵。   继续介绍ZBrush的使用。这次来看看FiberMesh功能。这是一个可以模仿毛发的功能。 一、 使用FiberMesh的预览功能 先准备一个模型&#xff0c;并生成多边形网格 然后按着Ctrl&#xff0c;在模型的表面画一个遮罩。 找到FiberMesh功能&#…

QT:计算点到线段的垂线段的距离

描述 在Qt中&#xff0c;要计算一个点到一条线段的垂线段的长度&#xff08;即点到线段上最近点的距离&#xff0c;且这个点是垂直于线段的&#xff09;&#xff0c;你不能直接使用QVector2D::distanceToLine&#xff0c;因为这个方法计算的是点到直线的垂直距离&#xff0c;而…

线程中的异常处理

线程中的异常处理 concurrent.futures — 启动并行任务 — Python 3.13.0 文档 from concurrent.futures import ThreadPoolExecutordef task():a 1 / 0print(任务执行中...)with ThreadPoolExecutor(max_workers5) as t:for i in range(10):worker t.submit(task)没有任任…

Unity实现自定义图集(二)

以下内容是根据Unity 2020.1.0f1版本进行编写的   实现一个自定义图集,该怎么入手呢。首先简单思考一下unity是怎么实现图集的。 因为unity的ui部分是开源的,所以我们可以看到UGUI的源代码,另外,Unity的内置Shader也是开源的,可以直接在官网下载(在下载的网页选择Built…

一文彻底搞懂大模型 - Hugging Face Transformers

Hugging Face Hugging Face Transformers是一个开源的预训练模型库&#xff0c;旨在将NLP领域的最新进展向更广泛的机器学习社区开放。该库包含了经过精心设计的最先进的Transformer架构&#xff0c;并提供了易于使用的API**&#xff0c;使得研究人员和开发者能够轻松地加载、…

Linux环境安装Anaconda

1.环境检查 uname -a2.下载Anaconda 下载地址: Anaconda 根据自己的版本下载 3.安装Anaconda 将下载的文件上传到Linux服务器设置权限 chmod x Anaconda3-2024.02-1-Linux-x86_64.sh执行.sh文件 ./Anaconda3-2024.02-1-Linux-x86_64.sh直接回车&#xff0c;一直回车&…

解决:由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开.请跟服务器管理员联系

今天早上远程连接京东云服务器&#xff0c;居然蹦出了下面的提示 查了下这个提示&#xff0c;出现这个报错的原因有两种&#xff1a; 1. 系统添加了“远程桌面会话主机”角色后&#xff0c;该授权到期&#xff08;可以免费试用120天&#xff0c;到期需要付费才能使用&#xff…

有哪些AI产品可以真正提高办公和学习效率?

你还在为加班熬夜、效率低下而苦恼吗&#xff1f;还在担心错过AI时代的风口&#xff0c;被时代抛弃吗&#xff1f; 告别效率焦虑&#xff0c;AI赋能你的学习和工作 现在有一些AI产品能为我们提供帮助&#xff0c;比如豆包、KIMI、通义千问、ChatGPT等等&#xff0c;帮助我们做P…

【深度学习】—激活函数、ReLU 函数、 Sigmoid 函数、Tanh 函数

【深度学习】—激活函数、ReLU 函数、 Sigmoid 函数、Tanh 函数 4.1.2 激活函数ReLU 函数参数化 ReLU Sigmoid 函数背景绘制 sigmoid 函数Sigmoid 函数的导数 Tanh 函数Tanh 函数的导数总结 4.1.2 激活函数 激活函数&#xff08;activation function&#xff09;用于计算加权和…

【有啥问啥】逆向工程(Reverse Engineering,RE):深度解析与技术方法

逆向工程&#xff08;Reverse Engineering&#xff0c;RE&#xff09;&#xff1a;深度解析与技术方法 引言 逆向工程&#xff08;Reverse Engineering&#xff0c;简称RE&#xff09;&#xff0c;作为现代科技领域中的一项重要技术&#xff0c;其影响力已远远超越了传统的硬…

“聪明车”上线“智慧路”!批量苏州金龙海格公交甘肃静宁投运

近日&#xff0c;甘肃省静宁县智慧公交系统正式上线&#xff0c;20台苏州金龙海格蔚蓝新能源公交车正式投入使用&#xff0c;大大提升了当地城市公共交通的智能水平以及城市形象。 智慧交通&#xff0c;势在必行 随着公共交通出行需求的不断升级&#xff0c;客运市场对于智能化…

爬虫请求响应以及提取数据

爬虫请求响应以及提取数据 回顾: 网页给客户端响应数据, 有哪些写法(在爬虫入门之爬虫原理以及请求响应这篇博客咯嘛有提到)? 1.响应对象.text(获取网页数据的时候会用到) 2.响应对象.content(将图片, 音频或视频等数据存放到文件的时候会用到) 那这一篇文章, 介绍一个新的写法…

小白打造爆款必备:速卖通平台测评与买家号培养全解析

随着亚马逊平台风控的持续升级&#xff0c;众多卖家面临着封店、侵权等诸多挑战&#xff0c;迫使许多商家开始探索其他市场&#xff0c;如速卖通、Temu等平台&#xff0c;这些平台对新入驻的卖家提供了显著的流量扶持。在速卖通平台的运营中&#xff0c;如何迅速且有效地提升店…

动态规划11:面试题 17.16. 按摩师

动态规划解题步骤&#xff1a; 1.确定状态表示&#xff1a;dp[i]是什么 2.确定状态转移方程&#xff1a;dp[i]等于什么 3.初始化&#xff1a;确保状态转移方程不越界 4.确定填表顺序&#xff1a;根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接&#xff1a;面试…

论文翻译 | Language Models are Few-Shot Learners 语言模型是少样本学习者(上)

摘要 最近的工作表明&#xff0c;通过在大规模文本语料库上进行预训练&#xff0c;然后在特定任务上进行微调&#xff0c;许多自然语言处理&#xff08;NLP&#xff09;任务和基准测试都取得了显著的提升。尽管这种方法在架构上通常是任务无关的&#xff0c;但它仍然需要成千上…

【vue2.7.16系列】手把手教你搭建后台系统__配置路由(3)

新建页面 我们把 components 改名为 views&#xff0c;并在 views 目录下添加三个页面&#xff0c;Login.vue&#xff0c;Home.vue&#xff0c;404.vue。 三个页面内容简单相似&#xff0c;只有简单的页面标识&#xff0c;如首页页面是 “Home Page”。 Home.vue&#xff0c;…

windows客户端SSH连接ubuntu/linux服务器,三种网络连接:局域网,内网穿透(sakuraftp),虚拟局域网(zerotier)

windows客户端SSH连接ubuntu/linux服务器&#xff0c;三种网络连接&#xff1a;局域网&#xff0c;内网穿透&#xff08;sakuraftp&#xff09;&#xff0c;虚拟局域网&#xff08;zerotier&#xff09; 目录 SSH简述、三种网络连接特点SSH简述局域网内连接内网穿透&#xff08…

SpringBoot助力校园资料分享:快速上手指南

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多学生、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

LabVIEW提高开发效率技巧----队列使用

在LabVIEW开发中&#xff0c;队列是实现并行处理、数据传递和任务调度的关键机制之一&#xff0c;合理使用队列可以有效提高程序性能并避免内存问题。结合队列长度限制和其他队列相关技巧&#xff0c;以下是队列使用的详细说明&#xff1a; 1. 队列长度限制 限制队列的长度可以…

maven打包常用命令

跳过tset打包 mvn package -Dmaven.test.skiptrue