SQL-запрос PGvector Django не регистрирует векторный тип данных

Я использую PGvector с Django. Хотя я обычно использую функциональность ORM PGvector, этот вариант использования требует сложного запроса, который я запускаю в необработанном SQL, как показано ниже.

      from .embed_utils import oaiembed
from .models import Embedding
from pgvector.django import HnswIndex
from django.db import connection

# TODO add performance metrics from time library
test_vector = [0.1] * 1536


def queryModel(k, query):
    response = Embedding.objects.order_by(HnswIndex('embedding', query))[:k]
    print('response: ', response)
    return response



def djankQueryModel(qvector, k, project_id):
    '''
    Query the database for the k nearest neighbors to a given vector

    Parameters
    ----------
    ref_vector : list
        The vector to query for nearest neighbors
    k : int
        The number of nearest neighbors to return
    project_id : str
        The project ID to filter the query by

    Returns
    -------
    rows : list
        A list of tuples containing the product data and embedding data for the k nearest neighbors
    '''


    print(type(qvector))

    raw_query = '''
    SELECT e.*, p.*
    FROM embeddings e
    JOIN products p ON e.product_id = p.product_id
    WHERE e.embedding_id IN (
        SELECT e1.embedding_id
        FROM embeddings e1
        JOIN (
            SELECT product_id, MIN(embedding <#> %s) as min_distance
            FROM embeddings
            GROUP BY product_id
            ORDER BY min_distance ASC
            LIMIT %s
        ) as unique_products ON e1.product_id = unique_products.product_id
    )
    ORDER BY e.embedding <-> %s
    LIMIT %s;
    '''

    with connection.cursor() as cursor:
        cursor.execute(raw_query, [qvector, k, qvector, k])
        rows = cursor.fetchall()

    # Convert rows to your model instances or process as needed
    return rows

def vectorQuery(k, query, project_id):
    '''
    Query the database for the k nearest neighbors to a given vector

    Parameters
    ----------
    k : int
        The number of nearest neighbors to return
    query : str
        The query to embed and find nearest neighbors for
    project_id : str
        The project ID to filter the query by

    Returns
    -------
    results : list
        A list of tuples containing the product data and embedding data for the k nearest neighbors
    '''
    print("{'message':'Executing query transaction}")
    embedding = oaiembed(query)
    results = djankQueryModel(embedding, k, project_id)
    print("{'message':'Query transaction complete'}")
    return results

Я получаю этот вывод при запуске django, где pgvector, похоже, не распознает список. Я попытался преобразовать в nparray и явно определить список.

введите сюда описание изображения

Я попытался преобразовать вектор в массив NP, который не распознается.

Я успешно выполнил необработанный SQL-запрос на консоли Postgres.

Стек Supabase Postgres: 15.1.0.133PGvector Postgres: 0.5.1: Запуск индекса HNSW Django: 4.2.7OpenAI text-embedding-ada-002: 1536 dim

0 ответов

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