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

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

1. Установка пакета

npm install --save chromadb # yarn add chromadb

2. Инициализация клиента Chroma

const {ChromaClient} = require('chromadb');
const client = new ChromaClient();

3. Создание коллекции

Коллекция в базе данных Chroma аналогична таблице в Mysql, где хранятся векторные данные (включая документы и другие исходные данные). Ниже приведено создание коллекции:

const {OpenAIEmbeddingFunction} = require('chromadb');
const embedder = new OpenAIEmbeddingFunction({openai_api_key: "ваш_ключ_api"})
const collection = await client.createCollection({name: "моя_коллекция", embeddingFunction: embedder})

Здесь используется модель встраивания текста openai для вычисления текстовых векторов, поэтому вам нужно предоставить ваш ключ openai api. Конечно, вы также можете опустить параметр embeddingFunction и использовать встроенную модель в Chroma для вычисления векторов или заменить ее другой моделью встроенного текстового встраивания с открытым исходным кодом.

4. Добавление данных

После определения коллекции данные добавляются в коллекцию, и Chroma будет хранить наши данные и создавать отдельный векторный индекс на основе векторов текстовых данных для удобного последующего запроса.

await collection.add({
    ids: ["id1", "id2"],
    metadatas: [{"source": "мой_источник"}, {"source": "мой_источник"}],
    documents: ["Это документ", "Это другой документ"],
}) 

Используя предварительно рассчитанные текстовые векторы, не используя встроенную функцию встраивания Chroma для вычисления:

await collection.add({
    ids: ["id1", "id2"],
    embeddings: [[1.2, 2.3, 4.5], [6.7, 8.2, 9.2]],
    where: [{"source": "мой_источник"}, {"source": "мой_источник"}],
    documents: ["Это документ", "Это другой документ"]
}) 

5. Запрос данных коллекции

На основе установленных для условий запроса queryTexts, Chroma вернет самые похожие результаты nResults.

const results = await collection.query({
    nResults: 2, 
    queryTexts: ["Это запрос документа"]
})