ChatGPT 和 Elasticsearch:OpenAI 遇见私有数据(一)

news2024/11/22 23:57:36

作者:Jeff Vestal

结合 Elasticsearch 的搜索相关性和 OpenAI 的 ChatGPT 的问答功能来查询你的数据。 在此博客中,你将了解如何使用 Elasticsearch 将 ChatGPT 连接到专有数据存储,并为你的数据构建问答功能。

ChatGPT 和 Elasticsearch:OpenAI 遇见私有数据

详细的操作步骤,请阅读文章 “ChatGPT 和 Elasticsearch:OpenAI 遇见私有数据(二)”。

什么是聊天 GPT?

近几个月来,人们对 ChatGPT 充满了热情,这是一种由 OpenAI 创建的开创性人工智能模型。 但 ChatGPT 到底是什么?

基于强大的 GPT 架构,ChatGPT 旨在理解文本输入并生成类似人类的响应。 GPT 代表 “Generative Pre-trained Transformer”。 Transformer 是一种顶尖模型架构,彻底改变了自然语言处理 (NLP) 领域。这些模型在海量数据上进行了预训练,能够理解上下文、生成相关响应,甚至进行对话 . 要详细了解 Transformer 模型的历史和 Elastic Stack 中的一些 NLP 基础知识,请务必查看 Elastic ML 工程师 Josh Devins 的精彩演讲。

ChatGPT 的主要目标是促进人机之间有意义且引人入胜的交互。 通过利用 NLP 的最新进展,ChatGPT 模型可以提供广泛的应用程序,从聊天机器人和虚拟助手到内容生成、代码完成等等。 这些人工智能驱动的工具已迅速成为无数行业的宝贵资源,帮助企业简化流程并增强服务。

然而,尽管 ChatGPT 具有不可思议的潜力,但用户仍应注意某些限制。 一个值得注意的限制是知识截止日期。 目前,ChatGPT 接受的数据训练截至 2021 年 9 月,这意味着它不知道此后发生的事件、发展或变化。 因此,用户在依赖 ChatGPT 获取最新信息时应牢记这一限制。 在讨论快速变化的知识领域(例如软件增强和功能甚至世界大事)时,这可能会导致反应过时或不正确。

ChatGPT 虽然是一种令人印象深刻的 AI 语言模型,但偶尔会在其响应中产生幻觉,当它无法访问相关信息时通常会加剧。 这种过度自信会导致向用户提供不正确的答案或误导性信息。 重要的是要意识到这一限制,并在必要时以一定程度的怀疑态度、交叉检查和验证信息来处理 ChatGPT 生成的响应,以确保准确性和可靠性。

ChatGPT 的另一个限制是它缺乏关于特定领域内容的知识。 虽然它可以根据接受过培训的信息生成连贯且与上下文相关的响应,但它无法访问特定领域的数据或提供依赖于用户独特知识库的个性化答案。 例如,它可能无法深入了解组织的专有软件或内部文档。 因此,用户在直接从 ChatGPT 寻求有关此类主题的建议或答案时应谨慎行事。

最小化这些限制的一种方法是为 ChatGPT 提供对与你的领域和问题相关的特定文档的访问权限,并启用 ChatGPT 的语言理解功能以生成量身定制的响应。

这可以通过将 ChatGPT 连接到 Elasticsearch 等搜索引擎来实现。

Elasticsearch —— 你知道,用于搜索!

Elasticsearch 是一个高效的搜索引擎,旨在提供相关文档检索,确保用户可以快速准确地访问他们需要的信息。 Elasticsearch 的主要重点是向用户提供最相关的结果、简化搜索过程并增强用户体验。

Elasticsearch 拥有众多可确保一流搜索性能的功能,包括支持传统关键字和基于文本的搜索 (BM25) 以及具有精确匹配和近似 kNN(k 最近邻)搜索功能的 AI 就绪矢量搜索。 这些高级功能使 Elasticsearch 不仅可以检索相关的结果,还可以检索使用自然语言表达的查询的结果。 通过利用传统、矢量或混合搜索 (BM25 + kNN),Elasticsearch 可以提供无与伦比的精确结果,帮助用户轻松找到他们需要的信息。

Elasticsearch 的主要优势之一是其强大的 API,它可以与其他服务无缝集成以扩展和增强其功能。 通过将 Elasticsearch 与各种第三方工具和平台集成,用户可以根据自己的特定需求创建功能强大的自定义搜索解决方案。 这种灵活性和可扩展性使 Elasticsearch 成为希望提高搜索能力并在竞争激烈的数字环境中保持领先地位的企业的理想选择。

通过与 ChatGPT 等高级人工智能模型协同工作,Elasticsearch 可以为 ChatGPT 提供最相关的文档以用于其响应。 Elasticsearch 和 ChatGPT 之间的这种协同作用可确保用户收到与其查询相关的事实、上下文相关和最新的答案。 从本质上讲,Elasticsearch 的检索能力与 ChatGPT 的自然语言理解能力相结合,提供了无与伦比的用户体验,为信息检索和 AI 支持的协助树立了新标准。

如何将 ChatGPT 与 Elasticsearch 结合使用

1)Python 界面接受用户提问。

为 Elasticsearch 生成混合搜索请求

  • 标题字段上的 BM25 匹配
  • kNN 搜索标题向量字段
  • 提升 kNN 搜索结果以对齐分数
  • 设置 size=1 只返回得分最高的文档

2)搜索请求被发送到 Elasticsearch。

3)文档正文和原始 url 返回给 python。

4.)对 OpenAI ChatCompletion 进行 API 调用。

  • 提示:“answer this question <question> using only this document <body_content from top search result>”

5)生成的响应返回给 python。

6)Python 将原始文档源 url 添加到生成的响应中,并将其打印到屏幕上供用户使用。

ElasticDoc ChatGPT 流程利用 Python 界面接受用户问题并为 Elasticsearch 生成混合搜索请求,结合 BM25 和 kNN 搜索方法从 Elasticsearch Docs 站点查找最相关的文档,这些文档现已在 Elasticsearch 中编制索引。 但是,你不必使用混合搜索甚至矢量搜索。 Elasticsearch 可以灵活地使用最适合你需求的搜索模式,并为你的特定数据集提供最相关的结果。

在检索到最佳结果后,该程序会为 OpenAI 的 ChatCompletion API 制作提示,指示它仅使用所选文档中的信息来回答用户的问题。 此提示是确保 ChatGPT 模型仅使用官方文档中的信息、减少产生幻觉的机会的关键。

最后,该程序向用户展示 API 生成的响应和源文档的链接,提供无缝且用户友好的体验,集成了前端交互、Elasticsearch 查询和 OpenAI API 使用以实现高效的问答。

请注意,虽然为简单起见我们只返回得分最高的文档,但最佳做法是返回多个文档以为 ChatGPT 提供更多上下文。 可以在不止一个文档页面中找到正确的答案,或者如果我们要为完整的正文文本生成向量,那么这些较大的文本正文可能需要分块并存储在多个 Elasticsearch 文档中。 通过利用 Elasticsearch 与传统搜索方法协同搜索大量矢量字段的能力,你可以显着提高你的顶级文档召回率。

技术设置

技术要求相当低,但需要一些步骤才能将所有部分组合在一起。 对于此示例,我们将配置 Elasticsearch 网络爬虫以摄取 Elastic 文档并在摄取时为标题生成向量。 你可以按照以下步骤复制此设置或使用你自己的数据。 为了跟进,我们需要:

  • Elasticsearch 集群
  • Eland Python 库
  • OpenAI API 帐号
  • 在某个地方运行我们的 python 前端和 api 后端

Elastic Cloud setup

本节中的步骤假设你当前没有在 Elastic Cloud 中运行的 Elasticsearch 集群。 如果你这样做,可以跳到下一部分。

注册

如果你还没有 Elasticsearch 集群,你可以注册 Elastic Cloud 免费试用。

创建部署

注册后,系统会提示你创建第一个部署。

  • 为你的部署创建一个名称。
  • 你可以接受默认的云提供商和区域,或单击 “Edit settings” 并选择其他位置。
  • 单击创建部署。 很快将为你配置一个新的部署,你将登录到 Kibana。

回到云端

在我们继续之前,我们需要在 Cloud Console 中做几件事:

  • 单击左上角的导航图标并选择 “Manage this deployment”。

添加机器学习节点。

  • 返回 Cloud Console,单击左侧导航栏中部署名称下的 Edit。

  • 向下滚动到 Machine Learning instances 框并单击 +Add Capacity。
  • 在每个区域的大小下,单击并选择 2 GB RAM。

  •  向下滚动并单击保存。

  • 在总结架构更改的弹出窗口中,单击 “Confirm”。 

  •  片刻之后,你的部署现在将能够运行机器学习模型!

重置 Elasticsearch 部署用户和密码:

  • 单击部署名称下方左侧导航栏中的 Security。
  • 单击 Reset Password 并使用重置进行确认。 (注意:因为这是一个新集群,所以不应使用此 Elastic 密码。)
  • 下载为 “elastic” 用户新创建的密码。 (我们将使用它从 Hugging Face 和我们的 python 程序中加载我们的模型。)

复制 Elasticsearch 部署云 ID。

  • 单击你的部署名称以转到 overview 页面。
  • 在右侧单击复制图标以复制你的 Cloud ID。 (保存此以备后用连接到 Deployment。)

 

Eland

接下来,我们需要将嵌入模型加载到 Elasticsearch 中,为我们的博客标题生成向量,然后为用户的搜索问题生成向量。 我们将使用由 SentenceTransformers 训练并托管在 Hugging Face 模型中心上的 all-distilroberta-v1 模型。 此设置不需要此特定模型即可工作。 它适合一般用途,因为它是在涵盖广泛主题的非常大的数据集上训练的。 但是,对于矢量搜索用例,使用针对您的特定数据集进行微调的模型通常会提供最佳相关性。

为此,我们将使用 Elastic 创建的 Eland python 库。 该库提供了广泛的数据科学功能,但我们将使用它作为桥梁,将模型从 Hugging Face 模型中心加载到 Elasticsearch,以便它可以部署在机器学习节点上以供推理使用。

Eland 可以作为 python 脚本的一部分运行,也可以在命令行上运行。 该存储库还为希望走这条路的用户提供了一个 Docker 容器。 今天我们将在一个小型 python notebook 中运行 Eland,它可以在网络浏览器中免费运行在谷歌的 Colab 中。

打开程序链接并单击顶部的 “Open in Colab” 按钮以在 Colab 中启动 notebook。

将变量 hf_model_id 设置为模型名称。 此模型已在示例代码中设置,但如果你想使用不同的模型或仅供将来参考:

  • hf_model_id='sentence-transformers/all-distilroberta-v1'
  • 从 Hugging Face 复制模型名称。 最简单的方法是单击模型名称右侧的复制图标。

运行 cloud auth 部分,系统会提示您输入:

  • Cloud ID(你可以在 Elastic Cloud 控制台中找到它)
  • Elasticsearch 用户名(最简单的方法是使用在创建部署时创建的 “Elastic” 用户)
  • Elasticsearch 用户密码

运行剩余的步骤。

  • 这将从 Hugging face 下载模型,将其分块,并将其加载到 Elasticsearch 中。
  • 将模型部署(启动)到机器学习节点上。

Elasticsearch 索引和网络爬虫

接下来我们将创建一个新的 Elasticsearch 索引来存储我们的 Elastic 文档,将网络爬虫配置为自动抓取这些文档并为其编制索引,并使用摄取管道为文档标题生成向量。

请注意,你可以在此步骤中使用你的专有数据,以创建适合你的领域的问答体验。

  • 如果你尚未打开 Kibana,请从 Cloud Console 打开它。
  • 在 Kibana 中,导航到 Enterprise -> Overview。 单击 “Create Elasticsearch Index”。

  •  使用 Web Crawler 作为摄取方法,输入 elastic-docs 作为索引名称。 然后,单击创 “Create Index”。

  • 单击 “Pipelines” 选项卡。
  • 单击 Ingest Pipeline Box 中的 Copy and customize。
  • 单击 Machine Learning Inference Pipelines 框中的 Add Inference Pipeline。

  • 为新管道输入名称 elastic-docs_title-vector。
  • 选择你在上面的 Eland 步骤中加载的经过训练的 ML 模型。
  • 选择 title 作为源字段。

  • 单击 Continue,然后在 Test stage 再次单击 Continue。
  • 在 Review 阶段点击 Create Pipeline。 

更新 dense_vector 字段的映射。 (注意:对于 Elasticsearch 8.8+ 版本,此步骤应该是自动的。)

  • 在导航菜单中,单击 Dev Tools。 如果这是你第一次打开 Dev Tools,你可能必须在带有文档的弹出窗口中单击 “Dismiss”。
  • 在 Console 选项卡的 Dev Tools 中,使用以下代码更新密集矢量目标字段的映射。 你只需将其粘贴到代码框中,然后单击第 1 行右侧的小箭头。
POST search-elastic-docs/_mapping
{
  "properties": {
    "title-vector": {
      "type": "dense_vector",
      "dims": 768,
      "index": true,
      "similarity": "dot_product"
    }
  }
}
  • 你应该会在屏幕的右半部分看到以下响应:
{
  "acknowledged": true
}
  • 这将允许我们稍后在 title 字段向量上运行 kNN 搜索。

配置网络爬虫以爬取 Elastic Docs 站点:

  • 再次单击导航菜单,然后单击 Enterprise Search -> Overview。
  • 在内容下,单击 Indices。
  • 单击可用索引下的 search-elastic-docs。

  • 单击 “Manage Domains” 选项卡。
  • 单击 “Add domain”。
  • 输入 https://www.elastic.co/guide/en,然后单击 Validate Domain。
  • 检查运行后,单击 Add domain。 然后单击 Crawl rules。
  • 一次添加以下爬网规则。 从底部开始,向上工作。 规则根据第一个匹配进行评估。
DisallowContainsrelease-notes
AllowRegex/guide/en/.*/current/.*
DisallowRegex.*

  •  准备好所有规则后,单击页面顶部的抓取。 然后,单击 “Crawl all domains on this index”。

Elasticsearch 的网络爬虫现在将开始爬取文档站点,为标题字段生成向量,并对文档和向量建立索引。

第一次爬网需要一些时间才能完成。 同时,我们可以设置 OpenAI API 凭证和 Python 后端。

与 OpenAI API 连接

要向 ChatGPT 发送文档和问题,我们需要一个 OpenAI API 帐户和密钥。 如果你还没有帐户,可以创建一个免费帐户,你将获得初始数量的免费积分。

  • 转到 https://platform.openai.com 并单击 “Signup”。 你可以完成使用电子邮件地址和密码或使用 Google 或 Microsoft 登录的过程。

创建帐户后,你需要创建一个 API 密钥:

  • 单击 API Keys。
  • 单击创 Create new secret key
  • 复制新密钥并将其保存在安全的地方,因为你将无法再次查看该密钥。

Python 后端设置

克隆或下载 python 程序


Github 代码链接

1)安装所需的 python 库。 我们在具有隔离环境的 Replit 中运行示例程序。 如果您在笔记本电脑或 VM 上运行它,最佳做法是为 python 设置一个虚拟 ENV。

  • 运行 pip install -r requirements.txt

2)设置身份验证和连接环境变量(例如,如果在命令行上运行:export openai_api="123456abcdefg789")

  • openai_api - OpenAI API 密钥
  • cloud_id - Elastic 云部署 ID
  • cloud_user - Elasticsearch 集群用户
  • cloud_pass - Elasticsearch 用户密码

3)运行 streamlit 程序。 有关 streamlit 的更多信息可以在其文档中找到。

  • Streamlit 有自己的启动命令:streamlit run elasticdocs_gpt.py

4) 这将启动网络浏览器,并将 url 打印到命令行。

样本聊天回复

一切都已摄取且前端启动并运行后,你可以开始询问有关 Elastic 文档的问题。

询问 “Show me the API call for an inference processor” 现在会返回一个示例 API 调用和一些有关配置设置的信息。

询问将新集成添加到 Elastic Agent 的步骤将返回:

如前所述,允许 ChatGPT 仅根据训练过的数据回答问题的风险之一是它容易产生错误答案的幻觉。 该项目的目标之一是为 ChatGPT 提供包含正确信息的数据,并让它制定答案。

那么当我们给 ChatGPT 一个不包含正确信息的文档时会发生什么? 比如,让它告诉你如何造船(Elastic 的文档目前没有涵盖):

当 ChatGPT 无法在我们提供的文档中找到问题的答案时,它会退回到我们的提示指令,简单地告诉用户它无法回答问题。

Elasticsearch 的强大检索 + ChatGPT 的强大功能

在此示例中,我们展示了如何将 Elasticsearch 强大的搜索检索功能与人工智能从 GPT 模型生成的响应中的前沿技术相结合,如何将用户体验提升到一个全新的水平。

可以对各个组件进行定制以满足你的特定要求并进行调整以提供最佳结果。 虽然我们使用 Elastic 网络爬虫来摄取公共数据,但你并不局限于这种方法。 随意尝试其他嵌入模型,尤其是那些针对特定领域数据进行微调的模型。

你今天可以尝试本博客中讨论的所有功能! 要构建你自己的 ElasticDocs GPT 体验,请注册一个 Elastic 试用帐户,然后查看此示例代码库以开始使用。

如果你想尝试搜索相关性的想法,可以尝试以下两个:

  • [博客] 使用 Elasticsearch 部署 NLP 文本嵌入和矢量搜索
  • [博客] 使用 Elastic 实现图像相似度搜索

原文:ChatGPT and Elasticsearch: OpenAI meets private data | Elastic Blog

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

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

相关文章

【react从入门到精通】React JSX详解

文章目录 前言React技能树什么是JSXJSX的基本语法规则1.JSX必须有一个顶层元素2.JSX标签必须有一个结束标记&#xff0c;或者是自闭合的3.JSX中可以使用JavaScript表达式4.JSX中的样式和HTML中的样式有所不同5.JSX中的class属性必须写成className6.JSX中的style属性必须使用对象…

JavaWeb-HTML常用标签了解(一)

这里写目录标题 注释标签标题标签段落标签换行标签格式化标签图片标签超链接标签外部链接与内部链接 注释标签 <!-- 有注释 -->无注释ctrl / 快捷键可以快速进行注释/取消注释. 注意 注释不能传达负能量!!! 标题标签 有六个, 从 h1 - h6. 数字越大, 则字体越小. <h…

读SQL进阶教程笔记14_SQL编程要点

1. 消灭NULL 1.1. NULL惹人讨厌的原因 1.1.1. 进行SQL编码时&#xff0c;必须考虑违反人类直觉的三值逻辑 1.1.2. 指定IS NULL、IS NOT NULL的时候&#xff0c;不会用到索引&#xff0c;SQL语句执行起来性能低下 1.1.2.1. 1 NULL NULL2- NULL NULL3 &#xff0a; NULL …

BrainStat:用于全脑统计和多模态特征关联的工具箱

BrainStat工具箱在茗创科技往期推文【点此阅读→资源分享 | 利用机器学习进行高级MRI分析】中作过简单介绍。近日&#xff0c;NeuroImage杂志发布了题为BrainStat: a toolbox for brain-wide statistics and multimodal feature associations的预印版文章。这篇文章详细阐述了B…

测试开发备战秋招面试5-牛客刷题之链表篇

趁着5.1假期把牛客网的必刷的TOP101过一遍&#xff0c;额&#xff0c;题目量有点大&#xff0c;争取5天给刷完吧&#xff0c;哈哈&#xff0c;加油啦。再用雷布斯的那句话来激励自己吧&#xff1a;努力了那么多年,回头一望,几乎全是漫长的挫折和煎熬。对于大多数人的一生来说,顺…

学习Python需要注意什么?分享一下如何提升写代码的质量

作为程序员&#xff0c;每天都会面对各种各样的问题和挑战。需求的变更、代码的维护和修复、测试的问题&#xff0c;以及线上出现的各种异常等等&#xff0c;这些都需要我们不断地投入精力去解决。但是&#xff0c;我们不能只关注在解决问题上&#xff0c;还需要关注代码质量。…

IDE - Android Studio/Xcode历史版本下载

文章目录 前言Android Studio1. 历史版本下载2. 文件完整性校验 Xcode1. 历史版本下载2. 网络环境模拟工具2.1 下载2.2 安装2.3 卸载 最后 前言 最近升级开发工具老是遇到各种兼容性问题导致需要降回老版本&#xff0c;Xcode历史版本下载方便倒还好&#xff0c;Android Studio…

使用pands.rolling方法实现移动窗口的聚合计算

一个问题举例 假设有一个5天的收益数据&#xff0c;需要每3天求出一次平均值来达成某个需求&#xff1a; daterevenue2023-05-01102023-05-02202023-05-03302023-05-04402023-05-0550 1号、2号和3号的数据求一次平均值&#xff0c;2号、3号和4号的数据求一次平均值&#xff…

Ucore lab4

实验目的 了解内核线程创建/执行的管理过程了解内核线程的切换和基本调度过程 实验内容 练习一&#xff1a;分配并初始化一个进程控制块 1.内核线程及管理 内核线程是一种特殊的进程&#xff0c;内核线程与用户进程的区别有两个&#xff1a;内核线程只运行在内核态&#x…

内网渗透(六十一)之Kerberosating攻击

Kerberosating攻击 Kerberosating攻击发生在Kerberos协议的TGS_REP阶段,KDC的TGS服务返回一个由服务Hash 加密的ST给客户端。由于该ST是用服务Hash进行加密的,因此客户端在拿到该ST后可以用于本地离线爆破。如果攻击者的密码字典足够强大,则很有可能爆破出SPN链接用户的明文…

JAVA入坑之GUI编程

一、相关概述 GUI编程是指通过图形化的方式来实现计算机程序的编写&#xff0c;它可以让用户通过鼠标、键盘等设备来操作计算机&#xff0c;而不是通过命令行来输入指令。在Java中&#xff0c;GUI编程主要使用的是Swing和AWT两种技术 二、AWT 2.1介绍 AWT是Java提供的用来建立…

【构造】CF851div2 C. Matching Numbers

Problem - C - Codeforces 题意&#xff1a; 有1~2*n的一个排列&#xff0c;进行数与数之间两两匹配&#xff0c;问如何组合可以使n个 数对 aibi排列起来是一个连续序列&#xff0c;如果无解输出No 思路&#xff1a; 构造题&#xff0c;考虑将构造的条件特殊化 手推样例可知…

【数据生成】——Semantic Image Synthesis via Diffusion Models语义分割数据集生成论文浅读

语义分割&#xff0c;数据生成 摘要 Denoising Diffusion Probabilistic Models (DDPMs) 在各种图像生成任务中取得了显著的成功&#xff0c;相比之下&#xff0c;生成对抗网络 (GANs) 的表现不尽如人意。最近的语义图像合成工作主要遵循事实上的基于 GAN 的方法&#xff0c;…

QT QHBoxLayout 水平布局控件

本文详细的介绍了QHBoxLayout控件的各种操作&#xff0c;例如&#xff1a;新建界面、添加控件、布局控件、显示控件、添加空白行、设置间距 、添加间距、设置位置、设置外边距、设置边距、添加固定宽度、方向上、方向下、方向左、方向右等等、 样式表等操作。 实际开发中&#…

无距离障碍:远程桌面Ubuntu实现全球办公【内网穿透】

目录 前言 视频教程 1. ubuntu安装XRDP 2.局域网测试连接 3. Ubuntu安装cpolar内网穿透 4.cpolar公网地址测试访问 5.固定域名公网地址 [TOC] 转载自远程穿透文章&#xff1a;Windows通过RDP异地远程桌面Ubuntu【内网穿透】 前言 XRDP是一种开源工具&#xff0c;它允许…

范数详解-torch.linalg.norm计算实例

文章目录 二范数F范数核范数无穷范数L1范数L2范数 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 范数是一种数学概念&#xff0c;可以将向量或矩阵映射到非负实数上&#xff0c;通常被…

Python使用pytorch深度学习框架构造Transformer神经网络模型预测红酒分类例子

1、红酒数据介绍 经典的红酒分类数据集是指UCI机器学习库中的Wine数据集。该数据集包含178个样本&#xff0c;每个样本有13个特征&#xff0c;可以用于分类任务。 具体每个字段的含义如下&#xff1a; alcohol&#xff1a;酒精含量百分比 malic_acid&#xff1a;苹果酸含量&a…

Python之硬汉巴特勒

一、前言 2023年4月27日&#xff0c;NBA季后赛热火4:1淘汰雄鹿&#xff0c;实现黑八。全NBA联盟最硬气的男人——巴特勒&#xff0c;再次向全世界证明了他是NBA最硬气的男人。上一场刚狂轰56分大比分逆转雄鹿&#xff0c;这一场又是带领球队打出了血性&#xff0c;超高难度绝平…

快速搭建简单图床 - 远程访问本地搭建的EasyImage图床【内网穿透】

文章目录 1.前言2. EasyImage网站搭建2.1. EasyImage下载和安装2.2. EasyImage网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 一个好的图床&#xff0c;是网站或者文章图片能稳定显示的关键&#xff0c;…

驱动管理软件推荐

最近发现电脑右下角的任务栏中有一个叹号图标&#xff0c;如下&#xff1a; 点进去之后发现是Windows自家的安全中心的内核隔离出现了点问题&#xff0c;内核隔离功能打不开 点击“查看不兼容的驱动程序”&#xff0c;发现是一些驱动作祟 我的电脑中显示了好多不兼容的驱动程序…