У меня возникли проблемы с возвратом результатов векторного поиска в PostgreSQL. Я создал индекс HNSW для столбцов answer_embedding и answer_keyword_embedding.
На Python я написал эту функцию, чтобы возвращать 5 наиболее распространенных документов на основе встраивания ответа QA. Это работает:
similarity_score = (
(Document.answer_embedding.op('')(embedding_array)) +
(Document.answer_keyword_embedding.op('')(keyword_embedding_array))
)
query = (
select(Document.doc_id, Document.answer))
.order_by(similarity_score)
.limit(max_neighbors)
)
results = session.execute(query).all()
Однако я также хочу получить оценку актуальности каждого документа. Что бы я ни делал, я вижу следующее сообщение об ошибке:
Сессия не удалась: объект 'float' не подлежит подписке
Следующие фрагменты кода выдают одну и ту же ошибку:
Сессия не удалась: объект 'float' не подлежит подписке p>
query = (
select(Document.doc_id, Document.answer,similarity_score.label("similarity"))
.order_by(similarity_score)
.limit(max_neighbors)
)
query = (
select(Document).add_columns(similarity_score.label("similarity"))
.order_by(similarity_score)
.limit(max_neighbors)
)
Если я преобразую его в использование полного текста запроса, я получу ошибку, что оператор «»/»» не распознается.
Когда я печатаю запрос, он выглядит так.
Query: SELECT "Document"."DocId", "Document"."Answer", ("Document"."AnswerEmbedding" :AnswerEmbedding_1) + ("Document"."AnswerKeywordEmbedding" :AnswerKeywordEmbedding_1) AS similarity
FROM "Document" ORDER BY ("Document"."AnswerEmbedding" :AnswerEmbedding_1) + ("Document"."AnswerKeywordEmbedding" :AnswerKeywordEmbedding_1)
LIMIT :param_1
Поскольку я могу получить документы, мне трудно понять, почему я не могу получить оценку для каждого документа.
Обеспечение обратной трассировки ниже:
File "path/to/database.py", line 142, in retrieve_documents
results = session.execute(query).scalars().all()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "path/to/sqlalchemy/engine/result.py", line 1769, in all
return self._allrows()
^^^^^^^^^^^^^^^
File "path/to/sqlalchemy/engine/result.py", line 548, in _allrows
rows = self._fetchall_impl()
^^^^^^^^^^^^^^^^^^^^^
File "path/to/sqlalchemy/engine/result.py", line 1676, in _fetchall_impl
return self._real_result._fetchall_impl()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "path/to/sqlalchemy/engine/result.py", line 2270, in _fetchall_impl
return list(self.iterator)
^^^^^^^^^^^^^^^^^^^
File "path/to/sqlalchemy/orm/loading.py", line 219, in chunks
fetch = cursor._raw_all_rows()
^^^^^^^^^^^^^^^^^^^^^^
File "path/to/sqlalchemy/engine/result.py", line 541, in _raw_all_rows
return [make_row(row) for row in rows]
^^^^^^^^^^^^^
File "path/to/sqlalchemy/cyextension/resultproxy.pyx", line 22, in sqlalchemy.cyextension.resultproxy.BaseRow.__init__
File "path/to/sqlalchemy/cyextension/resultproxy.pyx", line 79, in sqlalchemy.cyextension.resultproxy._apply_processors
File "path/to/pgvector/sqlalchemy/vector.py", line 33, in process
return Vector._from_db(value)
^^^^^^^^^^^^^^^^^^^^^^
File "path/to/pgvector/utils/vector.py", line 71, in _from_db
return cls.from_text(value).to_numpy().astype(np.float32)
^^^^^^^^^^^^^^^^^^^^
File "path/to/pgvector/utils/vector.py", line 36, in from_text
return cls([float(v) for v in value[1:-1].split(',')])
~~~~~^^^^^^
TypeError: 'float' object is not subscriptable
Подробнее здесь: https://stackoverflow.com/questions/790 ... postgresql