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

自建知识库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

相关文章

单打独斗的产品设计师工作流程总结

来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。我从入行开始就在一个做自己产品的小公司工作,到现在已经三年了。刚开始工作的时候什么也不懂,老板说让出效果图,就开始直接...

Android监听滚动视图(监听页面滚动)

Android UI Libs之Android-ObservableScrollView1. 说明Android-ObservableScrollView,顾名思义,Android上观察滚动的视图,可...

Flutter 之 ListView(flutter框架)

在 Flutter 中,ListView 可以沿一个方向(垂直或水平方向)来排列其所有子 Widget,常被用于需要展示一组连续视图元素的场景ListView 构造方法ListView:仅适用于列表中...

C# 中的多线程同步机制:lock、Monitor 和 Mutex 用法详解

在多线程编程中,线程同步是确保多个线程安全地访问共享资源的关键技术。C# 提供了几种常用的同步机制,其中 lock、Monitor 和 Mutex 是最常用的同步工具。本文将全面介绍这三种同步机制的用...

CPU「离奇」飙到 100%!开发者挖出 Linux 内核 16 年老 Bug:这么多年竟无人发现?

【CSDN 编者按】每一次对旧设备的升级都仿佛是一场跨越时代的冒险。本文作者致力于将基于 PXA166 的 Chumby 8 设备从 Linux 2.6.28 版本升级到现代 6.x 版本,然而,在看...

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

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