KNN Поиск сходства векторов в Redis не дает никаких результатов

Я пытаюсь использовать Redis для хранения векторов внедрения, полученных из API openAi, а затем выполнить поиск по сходству для получения похожих результатов в NodeJs. В целях тестирования на данный момент у меня есть 10 ключей в Redis, но запрос никогда не возвращает записи. Он всегда возвращает пустой список документов:

      { 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);
    }
  }

Эти фрагменты кода присутствуют в разных файлах, но все они вызываются с правильными значениями. Я попытался найти вектор точного текстового поля, хранящегося в одном из ключей Redis. Тем не менее, он не возвращает никаких результатов. Буду признателен за любую оказанную помощь.

1 ответ

Похоже, вы смешиваете аннотации 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',
  },

Если проблема не в этом, я мог бы помочь лучше, если вы предоставите дополнительные данные, которые я упомянул.

Другие вопросы по тегам