Cassandra 文档

版本

您正在查看预发布版本的文档。

向量搜索快速入门

为了启用您的机器学习模型,向量搜索使用数据在数据库中进行相似性比较,即使它没有通过连接明确定义。向量是一个浮点类型的数组,表示特定对象或实体。

向量搜索的基础在于嵌入,它是将文本作为浮点数向量进行紧凑表示。这些嵌入是通过将文本输入 API 生成的,该 API 使用神经网络将输入转换为固定长度的向量。嵌入捕获了文本的语义含义,提供了比传统基于词语的方法更细致的理解。向量表示允许实质上相似的输入产生几何上接近的输出向量;不相似输入在几何上相距更远。

为了启用向量搜索,您的 Cassandra 数据库中提供了一个新的 vector 数据类型,该类型支持向量搜索。

先决条件

没有先决条件任务。

通常,要将向量搜索与 Apache Cassandra 一起使用,您需要遵循以下说明

在本快速入门中,嵌入是随机生成的。通常,您需要将源文档/内容以及要匹配的查询都运行到嵌入生成器中。此示例只是为了展示如何使用 CQL 创建向量搜索数据对象。

创建向量键空间

创建要用于向量搜索表的键空间。此示例使用 cycling 作为 键空间名称

CREATE KEYSPACE IF NOT EXISTS cycling
   WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : '1' };

使用向量键空间

选择要用于向量搜索表的键空间。此示例使用 cycling 作为 键空间名称

USE cycling;

创建向量表

在您的键空间中创建一个新表,包括用于向量的 comments_vector 列。以下代码创建了一个包含五个值的向量

CREATE TABLE IF NOT EXISTS cycling.comments_vs (
  record_id timeuuid,
  id uuid,
  commenter text,
  comment text,
  comment_vector VECTOR <FLOAT, 5>,
  created_at timestamp,
  PRIMARY KEY (id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC);

可选地,您可以更改现有表以添加向量列

ALTER TABLE cycling.comments_vs
   ADD comment_vector VECTOR <FLOAT, 5>(1)

创建向量索引

使用存储附加索引 (SAI) 创建自定义索引

CREATE INDEX IF NOT EXISTS ann_index
  ON cycling.comments_vs(comment_vector) USING 'sai';

有关 SAI 的更多信息,请参阅 存储附加索引 文档。

可以使用定义相似性函数的选项创建索引

CREATE INDEX IF NOT EXISTS ann_index
    ON vsearch.com(item_vector) USING 'sai'
WITH OPTIONS = { 'similarity_function': 'DOT_PRODUCT' };

similarity_function 的有效值为 DOT_PRODUCTCOSINEEUCLIDEAN

将向量数据加载到您的数据库中

使用新类型将数据插入表中

INSERT INTO cycling.comments_vs (record_id, id, created_at, comment, commenter, comment_vector)
   VALUES (
      now(),
      e7ae5cf3-d358-4d99-b900-85902fda9bb0,
      '2017-02-14 12:43:20-0800',
      'Raining too hard should have postponed',
      'Alex',
      [0.45, 0.09, 0.01, 0.2, 0.11]
);
INSERT INTO cycling.comments_vs (record_id, id, created_at, comment, commenter, comment_vector)
   VALUES (
      now(),
      e7ae5cf3-d358-4d99-b900-85902fda9bb0,
      '2017-03-21 13:11:09.999-0800',
      'Second rest stop was out of water',
      'Alex',
      [0.99, 0.5, 0.99, 0.1, 0.34]
);
INSERT INTO cycling.comments_vs (record_id, id, created_at, comment, commenter, comment_vector)
   VALUES (
      now(),
      e7ae5cf3-d358-4d99-b900-85902fda9bb0,
      '2017-04-01 06:33:02.16-0800',
      'LATE RIDERS SHOULD NOT DELAY THE START',
      'Alex',
      [0.9, 0.54, 0.12, 0.1, 0.95]
);

INSERT INTO cycling.comments_vs (record_id, id, created_at, comment, commenter, comment_vector)
   VALUES (
      now(),
      c7fceba0-c141-4207-9494-a29f9809de6f,
      totimestamp(now()),
      'The gift certificate for winning was the best',
      'Amy',
      [0.13, 0.8, 0.35, 0.17, 0.03]
);

INSERT INTO cycling.comments_vs (record_id, id, created_at, comment, commenter, comment_vector)
   VALUES (
      now(),
      c7fceba0-c141-4207-9494-a29f9809de6f,
      '2017-02-17 12:43:20.234+0400',
      'Glad you ran the race in the rain',
      'Amy',
      [0.3, 0.34, 0.2, 0.78, 0.25]
);

INSERT INTO cycling.comments_vs (record_id, id, created_at, comment, commenter, comment_vector)
   VALUES (
      now(),
      c7fceba0-c141-4207-9494-a29f9809de6f,
      '2017-03-22 5:16:59.001+0400',
      'Great snacks at all reststops',
      'Amy',
      [0.1, 0.4, 0.1, 0.52, 0.09]
);
INSERT INTO cycling.comments_vs (record_id, id, created_at, comment, commenter, comment_vector)
   VALUES (
      now(),
      c7fceba0-c141-4207-9494-a29f9809de6f,
      '2017-04-01 17:43:08.030+0400',
      'Last climb was a killer',
      'Amy',
      [0.3, 0.75, 0.2, 0.2, 0.5]
);

使用 CQL 查询向量数据

要使用向量搜索查询数据,请使用 SELECT 查询

SELECT * FROM cycling.comments_vs
    ORDER BY comment_vector ANN OF [0.15, 0.1, 0.1, 0.35, 0.55]
    LIMIT 3;

要获取与查询数据最接近的最佳得分节点的相似性计算作为结果的一部分,请使用 SELECT 查询

SELECT comment, similarity_cosine(comment_vector, [0.2, 0.15, 0.3, 0.2, 0.05])
    FROM cycling.comments_vs
    ORDER BY comment_vector ANN OF [0.1, 0.15, 0.3, 0.12, 0.05]
    LIMIT 1;

此类查询支持的函数为

  • similarity_dot_product

  • similarity_cosine

  • similarity_euclidean

参数为 (<vector_column>, <embedding_value>)。两个参数都表示向量。

  • 限制必须为 1,000 或更少。

  • 向量搜索使用近似最近邻 (ANN),在大多数情况下,其结果几乎与精确匹配一样好。其扩展性优于精确最近邻 (KNN)。

  • 不支持最不相似搜索。

  • 向量搜索在 item_vector 列没有覆盖或删除的表上运行效果最佳。对于 item_vector 列有更改的表,预计搜索结果会更慢。

使用代码示例,您将获得向量搜索的工作示例。加载您自己的数据并使用搜索功能。