我正在尝试访问最相似的向量,但它返回空,我不明白。
我正在关注此文档:https://redis-py.readthedocs.io/en/stable/examples/search_vector_similarity_examples.html
这是我的架构:
schema = (
TagField("ticket_url"),
NumericField("ticket_id"),
NumericField("entity_id"),
VectorField("embedding",
"HNSW", {
"TYPE": "FLOAT32",
"DIM": self.vector_dim,
"DISTANCE_METRIC": "COSINE",
}
),
)
definition = IndexDefinition(
prefix=[self.doc_prefix], index_type=IndexType.HASH)
self.r.ft(self.index_name).create_index(
fields=schema, definition=definition)
搜索相似向量的功能
def search_similar_documents(self, entity_id, vector, topK=5, ticket_id=None):
query = (
Query("*=>[KNN 2 @embedding $vec as score]")
.sort_by("score")
.return_fields("score")
.paging(0, 2)
.dialect(2)
)
query_params = {"vec": vector}
return self.r.ft(self.index_name).search(query, query_params).docs
向量由 openai 响应生成并转换为字节
def embedding_openai(self, text):
try:
response = openai.Embedding.create(
input=text,
model="text-embedding-ada-002"
)
embedding = response['data'][0]['embedding']
array_embedding = np.array(embedding, dtype=np.float32)
return array_embedding.tobytes()
except Exception as ex:
print(ex)
return None
redis.ft(index).info() 返回这个
{'index_name': 'conversations', 'index_options': [], 'index_definition': [b'key_type', b'HASH', b'prefixes', [b'tickets:'], b'default_score', b'1'], 'attributes': [[b'identifier', b'ticket_url', b'attribute', b'ticket_url', b'type', b'TAG', b'SEPARATOR', b','], [b'identifier', b'ticket_id', b'attribute', b'ticket_id', b'type', b'NUMERIC'], [b'identifier', b'entity_id', b'attribute', b'entity_id', b'type', b'NUMERIC'], [b'identifier', b'embedding', b'attribute', b'embedding', b'type', b'VECTOR']], 'num_docs': '973', 'max_doc_id': '973', 'num_terms': '0', 'num_records': '3892', 'inverted_sz_mb': '0.00634765625', 'vector_index_sz_mb': '6.00555419921875', 'total_inverted_index_blocks': '2999', 'offset_vectors_sz_mb': '0', 'doc_table_size_mb': '0.086483001708984375', 'sortable_values_size_mb': '0', 'key_table_size_mb': '0.030145645141601562', 'records_per_doc_avg': '4', 'bytes_per_record_avg': '1.7101746797561646', 'offsets_per_term_avg': '0', 'offset_bits_per_record_avg': '-nan', 'hash_indexing_failures': '0', 'total_indexing_time': '347.62900000000002', 'indexing': '0', 'percent_indexed': '1', 'number_of_uses': 1, 'gc_stats': [b'bytes_collected', b'0', b'total_ms_run', b'0', b'total_cycles', b'0', b'average_cycle_time_ms', b'-nan', b'last_run_time_ms', b'0', b'gc_numeric_trees_missed', b'0', b'gc_blocks_denied', b'0'], 'cursor_stats': [b'global_idle', 0, b'global_total', 0, b'index_capacity', 128, b'index_total', 0], 'dialect_stats': [b'dialect_1', 0, b'dialect_2', 0, b'dialect_3', 0]}
向量存储为字节,我不知道这是算法的问题还是我的问题:/
这个问题解决了吗?可能有几件事
如果您有大量文档并且正在使用 FLAT 索引,则搜索可能不会在分配的 500 毫秒超时内返回。这可以在启动时配置或仅使用 HNSW。
https://redisvl.com 在用户指南中有一些这方面的示例。