跳至主要内容

Cassandra

兼容性

仅适用于 Node.js。

Apache Cassandra® 是一个 NoSQL、面向行的、高度可扩展且高度可用的数据库。

最新版本 的 Apache Cassandra 原生支持向量相似性搜索。

设置

首先,安装 Cassandra Node.js 驱动程序

npm install cassandra-driver @langchain/community @langchain/openai

根据您的数据库提供商,连接到数据库的具体方式会有所不同。我们将创建一个名为 configConnection 的文档,该文档将用作向量存储配置的一部分。

Apache Cassandra®

向量搜索在Apache Cassandra® 5.0 及更高版本中受支持。您可以使用标准连接文档,例如

const configConnection = {
contactPoints: ['h1', 'h2'],
localDataCenter: 'datacenter1',
credentials: {
username: <...> as string,
password: <...> as string,
},
};

Astra DB

Astra DB 是一个云原生 Cassandra 即服务平台。

  1. 创建一个Astra DB 帐户
  2. 创建一个启用向量的数据库
  3. 创建一个令牌 用于您的数据库。
const configConnection = {
serviceProviderArgs: {
astra: {
token: <...> as string,
endpoint: <...> as string,
},
},
};

您可以提供属性 datacenterID: 以及可选的 regionName:,而不是 endpoint:

索引文档

import { CassandraStore } from "langchain/vectorstores/cassandra";
import { OpenAIEmbeddings } from "@langchain/openai";

// The configConnection document is defined above
const config = {
...configConnection,
keyspace: "test",
dimensions: 1536,
table: "test",
indices: [{ name: "name", value: "(name)" }],
primaryKey: {
name: "id",
type: "int",
},
metadataColumns: [
{
name: "name",
type: "text",
},
],
};

const vectorStore = await CassandraStore.fromTexts(
["I am blue", "Green yellow purple", "Hello there hello"],
[
{ id: 2, name: "2" },
{ id: 1, name: "1" },
{ id: 3, name: "3" },
],
new OpenAIEmbeddings(),
cassandraConfig
);

查询文档

const results = await vectorStore.similaritySearch("Green yellow purple", 1);

或过滤后的查询

const results = await vectorStore.similaritySearch("B", 1, { name: "Bubba" });

向量类型

Cassandra 支持 cosine(默认)、dot_producteuclidean 相似性搜索;这在首次创建向量存储时定义,并在构造函数参数 vectorType 中指定,例如

  ...,
vectorType: "dot_product",
...

索引

Cassandra 5 版本引入了存储附加索引(SAI)。这些允许 WHERE 过滤,而无需指定分区键,并允许使用其他运算符类型,如非等式。您可以使用 indices 参数定义这些,该参数接受零个或多个字典,每个字典都包含 namevalue 条目。

索引是可选的,但如果对非分区列使用过滤后的查询,则需要它们。

  • name 条目是对象名称的一部分;在名为 test_table 的表上,索引 name: "some_column" 将是 idx_test_table_some_column
  • value 条目是在其上创建索引的列,用 () 括起来。对于上面的列 some_column,它将被指定为 value: "(some_column)"
  • 可选的 options 条目是传递到 CREATE CUSTOM INDEX 语句的 WITH OPTIONS = 子句的映射。此映射上的特定条目是特定于索引类型的。
  indices: [{ name: "some_column", value: "(some_column)" }],

高级过滤

默认情况下,过滤器将使用等式 = 应用。对于那些具有 indices 条目的字段,您可以提供一个 operator,其中包含索引支持的值的字符串;在这种情况下,您指定一个或多个过滤器,作为单例或在列表中(将被 AND-ed )。例如

   { name: "create_datetime", operator: ">", value: some_datetime_variable }

[
{ userid: userid_variable },
{ name: "create_datetime", operator: ">", value: some_date_variable },
];

value 可以是单个值或数组。如果它不是数组,或者 value 中只有一个元素,则生成的查询将类似于 ${name} ${operator} ?,其中 value 绑定到 ?

如果 value 数组中有多个元素,则计算 name 中未加引号的 ? 的数量,并从 value 的长度中减去,并将此数量的 ? 放置在运算符的右侧;如果有多个 ?,则它们将被封装在 () 中,例如 (?, ?, ?)

这有助于在运算符左侧进行绑定值,这对某些函数很有用;例如地理距离过滤器

{
name: "GEO_DISTANCE(coord, ?)",
operator: "<",
value: [new Float32Array([53.3730617,-6.3000515]), 10000],
},

数据分区和复合键

在某些系统中,您可能希望出于各种原因对数据进行分区,也许是按用户或按会话进行分区。Cassandra 中的数据始终按分区进行;默认情况下,此库将按第一个主键字段进行分区。您可以指定构成记录主键(唯一键)的多个列,并可以选择指定应作为分区键一部分的那些字段。例如,向量存储可以按 useridcollectionid 分区,其他字段 dociddocpart 使单个条目唯一

  ...,
primaryKey: [
{name: "userid", type: "text", partition: true},
{name: "collectionid", type: "text", partition: true},
{name: "docid", type: "text"},
{name: "docpart", type: "int"},
],
...

在搜索时,您可以在过滤器中包含分区键,而无需为这些列定义indices;您不需要指定所有分区键,但必须指定键中的第一个。在上面的示例中,您可以指定{userid: userid_variable}{userid: userid_variable, collectionid: collectionid_variable}的过滤器,但是如果您想指定仅{collectionid: collectionid_variable}的过滤器,则必须在indices列表中包含collectionid

其他配置选项

在配置文档中,提供了更多可选参数;它们的默认值为

  ...,
maxConcurrency: 25,
batchSize: 1,
withClause: "",
...
参数用法
maxConcurrency在给定时间内将向 Cassandra 发送多少个并发请求。
batchSize单个请求向 Cassandra 发送多少个文档。当使用大于 1 的值时,您应该确保您的批次大小不会超过 Cassandra 参数batch_size_fail_threshold_in_kb。批次是不记录的。
withClauseCassandra 表可以创建带有可选的WITH 子句;这通常不需要,但为了完整性而提供。

此页面有帮助吗?


您也可以留下详细的反馈 在 GitHub 上.