Метод VectorStoreIndex.from_vector_store библиотеки llama-index вызывает исключение pydantic_core.

Вопрос или проблема

Следующий код вызывает ошибку:

pydantic_core.pydantic_core.ValidationError: 1 ошибка валидации для NodeWithScore
node
Входные данные должны быть действительным словарем или экземпляром BaseNode [type=model_type, input_value=TextNode(id
=’dcb36e46-7a…metadata_seperator=”\n”), input_type=TextNode]
Для получения дополнительной информации посетите https://errors.pydantic.dev/2.9/v/model_type

import textwrap

from llama_index.core import VectorStoreIndex, StorageContext
from llama_index.legacy.vector_stores import PGVectorStore
from llama_index.llms.openai import OpenAI
from sqlalchemy import make_url
import os
import openai

# Получить ключ API OpenAI, прочитав локальный .env файл
openai.api_key = ("my-api-key")
os.environ["OPENAI_API_KEY"] = openai.api_key

print("Подключение к новой векторной базе данных...")
connection_string = "postgresql://user:user@localhost:5432"

db_name = "vector_db"

url = make_url(connection_string)
vector_store = PGVectorStore.from_params(
    database=db_name,
    host=url.host,
    password=url.password,
    port=url.port,
    user=url.username,
    table_name="table_name",
    embed_dim=1536,  # размерность встраивания openai
)

index = VectorStoreIndex.from_vector_store(
    vector_store=vector_store)

llm = OpenAI(model="gpt-3.5-turbo", temperature=0.1)

query_engine = index.as_query_engine(llm=llm)

response = query_engine.query("Дайте мне краткое содержание данных с кодом AA10B")

print(textwrap.fill(str(response), 100))

Моя проблема в том, что если вместо попытки использовать VectorStoreIndex.from_vector_store я использую VectorStoreIndex.from_documents, передавая напрямую список документов, это работает вполне нормально. Так что я не уверен, что я делаю не так.

Код, который работает, выглядит следующим образом:

import textwrap

from llama_index.core import StorageContext
from llama_index.llms.openai import OpenAI
from llama_index.readers.database import DatabaseReader
from llama_index.core import VectorStoreIndex
from llama_index.vector_stores.postgres import PGVectorStore
import openai
import os
from sqlalchemy import make_url, create_engine, text
import psycopg2

# Получить ключ API OpenAI, прочитав локальный .env файл
openai.api_key = ("my-api-key")
os.environ["OPENAI_API_KEY"] = openai.api_key

engine = create_engine("postgresql+psycopg2://user:user@localhost/db")

reader = DatabaseReader(
    engine=engine
)

query = """query"""

documents = reader.load_data(query=query)

# Воссоздать базу данных, если она существует
conn = psycopg2.connect("postgres://user:user@localhost:5432/db")
conn.autocommit = True
cur = conn.cursor()
cur.execute("DROP DATABASE IF EXISTS vector_db;")
cur.execute("CREATE DATABASE vector_db;")
conn.close()

conn = psycopg2.connect("postgres://user:user@localhost:5432/vector_db")
conn.autocommit = True
cur = conn.cursor()
cur.execute("CREATE EXTENSION vector;")
conn.close()

connection_string = "postgresql://user:user@localhost:5432"

db_name = "vector_db"

url = make_url(connection_string)
vector_store = PGVectorStore.from_params(
    database=db_name,
    host=url.host,
    password=url.password,
    port=url.port,
    user=url.username,
    table_name="table",
    embed_dim=1536,  # размерность встраивания openai
    hnsw_kwargs={
        "hnsw_m": 16,
        "hnsw_ef_construction": 64,
        "hnsw_ef_search": 40,
        "hnsw_dist_method": "vector_cosine_ops",
    },
)

storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(
    documents, storage_context=storage_context, show_progress=True
)

llm = OpenAI(model="gpt-3.5-turbo", temperature=0.1)

query_engine = index.as_query_engine(llm=llm)

response = query_engine.query("Дайте мне краткое содержание данных с кодом AA10B")

print(textwrap.fill(str(response), 100))

Ответ или решение

Решение проблемы с методом VectorStoreIndex.from_vector_store в llama-index

При разработке с использованием библиотеки llama-index, вы столкнулись с ошибкой валидации, возникающей при вызове метода VectorStoreIndex.from_vector_store. Сообщение об ошибке указывает на то, что структура данных, переданная в функцию, не соответствует ожидаемому формату. Рассмотрим более подробно, что может быть причиной этой проблемы и как её решить.

Описание проблемы

Ошибка, которую вы наблюдаете, связана с использованием класса NodeWithScore и говорит о том, что входные данные должны быть действительным словарем или инстансом BaseNode. Ваша попытка создать индекс, используя VectorStoreIndex.from_vector_store с PGVectorStore, не удается, в то время как использование метода VectorStoreIndex.from_documents работает без проблем.

Анализ кода

Ваш код, вызывающий ошибку, выглядит следующим образом:

index = VectorStoreIndex.from_vector_store(
    vector_store=vector_store)

Судя по всему, метод from_vector_store требует определенную структуру данных, которую ваш vector_store не предоставляет. При использовании метода from_documents ваши документы уже оформлены в ожидуемом формате, что и является причиной успешного выполнения.

Возможные решения

  1. Проверка структуры данных: Убедитесь, что данные, которые возвращает PGVectorStore, соответствуют спецификации. Ваша реализация в методе from_vector_store должна возвращать объекты, унаследованные от BaseNode. Проверьте, что вы правильно инициализируете PGVectorStore.

  2. Документация и зависимости: Убедитесь, что версии llama-index, Pydantic и других используемых библиотек совместимы друг с другом. Иногда такие проблемы возникают из-за несовместимости версий.

  3. Логирование и отладка: Включите логирование в своем приложении, чтобы понять, на каком этапе и какие данные передаются в from_vector_store. Это может дать вам более ясную картину формирования данных и их структуры.

  4. Сравнение с работающим кодом: Обратите внимание на то, как именно создается индекс с помощью from_documents. Возможно, вам потребуется адаптировать ваш подход к созданию векторов в from_vector_store, чтобы он возвращал ожидаемый формат.

  5. Использование интерфейсов: Посмотрите на интерфейсы, которые использует VectorStoreIndex и PGVectorStore. Возможно, стоит создать обертку или адаптер, который будет конвертировать ваш объект в нужный формат, прежде чем перед его передать в метод from_vector_store.

Заключение

Ошибки валидации, подобные той, которую вы наблюдаете, могут быть связаны с несоответствием между тем, что ожидает метод и тем, что фактически передается. Внимательное исследование структуры данных и правильная их инициализация, а также забота об актуальности используемых библиотек могут помочь устранить проблему. Если ошибка продолжает возникать, рекомендуется обратиться к документации llama-index и сообществу для получения дополнительной поддержки.

Если у вас возникли дополнительные вопросы, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...