自建知识库AI (十三)之向量搜索与数据库差别——仙盟创梦IDE
向量搜索:从基础到进阶,开启智能检索新篇章
对于初学者来说,理解向量搜索与传统 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