Chroma и Node.js

классификация тематики текста с помощью векторной базы данных

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

Например, перед нами стоит задача классификации текстов по темам — по одному предложению определить, какая категория из заранее определённого списка лучше всего ему соответствует. У нас есть запись "Эти компоненты обеспечивают стабильность и долговечность всей конструкции, что особенно важно в условиях высокой нагрузки", то относится ли это предложение к категории "Строительство" или к категории "Архитектура ПО"? Обычный поиск по ключевым словам не справляется с такой задачей, так как без интерпретации семантики текста сложно различить термины.

Многие вендоры предлагают свои векторные базы данных, но одной из самых популярных в настоящее время является Chroma. Сравнить её функционал с другими VDB можно здесь: https://superlinked.com/vector-db-comparison

Chroma предоставляет удобный API для создания и поиска векторов, которые могут быть использованы для обработки естественного языка, компьютерного зрения и других приложений.

В этой статье я покажу вам, как использовать Chroma с Node.js для создания простого инструмента классификации тематики исходного текста

Что нам понадобится

  • Node.js и npm
  • Docker – для запуска бэкенда Chroma
  • OpenAI Api ключ – для создания эмбеддингов

Установка Chroma

Создадим новый проект и установим в него клиент 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, вы можете создать эффективный инструмент для классификации тем на основе семантического анализа текстов. Этот подход позволяет значительно улучшить точность определения категорий, особенно когда одно и то же слово может иметь разные значения в разных контекстах.