counter free hit invisible

Chroma

Chroma AI-native açık kaynak vektör veritabanıdır. (Vektör veritabanları yazıma buradan ulaşabilirsiniz.)

Chroma size aşağıdaki araçları sunar :

  • Embeding (Gömme) ve bunların meta datalarını depoma.
  • Dokümanları ve Sorguları gömme.
  • Embeding’leri arama.

Chroma basitlik ve geliştirici üretkenliğine öncelik verir aynı zamanda çok hızlıdır.

Apache 2.0 la lisanslı Chroma ‘nın Chroma tarafından Python ve JS SDK ları sunuluyor. Diğer Dillerde kullanmak isteyenler için de community tarafından yazılmış clientları var.

Bundan sonra yazacaklarım Chroma’nın Python’da kullanımı ile ilgili olacak. Chroma Python Script yada server olarak çalışabiliyor. pip komutu ile hroma paketlerini yüklüyoruz.

pip install chromadb

Chroma ‘da veritananını yerel (local) makinemizden yüklenip ve kayıt edebileceğimiz şekilde ayarlayabiliyoruz. Bu şekilde veri(data) otomatik olarak kayıt edilebilecek yada varsa silinebilecek. Aağıdaki kod Python scriptimizi çalıştırdığımız dizinde data adında bir klasör oluşturacak ve bundan sonra verileri buradan yükleyip, silebileceğiz.

client = chromadb.PersistentClient(path="data")

client nesnesinin kolaylık sağlayan bir kaç metodu var. Bunlardan heartbeat metodunu istemcinin bağlı kaldığından emin olmak için kullanırız. reset metodunu ise tüm db’yi silmek için kullanabiliriz.

Chroma ‘yı console ‘dan sunucu olarak çalıştırıp client(istemci) ile bağlanmakta mümkün. Bu konuda daha fazla bilgiyi Chroma Rehberinde bulabilirsiniz.

Kolleksiyonlar (collections)

Embedings (gömme) LLM özelnde basitçe anlatmak gerekirse kelimelerinizin matematiksel vektör şeklinde ifade edilmesidir. Chroma embedingleri (gömme) yönetmek için collection primitif veri timini kullanır.Chroma url’de koleksiyon adlarını kullanır, bu nedenle isimlendirmr konusunda birkaç kısıtlama vardır. Bunlar:

  • Adın uzunluğu 3 – 63 karakter arasında olmalıdır.
  • İsim küçük harfle veya rakamla başlayıp bitmelidir ve aralarında nokta, tire ve alt çizgi bulunabilir.
  • Ad arka arkaya iki nokta içermemelidir.
  • Ad geçerli bir IP adresi olmamalıdır

Embeddings (Gömme) fonksiyonu metni girdi olarak alır ve tokenizasyon ve embedding(gömme) işlemlerini gerçekleştirir. Herhangi bir gömme(embedding) işlevi yazılmazsa, Chroma varsayılan olarak sentense transformer ‘ı kullanır. Bu yazıda özel olarak bir işlev kullanmayacağım ama Retrieval-Augmented Generation (RAG) ile ilgili hazırladığım yazıda burası daha önemli olacak.Hangi LLM modelini kullanmak istiyorsak vektör database ‘e verileri yazarken bu fonksiyon ile embeddings oluturup yazacağız. Örneğin OpenAI, Google Generative AI gibi …

collection =client.create_collection(name="my_collection", embedding_function=emb_fn)
collection =client.get_collection(name="my_collection", embedding_function=emb_fn)

Koleksiyonlar get_collection ile isimlerine göre alınabilir ve delete_collection ile silinebilir. Ayrıca, varsa bir koleksiyonu almak veya yoksa oluşturmak için get_or_create_collection kullanabilirsiniz.

collection = client.create_collection(name="my_collection")
collection = client.get_collection(name="my_collection")
collection = client.get_collection(name="test")
collection = client.get_or_create_collection(name="test")
client.delete_collection(name="my_collection")

Yukarıdaki koddan collection = client.get_collection(name=”test”) kodu hata verecektir. Çünkü test adında koleksiyon oluşturulmadan get ile çağırılıyor.

Mesafe Fonksiyonunun değiştirilmesi :

 collection = client.create_collection(
        name="collection_name",
        metadata={"hnsw:space": "cosine"} # l2 is the default
    )

create_collection ayrıca hnsw:space değerini ayarlayarak gömme mesafe yöntemini (distance function) özelleştirmek için kullanılabilecek opsiyonel bir meta veri argümanı alır. Bu embedding’lerin (gömmelerin) matematiksel bir vektör olduğunu ve benzerlik bulurken bu fonksiyonu kullanacaklarını aklınıza getirin. Varsayılan olarak l2 değerini alır ama aşağıdaki tablodan istediğinize göre kullanabilirsiniz.

Kolleksiyona veri(data) ekleme:

Chroma veriyi add fonksiyonu ile ekler.

collection.add(
    documents=["lorem ipsum...", "dolor amet...", "samet...", ...],
    metadatas=[{"sayfa": "3", "paragraf": "1"}, {"sayfa": "3", "paragraf": "5"}, {"sayfa": "29", "paragraf": "11"}, ...],
    ids=["id1", "id2", "id3", ...]
)

Chroma’ya bir belge listesi iletilirse, bunları otomatik olarak tokenize edecek ve koleksiyonun gömme işleviyle (embeding function) gömecektir (koleksiyon oluşturulurken belirtilmediyse varsayılan kullanılacaktır). Chroma ayrıca belgelerin kendilerini de depolayacaktır. Eğer belgeler seçilen gömme fonksiyonu(embeding function) kullanılarak gömülemeyecek kadar büyükse, bir istisna(exception) ortaya çıkar.

Burada şunu açıklamakta yarar var benim bu isimlendirmede kafam karışmıştı. Burada documents dediği vektör veritabanına gönderdiğiniz veriler. Yani örneğin bir pdf dosyanız var onu paragraf paragraf bölümlere ayırdınız ve documents listesine her birini bir eleman olarak eklediniz. Buradaki her bir item (eleman) document oluyor. Yani bizim anladığımız anlamda doküman değil. Bir de şu var biz genelde llm özelinde metinsel ifadeleri konuşuyoruz vektör veritabanına imajların, müzik dosyalarının vb. lerinin de gömmeleri (embeddings) depolanıyor.

Her belgenin benzersiz bir id siolmalıdır. Aynı id ‘yi iki kez eklemeye çalışmak, yalnızca ilk değerin saklanmasıyla sonuçlanacaktır. Ek bilgi depolamak ve filtrelemeyi etkinleştirmek için her belge için isteğe bağlı bir meta veri listesi eklenebilir.

collection.add(
    documents=["doc1", "doc2", "doc3", ...],
    embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
    metadatas=[{"paragraf": "3", "satır": "16"}, {"paragraf": "3", "satır": "5"}, {"paragraf": "29", "satır": "11"}, ...],
    ids=["id1", "id2", "id3", ...]
)

Alternatif olarak, belgeyle ilişkili gömmelerin(embedings) bir listesini doğrudan sağlayabilirsiniz böylece Chroma ilişkili belgelerin gömmelerini oluşturmadan bunları depolayacaktır. Bu gömmeler(embeddings) documents listesi ile aynı uzunlukta değilse istisna (exception) oluşur.

collection.add(
    embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
    metadatas=[{"paragraf": "3", "satır": "16"}, {"paragraf": "3", "satır": "5"}, {"paragraf": "29", "satır": "11"}, ...],
    ids=["id1", "id2", "id3", ...]
)

Belgeleri(Document) başka bir yerde de saklayabilir ve Chroma’ya yalnızca gömmelerin ve meta verilerin bir listesini depolayabilirsiniz. Gömmeleri başka bir yerde depolanan belgelerinizle ilişkilendirmek için id’leri kullanabilirsiniz. (İlişkisel veritabanında ki gibi düşünün image pathlerini yazıp imajları file server da tutuyor gibi.)

Devam Edecek …

Yorum yapın