Вопрос или проблема
Следующий код вызывает ошибку:
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
ваши документы уже оформлены в ожидуемом формате, что и является причиной успешного выполнения.
Возможные решения
-
Проверка структуры данных: Убедитесь, что данные, которые возвращает
PGVectorStore
, соответствуют спецификации. Ваша реализация в методеfrom_vector_store
должна возвращать объекты, унаследованные отBaseNode
. Проверьте, что вы правильно инициализируетеPGVectorStore
. -
Документация и зависимости: Убедитесь, что версии
llama-index
,Pydantic
и других используемых библиотек совместимы друг с другом. Иногда такие проблемы возникают из-за несовместимости версий. -
Логирование и отладка: Включите логирование в своем приложении, чтобы понять, на каком этапе и какие данные передаются в
from_vector_store
. Это может дать вам более ясную картину формирования данных и их структуры. -
Сравнение с работающим кодом: Обратите внимание на то, как именно создается индекс с помощью
from_documents
. Возможно, вам потребуется адаптировать ваш подход к созданию векторов вfrom_vector_store
, чтобы он возвращал ожидаемый формат. -
Использование интерфейсов: Посмотрите на интерфейсы, которые использует
VectorStoreIndex
иPGVectorStore
. Возможно, стоит создать обертку или адаптер, который будет конвертировать ваш объект в нужный формат, прежде чем перед его передать в методfrom_vector_store
.
Заключение
Ошибки валидации, подобные той, которую вы наблюдаете, могут быть связаны с несоответствием между тем, что ожидает метод и тем, что фактически передается. Внимательное исследование структуры данных и правильная их инициализация, а также забота об актуальности используемых библиотек могут помочь устранить проблему. Если ошибка продолжает возникать, рекомендуется обратиться к документации llama-index
и сообществу для получения дополнительной поддержки.
Если у вас возникли дополнительные вопросы, не стесняйтесь задавать их!