NodeJS Redis中的KNN向量相似性搜索,不返回任何结果

p1tboqfb  于 2023-08-04  发布在  Node.js
关注(0)|答案(1)|浏览(172)

我尝试使用Redis存储从openAi API返回的嵌入向量,然后在NodeJs中执行相似性搜索以检索相似的结果。出于测试目的,我目前在Redis中有10个键,但查询从未返回记录。它总是返回一个空的文档列表:

{ total: 0, documents: [] }

字符串
架构声明:

const schema: RediSearchSchema = {
      '$.text': {
        type: SchemaFieldTypes.TEXT,
        AS: 'text',
      },
      '$.embedding': {
        type: SchemaFieldTypes.VECTOR,
        ALGORITHM: VectorAlgorithms.HNSW,
        TYPE: 'FLOAT32',
        DIM: 1536,
        DISTANCE_METRIC: 'COSINE',
        AS: 'embedding',
      },
    };
    
RedisClient.registerIndex({
      schema: schema,
      name: 'contexts',
      prefix: KNOWLEGE_KEYS_PREFIX,
    });


索引创建:

private static async createIndices() {
    RedisClient.indices.forEach(async (i) => {
      try {
        await RedisClient.client.ft.CREATE(i.name, i.schema, {
          ON: 'HASH',
          PREFIX: i.prefix,
        });
      } catch (err) {
        const message = `index ${i.name} already exists`;
        Logger.logError(message);
      }
    });
  }

static registerIndex(ri: RedisIndex) {
    RedisClient.indices.push(ri);
  }


载体添加:

RedisClient.client.HSET(key, {
          text: e.text,
          embedding: Buffer.from(new Float32Array(e.vector).buffer),
        });


用于执行向量搜索的代码:

static async search(indexName: string, queryVector: Buffer, vectorFieldName = 'embedding', top = 5): Promise<any> {
    try {
      const query = `*=>[KNN ${top} @${vectorFieldName} $queryVector AS vec_score]`;
      console.log(query);
      const result = await RedisClient.client.ft.search(indexName, query, {
        PARAMS: {
          queryVector: queryVector,
        },
        DIALECT: 2,
        RETURN: ['text', 'vec_score'],
        SORTBY: 'vec_score',
        LIMIT: {
          from: 0,
          size: top,
        },
      });
      console.log(result);
      return result;
    } catch (err) {
      console.log(err);
      Logger.logError(err);
    }
  }


这些代码片段存在于不同的文件中,但都是使用适当的值调用的。我试过在vector中搜索存储在Redis中的一个键中的确切文本字段。但是,它仍然不返回任何结果。任何帮助都是非常感谢的。

6rvt4ljy

6rvt4ljy1#

看起来你混合了JSON和HASH注解。您能否尝试在其中一个文档上运行一个HGET命令来验证其结构,并包含一个FT.INFO输出来验证索引参数?
”$.text” as “text””$.embedding” as “embedding”表明您有一个指向这两个字段的JSON路径,并且您可以创建一个别名,以便在查询中引用它们。但是索引期望在您最初提供的路径下找到要索引的数据,并且由于您没有$.text$.embedding下的数据,因此它无法找到数据,索引仍然为空。
尝试替换

'$.text': {
    type: SchemaFieldTypes.TEXT,
    AS: 'text',
  },
  '$.embedding': {
    type: SchemaFieldTypes.VECTOR,
    ALGORITHM: VectorAlgorithms.HNSW,
    TYPE: 'FLOAT32',
    DIM: 1536,
    DISTANCE_METRIC: 'COSINE',
    AS: 'embedding',
  },

字符串

'text': {
    type: SchemaFieldTypes.TEXT,
  },
  'embedding': {
    type: SchemaFieldTypes.VECTOR,
    ALGORITHM: VectorAlgorithms.HNSW,
    TYPE: 'FLOAT32',
    DIM: 1536,
    DISTANCE_METRIC: 'COSINE',
  },


如果这不是问题所在,如果你能提供我提到的其他数据,我可以提供更好的帮助

相关问题