当前位置:首页 > 技术知识 > 正文内容

自建知识库AI (十三)之向量搜索与数据库差别——仙盟创梦IDE

maynowei10个月前 (09-04)技术知识130

向量搜索:从基础到进阶,开启智能检索新篇章

对于初学者来说,理解向量搜索与传统 MySQL 分词后 OR 匹配单个词的区别与联系,是踏入这一领域的关键。本文将详细阐述两者的相似点与本质差异,并深入解释向量搜索为何以此命名,过程中穿插小代码和数学公式辅助理解。

一、相似点:基于 “词” 匹配内容

无论是向量搜索还是 MySQL 分词后 OR 的 LIKE 查询,都以 “词” 作为关联内容的桥梁。

MySQL 分词 + OR 查询

以搜索 “人工智能算法” 为例,MySQL 首先会对搜索词进行分词,得到 “人工智能” 和 “算法” 两个词。然后执行查询语句:

sql

WHERE content LIKE '%人工智能%' OR content LIKE '%算法%';

这里通过判断文章内容中是否出现这些词,来确定文章是否与搜索相关。本质上,这是一种基于 “词是否出现” 的判断方式。

向量搜索

向量搜索同样先基于词表进行分词。假设 “人工智能” 和 “算法” 在词表中分别对应索引 0 和 1 。接下来,将关键词和文章都转换为向量。在这个过程中,关键词向量中索引 0 和 1 的权重会升高,而文章向量中这两个位置的数值则表示词出现的频率或重要性。例如,在 JavaScript 中实现简单的向量表示:

javascript

编辑

// 假设词表中有“人工智能”(索引0)和“算法”(索引1)
// 关键词向量
const keywordVector = [0, 0];
keywordVector[0] = 0.8; // “人工智能”权重升高
keywordVector[1] = 0.7; // “算法”权重升高

// 文章向量示例
const articleVector = [0, 0];
// 假设文章中“人工智能”出现频率高,权重设为0.6
articleVector[0] = 0.6; 
// “算法”出现频率低,权重设为0.3
articleVector[1] = 0.3; 

从本质上讲,向量搜索也是通过 “词的存在 / 权重” 来判断文章与关键词的相关性。

二、本质差异:向量搜索能 “量化相关性” 并排序

MySQL 的 OR 查询和向量搜索在判断文章相关性的精细程度上存在显著差异。

MySQL OR 查询的局限

MySQL 的 OR 查询仅能判断文章是否包含搜索词,却无法区分不同文章中包含词的多少以及词的重要性。例如,有以下三篇文章:

  • 文章 A:只包含 “人工智能” 1 个词;
  • 文章 B:包含 “人工智能” + “算法” 2 个词;
  • 文章 C:包含 “人工智能” + “算法” 且多次出现。

在 OR 查询中,这三篇文章会被视为 “同等相关”,只能按照默认顺序(如 ID 排序)展示。这意味着用户可能无法快速获取到最符合需求的文章。

向量搜索的优势

向量搜索通过向量数值和余弦相似度实现了更精细的相关性量化。向量中每个维度的数值直接表示词的重要性,一般来说,词出现的频率越高,权重越大。以之前的例子继续:

  • 文章 A 的向量可能是 [0.8, 0, ...](只包含 “人工智能”);
  • 文章 B 的向量可能是 [0.8, 0.7, ...](包含两个词);
  • 文章 C 的向量可能是 [1.2, 1.0, ...](两个词多次出现)。

这里涉及到一个重要的数学公式来计算向量之间的相似度 —— 余弦相似度。余弦相似度的公式为: \(\text{Cosine Similarity}(A, B) = \frac{A \cdot B}{ \| A \| \times \| B \| }\) 其中,\(A \cdot B\) 是向量 A 和 B 的点积,\(\| A \|\) 和 \(\| B \|\) 分别是向量 A 和 B 的模。

假设关键词 “人工智能算法” 的向量是 [0.9, 0.8, ...],计算可得三篇文章与关键词向量的相似度:

  • 文章 C:0.98
  • 文章 B:0.92
  • 文章 A:0.75

最终,向量搜索会按照相似度从高到低的顺序展示文章,更符合用户想要获取最相关内容的需求。在 JavaScript 中,可以这样实现简单的余弦相似度计算:

javascript

function dotProduct(vec1, vec2) {
    let product = 0;
    for (let i = 0; i < vec1.length; i++) {
        product += vec1[i] * vec2[i];
    }
    return product;
}

function magnitude(vec) {
    let sum = 0;
    for (let i = 0; i < vec.length; i++) {
        sum += vec[i] ** 2;
    }
    return Math.sqrt(sum);
}

function cosineSimilarity(vec1, vec2) {
    const dot = dotProduct(vec1, vec2);
    const mag1 = magnitude(vec1);
    const mag2 = magnitude(vec2);
    if (mag1 === 0 || mag2 === 0) return 0;
    return parseFloat((dot / (mag1 * mag2)).toFixed(6));
}

// 假设已有关键词向量keywordVector和文章向量articleVector
const similarity = cosineSimilarity(keywordVector, articleVector);
console.log(similarity);

三、总结:向量搜索是 “升级版的分词匹配”

向量搜索和 MySQL 的 OR 查询基础逻辑相通,都是基于词表分词来关联内容,本质都是基于词的匹配。但向量搜索更智能,它通过数值量化词的重要性,并利用余弦相似度进行排序,解决了 MySQL OR 查询无法区分相关性强弱的问题,能更精准地返回用户真正想找的内容。简单概括,MySQL 的 OR 查询是 “有没有相关词” 的定性判断,而向量搜索是 “相关度有多高” 的定量计算。

四、为何取名向量

向量搜索之所以如此命名,核心在于它运用了数学上向量的形式和特性来表达文本。虽然其基础逻辑与分词匹配相似,但它将词的出现情况转化为可计算的数值数组,这个数组在数学上就是向量。

具体而言,当把文本(文章或关键词)转化为向量时,实际上是用数组里的每个数字对应词表中每个词的重要性。例如,词表中有 3 个词(“AI”“算法”“数据”),一篇文章的向量可能是 [0.8, 0.3, 0] ,这个数组里的每个位置对应一个词,数字越大说明该词在文章里越重要。

在数学中,向量就是由多个数值组成的有序数组,如二维向量 (x, y)、三维向量 (x, y, z),每个数值代表向量在对应维度上的分量。文本转化后的词 - 权重数组与数学向量的结构完全一致,词表的每个词对应向量的维度,词的权重对应向量在该维度的分量。

更为关键的是,向量搜索的核心 —— 计算相关性,本质上运用了向量的数学特性。比如通过计算两个向量的夹角大小(余弦相似度)来判断它们的相似程度,夹角越小,向量越相似。如果不把文本转化为向量,就无法运用这些数学方法量化相关性,只能停留在有没有词的定性判断层面。因此,尽管基础逻辑与分词匹配相似,但它以向量这种数学形式承载文本信息,并依赖向量的数学特性完成核心计算,故而被称为 “向量搜索”。

阿雪技术观


在科技发展浪潮中,我们不妨积极投身技术共享。不满足于做受益者,更要主动担当贡献者。无论是分享代码、撰写技术博客,还是参与开源项目维护改进,每一个微小举动都可能蕴含推动技术进步的巨大能量。东方仙盟是汇聚力量的天地,我们携手在此探索硅基生命,为科技进步添砖加瓦。

Hey folks, in this wild tech - driven world, why not dive headfirst into the whole tech - sharing scene? Don't just be the one reaping all the benefits; step up and be a contributor too. Whether you're tossing out your code snippets, hammering out some tech blogs, or getting your hands dirty with maintaining and sprucing up open - source projects, every little thing you do might just end up being a massive force that pushes tech forward. And guess what? The Eastern FairyAlliance is this awesome place where we all come together. We're gonna team up and explore the whole silicon - based life thing, and in the process, we'll be fueling the growth of technology

相关文章

单片机C语言编程,心得都在这里了

单片机写代码总踩坑,头文件被无视,老工程师的经验哪里来?前几天写8x8矩阵键盘的程序,搞了三天代码一直乱报错。后来发现自己连头文件是什么都不清楚,之前写的都是小程序,压根没碰过.h文件。看别人的程序都...

Windows 加密盘BitLocker爆锁屏绕过严重漏洞

BitLocker Windows内置现代设备级数据加密保护功能,BitLocker与Windows内核深度集成。有大量的企业和个人使用BitLocker加密自己关键数据,以防止数据泄密。BitLoc...

2018年度回顾:挖矿木马为什么会成为病毒木马黑产的中坚力量

一、概述根据腾讯御见威胁情报中心监测数据,2018年挖矿木马样本月产生数量在百万级别,且上半年呈现快速增长趋势,下半年上涨趋势有所减缓。由于挖矿的收益可以通过数字加密货币系统结算,使黑色产业变现链条十...

网络安全常用术语(网络安全常用术语介绍)

黑客帽子之分白帽白帽:亦称白帽黑客、白帽子黑客,是指那些专门研究或者从事网络、计算机技术防御的人,他们通常受雇于各大公司,是维护世界网络、计算机安全的主要力量。很多白帽还受雇于公司,对产品进行模拟黑客...

C语言进阶教程:线程同步:互斥锁、条件变量与信号量

在多线程编程中,线程同步是确保数据一致性和程序正确性的关键。当多个线程需要访问共享资源时,如果缺乏适当的同步机制,就可能导致竞态条件(Race Condition)、死锁(Deadlock)等问题。本...

如何正确理解Java领域中的并发锁,我们应该具体掌握到什么程度?

苍穹之边,浩瀚之挚,眰恦之美; 悟心悟性,善始善终,惟善惟道! —— 朝槿《朝槿兮年说》写在开头对于Java领域中的锁,其实从接触Java至今,我相信每一位Java Developer都会有这样的一个...