使用 Weaviate 矢量搜索为 60 多万篇学术论文构建可扩展的知识图谱搜索

Keenious 是一个专为学生、研究人员设计的搜索引擎! 并且提供了应用程序直接在文本编辑器中运行;可以帮助我们分析整个文档并工作时找到高度相关的结果

介绍

与传统搜索不同,我们的Keenious 学术搜索引擎在直接相关的结果(关键字等)与通过语义与输入文档相关的相似性结果之间取得平衡。相似性的结果促进了对研究和主题的持续发现和探索,这两者对各级研究人员和学生都至关重要。

找到正确的平衡很困难因为用户意图本身就是不确定的,所以很难找一种行之有效的方法来寻找最佳平衡方案。我们使用自己的理解、反复试验以及最重要的用户反馈来找到最佳组合。

最近,我们一直在探索引入一种无需基于文本的语义向量即可执行的语义搜索的方法。这样做的原因是用户无需搜索文档就可以对研究和主题进行深入探索和发现。我们通常将此称为冷启动问题,即用户没有论文或文档文本可供搜索的情况。

能够开发出一种解决方案一直是我们关注的焦点,该解决方案允许用户无需文档或搜索查询,只通过单一提示或输入(他们喜欢的论文、主题等)轻松发现个性化的研究建议。我们目前找到的解决方案是使用知识图谱(KG)结合快速向量搜索解决方案(Weaviate)。

在本文中,我们将简要介绍知识图谱,以及我们在Keenious如何利用它们,同时主要关注如何使用Weaviate缩放图并使其嵌入到搜索引擎中。这里主要包括Weaviate的概述,以及Weaviate为什么作为此任务的正确工具。

Keenious的快速介绍

在我们开始之前,你可能不熟悉 Keenious 及其功能。 Keenious 是一种工具,可以分析你的写作,并在几秒钟内向你展示数百万在线出版物中最相关的研究。

我们相信学习不是一个静态的过程因此研究也不应该是,使用 Keenious每一个文档都可以变为搜索查询。 我们的插件会在撰写文本的同时分析的文本并在每一步为你找到最相关的研究。 Keenious 通过筛选跨学科主题和研究领域来发掘隐藏的宝藏。

如果需要搜索更具体的内容,可以使用搜索单独浏览论文或文档中的每个句子。 这将缩小搜索范围,同时保持它与文档的其余部分相关。

学术知识图谱

知识图谱 (KG) 是一个很深的主题,这里我们就不详细的介绍,有兴趣的朋友可以查看以前我们公众号 deephub-imba 发布的文章。我们这整理了一些知识图谱的要点,供你理解本文后面的内容

  • 知识图谱又名语义网络:它们是一种连接多个现实世界实体和概念的网络,并区分它们相互关联的不同方式。几乎任何概念/实体/系统都可以抽象为知识图谱。

  • 更正式的 KG 是异构图,其中可以存在多种类型的节点和/或边。例如,movielens 数据集可以抽象为由多种类型的节点组成的 KG,例如电影、演员、流派、语言和指定两个实体之间关系的边,即演员 → 出演 → 电影。

  • 它们与所有节点和边都属于同一类型的同构图形成直接对比,例如,朋友(社交)网络。

  • 我们的知识图谱的主要实体(节点)和关系(边)是论文引用以及丰富图谱的其他论文特定元数据。

  • 使用这些节点和边缘关系,我们能够创建学术知识图并训练自定义模型以生成非常丰富的图嵌入,其中每个嵌入代表一种独特的节点类型,包括我们数据集中的论文。这些嵌入构成了此搜索的基础,也是我们提供给 Weaviate 的内容,以使我们的 KG 中的每个独特实体都可被发现。

Weaviate矢量搜索引擎

Weaviate 是一个矢量搜索引擎,帮助推动人工智能搜索和发现。 矢量搜索现在正处于一个重要且非常有趣的交汇处,它正在成熟并且成为搜索技术的主流,因为它好处是不可否认的。

就像倒排索引如何改变我们进行全文搜索的方式一样,像 Weaviate 这样的矢量搜索引擎正在推动下一代对文本、图像和知识图谱中的非结构化数据的搜索。

数据对象和混合索引搜索

从根本上说,Weaviate的架构从一开始就经过了深度的思考。Weaviate中的数据对象基于一个类属性结构,这使得 Weaviate 中的所有对象都可以轻松地使用 GraphQL 进行本机查询,并且对使用了复杂的过滤器和标量值进行查询进行了优化。其实,传统的倒排索引和矢量索引的结合才是Weaviate真正脱颖而出的原因。在同一个查询中,用户可以选择从向量搜索中包含或排除具有特定标量值(文本、数字等)的数据对象。

即插即用设计

Weaviate另一个有趣的设计方面是它的API是高度模块化的。矢量索引 API 的结构也是作为一个插件系统进行工作,这样可以使得Weaviate 以适应矢量搜索的并进行持续改进。

Weaviate 当前的向量索引类型是 HNSW,这是一种最先进的近似最近邻 (ANN) 向量搜索算法。 ANN 搜索是一个非常活跃的研究领域,并且一直在提出新的可以提高召回率和效率的新索引架构。因为 Weaviate 的矢量索引 API 与后端无关,这意味着将来当最新和最好的 ANN 索引添加到 Weaviate 的可用插件时,用户可能能够在对其设置进行最小更改的情况下进行切换(有可能根本不需要改动)。

我认为选择花时间设计一个可以适应未来任何向量索引的API是一个非常好的选择。太多的文本搜索引擎使用20多年前的检索方法,这种检索方法早就被超越了,但因为代码耦合太紧密,无法被取代。

模块和集成

Weaviate 除了采取的整体模块化方法之外还建立在搜索之上的功能模块,以及许多定制的向矢量转换数据的矢量化模块。Weaviate 内置一些非常强大的模块,在使用过程中涉及几个常规转换步骤,可以通过创建自己任务流进行拼接。以下是我整理的一些常用模块:

text2vec-contextionary:一个非常有趣的功能,它本质上将数据对象和对象的上下文进行向量化表示并保存到数据库中。

text2vec-transformers:利用sentence-transformers中丰富的嵌入模型为每个导入Weaviate的文本对象创建一个段落/文档嵌入,这样开发人员就不必自己实现推理代码。

img2vec-neural:与 text2vec 类似,该模块使用大型预训练计算机视觉模型自动将图像矢量化,以无缝启用对任何图像的语义搜索。

横向扩展

注意:在编写本文的时候,Weaviate加入了横向扩展特性的候选版本v.1.8.0-rc0刚刚发布。预计到2021年秋季,它将稳定发布。

虽然我们的用例目前能够适用于Weaviate的单个节点实例,但最终我们还是需要一个可以无限扩展的向量搜索解决方案。在矢量搜索的世界里这是很麻烦的事情。一旦向量到达了一定的数量级许多向量搜索算法的性能都会有一个上限。Weaviate的设计时也考虑了作为节点集群进行水平扩展,很像Elasticsearch目前用于文本搜索的功能。Weaviate的可扩展版本由一个索引组成,该索引被分解成许多不同的分片或小型ANN索引,然后可以分布在多个节点上。

通过这种设置,可以向Weaviate集群添加对象的数量实际上没有限制,因为它可以扩展到任何用例而不会牺牲性能。

横向可扩展是矢量搜索引擎真正投入生产所需的最关键特性。Weaviate目前在可伸缩性方面处于有利地位。整个代码库,包括HNSW的自定义实现,都是用Go语言编写的,因为Go非常适合大型可伸缩系统。

使用 Weaviate 为知识图谱提供搜索支持

对于考虑使用 Weaviate 的任何人来说,需要注意的是它对内存要求很高,但是具体取决于需要的“模式”。如果针对索引添加新对象,即大量写入,那么内存消耗会非常大。为了解决这个问题可以在大量的插入之后重新启动 Weaviate 这样可以仅使用一小部分内存,因为插入后的向量不需要存储在内存中。

下面让我们来讨论一下 Keenious 如何实际使用 Weaviate 来支持我们即将推出的知识图谱搜索功能。

虽然 Weaviate 具有前面提到的许多功能模块,但其核心是纯矢量原生数据库和搜索引擎。由于我们已经训练自定义模型来为我们的项目生成丰富的嵌入向量,因此我们只需要所有的向量都直接导入到 Weaviate 中,无需任何转换。在单节点版本中我们目前已经索引了超过6000万的文档。

目前,我们在自己的自定义工作站上构建索引和数据库,Keenious 的每个人都亲切地称其为Goku。下一步我们会将其迁移到 Kubernetes 上工作。 Weaviate 有一个非常有用的工具,可以快速创建一个基本的 docker-compose 文件来使事情顺利进行

Weaviate 有许多不同的客户端可供选择,具体取决于您熟悉的语言。Python、Go、Java、Javascript 和 CLI 客户端,都已经是非常成熟的产品了。

优化 Weaviate 的一些技巧

目前,向量索引有 4 个主要参数,可以在某种意义上进行调整。 这些参数是:

  1. efConstruction
  2. maxConnections
  3. ef
  4. vectorCacheMaxObjects

前 3 个参数直接来自 HNSW 本身并且特定于算法,因此可以查看原始论文以获取对每个参数作用的更详细说明。这些参数的主要影响,特别是 efConstruction 和 maxConnections 是召回率/精度和资源使用/导入时间之间的权衡。

增加 maxConnections 通常会提高索引的质量,但也会增加内存中 HNSW 图的大小。如果您无法承受增加的内存使用量,那么 efConstruction 可能是您想要增加的参数,但增加此参数会增加导入时间。

ef 参数实际上只在进行搜索时起作用,并且取决于索引中的对象数量和相应时间的要求。我们发现,在索引时使用较高的 efConstruction 值时,我们可以在搜索时提供较低的 ef 值。

请小心使用 vectorCacheMaxObjects,几乎肯定希望它大于或等于索引时数据集中的对象数,但是当运行 Weaviate 仅用于搜索时,将内存保持在较低水平可能是有益的,因为不这样做’不需要将所有向量存储在内存中,HNSW 图做了繁重的工作,向量仅用于计算最终的距离分数。

总结

在 Keenious,我们对 Weaviate 的矢量搜索质量和构建在其上的所有附加功能感到非常满意,这些附加功能真正改变了矢量搜索的游戏规则。

选择 Weaviate 使我们能够完全专注于为我们的搜索引擎开发出色的功能,这些功能涉及我们存储在 Weaviate 中的 60 多万个知识图谱嵌入。我们能够用最前沿的产品来解决学术搜索问题,而不是技术实现要求,这太棒了。

我们很快(2021 年秋末)在此基础上提供了一些非常有趣的功能,我们期待在发布后与您分享这些功能,敬请期待。

作者:Charles Pierse

热门文章

暂无图片
编程学习 ·

C语言二分查找详解

二分查找是一种知名度很高的查找算法,在对有序数列进行查找时效率远高于传统的顺序查找。 下面这张动图对比了二者的效率差距。 二分查找的基本思想就是通过把目标数和当前数列的中间数进行比较,从而确定目标数是在中间数的左边还是右边,将查…
暂无图片
编程学习 ·

GMX 命令分类列表

建模和计算操作命令: 1.1 . 创建拓扑与坐标文件 gmx editconf - 编辑模拟盒子以及写入子组(subgroups) gmx protonate - 结构质子化 gmx x2top - 根据坐标生成原始拓扑文件 gmx solvate - 体系溶剂化 gmx insert-molecules - 将分子插入已有空位 gmx genconf - 增加…
暂无图片
编程学习 ·

一文高效回顾研究生课程《数值分析》重点

数值分析这门课的本质就是用离散的已知点去估计整体,就是由黑盒子产生的结果去估计这个黑盒子。在数学里这个黑盒子就是一个函数嘛,这门课会介绍许多方法去利用离散点最大化地逼近这个函数,甚至它的导数、积分,甚至微分方程的解。…
暂无图片
编程学习 ·

在职阿里5年,一个28岁女软测工程师的心声

简单的先说一下,坐标杭州,14届本科毕业,算上年前在阿里巴巴的面试,一共有面试了有6家公司(因为不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少) ​ 编辑切换为居中…
暂无图片
编程学习 ·

字符串左旋c语言

目录 题目: 解题思路: 第一步: 第二步: 第三步: 总代码: 题目: 实现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符…
暂无图片
编程学习 ·

设计模式--观察者模式笔记

模式的定义与特点 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式&#xf…
暂无图片
编程学习 ·

睡觉突然身体动不了,什么是睡眠痽痪症

很多朋友可能有这样的体验,睡觉过程中突然意识清醒,身体却动弹不了。这时候感觉非常恐怖,希望旁边有一个人推自己一下。阳光以前也经常会碰到这样的情况,一年有一百多次,那时候很害怕晚上到来,睡觉了就会出…
暂无图片
编程学习 ·

深入理解C++智能指针——浅析MSVC源码

文章目录unique_ptrshared_ptr 与 weak_ptrstd::bad_weak_ptr 异常std::enable_shared_from_thisunique_ptr unique_ptr 是一个只移型别(move-only type,只移型别还有std::mutex等)。 结合一下工厂模式,看看其基本用法&#xff…
暂无图片
编程学习 ·

@TableField(exist = false)

TableField(exist false) //申明此字段不在数据库存在,但代码中需要用到它,通知Mybatis-plus在做写库操作是忽略它。,.
暂无图片
编程学习 ·

Java Web day15

第十二章文件上传和下载 一、如何实现文件上传 要实现Web开发中的文件上传功能,通常需要完成两步操作:一.是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。 需要使用一个Apache组织提供一个…
暂无图片
编程学习 ·

【51nod 2478】【单调栈】【前缀和】小b接水

小b接水题目解题思路Code51nod 2478 小b接水 题目 输入样例 12 0 1 0 2 1 0 1 3 2 1 2 1输出样例 6解题思路 可以发现最后能拦住水的都是向两边递减高度(?) 不管两个高积木之间的的积木是怎样乱七八糟的高度,最后能用来装水的…
暂无图片
编程学习 ·

花了大半天写了一个UVC扩展单元调试工具

基于DIRECTSHOW 实现的,用的是MFC VS2019. 详见:http://www.usbzh.com/article/detail-761.html 获取方法 加QQ群:952873936,然后在群文件\USB调试工具&测试软件\UVCXU-V1.0(UVC扩展单元调试工具-USB中文网官方版).exe USB中文网 USB中文…
暂无图片
编程学习 ·

贪心(一):区间问题、Huffman树

区间问题 例题一:区间选点 给定 N 个闭区间 [ai,bi]请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数 N,表示区间数。 接下来 …
暂无图片
编程学习 ·

C语言练习实例——费氏数列

目录 题目 解法 输出结果 题目 Fibonacci为1200年代的欧洲数学家,在他的着作中曾经提到:「若有一只免子每个月生一只小免子,一个月后小免子也开始生产。起初只有一只免子,一个月后就有两只免子,二个月后有三只免子…
暂无图片
编程学习 ·

Android开发(2): Android 资源

个人笔记整理 Android 资源 Android中的资源,一般分为两类: 系统内置资源:Android SDK中所提供的已经定义好的资源,用户可以直接拿来使用。 用户自定义资源:用户自己定义或引入的,只适用于当前应用的资源…
暂无图片
编程学习 ·

零基础如何在短时间内拿到算法offer

​算法工程师是利用算法处理事物的职业 算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。 如果一个算法有缺陷,或不适合于某个问题,执…
暂无图片
编程学习 ·

人工智能:知识图谱实战总结

人工智能python,NLP,知识图谱,机器学习,深度学习人工智能:知识图谱实战前言一、实体建模工具Protegepython,NLP,知识图谱,机器学习,深度学习 人工智能:知识图…
暂无图片
编程学习 ·

【无标题】

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…