newspaper Haber edit_note yapayzekasozluk.tr Haber Masası schedule 19 Ağustos 2026 · 07:51 timer 7 dk okuma

Çok Vektörlü Modeller: ColBERT Tarzı Geç Etkileşim ile Arama Kalitesini Artırma

Sentence Transformers v6.0 ile çok vektörlü (multi-vector) modeller artık tek bir API ile kullanılabilir. ColBERT tarzı geç etkileşim (late interaction) sayesinde belgelerdeki her token için vektör tutan bu modeller, yoğun (dense) modellere kıyasla daha yüksek doğruluk sunar. Görsel belge arama, ses ve video alanlarında da çığır açan bu teknolojiyi nasıl kullanacağınızı adım adım anlatıyoruz.

Çok Vektörlü Modeller Nedir?

Geleneksel yoğun (dense) gömme (embedding) modelleri, bir metni okuyup tek bir sabit boyutlu vektöre dönüştürür. Tüm bilgi, 384, 768 veya 1024 sayıya sığdırılmak zorundadır. Benzerlik, iki özet vektör arasındaki tek bir iç çarpımdır. Bu yöntem şaşırtıcı derecede iyi çalışır, ancak sıkıştırma kayıplıdır: nadir bir varlık, tam bir tanımlayıcı veya uzun bir pasajdaki kritik bir cümle, aynı vektörde yer kapmak için yarışmak zorundadır. Birden fazla gereksinimi olan bir sorgu da aynı duvara çarpar. Örneğin, "ahşap ayaklı ve yuvarlak minderli yeşil kanepe" için tek bir vektör, dört özelliği tek bir noktada harmanlamak zorundadır; bu nedenle yanlış ayaklara sahip yeşil bir kanepe, gerçekten istediğiniz kanepeye yakın bir yerde konumlanabilir.

Çok vektörlü (multi-vector) modeller (ColBERT makalesinden sonra geç etkileşim veya ColBERT tarzı modeller olarak da bilinir) bu sıkıştırmayı atlar. Aynı transformatörü çalıştırır, ancak token gömme vektörlerini tek bir vektörde birleştirmek yerine, her token gömme vektörünü küçük bir boyuta (klasik olarak 128) yansıtır ve hepsini korur. 9 tokenlık bir belge, 1x128 vektör değil, 9x128'lik bir matris olur. Sorgu ve belge arasındaki etkileşim, puanlama zamanına ertelenir; bu nedenle "geç etkileşim" adı verilir. Çapraz kodlayıcı (cross-encoder) erken etkileşir: her iki metin de modele birlikte gider, bu doğrudur ancak önceden hesaplanacak hiçbir şey bırakmaz, çünkü her belge her yeni sorgu için yeniden kodlanmak zorundadır. Yukarıdaki yoğun gömme modeli olan çift kodlayıcı (bi-encoder) ise neredeyse hiç etkileşmez (iki bitmiş özet arasında tek bir iç çarpım) ve bu, bir koleksiyonu bir kez kodlayıp hızlı sorgulamanıza olanak tanır. Geç etkileşim ikisinin arasında yer alır: belgeler hâlâ bağımsız olarak kodlanır ve çevrimdışı olarak dizinlenebilir, ancak puanlama her sorgu tokenını her belge tokenıyla karşılaştırır, bu da ikisinin etkileşimi için çok daha fazla alan bırakır.

MaxSim ile Puanlama

Puanlama, MaxSim operatörünü kullanır: her sorgu tokenı için, herhangi bir belge tokenına karşı en yüksek benzerliğini alır ve bu maksimumları sorgu boyunca toplar. Token gömme vektörleri L2-normalize edildiğinden, bu iç çarpımların her biri [-1, 1] aralığında bir kosinüs benzerliğidir; bu nedenle toplam, [-sorgu_token_sayısı, sorgu_token_sayısı] aralığında kalır. Operatörü yumuşak bir hizalama olarak okuyabilirsiniz: her sorgu tokenı, onu en iyi açıklayan belge tokenına işaret eder ve puan, belgenin sorguyu genel olarak ne kadar iyi desteklediğidir. Hizalamanın sözlüksel olması gerekmez, çünkü token gömme vektörleri bağlamsaldır. "Penguenler nerede yaşar?" sorgusunu "Penguenler Antarktika'da yaşar." belgesiyle lightonai/mLateOn kullanarak kodlayın; sorgu tokenı 'yaşar', 'yaşar' kelimesiyle hiçbir karakter paylaşmamasına rağmen en iyi eşleşmesini 0.94 benzerlikle 'yaşar' üzerinde bulur. Bu, sözlüksel erişimin yapamadığı bir şeydir; BM25 ve benzerleri terimin kendisine ihtiyaç duyar, bu nedenle eş anlamlılar ve parafrazlar gözden kaçar. Yoğun gömme modelleri de bu boşluğu kapatır, elbette. Geç etkileşimin eklediği şey, diğer yönden vazgeçmeden bunu yapmasıdır: tam bir eşleşme önemli olduğunda (bir ürün kodu, bir soyadı, bir işlev adı), MaxSim yine de o tokenı kendi başına tutar; tek vektörlü bir model ise onu diğer her şeyle ortalamak zorundaydı. Ayrıca birebir değildir, çünkü birden fazla sorgu tokenı genellikle aynı belge tokenına yerleşir.

Kurulum ve Model Yükleme

Çok vektörlü modeller basit bir kurulumla çalışır: `pip install -U sentence-transformers`. ColPali tarzı görsel belge erişimi için görüntü bağımlılıklarına da ihtiyacınız var: `pip install -U "sentence-transformers[image]"`. Sentence Transformers v6.0, transformers v5.x, torch 2.2+ ve huggingface-hub v1.x gerektirir. Bunlardan herhangi birini düşük sürüme sabitlerseniz, önce yükseltmeyi planlayın. Çok vektörlü bir model yüklemek, diğer Sentence Transformers modellerini yüklemekle aynı görünür:

```python from sentence_transformers import MultiVectorEncoder model = MultiVectorEncoder("lightonai/LateOn") ```

Hub'da çalışan modelleri bulmak için `multi-vector` ve `sentence-transformers` etiketlerine bakın. Bu etiketlere sahip herhangi bir model yukarıdaki satırla yüklenir; ister PyLate kontrol noktası, ister Stanford-NLP ColBERT kontrol noktası veya görsel belge erişimi için ColPali ailesi bir model olsun. Ekosistem üzerinde çalışarak bu etiketi çalışan her modele eklemeye devam ediyoruz, bu nedenle liste büyümeye devam ediyor. MultiVectorEncoder, bu kontrol noktalarının yıllar içinde yayınlandığı formatların her birini okur, böylece PyLate ve Stanford-NLP kontrol noktaları doğrudan yüklenir.

Kodlama ve Benzerlik Hesaplama

Çok vektörlü modeller asimetriktir: sorgular ve belgeler farklı öneklerden, farklı uzunluk sınırlarından ve farklı puanlama maskelerinden geçer. Birçok yoğun modelin aksine, doğru gömme vektörlerini elde etmek için `encode_query()` ve `encode_document()` kullanılması zorunludur. Örneğin:

```python from sentence_transformers import MultiVectorEncoder model = MultiVectorEncoder("lightonai/mLateOn") queries = ["Fransa'nın başkenti neresidir?"] documents = [ "Paris, Fransa'nın başkentidir.", "Berlin, Almanya'nın başkenti ve hem alan hem nüfus bakımından en büyük şehridir.", ] query_embeddings = model.encode_query(queries) document_embeddings = model.encode_document(documents) print(query_embeddings[0].shape) # (10, 128) print(document_embeddings[0].shape, document_embeddings[1].shape) # (10, 128) (19, 128) ```

Dikkat edin, geriye dönük olarak bir liste 2B tensör alırsınız; her girdi için biri, her biri (token_sayısı, gömme_boyutu) şeklinde. Yoğun gömme vektörlerinin aksine, bunları tek bir dikdörtgen tensörde birleştiremezsiniz, çünkü her girdinin kendi token sayısı vardır. `encode_query`, sorgu işaretini ön ekler, kontrol noktası isterse sorguyu sabit bir uzunluğa genişletir ve sorgu uzunluğunda sınırlar. `encode_document`, belge işaretini ön ekler, belge uzunluğunda sınırlar ve puanlama maskesinden atlanan tokenları (çoğu kontrol noktası için noktalama işaretleri) çıkarır. `model.similarity()` tüm çiftler arası MaxSim matrisini hesaplar:

```python scores = model.similarity(query_embeddings, document_embeddings) print(scores) # tensor([[10.7942, 11.1104, 10.9743, 11.0811]]) ```

Mars kazanır, olması gerektiği gibi. İkincilerin ne kadar yakın olduğuna dikkat edin: Satürn de "Kızıl Gezegen" ifadesini içeriyor ve Jüpiter kırmızı bir lekeye sahip bir gezegen, bu nedenle token düzeyinde bir operatörün üçünde de yakalayacağı çok şey var. Önemli olan sıralamadır. Puanlar genellikle bu kadar yakın olur. MaxSim, sorgu tokenı başına bir maksimum alır, bu nedenle bir belge genellikle her sorgu tokenına iyi bir en iyi eşleşme verir ve puanlar bir tabandan başlar. Bağlamsal token gömme vektörleri de anizotropiktir, dar bir koni içinde kümelenirler, bu nedenle rastgele token çiftleri bile yüksek puan alma eğilimindedir. Ayrıca `model.similarity_pairwise()` de vardır; eşleştirilmiş çiftleriniz zaten varsa ve tam benzerlik matrisi yerine yalnızca çift puanlarını istiyorsanız kullanışlıdır.

Anlamsal Arama ve Dizinleme

Küçük bir derlem için tümüyle dışlayıcı MaxSim en basit çalışan yöntemdir. Derlemi bir kez kodlayın, ardından her sorguyu her şeyle puanlayın. Örneğin, Natural Questions veri kümesinin 4.874 pasajı RTX 3090'da 20 saniyede kodlanır ve her arama uçtan uca yaklaşık 120 ms sürer; bunun çoğu, 608.414 token vektörüne karşı MaxSim puanlamasıdır. Bu kesindir, ancak toplam derlem tokenlarıyla doğrusal olarak ölçeklenir ve tüm token vektörlerini bellekte tutar; bu nedenle birkaç bin belgeniz varsa kullanın, birkaç milyon değil. Bu boyutun üzerinde gerçek bir geç etkileşim dizinine ihtiyacınız var; Sentence Transformers bunu sağlamaz. Buna gerek yok: bu dizinler `encode_document`'ın ürettiği her şeyi saklar, bu nedenle burada kodlayın ve token gömme vektörlerini onlar için yapılmış bir şeye teslim edin. Dizinleme bölümünde dört seçenek için çalışan kod parçacıkları vardır ve aşağıdaki bölüm dizini tamamen atlamayı kapsar.

Geç etkileşim kalitesini, geç etkileşim dizini tutmadan da elde edebilirsiniz: çok vektörlü bir modeli yeniden sıralayıcı (reranker) olarak kullanarak. Hızlı bir çift kodlayıcı, büyük bir derlemi bir avuç adaya daraltır, ardından çok vektörlü model yalnızca bu adayları yeniden puanlar. Yalnızca 50 aday çok vektörlü olarak kodlanır, böylece dizininiz normal bir yoğun dizin olarak kalır ve token vektörleri geçicidir. Bu, yeniden sırala ve yeniden sırala (retrieve-and-rerank) yığınında bir çapraz kodlayıcının oynadığı rolün aynısıdır, ancak çok vektörlü bir model aday başına önemli ölçüde daha ucuzdur. Belgeleri tek bir yığında kodlar ve bir matris çarpımıyla puanlarsınız; sorgu-belge çifti başına bir ileri geçiş yerine. Birkaç vektör veritabanı çok vektörlü modelleri yerel olarak dizinler ve puanlar: Qdrant v1.10'dan beri, Weaviate v1.29'dan beri, Vespa yıllardır, LanceDB v0.15.0'dan beri ve VectorChord, pgvector'da olmayan bir MaxSim operatörünü Postgres'e ekler. Milvus onlara v2.6.4'te katıldı. Bir sunucu çalıştırmak istemiyorsanız, LightOn'un fast-plaid'i pip ile kurulabilir ve PLAID'i doğrudan uygular; PyLate ise onu daha kapsamlı bir erişim yığınına sarar.

Görsel, Ses ve Video Erişimi

Çok vektörlü modeller, görsel belge erişiminde (visual document retrieval) son teknolojidir; metin sorgusu, arada OCR adımı olmadan doğrudan sayfa görüntüleriyle eşleştirilir. ColPali ailesi modeller, sayfa görüntülerini token dizileri olarak kodlar ve metin sorgularıyla aynı MaxSim operatörünü kullanır. Bu, taranmış belgeler, sunumlar ve diğer görsel açıdan zengin içerikler için güçlü bir yaklaşımdır. Benzer şekilde, ses ve video klipleri de token vektörlerine dönüştürülebilir; böylece aynı API ile çok modlu erişim mümkün olur. `encode_document`, pasaj, sayfa görüntüsü, ses klibi veya video olsun, aynı token-vektör matrisleri listesini döndürür; bu nedenle ColPali tarzı modeller, Dizinleme bölümündeki herhangi bir dizine değişiklik yapılmadan gider. Belge başına daha fazla vektör vardır, bu da Token Havuzlama'yı (Token Pooling) orada daha erken kullanmaya değer kılar.

Neden Önemli?

Türkçe ve diğer dillerde yüksek kaliteli bilgi erişimi, özellikle çok dilli ve görsel içerikli belgelerde kritik bir ihtiyaçtır. Çok vektörlü modeller, yoğun modellerin tek vektöre sıkıştırma kaybını aşarak, sorgudaki her gereksinimin kendi kanıtını bulmasını sağlar. Bu, özellikle uzun belgeler, çok koşullu sorgular ve alan dışı verilerde belirgin bir kalite artışı sunar. Türkiye'deki arama motorları, kurumsal belge yönetimi ve dijital arşivler için bu teknoloji, daha doğru ve kapsamlı sonuçlar anlamına gelir. Ayrıca, görsel belge erişiminde OCR ihtiyacını ortadan kaldırması, taranmış Osmanlıca veya eski Türkçe belgeler gibi zorlu içeriklerde büyük bir avantaj sağlar. Sentence Transformers ile bu modellerin kullanımının kolaylaşması, geliştiricilerin bu güçlü tekniği benimsemesini hızlandıracak ve Türkçe doğal dil işleme uygulamalarında yeni bir çığır açacaktır.

link Kaynak: HuggingFace
tag Sentence Transformers tag ColBERT tag çok vektörlü model tag geç etkileşim tag bilgi erişimi tag yapay zeka

İlgili Terimler

7 terim