Вопрос или проблема
У меня есть приложение, использующее Langchain.js в Express, Prisma ORM, Postgres и PGVector. У меня есть функция, которая выполняет поиск по схожести в базе данных на основе массива ответов, который приходит:
const retriever = pgvectorStore.asRetriever({
verbose: true,
k: 25,
searchType: "similarity",
filter: {
iron_catergory: answers[4],
varient_price: { lt: answers[1] },
dexterity: answers[0],
shaft_flex: answers[3],
length: answers[5],
},
});
Ниже представлена схема Prisma:
model golfClubs4Cash_irons_online {
id String @id
varient_sku String
title String
varient_price Int
price_range String
url String
image String
brand String
club_model String
set_makeup String
iron_catergory String
dexterity String
condition String
shaft_flex String
shaft_material String
number_of_clubs String
shaft_model String
location String
length_to_standard String
length_inches String
length String
store_id Int
}
model ironsvector_online {
id String @id @default(uuid())
content String
metadata Json
vector Unsupported("vector")
}
Проблема заключается в фильтре varient_price. Да, я знаю, что написание varient неверно, но оно последовательно неверно по всему коду. Я пытаюсь отфильтровать все varient_price меньше, чем answers[1]. По какой-то причине я не могу понять, почему этот фильтр не работает. Я думаю, что использую правильный синтаксис, и когда я запускаю программу, данные приходят, как показано ниже, но возвращают пустой массив:
filter: {
iron_catergory: 'Midsize Players',
varient_price: { 'lt': 750 },
dexterity: 'Right-Handed',
shaft_flex: 'Stiff',
length: 'Standard'
}
Если я удаляю фильтр varient_price, значения возвращаются. Что я делаю не так?
Ответ или решение
Чтобы успешно фильтровать записи в вашей базе данных Postgres с использованием PGVector в Langchain.js, важно обратить особое внимание на правильность условий фильтрации, особенно в отношении структуры и типизации данных в вашей схемы Prisma.
Проблема с фильтром varient_price
Вы упомянули, что фильтр varient_price
не работает должным образом, что приводит к возвращению пустого массива. Причины, по которым это может происходить:
-
Тип данных: Проверьте, что
varient_price
в базе данных имеет тип данныхInt
, как указано в вашей схеме Prisma. Если вы передаете значение в формате строки, это может вызывать проблемы с фильтрацией. Убедитесь, чтоanswers[1]
действительно возвращает целочисленное значение. -
Спеллинг названий: Убедитесь, что название
varient_price
в фильтре написано правильно и согласовано с названием в вашей модели. Наличие орфографических ошибок в названиях может привести к тому, что фильтр не будет найден базой данных, что также вызовет пустой результат. -
Логика фильтрации: Убедитесь, что действительно есть записи, соответствующие критериям фильтров. Если запрашиваемая цена (
lt: answers[1]
) не соответствует ни одной записи, вы не получите результат. Рекомендуется временно проверить результаты запроса без фильтраvarient_price
, чтобы убедиться, что в базе данных есть данные, которые должны быть отфильтрованы.
Рекомендации
-
Логирование SQL-запросов: В отличие от простой фильтрации, полезно включить подробное логирование SQL-запросов, чтобы увидеть, как формируется запрос и какие данные передаются. Это даст возможность отследить ошибки на уровне базы данных.
-
Тестирование значений: Для начала протестируйте функциональность фильтра
varient_price
с фиксированными значениями, чтобы удостовериться, что фильтрация работает корректно.
const testFilter = pgvectorStore.asRetriever({
verbose: true,
k: 25,
searchType: "similarity",
filter: {
iron_catergory: 'Midsize Players',
varient_price: { lt: 800 }, // Тестовое фиксированное значение
dexterity: 'Right-Handed',
shaft_flex: 'Stiff',
length: 'Standard'
},
});
- Использование
await
: Убедитесь, что ваш запрос к базе данных правильно обрабатывается с использованиемasync/await
, если это необходимо. Неправильная обработка асинхронности может привести к тому, что данные не загружаются должным образом.
Заключение
Проблемы с фильтрацией часто возникают из-за несоответствий в типах данных или неправильных названий. Проверьте указанные моменты, и, скорее всего, ваша проблема с фильтром varient_price
будет решена. Внедрение тестовых сценариев и данных поможет вам лучше понять, где крывается ошибка, что позволит улучшить производительность приложения и конечный пользовательский опыт.