我尝试使用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中的一个键中的确切文本字段。但是,它仍然不返回任何结果。任何帮助都是非常感谢的。
1条答案
按热度按时间6rvt4ljy1#
看起来你混合了JSON和HASH注解。您能否尝试在其中一个文档上运行一个HGET命令来验证其结构,并包含一个FT.INFO输出来验证索引参数?
”$.text” as “text”
和”$.embedding” as “embedding”
表明您有一个指向这两个字段的JSON路径,并且您可以创建一个别名,以便在查询中引用它们。但是索引期望在您最初提供的路径下找到要索引的数据,并且由于您没有$.text
和$.embedding
下的数据,因此它无法找到数据,索引仍然为空。尝试替换
字符串
与
型
如果这不是问题所在,如果你能提供我提到的其他数据,我可以提供更好的帮助