作者:Jeff Vestal

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

ChatGPT 和 Elasticsearch:OpenAI 遇见私有数据
详细的操作步骤,请阅读文章 “ChatGPT 和 Elasticsearch:OpenAI 遇见私有数据(二)”。
近几个月来,人们对 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 拥有众多可确保一流搜索性能的功能,包括支持传统关键字和基于文本的搜索 (BM25) 以及具有精确匹配和近似 kNN(k 最近邻)搜索功能的 AI 就绪矢量搜索。 这些高级功能使 Elasticsearch 不仅可以检索相关的结果,还可以检索使用自然语言表达的查询的结果。 通过利用传统、矢量或混合搜索 (BM25 + kNN),Elasticsearch 可以提供无与伦比的精确结果,帮助用户轻松找到他们需要的信息。
Elasticsearch 的主要优势之一是其强大的 API,它可以与其他服务无缝集成以扩展和增强其功能。 通过将 Elasticsearch 与各种第三方工具和平台集成,用户可以根据自己的特定需求创建功能强大的自定义搜索解决方案。 这种灵活性和可扩展性使 Elasticsearch 成为希望提高搜索能力并在竞争激烈的数字环境中保持领先地位的企业的理想选择。
通过与 ChatGPT 等高级人工智能模型协同工作,Elasticsearch 可以为 ChatGPT 提供最相关的文档以用于其响应。 Elasticsearch 和 ChatGPT 之间的这种协同作用可确保用户收到与其查询相关的事实、上下文相关和最新的答案。 从本质上讲,Elasticsearch 的检索能力与 ChatGPT 的自然语言理解能力相结合,提供了无与伦比的用户体验,为信息检索和 AI 支持的协助树立了新标准。

1)Python 界面接受用户提问。
为 Elasticsearch 生成混合搜索请求
2)搜索请求被发送到 Elasticsearch。
3)文档正文和原始 url 返回给 python。
4.)对 OpenAI ChatCompletion 进行 API 调用。
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 文档并在摄取时为标题生成向量。 你可以按照以下步骤复制此设置或使用你自己的数据。 为了跟进,我们需要:
本节中的步骤假设你当前没有在 Elastic Cloud 中运行的 Elasticsearch 集群。 如果你这样做,可以跳到下一部分。
如果你还没有 Elasticsearch 集群,你可以注册 Elastic Cloud 免费试用。

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

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

添加机器学习节点。





重置 Elasticsearch 部署用户和密码:

复制 Elasticsearch 部署云 ID。

接下来,我们需要将嵌入模型加载到 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 设置为模型名称。 此模型已在示例代码中设置,但如果你想使用不同的模型或仅供将来参考:

运行 cloud auth 部分,系统会提示您输入:
运行剩余的步骤。
接下来我们将创建一个新的 Elasticsearch 索引来存储我们的 Elastic 文档,将网络爬虫配置为自动抓取这些文档并为其编制索引,并使用摄取管道为文档标题生成向量。
请注意,你可以在此步骤中使用你的专有数据,以创建适合你的领域的问答体验。




更新 dense_vector 字段的映射。 (注意:对于 Elasticsearch 8.8+ 版本,此步骤应该是自动的。)
POST search-elastic-docs/_mapping
{
"properties": {
"title-vector": {
"type": "dense_vector",
"dims": 768,
"index": true,
"similarity": "dot_product"
}
}
}
{
"acknowledged": true
}
配置网络爬虫以爬取 Elastic Docs 站点:

| Disallow | Contains | release-notes |
| Allow | Regex | /guide/en/.*/current/.* |
| Disallow | Regex | .* |


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

第一次爬网需要一些时间才能完成。 同时,我们可以设置 OpenAI API 凭证和 Python 后端。
要向 ChatGPT 发送文档和问题,我们需要一个 OpenAI API 帐户和密钥。 如果你还没有帐户,可以创建一个免费帐户,你将获得初始数量的免费积分。
创建帐户后,你需要创建一个 API 密钥:

1)安装所需的 python 库。 我们在具有隔离环境的 Replit 中运行示例程序。 如果您在笔记本电脑或 VM 上运行它,最佳做法是为 python 设置一个虚拟 ENV。
2)设置身份验证和连接环境变量(例如,如果在命令行上运行:export openai_api="123456abcdefg789")
3)运行 streamlit 程序。 有关 streamlit 的更多信息可以在其文档中找到。
4) 这将启动网络浏览器,并将 url 打印到命令行。
一切都已摄取且前端启动并运行后,你可以开始询问有关 Elastic 文档的问题。
询问 “Show me the API call for an inference processor” 现在会返回一个示例 API 调用和一些有关配置设置的信息。

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

如前所述,允许 ChatGPT 仅根据训练过的数据回答问题的风险之一是它容易产生错误答案的幻觉。 该项目的目标之一是为 ChatGPT 提供包含正确信息的数据,并让它制定答案。
那么当我们给 ChatGPT 一个不包含正确信息的文档时会发生什么? 比如,让它告诉你如何造船(Elastic 的文档目前没有涵盖):

当 ChatGPT 无法在我们提供的文档中找到问题的答案时,它会退回到我们的提示指令,简单地告诉用户它无法回答问题。
在此示例中,我们展示了如何将 Elasticsearch 强大的搜索检索功能与人工智能从 GPT 模型生成的响应中的前沿技术相结合,如何将用户体验提升到一个全新的水平。
可以对各个组件进行定制以满足你的特定要求并进行调整以提供最佳结果。 虽然我们使用 Elastic 网络爬虫来摄取公共数据,但你并不局限于这种方法。 随意尝试其他嵌入模型,尤其是那些针对特定领域数据进行微调的模型。
你今天可以尝试本博客中讨论的所有功能! 要构建你自己的 ElasticDocs GPT 体验,请注册一个 Elastic 试用帐户,然后查看此示例代码库以开始使用。
如果你想尝试搜索相关性的想法,可以尝试以下两个:
原文:ChatGPT and Elasticsearch: OpenAI meets private data | Elastic Blog
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
英文版英文链接关注公众号在“亚特兰蒂斯的回声”中踏上一段难忘的冒险之旅,深入未知的海洋深处。足智多谋的考古学家AriaSeaborne偶然发现了一件古代神器,揭示了一张通往失落之城亚特兰蒂斯的隐藏地图。在她神秘的导师内森·兰登教授的指导和勇敢的冒险家亚历克斯·默瑟的帮助下,阿丽亚开始了一段危险的旅程,以揭开这座传说中城市的真相。他们的冒险之旅带领他们穿越险恶的大海、神秘的岛屿和充满陷阱和谜语的致命迷宫。随着Aria潜在的魔法能力的觉醒,她被睿智勇敢的QueenNeria的幻象所指引,她让她为即将到来的挑战做好准备。三人组揭开亚特兰蒂斯令人惊叹的隐藏文明,并了解到邪恶的巫师马拉卡勋爵试图利用其古
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf