GraphRAG论文解读

news/2024/9/19 18:38:28/ 标签: python

欢迎一起讨论

  • 论文地址
  • 综述
  • 介绍部分核心翻译
    • 翻译
    • 解释重要的信息
      • 元素和实体的关系(包含和被包含,而非相等)
      • Graph Index(图索引)
      • Community Detection(社区检测)
      • Query-Focused Summarization(查询聚焦的摘要)
      • Global Answer(全局答案)
  • Graph RAG 方法与流程核心翻译以及解释
    • Source Documents → Text Chunks
      • 翻译
      • 召回率与精确度的平衡
    • Text Chunks → Element Instances
      • 翻译
      • 重要信息解释
        • 为什么需要“少量示例”(Few-shot Learning)?
        • 补充提取(Gleanings)
        • 简单的示例(非官方仅为了理解)
    • Element Instances → Element Summaries
      • 原文大意
      • 重要概念解释
        • 抽象总结(前一步也有涉及)
        • 将多个实例总结为一个整体
        • 重复实体的问题以及解决方案、
    • Element Summaries → Graph Communities
      • 原文大意
      • 重要概念解释
        • 创建的图索引
        • 为什么使用社区检测?
        • 层次结构和全局摘要
    • Graph Communities → Community Summaries
      • 原文概述
      • Leiden算法的社区层次
    • Community Summaries → Community Answers → Global Answer
      • 原文大意
  • 其他部分需要代码

论文地址

点我下载
翻译是谷歌翻译+人为纠正了一部分,有的地方感觉还是英文会好点。解释部分为个人理解以及对论文的一定补充,因为不是论文可能并不是针对大众的/

综述

该文章的主要内容和分析:

  1. 研究背景
    传统RAG是一种通过从外部知识库中检索相关信息来增强生成能力的技术,但它在处理针对整个文本语料库的全局问题时表现不佳。本文提出的 Graph RAG 方法旨在结合 RAG 的优点和图索引的结构化特性,以应对这些挑战。
  2. 方法概述
    Graph RAG 方法将文档集转化为一个知识图谱,并通过大语言模型(LLM)生成社区摘要。在用户提出问题时,系统通过摘要生成部分答案,并将这些答案汇总为最终的全局答案。这种方法特别适用于需要理解数据集全局主题的查询任务。
  3. 主要流程
    文档处理与图谱构建:首先,将文档分割成小块,提取其中的实体及其关系,生成图谱。
    社区检测与摘要生成:利用社区检测算法(如Leiden算法)对图谱进行分区,并生成每个社区的摘要。
    问题解答:通过并行处理生成各个社区的部分答案,并最终整合这些答案生成全局答案。
  4. 实验与评估
    该方法在两个不同的真实世界数据集上进行了评估,包括播客转录文本和新闻文章。实验表明,与传统的 RAG 方法相比,Graph RAG 在回答的全面性和多样性方面表现更好,尤其是在处理复杂的全局性问题时。
  5. 贡献与局限性
    Graph RAG 方法的一个显著优势是能够有效处理超出 LLM 上下文窗口大小的庞大数据集,同时生成多样且全面的答案。然而,文章也指出,这种方法在某些场景下可能并不总是优于直接的文本摘要方法,并且其效果在不同类型的数据集和查询上可能有所不同。

介绍部分核心翻译

翻译

人类在各个领域的成就依赖于我们阅读和推理大量文档的能力,这种能力通常能得出超越文本本身所陈述内容的结论。微软根据上图结论和自身的数据,做了下图的尝试。
在这里插入图片描述
Graph RAG 管道使用了由 LLM 生成的源文档文本的图索引。这个索引包含了节点(例如实体)、边(例如关系)和协变量(例如声明),这些元素通过针对数据集领域的 LLM 提示被检测、提取并总结出来。社区检测(例如 Leiden 算法,Traag 等,2019)被用来将图索引划分为若干元素组(节点、边、协变量),LLM 可以在索引时和查询时并行地总结这些元素组。对于给定查询的“全局答案”是通过对所有与该查询相关的社区摘要进行最终一轮的查询聚焦总结后生成的。

解释重要的信息

元素和实体的关系(包含和被包含,而非相等)

“元素”(elements)和“实体”(entities)是相关但不同的概念。具体来说:

  1. 实体(Entities)
    实体是图中的基本构建块,通常表示具体的对象或概念。比如,在文档中,实体可以是“人”、“地点”、“组织”等。实体在图中被表示为节点。
  2. 元素(Elements)
    元素是一个更广泛的概念,它包括了图中的实体(节点)、关系(边)以及协变量(如声明、描述等附加信息)。因此,实体是元素的一种,而元素还包含了与实体相关的其他信息。
    关系:
    实体 是 元素 的一种,所有的实体都是元素,但并不是所有的元素都是实体。
    在图索引中,实体通过它们之间的关系连接在一起,这些关系也是元素的一部分。
    协变量则是与这些实体和关系相关的附加信息,它们同样属于元素的范畴。
    总结来说,实体是图中具体的对象,而元素则包括了实体以及与实体相关的关系和其他附加信息。在Graph RAG方法中,LLM会提取这些元素,构建起整个图索引,以便后续的查询处理和答案生成。

Graph Index(图索引)

图索引 是通过将文档内容转换为图的形式来表示数据。图中的节点表示实体(如人物、地点等),边表示这些实体之间的关系,协变量(如声明)则是附加的上下文信息。这个图索引为后续的查询处理提供了结构化的数据基础。

Community Detection(社区检测)

社区检测是一种图分析技术,用于识别图中密切相关的节点群体。Graph RAG 使用社区检测算法(如 Leiden 算法)来将图索引划分为多个社区,每个社区包含紧密关联的元素。这种划分有助于在并行处理时更加高效地生成摘要和答案。

Query-Focused Summarization(查询聚焦的摘要)

查询聚焦的摘要 是指根据用户的具体查询,从相关的社区摘要中提取信息,并生成一个针对该查询的总结性回答。这一步骤是将多个社区的部分答案整合为一个全局答案的关键。

Global Answer(全局答案)

全局答案 是对给定查询的最终回答。它是在对所有相关社区的摘要进行查询聚焦的总结后生成的,目的是提供一个全面且有针对性的答案,涵盖与查询相关的所有重要信息。

Graph RAG 方法与流程核心翻译以及解释

Source Documents → Text Chunks

翻译

一个基本的设计决策是确定从源文档中提取的输入文本应被分割为多大粒度的文本块进行处理。在接下来的步骤中,这些文本块将被传递给一组用于提取图索引各种元素的大型语言模型(LLM)提示。较大的文本块需要较少的LLM调用来进行这种提取,但较长的LLM上下文窗口会导致召回率的下降(Kuratov等,2024;Liu等,2023)。这种现象可以在图2中观察到,图中展示了一个单轮提取(即无补充提取)的情况:在一个样本数据集(HotPotQA,Yang等,2018)上,使用600个token的文本块几乎提取了两倍于使用2400个token文本块的实体引用。尽管更多的引用通常更好,但任何提取过程都需要在召回率和精确度之间为目标活动找到平衡。

召回率与精确度的平衡

召回率(Recall) 指的是系统能够识别并提取到所有相关信息的能力。较高的召回率意味着系统提取到了更多的实体或信息。
精确度(Precision) 指的是系统提取到的内容中有多少是真正相关的,较高的精确度意味着提取结果中噪音较少。
在文本块的选择中,设计者需要在召回率和精确度之间找到一个平衡点:
大文本块可能导致高精度但低召回率,因为系统可能漏掉一些重要的信息。
小文本块可能提高召回率,但也有可能带来一些无关的信息,影响精确度。

Text Chunks → Element Instances

翻译

这一步的基本要求是识别并提取源文本块中的图节点和边的实例。我们使用一个多部分的LLM提示来完成此操作,首先识别文本中的所有实体,包括它们的名称、类型和描述,然后再识别所有显然相关的实体之间的关系,包括源实体和目标实体以及它们关系的描述。两种类型的元素实例都以分隔的元组列表形式输出。
根据文档语料库的领域特点调整这个提示的主要机会在于为LLM提供用于上下文学习的少量示例的选择(Brown等,2020)。例如,虽然我们默认的提示可以适用于广泛的“命名实体”类别(如人物、地点、组织),但具有专业知识的领域(例如科学、医学、法律)将受益于专门针对这些领域的少量示例。我们还支持一个次要的提取提示,用于提取我们希望与提取的节点实例关联的任何额外协变量。我们默认的协变量提示旨在提取与检测到的实体相关的声明,包括主语、宾语、类型、描述、源文本范围以及开始和结束日期。
为了平衡效率和质量的需求,我们使用了多轮“补充提取”(gleanings),最多达到指定的最大轮次,以鼓励LLM检测到在先前提取轮次中可能遗漏的额外实体。这是一个多阶段过程,首先我们要求LLM评估是否提取了所有实体,使用100的logit偏差强制其做出是/否决定。如果LLM响应说有实体被遗漏,那么继续提示“在上一次提取中遗漏了许多实体”,以鼓励LLM补充提取这些遗漏的实体。这种方法使我们能够在使用较大文本块的情况下不降低质量(如图2所示),也不会引入不必要的噪音。

重要信息解释

为什么需要“少量示例”(Few-shot Learning)?

少量示例学习:LLM的能力可以通过提供几个示例来提升。这些示例告诉模型我们具体想提取哪些信息。比如,如果我们处理的是法律文本,我们可以给LLM几个示例,告诉它如何识别法律条款和相关的法律关系。
领域适应:不同领域的文本往往有自己特定的术语和结构,因此在不同领域,提供一些有针对性的示例可以显著提高模型的提取准确性。

补充提取(Gleanings)

多轮提取:有时候,模型在第一次提取时可能会遗漏一些信息。为了尽量减少这种遗漏,我们会让模型多次扫描同一个文本块,每次尝试提取更多的信息。
补充提取的过程:每次提取后,模型会判断是否有遗漏,如果有,它会在下一轮中尝试“补充”那些遗漏的实体和关系。这种方法可以确保即使我们使用较大的文本块,也能保持较高的提取质量。

简单的示例(非官方仅为了理解)

测试环境:python3.10.14 windows 某大模型API 提示词为官方提供
假设文本:
“苹果公司的CEO是蒂姆·库克。他在2020年领导公司推出了多款新产品。”
那么经过这一步提取出来的就是:
在这里插入图片描述

Element Instances → Element Summaries

原文大意

使用大型语言模型(LLM)来“提取”源文本中表示的实体、关系和声明的描述,本身已经是一种抽象总结的形式,它依赖于LLM创建出独立且有意义的概念摘要,这些概念可能是隐含的而不是文本中明确表述的(例如隐含关系的存在)。要将所有这些实例级别的摘要转换为每个图元素(即实体节点、关系边和声明协变量)的单一描述性文本块,需要进一步对匹配的实例组进行LLM摘要。

在这一阶段,可能的担忧是,LLM可能不会始终以相同的文本格式提取对同一实体的引用,导致出现重复的实体元素,从而在实体图中生成重复的节点。然而,由于在接下来的步骤中,所有密切相关的实体“社区”将被检测和总结,并且鉴于LLM能够理解多种名称变体背后的共同实体,我们的方法能够应对这种变体,只要所有变体都足够密切地连接到一组相关实体。

总体来说,我们在潜在噪声较大的图结构中使用丰富的描述性文本来表示同质节点,这与LLM的能力以及全局、查询聚焦摘要的需求相一致。这些特性也使得我们的图索引区别于典型的知识图谱,后者依赖于简明一致的知识三元组(主语、谓语、宾语)来进行下游推理任务。

重要概念解释

抽象总结(前一步也有涉及)

在这个过程中,LLM实际上是在对这些信息进行抽象总结。这意味着它不仅仅是从文本中逐字逐句地复制信息,而是根据文本的整体含义生成一个简洁且有意义的描述。比如,文本中可能没有明确说出两个实体之间的关系,但LLM可以根据上下文推断出这种关系并生成相应的描述。

将多个实例总结为一个整体

在提取出这些信息后,我们希望将相同或类似的实例合并为一个整体的描述。比如,如果多次提到“苹果公司”和“库克”的关系,我们希望最终生成一个统一的描述来代表这个关系,而不是有很多重复的信息。

重复实体的问题以及解决方案、

在这个大标题的执行过程中,可能会遇到一个问题:同一个实体(比如“苹果公司”)可能会在不同的地方以不同的格式或名称出现(比如“Apple Inc.”、“苹果公司”、“Apple”),LLM可能会认为它们是不同的实体,导致生成了多个重复的实体节点。
解决方案:后续步骤中会使用一种称为社区检测的技术。这种技术可以识别并合并那些密切相关的实体和关系,即使它们的名称或描述略有不同。因为LLM有能力识别这些变体背后的共同点,所以我们的整体方法可以处理这些差异,并将它们合并为一个统一的实体。

Element Summaries → Graph Communities

原文大意

在前一步中创建的索引可以建模为一个同质的无向加权图,其中实体节点通过关系边相连,边的权重表示检测到的关系实例的标准化计数。给定这样一个图,可以使用各种社区检测算法将图划分为社区,这些社区中的节点彼此之间的连接比与图中其他节点的连接更强(例如,参见Fortunato, 2010 和 Jin et al., 2021 的综述)。在我们的流程中,我们使用Leiden算法(Traag等,2019),因为它能够高效地恢复大规模图的层次社区结构(见图3)。这个层次结构的每个级别都提供了一个社区划分,这些划分覆盖了图中的所有节点,且相互排斥并集体穷尽,使得能够通过分而治之的方法进行全局摘要。

重要概念解释

创建的图索引

在前一步中,我们通过提取文本中的实体(如人、地点、公司等)和它们之间的关系,构建了一个图。这张图的结构可以表示为一个同质的无向加权图。
同质(Homogeneous):这意味着图中的所有节点(实体)和边(关系)都是相同类型的。换句话说,所有节点都是“实体”,所有边都是“关系”。
无向(Undirected):无向图意味着节点之间的连接(边)没有方向性,表示关系是双向的。例如,A和B之间的关系在无向图中表示为A-B,而不是A→B或B→A。
加权(Weighted):加权图中的边具有一个数值权重。在这里,边的权重表示检测到的关系实例的标准化计数(normalized counts)。也就是说,某个关系出现的次数越多,权重就越高。

为什么使用社区检测?

1.社区检测可以帮助我们将复杂的图划分为多个较小的部分,这样做有几个好处:
简化处理:通过将图划分为社区,我们可以分而治之,分别处理每个社区的信息,从而简化处理流程。
提高准确性:社区中的节点关系密切,因此在生成摘要或处理信息时,可以集中关注每个社区内部的关系,提高信息处理的准确性。
2.解决之前说的重复实体的问题

层次结构和全局摘要

Leiden算法生成的层次结构提供了图的多层次划分。每个层次都对图中的所有节点进行划分,这些划分是相互排斥且集体穷尽的,即每个节点只属于一个社区,且所有节点都被划分在某个社区中。
这种层次化的社区结构使得我们可以使用分而治之的策略来进行全局摘要。也就是说,我们可以先在较小的社区中生成摘要,然后逐步汇总这些社区的摘要,最终生成整个图的全局摘要

Graph Communities → Community Summaries

原文概述

社区摘要的目的:生成的社区摘要帮助用户理解数据集的全局结构和语义,即使在没有具体查询的情况下,这些摘要也有助于理解数据集。用户可以通过浏览不同层次的社区摘要,了解整体主题,并深入到更详细的子主题。
摘要生成方法:摘要生成分为不同层次,包括根社区(最高层次)和叶社区(最低层次)。在叶社区中,系统优先考虑重要的节点和边,逐步将它们加入到模型的上下文窗口中,直到达到上下文窗口的限制。在更高层次的社区中,如果所有元素摘要都能适应上下文窗口,则直接生成总结;如果不能,则通过替换较长的摘要来确保摘要适应上下文窗口。
总结的应用:这些社区摘要在图形索引中作为回答全局查询的关键部分,通过分层次的摘要帮助系统有效地处理和回答复杂的查询。

Leiden算法的社区层次

Leiden算法生成的社区是分层次的,通常有多个层次:
根社区(Root communities):这些是图中最顶层的社区,包含了较大的主题或群体。我们称之为层次0。
叶社区(Leaf-level communities):这些是最低层次的社区,包含了最具体的子群体或主题。我们称之为层次1及以下。

Community Summaries → Community Answers → Global Answer

原文大意

首先,我们把之前生成的社区摘要随机打乱,并将它们分成预先规定大小的“小块”。这样做是为了确保信息均匀分布在这些块中,避免所有重要信息集中在一个地方,导致在处理时可能会被忽略。
生成中间答案:
然后,我们会让LLM(大型语言模型)根据每个小块生成一个中间答案。这是一个并行处理的过程,也就是说,每个小块会同时被处理。
每个生成的答案都会得到一个0到100分的分数,这个分数表示这个答案对回答用户问题的帮助程度。分数为0的答案会被过滤掉,因为它们对回答问题没有帮助。
合成最终答案:
最后,我们会根据这些中间答案的帮助程度(分数)来排序,从最有帮助的答案开始,把它们逐个放入一个新的上下文窗口,直到达到token(即字数或词数)的限制。
这个新窗口中的内容就是我们为用户生成的最终答案,并会把它返回给用户

其他部分需要代码

后续对大家有帮助的话,会手撕代码。


http://www.ppmy.cn/news/1517080.html

相关文章

Android studio 升级问题记录-个性化配置迁移

前言 在本次折腾Android studio更新的过程中,遇到了很多问题,包括: 选择直接覆盖更新的话,会发现样式还是老样式旧项目运行不通过,并且会生成一些异常的build无法再支持代码自动补全功能本地没commit的代码丢失&…

【经验】linux下cuda的更换

linux下cuda的更换 查看当前cuda和cudnn的版本 nvcc -Vcudnn版本 cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2下载对应版本的cuda 查看驱动版本535.54.03 下载对应的cuda版本 版本查看https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.htm…

pytest参数化多种用法总结

pytest.mark.parametrize 是 pytest 的一个核心功能,它允许你参数化测试函数,这样你就可以使用不同的参数运行同一个测试函数多次。以下是 pytest.mark.parametrize 的详细用法总结: 基本用法 parametrize 装饰器可以接受一个或多个参数名&…

驱动:mknod-misc 杂项自动

一、杂项设备驱动 #include <linux/init.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/module.h> #include <linux/device.h> #include <asm/io.h> #include <asm/string.h> #include <asm/uaccess.h>…

TinaSDKV2.0 自定义系统开发

TinaSDKV2.0 自定义系统开发 什么是自定义系统&#xff1f; TinaSDK Kconfig界面配置 Tina Linux采用 Kconfig 机制对 SDK 和内核进行配置。 Kconfig 是一种固定格式的配置文件。Linux 编译环境中的 menuconfig 程序可以识别这种格式的配置文件&#xff0c;并提取出有效信息…

电脑丢失dll文件一键修复之dll确实损坏影响电脑运行

在使用电脑过程中&#xff0c;DLL文件丢失或损坏是一个常见的问题&#xff0c;它可能导致程序无法正常运行&#xff0c;甚至影响整个系统的稳定性。本文将详细介绍如何一键修复丢失的DLL文件&#xff0c;探讨常见的DLL丢失报错原因&#xff0c;并提供详细的修复步骤和预防措施。…

【mysql】mysql之数据操作语言(insert、delete、update)

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

《机器学习》—— OpenCV 对图片的各种操作(均值、方框、高斯、中值滤波处理)

文章目录 1、对有椒盐噪声的图片进行均值、方框、高斯、中值滤波处理2、给图像边缘增加边框3、对图片进行阈值化操作 1、对有椒盐噪声的图片进行均值、方框、高斯、中值滤波处理 均值滤波 cv2.blur是 OpenCV 库中的一个函数&#xff0c;用于对图像进行均值模糊处理。这个函数通…

幂等性简介

幂等性&#xff08;Idempotence&#xff09;是计算机科学中的一个重要概念&#xff0c;特别是在分布式系统和网络服务中。幂等性操作的特点是&#xff0c;无论执行多少次&#xff0c;结果都是相同的。换句话说&#xff0c;幂等性操作在多次执行后&#xff0c;对系统的状态不会产…

pycharm中opencv-python和opencv-contrib安装

1.去到https://pypi.org/中查找opencv-python 和opencv-contrib-python 2.分别下载。 3.下载完后&#xff0c;打开pycharm&#xff0c;然后新建一个项目&#xff0c;设置项目配置环境为当前python环境&#xff0c; 4.打开pycharm提供的控制台&#xff0c;使用pip install 安装文…

Datawhale第五期夏令营-CV竞赛

CV竞赛 0.赛事报名租用4090 1.开始运行下载文件提交结果 2.内容解释赛题背景赛题目标社会价值评分规则baseline精读代码什么是YOLO 主要代码内容精读使用Ultraalytics运行代码 0.赛事报名 赛事官网:https://www.marsbigdata.com/competition/details?id3839107548872 租用40…

密码强度验证——js基础积累

//密码强度等级 getPwdLevel:function (pwd,minLength8) {var level 0;if (pwd.length < minLength) return level;if (/\d/.test(pwd)) level; //数字if (/[a-z]/.test(pwd)) level; //小写if (/[A-Z]/.test(pwd)) level; //大写if (/\W/.test(pwd)) level; //特殊字符ret…

第四章:照相机模型与增强现实

目录 1 针孔照相机模型 1.1 照相机矩阵 1.2 三维点的投影 1.3 照相机矩阵的分解 1.4 计算照相机中心 2 照相机标定 3 以平面和标记物进行姿态估计 4 增强现实 4.1 PyGame和PyOpenGL 4.2 从照相机矩阵到OpenGL格式 4.3 在图像中放置物体 1 针孔照相机模型 针孔照相机…

MYSQL集群技术

---------------第一部分---------------------- 一.mysql源码部署 环境&#xff1a;rhel7.9 1.1.下载安装包 官网&#xff1a;http://www.mysql.com 1.2.在linux下部署mysql 1.创建登录用户和数据目录&#xff0c;并给数据目录赋权&#xff0c;因为配置文件读取需要权限&…

WPF中如何根据数据类型使用不同的数据模板

我们在将一个数据集合绑定到列表控件时&#xff0c;有时候想根据不同的数据类型&#xff0c;显示为不同的效果。 例如将一个文件夹集合绑定到ListBox时&#xff0c;系统文件夹和普通文件夹分别显示为不同的效果&#xff0c;就可以使用模板选择器功能。 WPF提供了一个模板选择…

机器学习-训练集、验证集、测试集(附:分割方法+交叉验证)【随记】

训练集、验证集、测试集&#xff08;附&#xff1a;分割方法交叉验证&#xff09; 1. 训练集&#xff08;Training Set&#xff09; 2. 验证集&#xff08;Validation Set&#xff09; 3. 测试集&#xff08;Test Set&#xff09; 4. 数据集的分割方法 5. 交叉验证&#x…

2024.8.15(python管理mysql、Mycat实现读写分离)

一、python管理mysql 1、搭建主mysql [rootmysql57 ~]# tar -xf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz [rootmysql57 ~]# cp -r mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql [rootmysql57 ~]# rm -rf /etc/my.cnf [rootmysql57 ~]# mkdir /usr/local/mysql…

pdf与canvas结合使用的场景1——为pdf增加水印

title: pdf与canvas结合使用的场景 date: 2024-08-28 10:03:45 tags: javascript 场景1:生成新的pdf水印 添加水印场景分析 这种情况下&#xff0c;不用再次封装好的一些水印工具的话&#xff0c;纯vue3前端的话就是使用pdfjscanvas来生成。 思路&#xff1a;1.上传并读取p…

《第二十八章:性能优化 - 电量优化》

一、引言 在 Android 应用开发中&#xff0c;电量优化是提升用户体验、延长设备续航的重要环节。一个电量消耗过高的应用可能会导致用户不满&#xff0c;甚至卸载。在这一章中&#xff0c;我们将重点探讨如何通过合理使用传感器和优化网络请求来降低应用的电量消耗。 二、合理使…

Tower for Mac Git客户端管理软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试1、打开软件&#xff0c;测试2、克隆项目&#xff0c;测试 安装完成&#xf…