-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
TiDB vector search doc #18502
TiDB vector search doc #18502
Changes from 80 commits
48f906c
0b31525
96f2701
3fdab1b
98e417b
9bd83d6
52934cb
26027f9
df68638
febd534
69429af
d285b55
3852ed3
93b7e90
15e18d0
402f1d0
f869c42
374b687
ea2b0b1
2cf3e79
0eea4d7
93fe602
abe5eac
a01ba0e
48f47af
f9b6dc0
ae94864
f485b58
2e56e20
bb7ce0b
d50b638
5290946
eb604f7
65656f8
99f9ab7
2c5efa4
b2e32b7
9a51513
c09d85f
bf063b7
9eaf1f7
c62f7c9
0083ea1
6a673b9
5ebe116
a250dff
94e8ab5
634c602
4b54e6d
5eeb336
c6dad29
9a77c65
502bd52
652b639
05784ea
cfacbef
3a68b70
eb42ae8
8d938d4
f7a31f2
894fcd4
92e1aee
0f91e5a
39958f3
f8af8f6
12abce8
c9ef22f
3350c10
f18d840
9cbc09e
13bc862
7704118
d135903
f374485
2ba7811
c7fedb4
28164e7
b862a36
7c4e8bd
95338ee
1b5fa2f
03d3cb5
1c39b37
0010207
9fee36a
ad6eeb1
44995da
ead511b
7fbbed3
f51d860
c00b0fc
6d13acc
36d03f9
e03d678
30118d0
fac90f3
5480123
5e0c7d5
18a286b
97d997e
a93a7d2
dd38923
6243bd0
52e696f
bf35116
6fa2321
a13da5f
f87d771
960218c
8b3f476
7ace7de
a3cd4e8
9aa03cd
b8a100a
57aacb9
4f3560b
d82bb79
c4d049e
cc21bc8
b50a16e
7125775
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -120,6 +120,7 @@ TiDB 支持将数据备份到 Amazon S3、Google Cloud Storage (GCS)、Azure Blo | |
| 全局临时表 | | 确保使用 BR v5.3.0 及以上版本进行备份和恢复,否则会导致全局临时表的表定义错误。 | | ||
| TiDB Lightning 物理导入模式| |上游数据库使用 TiDB Lightning 物理导入模式导入的数据,无法作为数据日志备份下来。推荐在数据导入后执行一次全量备份,细节参考[上游数据库使用 TiDB Lightning 物理导入模式导入数据的恢复](/faq/backup-and-restore-faq.md#上游数据库使用-tidb-lightning-物理导入模式导入数据时为什么无法使用日志备份功能)。| | ||
| TiCDC | | BR v8.2.0 及以上版本:如果在恢复的目标集群有 [CheckpointTS](/ticdc/ticdc-architecture.md#checkpointts) 早于 BackupTS 的 Changefeed,BR 会拒绝执行恢复。BR v8.2.0 之前的版本:如果在恢复的目标集群有任何活跃的 TiCDC Changefeed,BR 会拒绝执行恢复。 | | ||
| 向量搜索 | | 确保使用 BR v8.4.0 及以上版本进行备份与恢复。不支持将带有向量数据类型的恢复至 v8.4.0 之前的 TiDB 集群。 | | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add limitation about BR
JaySon-Huang marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
### 版本间兼容性 | ||
|
||
|
Original file line number | Diff line number | Diff line change | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -60,6 +60,10 @@ tiup install dm dmctl | |||||||||||||
|
||||||||||||||
- DM 不支持 MySQL 8.0 的新特性 binlog 事务压缩 [Transaction_payload_event](https://dev.mysql.com/doc/refman/8.0/en/binary-log-transaction-compression.html)。使用 binlog 事务压缩有导致上下游数据不一致的风险。 | ||||||||||||||
|
||||||||||||||
+ 向量类型数据同步 | ||||||||||||||
|
||||||||||||||
- DM 不支持 MySQL 9.0 的向量数据类型同步。 | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add limitation about DM There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @JaySon-Huang 请问上面的"同步"同时包括“全量数据迁移和增量数据同步吗”,如果是,可以修改成下面这样吗
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @qiancai LGTM |
||||||||||||||
|
||||||||||||||
## Contributing | ||||||||||||||
|
||||||||||||||
欢迎参与 DM 开源项目并万分感谢您的贡献,可以查看 [CONTRIBUTING.md](https://github.com/pingcap/tiflow/blob/master/dm/CONTRIBUTING.md) 了解更多信息。 | ||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,248 @@ | ||
--- | ||
title: 向量数据类型 | ||
summary: 本文介绍 TiDB 的向量数据类型。 | ||
--- | ||
|
||
# 向量数据类型 (Vector) | ||
|
||
向量指的是一组浮点数序列,例如 `[0.3, 0.5, -0.1, ...]`。针对 AI 应用中大量使用到的嵌入向量 (vector embedding) 数据,TiDB 专门提供了向量数据类型,以便高效地存储和访问这些数据。 | ||
|
||
> **警告:** | ||
> | ||
> 该功能目前为实验特性,不建议在生产环境中使用。该功能可能会在未事先通知的情况下发生变化或删除。如果发现 bug,请在 GitHub 上提 [issue](https://github.com/pingcap/tidb/issues) 反馈。 | ||
|
||
目前支持的向量数据类型包括: | ||
|
||
- `VECTOR`: 存储一组单精度浮点数 (Float) 向量,向量维度可以是任意的。 | ||
- `VECTOR(D)`: 存储一组单精度浮点数 (Float) 向量,向量维度固定为 `D`。 | ||
qiancai marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
与使用 [`JSON`](/data-type-json.md) 类型相比,使用向量类型具有以下优势: | ||
|
||
- 支持向量索引。可以通过构建[向量搜索索引](/vector-search-index.md)加速查询。 | ||
- 可指定维度。指定一个固定维度后,不符合维度的数据将被阻止写入到表中。 | ||
- 存储格式更优。向量数据类型针对向量数据进行了特别优化,在空间利用和性能效率上都优于 `JSON` 类型。 | ||
|
||
## 语法 | ||
|
||
可以使用以下格式的字符串来表示一个数据类型为向量的值: | ||
|
||
```sql | ||
'[<float>, <float>, ...]' | ||
``` | ||
|
||
示例: | ||
|
||
```sql | ||
CREATE TABLE vector_table ( | ||
id INT PRIMARY KEY, | ||
embedding VECTOR(3) | ||
); | ||
|
||
INSERT INTO vector_table VALUES (1, '[0.3, 0.5, -0.1]'); | ||
|
||
INSERT INTO vector_table VALUES (2, NULL); | ||
``` | ||
|
||
当将不符合语法的字符串作为向量数据插入时,TiDB 会进行报错: | ||
qiancai marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
```sql | ||
[tidb]> INSERT INTO vector_table VALUES (3, '[5, ]'); | ||
ERROR 1105 (HY000): Invalid vector text: [5, ] | ||
``` | ||
|
||
下面的示例中 `embedding` 向量列的维度在建表时已经定义为 `3`,因此当插入其他维度的向量数据时,TiDB 会进行报错: | ||
qiancai marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
```sql | ||
[tidb]> INSERT INTO vector_table VALUES (4, '[0.3, 0.5]'); | ||
ERROR 1105 (HY000): vector has 2 dimensions, does not fit VECTOR(3) | ||
``` | ||
|
||
可参阅[向量函数与操作符](/vector-search-functions-and-operators.md)了解向量数据类型支持的所有函数和操作符。 | ||
|
||
可参阅[向量搜索索引](/vector-search-index.md)了解向量搜索索引的信息。 | ||
qiancai marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
## 混合存储不同维度的向量 | ||
|
||
省略 `VECTOR` 类型中的维度参数后,就可以在同一列中存储不同维度的向量: | ||
|
||
```sql | ||
CREATE TABLE vector_table ( | ||
id INT PRIMARY KEY, | ||
embedding VECTOR | ||
); | ||
|
||
INSERT INTO vector_table VALUES (1, '[0.3, 0.5, -0.1]'); -- 插入一个 3 维向量 | ||
INSERT INTO vector_table VALUES (2, '[0.3, 0.5]'); -- 插入一个 2 维向量 | ||
``` | ||
|
||
需要注意的是,存储了不同维度向量的列不支持构建[向量搜索索引](/vector-search-index.md),因为只有维度相同的向量之间才能计算向量距离。 | ||
|
||
## 比较 | ||
|
||
[比较运算符](/vector-search-functions-and-operators.md#扩展的内置函数和运算符) 如 `=`, `!=`, `<`, `>`, `<=` 和 `>=` 等都能正常对向量数据进行比较。可参阅[向量函数与操作符](/vector-search-functions-and-operators.md#扩展的内置函数和运算符)了解向量数据类型支持的所有函数和操作符。 | ||
qiancai marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
比较向量数据类型时,TiDB 会以向量中的各个元素为单位进行依次比较,如: | ||
|
||
- `[1] < [12]` | ||
- `[1,2,3] < [1,2,5]` | ||
- `[1,2,3] = [1,2,3]` | ||
- `[2,2,3] > [1,2,3]` | ||
|
||
当两个向量的维度不同时,TiDB 采用字典序 (Lexicographical Order) 进行比较,具体规则如下: | ||
|
||
- 两个向量中的各个元素逐一进行数值比较。 | ||
- 当遇到第一个不同的元素时,它们之间的数值比较结果即为两个向量之间的比较结果。 | ||
- 如果一个向量是另一个向量的前缀,那么维度小的向量 _小于_ 维度大的向量。例如,`[1,2,3] < [1,2,3,0]`。 | ||
- 长度相同且各个元素相同的两个向量 _相等_ 。 | ||
- 空向量 _小于_ 任何非空向量。例如,`[] < [1]`。 | ||
- 两个空向量 _相等_ 。 | ||
qiancai marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
|
||
qiancai marked this conversation as resolved.
Show resolved
Hide resolved
|
||
在进行向量比较时,请使用[显式转换](#类型转换-cast)将向量数据从字符串转换为向量类型,以避免 TiDB 直接基于字符串进行比较: | ||
|
||
```sql | ||
-- 因为给出的数据实际上是字符串,因此 TiDB 会按字符串进行比较 | ||
[tidb]> SELECT '[12.0]' < '[4.0]'; | ||
+--------------------+ | ||
| '[12.0]' < '[4.0]' | | ||
+--------------------+ | ||
| 1 | | ||
+--------------------+ | ||
1 row in set (0.01 sec) | ||
|
||
-- 显式转换为向量类型,从而按照向量的比较规则进行正确的比较 | ||
[tidb]> SELECT VEC_FROM_TEXT('[12.0]') < VEC_FROM_TEXT('[4.0]'); | ||
+--------------------------------------------------+ | ||
| VEC_FROM_TEXT('[12.0]') < VEC_FROM_TEXT('[4.0]') | | ||
+--------------------------------------------------+ | ||
| 0 | | ||
+--------------------------------------------------+ | ||
1 row in set (0.01 sec) | ||
``` | ||
|
||
## 运算 | ||
|
||
向量数据类型支持算术运算 `+` 和 `-`,对应的是两个向量以元素为单位进行的加法和减法。不支持对不同维度向量进行算术运算,执行这类运算会遇到报错。 | ||
|
||
以下是一些示例: | ||
|
||
```sql | ||
[tidb]> SELECT VEC_FROM_TEXT('[4]') + VEC_FROM_TEXT('[5]'); | ||
+---------------------------------------------+ | ||
| VEC_FROM_TEXT('[4]') + VEC_FROM_TEXT('[5]') | | ||
+---------------------------------------------+ | ||
| [9] | | ||
+---------------------------------------------+ | ||
1 row in set (0.01 sec) | ||
|
||
[tidb]> SELECT VEC_FROM_TEXT('[2,3,4]') - VEC_FROM_TEXT('[1,2,3]'); | ||
+-----------------------------------------------------+ | ||
| VEC_FROM_TEXT('[2,3,4]') - VEC_FROM_TEXT('[1,2,3]') | | ||
+-----------------------------------------------------+ | ||
| [1,1,1] | | ||
+-----------------------------------------------------+ | ||
1 row in set (0.01 sec) | ||
|
||
[tidb]> SELECT VEC_FROM_TEXT('[4]') + VEC_FROM_TEXT('[1,2,3]'); | ||
ERROR 1105 (HY000): vectors have different dimensions: 1 and 3 | ||
``` | ||
|
||
## 类型转换 (Cast) | ||
|
||
### 向量与字符串之间的转换 | ||
|
||
可以使用以下函数在向量和字符串之间进行转换: | ||
|
||
- `CAST(... AS VECTOR)`:将字符串类型转换为向量类型 | ||
- `CAST(... AS CHAR)`:将向量类型转换为字符串类型 | ||
- `VEC_FROM_TEXT`:将字符串类型转换为向量类型 | ||
- `VEC_AS_TEXT`:将向量类型转换为字符串类型 | ||
|
||
出于易用性考虑,如果你使用的函数只支持向量数据类型(例如,向量相关距离函数),那么你也可以直接传入符合格式要求的字符串数据,TiDB 会进行隐式转换: | ||
|
||
```sql | ||
-- VEC_DIMS 只接受向量类型,因此你可以直接传入字符串类型,TiDB 会隐式转换为向量类型: | ||
[tidb]> SELECT VEC_DIMS('[0.3, 0.5, -0.1]'); | ||
+------------------------------+ | ||
| VEC_DIMS('[0.3, 0.5, -0.1]') | | ||
+------------------------------+ | ||
| 3 | | ||
+------------------------------+ | ||
1 row in set (0.01 sec) | ||
|
||
-- 也可以使用 VEC_FROM_TEXT 显式地将字符串转换为向量类型后传递给 VEC_DIMS 函数: | ||
[tidb]> SELECT VEC_DIMS(VEC_FROM_TEXT('[0.3, 0.5, -0.1]')); | ||
+---------------------------------------------+ | ||
| VEC_DIMS(VEC_FROM_TEXT('[0.3, 0.5, -0.1]')) | | ||
+---------------------------------------------+ | ||
| 3 | | ||
+---------------------------------------------+ | ||
1 row in set (0.01 sec) | ||
|
||
-- 也可以使用 CAST(... AS VECTOR) 进行显式转换: | ||
[tidb]> SELECT VEC_DIMS(CAST('[0.3, 0.5, -0.1]' AS VECTOR)); | ||
+----------------------------------------------+ | ||
| VEC_DIMS(CAST('[0.3, 0.5, -0.1]' AS VECTOR)) | | ||
+----------------------------------------------+ | ||
| 3 | | ||
+----------------------------------------------+ | ||
1 row in set (0.01 sec) | ||
``` | ||
|
||
当你使用的运算符或函数接受多种数据类型时,TiDB 不会进行隐式转换,请先显式地将字符串类型转换为向量类型后,再传递给这些运算符或函数。例如,进行比较运算前,需要显式地将字符串转换为向量类型,否则 TiDB 将会按照字符串类型进行比较,而非按照向量类型进行比较: | ||
|
||
```sql | ||
-- 传入的类型是字符串,因此 TiDB 会按字符串进行比较: | ||
[tidb]> SELECT '[12.0]' < '[4.0]'; | ||
+--------------------+ | ||
| '[12.0]' < '[4.0]' | | ||
+--------------------+ | ||
| 1 | | ||
+--------------------+ | ||
1 row in set (0.01 sec) | ||
|
||
-- 转换为向量类型,以便使用向量类型的比较规则: | ||
[tidb]> SELECT VEC_FROM_TEXT('[12.0]') < VEC_FROM_TEXT('[4.0]'); | ||
+--------------------------------------------------+ | ||
| VEC_FROM_TEXT('[12.0]') < VEC_FROM_TEXT('[4.0]') | | ||
+--------------------------------------------------+ | ||
| 0 | | ||
+--------------------------------------------------+ | ||
1 row in set (0.01 sec) | ||
``` | ||
|
||
向量也可以显式地转换为字符串。以使用 `VEC_AS_TEXT()` 函数为例: | ||
|
||
```sql | ||
-- 字符串首先被隐式地转换成向量,然后被显式地转为字符串,因而返回了一个规范化的字符串格式: | ||
[tidb]> SELECT VEC_AS_TEXT('[0.3, 0.5, -0.1]'); | ||
+--------------------------------------+ | ||
| VEC_AS_TEXT('[0.3, 0.5, -0.1]') | | ||
+--------------------------------------+ | ||
| [0.3,0.5,-0.1] | | ||
+--------------------------------------+ | ||
1 row in set (0.01 sec) | ||
``` | ||
|
||
如需了解其他转换函数,请参阅[向量函数和操作符](/vector-search-functions-and-operators.md)。 | ||
|
||
### 向量与其他数据类型之间的转换 | ||
|
||
目前 TiDB 无法直接在向量和其他数据类型(如 `JSON`)之间进行转换,但你可以使用字符串作为中间类型进行转换。 | ||
|
||
## 使用限制 | ||
|
||
- 向量最大支持 16383 维。 | ||
- 向量数据中不支持 `NaN`、`Infinity` 和 `-Infinity` 浮点数。 | ||
- 目前,向量类型不能存储双精度浮点数。计划在未来的版本中支持这一功能。在此期间,如果为向量类型导入双精度浮点数,它们将被转换为单精度数。 | ||
|
||
有关其他限制,请参阅[向量搜索限制](/vector-search-limitations.md)。 | ||
EricZequan marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
## MySQL 兼容性 | ||
|
||
向量数据类型只在 TiDB 中支持,MySQL 不支持。 | ||
|
||
## 另请参阅 | ||
|
||
- [向量函数和操作符](/vector-search-functions-and-operators.md) | ||
- [向量搜索索引](/vector-search-index.md) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
preview: https://pr.pingcap-docsite-preview.pages.dev/zh/tidb/dev/vector-search-overview