классификация тематики текста с помощью векторной базы данных
В последние годы векторные базы данных стали популярными среди
разработчиков и исследователей в области машинного обучения и искусственного интеллекта. Эти
базы данных позволяют эффективно хранить и обрабатывать высокоразмерные векторные представления
данных, открывая новые возможности в таких задачах как поиск семантического сходства,
кластеризация и построение рекомендательных систем.
Например, перед нами стоит задача классификации текстов по темам — по одному предложению определить,
какая категория из заранее определённого списка лучше всего ему соответствует.
У нас есть запись "Эти компоненты обеспечивают стабильность и
долговечность всей конструкции, что особенно важно в условиях высокой нагрузки", то относится
ли это предложение к категории "Строительство"
или к категории "Архитектура ПО"
?
Обычный поиск по ключевым словам не справляется с
такой задачей, так как без интерпретации семантики текста сложно различить термины.
Многие вендоры предлагают свои векторные базы данных, но одной из самых популярных в настоящее
время является Chroma. Сравнить её функционал с другими VDB можно здесь: https://superlinked.com/vector-db-comparison
Chroma предоставляет удобный API для создания и поиска векторов, которые могут быть использованы для
обработки естественного языка, компьютерного зрения и других приложений.
В этой статье я покажу вам, как использовать Chroma с Node.js для создания простого инструмента
классификации тематики исходного текста
Создадим новый проект и установим в него клиент Chroma:
npm install --save chromadb chromadb-default-embed
Запустим бэкенд Chroma:
docker pull chromadb/chroma
docker run -p 8000:8000 chromadb/chroma
Эмбеддинг — это представление объектов (таких как слова, предложения или изображения) в виде
векторов в многомерном пространстве. Эти векторы сохраняют семантическую информацию,
позволяя моделям машинного обучения эффективно работать с данными, находя схожие объекты
путем вычисления расстояний между их векторными представлениями.
В контексте нашей статьи, эмбеддинги используются для преобразования текстов в числовые
векторы, которые затем можно обрабатывать с помощью векторной базы данных Chroma для задач
классификации тем.
Чтобы их сгенерировать нам потребуется ключ OpenAI – я буду использовать модель
text-embedding-ada-002
, но вы можете использовать
text-embedding-3-small
или text-embedding-3-large
. Также для
создания эмбеддингов доступны Cohere, Google Gemini, HF Server, Hugging Face, Instructor,
JinaAI, Roboflow, Ollama Embeddings, но для некоторых из них недоступно JavaScript API.
const {OpenAIEmbeddingFunction} = require('chromadb');
const embeddingFunction = new OpenAIEmbeddingFunction({
openai_api_key: "yourApiKey",
model: " text-embedding-ada-002"
})
const collection = await client.createCollection({
name: "name",
embeddingFunction: embeddingFunction
})
const entries = [
" Эти компоненты обеспечивают стабильность и долговечность всей конструкции, что особенно важно в условиях высокой нагрузки.",
" Настройка параметров позволяет оптимизировать производительность и избежать возможных сбоев в процессе работы приложения при высоких нагрузках."
]
const embeddings = embeddingFunction.generate(entries)
Суть простого способа классификации тем заключается в том, чтобы вставить эмбеддинг для
каждой темы с некоторым примером текста и для любого заданного текста найти ближайший
вектор. Например, давайте используем "Эти компоненты обеспечивают стабильность и
долговечность всей конструкции, что особенно важно в условиях высокой нагрузки" как
представителя категории "Строительство"
, и "Настройка параметров позволяет оптимизировать
производительность и избежать возможных сбоев в процессе работы приложения при высоких
нагрузках" как представителя категории "Архитектура программного обеспечения"
. Следующий
код генерирует эмбеддинги для этих двух предложений и вставляет их в Chroma с
ассоциированной категорией в качестве метаданных.
// Порядок категорий соответствует порядку записей
const categories = [{ category: ' Строительство ' }, { category: 'Архитектура программного обеспечения' }]
await collection.add({
ids: ['id1', 'id2'],
documents: entries,
embeddings: embeddings,
metadatas: categories
});
Затем, для классификации текста, мы передадим текст в функцию query(), которая автоматически сгенерирует для нас эмбеддинги с помощью OpenAI. Следующий код классифицирует 4 предложения, в которых словосочетание "Высокие нагрузки" используется в разных контекстах.
const queryTexts = [
'Введение новых архитектурных решений значительно улучшило устойчивость здания к высоким
сейсмическим нагрузкам.',
‘Использование современных строительных материалов позволило сократить время возведения
инфраструктурных объектов, которые могут выдерживать высокие нагрузки’,
'Оптимизация алгоритмов сократила время выполнения задач и улучшила общую производительность
программы при высоких нагрузках более 1000000 RPS',
'Внедрение модульного подхода в разработке позволило упростить процесс тестирования и
масштабирования приложения под высокие нагрузки.'
]
const results = await collection.query({
nResults: 1,
queryTexts: queryTexts
});
console.log('Results', results.metadatas.map(res => res[0].category));
Результат просто отличный – всего на основе двух векторов нам удалось правильно классифицировать все предложения практически без общих слов, кроме сочетания “высокая нагрузка”.
В результате, используя Node.js и векторную базу данных Chroma, вы можете создать эффективный инструмент для классификации тем на основе семантического анализа текстов. Этот подход позволяет значительно улучшить точность определения категорий, особенно когда одно и то же слово может иметь разные значения в разных контекстах.