کروما یک پایگاه داده برداری منبع باز است که از فناوری جستجوی مشابهت بردار برای ذخیره و بازیابی موثر داده‌های بردار بزرگ ابعاد استفاده می‌کند.

کروما یک پایگاه داده توکار داخل برنامه است که به صورت یک بسته‌ی پیشفرض به کد ما داخل می‌شود. مزیت آن در سادگی آن است. اگر شما در حال توسعه یک برنامه LLM هستید که نیاز به یک پایگاه داده بردار برای اجرای حافظه LLM و پشتیبانی از جستجوی متن مشابهت زبان دارد و نمی‌خواهید یک پایگاه داده بردار مستقل را نصب کنید، کروما انتخاب خوبی است. این آموزش عمدتاً بر اساس جاوااسکریپت است.

1. نصب بسته‌ی نرم‌افزاری

npm install --save chromadb # yarn add chromadb

2. مشتری کروما را مقداردهی اولیه کنید

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

3. ایجاد مجموعه

یک مجموعه در پایگاه داده‌ی کروما مشابه یک جدول در Mysql است که داده‌های برداری (شامل اسناد و داده‌های منبع دیگر) در آن ذخیره می‌شود. در زیر یک مجموعه ایجاد می‌شود:

const {OpenAIEmbeddingFunction} = require('chromadb');
const embedder = new OpenAIEmbeddingFunction({openai_api_key: "کلید_api_شما"})
const collection = await client.createCollection({name: "مجموعه_من", embeddingFunction: embedder})

در این‌جا از یک مدل جاسازی متن openai برای محاسبه بردارهای متن استفاده شده است، بنابراین شما باید کلید API openai خود را ارائه دهید. البته می‌توانید پارامتر embeddingFunction را حذف کنید و از مدل داخلی کروما برای محاسبه بردارها استفاده کنید و یا آن را با یک مدل دیگر جاسازی متن منبع باز جایگزین کنید.

4. اضافه کردن داده

پس از تعریف یک مجموعه، داده به مجموعه اضافه می‌شود و کروما داده‌های ما را ذخیره کرده و یک فهرست برداری اختصاصی بر اساس بردارهای داده‌های متنی می‌سازد تا بعداً به راحتی برای جستجو استفاده شود.

await collection.add({
    ids: ["شناسه1", "شناسه2"],
    metadatas: [{"منبع": "منبع_من"}, {"منبع": "منبع_من"}],
    documents: ["این یک سند است", "این یک سند دیگر است"],
}) 

استفاده از بردارهای متنی پیش‌محاسبه شده، بدون استفاده از تابع جاسازی داخلی کروما برای محاسبه:

await collection.add({
    ids: ["شناسه1", "شناسه2"],
    embeddings: [[1.2, 2.3, 4.5], [6.7, 8.2, 9.2]],
    where: [{"منبع": "منبع_من"}, {"منبع": "منبع_من"}],
    documents: ["این یک سند است", "این یک سند دیگر است"]
}) 

5. جستجوی داده‌های مجموعه

بر اساس متن‌های پرس و جو تنظیم شده برای شرایط پرس و جو، کروما nResults نتایج مشابهت‌های بیشتر را برمی‌گرداند.

const results = await collection.query({
    nResults: 2, 
    queryTexts: ["این یک سند پرس و جو است"]
})