用「明道云+ChatGPT+Weaviate」挑战零代码1小时实现ChatPDF

news2024/12/26 2:50:08

ChatGPT流行起来之后,快速的出现了一批基于ChatGPT的工具应用,ChatPDF就是其中比较受欢迎的一款。它是一个可以让你与PDF文件进行对话的工具,既可以帮助你快速提取PDF文件中的信息,例如手册、论文、合同、书籍等;也可以根据你的问题,在PDF文件中寻找相关的段落,并用自然语言回答你。
ChatPDF

今天,我们就用明道云+ChatGPT+Weaviate实战一下,1个小时内来实现类似的功能。

需求梳理

我们先描述一下最终效果:
在这里插入图片描述

对这个效果稍加分析,不难看出,需求涉及了两个处理阶段:

1.将用户上传的PDF文件按页码进行拆分,并标注每一页的页码和内容详情;

2.确保ChatGPT可以在用户提问时引用到这些PDF文件的内容,并在文件内容范围内给出回答和引用位置;

其中第1点比较容易,我们可以使用能处理PDF文件的Python库或者JS库在代码块中实现,或者用一些现成的OCR接口来实现。在这个例子里,我们将使用「百度智能云」的办公文档识别API来处理PDF文件内容的分页文字提取 [1]。这个过程可以直接使用明道云「集成中心」中预封装的连接,零代码就能实现,然后用工作表将文字识别的结果存起来。

而对于第2点,对初次接触ChatGPT开发的朋友来说,有点难度。不过我们可以将问题进行如下分解,并逐个解决:

1.怎么让ChatGPT在指定的文本内容范围内回答问题?
2.想要指定范围的文本内容超级大,远远超过了ChatGPT的token数量限制,怎么办?
3.如何在ChatGPT的回答里附加上被引用的PDF文件名称和页码?
4.向ChatGPT提问的内容超出了指定的文本内容范围,如何返回类似「未找到答案」这样固定格式的回复?

解决了这些问题,这个需求自然也就没有任何障碍了。接下来我们来看看从实现原理上,如何让ChatGPT基于我们的PDF个人知识库来回答问题,突破以上限制。

技术原理

1.怎么让ChatGPT在指定的文本内容范围内回答问题?

要实现这个功能,重点在于编写和改造合适的 prompt 后再向ChatGPT提问。例如大家听说过的「角色扮演法」,让ChatGPT扮演一个角色,基于prompt中给定的上下文背景再作答。其实,更激进一点,让它只能在给定的文本内抽取答案,这个功能就实现了。比如下面的例子:

在这里插入图片描述

chatGPT 在上下文中回复

这里使用了一个 prompt 模板,代入上下文(context)和问题(question),ChatGPT将基于上下文来进行回复:

You are a useful assistant for provide professional customer question answering. You can refer to the context to respond to user questions. Must reply using the language used in the user's question. 
Context: {context}
Question: {question}

我们可以用一个简单的流程图来表示这种组合方式:
在这里插入图片描述

如果问题在上下文里没有找到答案,ChatGPT也会进行简单的「拒绝性」回复:

在这里插入图片描述

chatGPT 上下文中未找到答案时的回复

看得出来,ChatGPT即使没有找到答案,也会进行很人性化的回复。如果只是和用户进行聊天式的对话,这样也够用了。但是如果想在上下文中没有找到答案时进行下一步操作,例如调用搜索引擎或者将问题标注为「答案缺失」,这样的回答还无法满足我们的需求。关于这个问题,我们将在后面解决它。

这只是一个简单的prompt模板示例,我们还可以不断地对 prompt 进行修改和调整,并多次测试,直到ChatGPT的回复可以满足我们的需求为止。

2.想要指定范围的文本内容超级大,远远超过了ChatGPT的token数量限制,怎么办?

解决了上一个问题,我们似乎找到了让ChatGPT在PDF文件内容范围内回答问题的方法。那么,是不是我们将整个PDF文件的内容作为 context 传给ChatGPT,就能让它基于PDF文件来回复我们的问题了?

是的,就像你知道的那样,答案是不太行。原因在于我们使用ChatGPT提供的API接口时,有严格的token数量限制(token数量是ChatGPT按请求内容字数计费的标准,通常来说,一个英文单词计为1个token,而一个中文字符大约计为1个token [2],感觉略坑吧,这也是建议大家尽量使用英文的原因之一):我们常用的 GPT-3.5 接口,请求时最大支持4096个token,这包括了提问和回答的所有字符;就算是价格贵几十倍的GPT-4,最大支持也不过3万2千个token。

因此,我们需要一种既能减少context的文字数量,又让它包含尽量准确的上下文信息的方法。这种方法就是「文本相似性搜索」。

文本相似性搜索基于两个技术:文本嵌入(Text Embedding)和余弦相似度(Cosine Similarity)搜索。

简单来说,就是用文本嵌入技术将自然语言转换成一个高维度空间的数值向量(Vector),这个转换的结果是通过大量的神经网络模型训练来获得的,可以保留文本转成向量后的语义关系 [3] 。也就是说,意思越相近的两个词,它们在向量空间里的位置就越接近,而且它还是兼容多种语言的。比如,世界上所有语言的「你好」,转换成向量后,它们的数值几乎是相等的。

最后,把要搜索的文本转成向量后使用余弦相似度搜索向量数据库(Vector Database),就可以得到按语义相似度排序之后的结果——这个结果通常有两个指标:距离(Distance)和相似确定性(Similar Certainty),它们的值都在0-1之间,越相似的结果,距离值越小、相似确定性值越大。有也一些数据库搜索结果中直接给出了一个相似度评分(Score),意思也都差不多。

我们把PDF文件按页拆分后,就可以用文本相似性搜索先搜索到和提问的语义最接近的那一页,然后只把那一页的文本作为context组合到prompt里传给ChatGPT,这样就能达到我们想要的效果了。

加上这个过程后,把上面的流程图稍加改造表示一下新的流程:
在这里插入图片描述

其中的向量数据库有很多种选择,本示例里使用的是 Weaviate(Cloud 版本),因为它不仅内置了OpenAI 的文本嵌入 (Text Embedding) 接口可以在用户无感知的情况下执行文本转向量,还提供了非常完善的REST API。明道云集成中心里也已经预置了Weaviate的API,可以零代码直接使用。

3.如何在ChatGPT的回答里附加上被引用的PDF文件名称和页码?

要在答案里附加上PDF的信息,有两种方法:

第一种是把PDF文件名称和页码,都组合到prompt里面,并修改prompt让ChatGPT在回复时给出文件和页码信息;
第二种就是我们在组合prompt前就把向量数据库里返回的排名最高的PDF文件和页码拿到,直接组合到最终输出给用户的答案中。

ChatPDF使用的是第一种,在这个例子里,我们采用第二种,流程图修改如下:
在这里插入图片描述

4.向ChatGPT提问的内容超出了指定的文本内容范围,如何返回类似「未找到答案」这样固定格式的回复?

刚才我们说过了,即便不特别处理,在prompt的约束下,ChatGPT也不会胡乱给一个答案凑数,尤其是在请求时 temperature 参数设置为 0 的时候(该参数用于调节ChatGPT输出结果的确定性,值在0-2之间,值越大结果越随机也越有创意) [4]。 但如果要想一个格式化的答案,我们则要另想办法。

在上面从向量数据库进行相似性搜索的时候,我们已经知道搜索的结果会按照相似度进行排序,并且会给出搜索结果的相似确定性值。那么,我们就可以为相似确定性设置一个阈值,大于这个值的结果,我们认为它符合我们对相似度的定义,其结果可以被用作上下文组合到prompt里;而小于这个值的结果,我们认为它的相似度还不够,即便把它作为上下文组合到prompt里,用户也可能得到风马牛不相及的答案。

按这个规则,如果没有搜索到符合相似度的结果,那我们就不用再向ChatGPT提问了,直接向用户返回「未找到答案」即可。当然,这个阈值要经过多次测试,找到一个平衡点。在这个例子里,我们假设90%相似的结果才有用,所以把这个阈值设为 0.9,所有相似度搜索结果的相似确定性值小于0.9的,我们就认为它的相似度不够,找不到答案。

我们最终的流程图修改如下:
在这里插入图片描述

实现过程

一、工具准备

明道云专业版账号或私有部署版(https://mingdao.com 免费注册体验14天专业版,私有部署版需要能访问公网及OpenAI接口)
百度智能云开发者账号(https://cloud.baidu.com/ 实名认证后可申请文字识别免费次数)
Weaviate Cloud 账号或安装本地版(https://weaviate.io/ 免费注册体验14天,本地部署需要有公网地址且可以访问OpenAI接口)
OpenAI API Key(https://platform.openai.com/account/api-keys 需要使用 embedding接口)
二、PDF文档处理
在这里插入图片描述

我们先在明道云里实现上传PDF文件后将文档分页识别,把文字识别结果存储到工作表内,并将内容转换成向量存储到向量数据库。这里的实现思路分成以下几个步骤:

  1. 用户上传PDF文件到明道云工作表;
  2. 上传完成后自动触发工作流,调用百度文档识别API逐页识别文字;
  3. 所有页码处理完成后,自动将所有页面的内容批量上传至向量数据库Weaviate(需要先创建集合,上传内容时Weaviate会自动调用OpenAI的Embedding接口执行文本转向量);
  4. 当工作表里的文字内容有变动时,自动同步到向量数据库;
  5. 当工作表里的PDF文档被删除或者某一页的内容被删除时,自动删除向量数据库里对应的内容;

2.1 创建向量数据库集合

要完成文本相似性搜索,我们必须要先把文本转成向量存储到向量数据库,然后再用文本的向量进行搜索。注册好 Weaviate Cloud Services 账号,创建一个免费的沙盒环境 [5]。创建完成后,会自动生成 Cluster URL,这个地址我们等一下会用到;如果创建时开启了认证(Authentication),则需要把认证信息中的Admin API Key也复制下来(下图中的钥匙图标处)。

在这里插入图片描述

创建好的 Weaviate Cluster

接下来在明道云创建一个应用,在集成中心里搜索 Weaviate,安装连接后填写好上一步获得的 API Key 和 Cluster URL,并授权到刚刚创建的应用。还需要在连接参数里配置好 OpenAI 的 API Key,上传数据到向量数据库时会用到。
在这里插入图片描述

在明道云集成中心安装 Weaviate

明道云把Weaviate的API做了比较深度的封装,提供了一个「创建简单集合」的API,只需要传入集合名称和说明,就可以创建一个有「标题」、「内容」、「URL」、「拥有者」四个字段的集合,其中的「标题」和「内容」参与向量搜索,「URL」和「拥有者」仅做为数据存储。在使用「用向量搜索相似数据」API时,将严格按照传入的「拥有者」参数进行筛选,用于用户数据隔离。

我们在明道云里创建一个管理集合的工作表,并建立新增和删除工作表时自动触发工作流,创建和删除Weaviate上的集合。
在这里插入图片描述

工作表:模型向量集合

为了便于扩展,这里设计的是一个通用的模型集合。ChatPDF只是其中的一个模型,我们把prompt模板、搜索结果数量限制和相似确定性限制都参数化,便于以后我们用于其它业务场景。由于集合创建后不能修改,所以我们需要为工作表设置「业务规则」,限制集合创建后,不能修改名称和说明。

在这里插入图片描述

业务规则

这里的自动化工作流内容比较简单,里面只有「调用已集成API」节点,向Weaviate发起对应的请求。

在这里插入图片描述

自动化工作流:自动创建和删除Weaviate集合

创建完成后,向工作表添加一条数据,Weaviate上也会新增一个集合。
在这里插入图片描述

创建好的集合

2.2 识别PDF文档

我们在明道云里创建两张工作表用于存放文档资料:「主文档」、「文档内容明细」。其中,「文档内容明细」是「主文档」的子表,前者存放的内容与向量数据库中存放的内容是一一对应的,所以它的结构也是按照向量数据库的字段结构来设计的;后者主要用于存放用户上传的PDF文档。

在这里插入图片描述

工作表:主文档(主表)
在这里插入图片描述

工作表:文档内容明细(子表)

主表关联了「模型向量集合」表,子表用文本存储集合名称,它们的默认值都设置为刚刚创建的「ChatPDF」集合。然后我们需要为这两张工作表添加自动化工作流,在用户上传文件后自动完成文字识别和上传到Weaviate的动作。

在开始搭建工作流之前,还需要在「集成中心」里安装「百度云办公文档识别」的API,并在连接里配置好百度云的 API Key 和 Secret Key等信息。

在这里插入图片描述

在集成中心安装PDF识别API

在处理PDF文字识别的工作流中,有一个循环调用文字识别接口处理PDF文档每个页面识别结果的过程,由于文字识别接口有并发请求量的限制,我们可以在工作流里添加「逐条执行」的「子流程」或者「封装业务流程」来实现,为了复用性,我们这里采用了「封装业务流程」——它就像一个自定义封装的「函数(Function)」,没有固定的触发器,只有输入和输出参数,可以在任意位置被其他工作流调用 [6]。
在这里插入图片描述

使用封装业务流程处理分页文字识别
在所有页面的文字识别完成后,我们会调用Weaviate的批量上传API一次性把所有结果都上传到向量数据库(必须配置好 OpenAI API Key)。接着还要处理一下更新和删除的逻辑,当手动更新和删除文档内容明细的数据时,要及时的同步到向量数据库中。

在这里插入图片描述

完成PDF识别步骤后的自动化工作流
至此,PDF文档的处理步骤就完成了。用户上传PDF文件后,会自动完成分页、识别和上传动作。

在这里插入图片描述

PDF文档处理完成示例
在这里插入图片描述

Weaviate 控制台查询结果

三、向ChatGPT提问

在开发基于 ChatGPT 的问答应用时,最容易被用户接受的还是对话式的聊天UI。所以用明道云实现ChatPDF,可以直接基于它的内置 IM 工具来做。我用明道云做个人知识库时,就是基于这个IM做了一个「AI小助手」,也集成了今天讲的这个模仿ChatPDF模型进来,效果还是很不错的:
在这里插入图片描述

把 chatGPT AI 助手集成到明道云 IM

不过今天只是实现一个在1小时可以零代码完成的小Demo,我们就不用集成到IM里了,不然这篇文章可能1万字收不住了,我们直接用工作表来实现简单的提问效果。如果想和我一样集成到IM聊天工具中,可以自行研究一下明道云开放平台中关于处理聊天消息的一些API接口 [7]。当然,同样的思路集成在钉钉或者企业微信的机器人上也是可以的。

3.1 组合prompt

在这里插入图片描述

组合ChatPDF可用的prompt,是我们这个流程的核心部分。我们先设计一个工作表用来存放用户的问题和AI的回复,并用工作流实现自动生成对应prompt。

在这里插入图片描述

工作表:提问 & 回答
在创建工作流之前,还要去集成中心安装一下「ChatGPT」的API,因为我们要用到其中的文本嵌入接口把问题转成向量,进而用它去向量数据库中搜索语义最相似的页面内容,最后还要用它的chat接口进行提问。我们选择封装好的「一问一答」和「生成文本嵌入向量」API进行安装。
在这里插入图片描述

到集成中心安装 ChatGPT API
这一部分的工作流其实也很简单,触发器设置为当工作表在新增或者更新时,如果「问题」字段有值则自动执行。流程中需要调用不同的集成API,再根据返回结果执行不同的分支。我这里为了记录下每个步骤的结果,多加了一些把请求结果更新到工作表存储起来的步骤,应用搭建好了之后它们都是可以删除的。

在这里插入图片描述

自动化工作流:生成 Prompt

你可以往工作表添加问题进行测试了,正常情况下,如果有答案,它会生成Prompt,没有答案时会生成未找到答案的回复信息。

3.2 请求 ChatGPT 并组合回复结果
在这里插入图片描述

1个小时所剩无多,马上就到了要验收我们成果的时候了。这个步骤只需要在上一个工作流的有搜索结果分支内加上一个向ChatGPT的请求,然后在拿到AI回复的返回值后把PDF信息拼接进去就OK啦。

在这里插入图片描述

对于知识库的问答,通常采样温度 (temperature) 设置为0会得到更准确的回复
在这里插入图片描述

组合最终回复并更新到记录中

好了,当我们再次在工作表新建一条记录,提出问题后,稍等工作流运行完毕,就可以得到我们想要的答案了。你也可以将提问和回答的过程傅「封装业务流程」实现,再将这个流程开放为API,这样你在明道云平台之外,也可以使用这个能力了。下面是在记录详情中展示的最终效果:

在这里插入图片描述

用工作表展示 ChatPDF 提问效果

写在最后

我们虽然用明道云快速地搭建了一个ChatPDF,但我相信你也看出来了,我们从头至尾设计的都是一个通用框架,而 PDF文档的分析只是它的其中一个应用场景。掌握了原理了之后,你可以在这个应用里放心的玩你感兴趣的其他基于自身业务内容的场景,测试和调整你的prompt模板,做出令人惊艳的成果。在这个例子里,你可以尝试一次性取2到3页的相关PDF,再提交给ChatGPT寻求答案,做出升级版的ChatPDF;你也可以尝试将采样温度(temperature)也作为模型的一个配置项……自己动手试试?

另外,上面这个Demo应用,已经上架到了明道云应用库,你可以直接在应用库搜索「ChatPDF」安装或下载使用 [8]。有关于这篇文章的的任何问题,也欢迎留言探讨。

引用

[1] 百度智能云「办公文档文字识别」:https://cloud.baidu.com/doc/OCR/s/ykg9c09ji
[2] ChatGPT Tokenizer (token计算器):https://platform.openai.com/tokenizer
[3] Sentiment Classification using Document Embeddings trained with Cosine Similarity :https://aclanthology.org/P19-2057.pdf
[4] ChatGPT API:https://platform.openai.com/docs/api-reference/chat/create
[5] Weaviate 控制台:https://console.weaviate.cloud
[6] 明道云封装业务流程介绍:https://help.mingdao.com/zh/flow_pbp.html
[7] 明道云开放平台文档:https://open.mingdao.com/document
[8] 明道云应用库-ChatPDF主页:https://mingdao.com/library/det

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

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

相关文章

【计算机视觉】最后显示的CIFAR-100数据集照片很模糊怎么解决?

文章目录 一、前言二、如何解决2.1 使用图像增强技术2.2 使用插值方法2.3 使用更高分辨率的图像数据集2.4 手动调整图像尺寸 三、总结 一、前言 如果从CIFAR-100数据集加载的图像显示模糊,可能有几个可能的原因: 分辨率较低:CIFAR-100数据集…

全力押注预制菜,叮咚买菜或错失即时零售红利

实际上,叮咚买菜相比于美团、京东更适合抢分即时零售的市场红利。 目前美团进入即时零售的逻辑是,拥有几百万骑手的履约软硬件可以复用,同时从外卖场景延伸到其他消费场景比较丝滑,从平台几千万用户的温饱满足,延展到多…

计算机网络实验(ensp)-实验10:三层交换机实现VLAN间路由

目录 实验报告: 实验操作 1.建立网络拓扑图并开启设备 2.配置主机 1.打开PC机 配置IP地址和子网掩码 2.配置完成后点击“应用”退出 3.重复步骤1和2配置每台PC 3.配置交换机VLAN 1.点开交换机 2.输入命名:sys 从用户视图切换到系统视图…

网络工程师精选习题详解(一)

请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 1.在IPv4地址192.168.2.0/24中,表示主机的二进制位数是( )位。 A.8 B.16 C.24 D.32 答案:A /24示网络…

面对职业焦虑,我们能做些什么?

目录 大环境分析:AI 发展汹涌而上温水煮青蛙:那些“被替代”的“我们”码农分类:程序员都在做些什么码农黑暗季:失业潮原因分析程序员短期真的可替代吗?AI 发展来势汹汹,如何顺势而为最后:纵观全…

SpringBoot整合Swagger2,让接口文档管理变得更简单

在软件开发的过程中,接口文档的编写往往是一个非常重要的环节,因为它是前端和后端沟通的桥梁,帮助团队更好地协作。然而,手动编写接口文档不仅耗费时间,还容易出错,因此我们需要一种简单的方法来管理接口文…

宝武中南钢铁借助飞桨让钢筋超限监控有了“火眼金睛”

现代钢铁工业生产过程是一个复杂而庞大的生产体系,涵盖数百道工序。 在70多年的发展历程中,炼钢、轧钢、连铸以及节能减排等各项技术不断进化,无一不印证了中国钢铁在技术创新之路上获得的持续性突破。如今,宝武中南钢铁&#xff…

Java websocket 使用

简介 WebSocket 是一种基于 TCP 协议的全双工通信协议,可以在浏览器和服务器之间建立实时、双向的数据通信。在 Java 中,我们可以使用 Java API for WebSocket(JSR 356)来实现 WebSocket。 WebSocket 的作用是在 Web 应用程序中…

基于html+css的图展示77

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Charles安装及抓取APP接口

一、Charles使用 Charles是一款代理服务器,通过过将自己设置成系统(电脑或者浏览器)的网络访问代理服务器,然后截取请求和请求结果达到分析抓包的目的。该软件是用Java写的,能够在Windows,Mac,…

STM32F4_DAC数模转换

目录 1. DAC简介 2. DAC框图 3. DAC功能介绍 3.1 DAC通道使能 3.2 DAC输出缓冲器使能 3.3 DAC数据格式 3.4 DAC转换 3.5 DAC输出电压 3.6 DAC触发选择 3.7 DMA请求 3.8 生成噪声 3.9 生成三角波 4. 相关寄存器 4.1 DAC控制寄存器:DAC_CR 4.2 DAC1通道…

1-《java基础》

1-《java基础》 一.java基本数据类型和引用类型1.基本数据类型:2.引用数据类型3.基本数据类型和引用数据类型区别3.1 存储位置3.2 传递方式 4.自动装箱,自动拆箱 二.equals和的区别三.static1.static关键字的用途2.static方法3.static变量4.static代码块…

Unity中级客户端开发工程师的进阶之路

上期UWA技能成长系统之《Unity高级客户端开发工程师的进阶之路》得到了很多Unity开发者的肯定。通过系统的学习,可以掌握游戏性能瓶颈定位的方法和常见的CPU、GPU、内存相关的性能优化方法。 UWA技能成长系统是UWA根据学员的职业发展目标,提供技能学习的…

加密解密软件VMProtect教程(六):主窗口之控制面板“项目”部分(3)

VMProtect 是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic(本机)、Virtual Pascal和XCode编译器。 同时,VMProtect有一个内置的反汇编程序,可以与Windows和Mac OS X可执行文件一起…

wpf字符串格式化来实现空格占位 对齐问题Arial字符宽度不一致ChitGPT真牛

console是正常的。xml界面不正常,对不齐。 可能的原因各字符宽度不一致导致的。换个字体试试。黑体就正常。默认的Arial就不对。 在 C# 中,可以使用字符串格式化来实现空格占位。具体的做法是在格式字符串中使用占位符 {n},其中 n 表示要占用…

一单一结,靠Python爬虫赚外快,在家就能做

今年以来我们听到了太多负面声音,“互联网寒冬”“裁员”“优化”“失业”,同时也听到了许多朋友迷茫的声音: 面对未来的焦虑:未来我应该往哪方面发展? 面对裁员的迷茫:被裁,下一份工作如何选…

Playwright系列:第11章 CI/CD集成(Jenkins/Gitlab)

下方查看历史精选文章 重磅发布 - 自动化框架基础指南pdfv1.1大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 CI/CD即持续集成/持续交付,是软件开发的一…

UDP通信相关

Linux网络编程-UDP单播服务客户端代码实现 1、服务端 只接收一个字符串 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #…

部署问题集合(十四)VMware复制完整的虚拟机

前言&#xff1a; 由于原先的服务器内存和磁盘空间都不太够&#xff0c;所以需要将其中的程序部署到新的服务器上但部署过程总因为各种奇奇怪怪的问题报错&#xff0c;所以干脆想着将整个虚拟机都复制到新的服务器上&#xff0c;这样需要改动的东西最少&#xff0c;仅需要处理…

黄金圈法则/思维

黄金圈法则/思维 美国作家西蒙.斯涅克因&#xff08;国际知名广告、营销专家&#xff09;在TED演讲中提出黄金圈法则而一举扬名。 模型介绍 黄金圈法则的核心思想是&#xff1a;在沟通表达的时候&#xff0c;按照一个特定的结构why->how->what进行表达。它本质也是一种思…