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',
},
Если проблема не в этом, я мог бы помочь лучше, если вы предоставите дополнительные данные, которые я упомянул.