Gömmeler Nelerdir? Vektörler ve Kosinüs Benzerliği Basitçe Açıklandı
Yerleştirmeler, bilgisayarların kelimeleri tam olarak eşleştirmek yerine anlamları karşılaştırmasına olanak tanır. Anlamsal aramaya, önerilere ve RAG’a güç verirler. Bunların ne olduğunu, benzerliğin nasıl ölçüldüğünü ve sizi nerede hayal kırıklığına uğrattıklarını öğrenin.
- Yerleştirme, metnin, bir görselin veya diğer verilerin anlamını temsil eden sayıların bir listesidir.
- Benzer öğeler benzer sayılarla sonuçlanır, dolayısıyla anlam matematikle karşılaştırılabilir.
- Kosinüs benzerliği yönü karşılaştırır ve iki yerleştirmenin ne kadar benzer olduğunu puanlamanın yaygın bir yoludur.
- Yalnızca aynı modeldeki yerleştirmeleri karşılaştırın ve sonuçları kendi verileriniz üzerinde test edin.
“Paramı nasıl geri alabilirim” diye arama yaptığınızda, iyi bir sistem “Geri ödeme politikası” başlıklı bir sayfa bulmalıdır, her ne kadar ikisi arasında önemli bir kelime olmasa da. Bu yetenek, modern yapay zekanın en kullanışlı fikirlerinden biri olan yerleştirmelerden kaynaklanmaktadır.
Bu kılavuz, ağır matematik gerektirmeyen yerleştirmeleri açıklamaktadır. Python 3.13’te küçük bir örnek çalıştırdık ve çıktısı aşağıda gösteriliyor. Buradaki vektörler, fikrin görülmesini kolaylaştırmak için her biri yalnızca üç sayı içeren, elle oluşturduğumuz vektörlerdir. Gerçek yerleştirmeler eğitimli bir modelden gelir ve genellikle yüzlerce veya binlerce sayıya sahiptir.
Gömme nedir?
Gömme, bir şeyin vektör adı verilen bir sayı listesi şeklinde temsilidir. İlgili anlamlara sahip öğelerin birbirine yakın vektörler alması için bir model eğitilir.
"kitten" -> [0.9, 0.8, 0.1]
"cat" -> [0.9, 0.7, 0.2]
"invoice" -> [0.0, 0.1, 0.9]
Metin bu formda olduğunda, bilgisayar iki metin parçasının ne kadar benzer olduğunu hesaplayabilir ve bunu doğrudan kelimelerle yapamaz. Gömmeler kelimelerle de sınırlı değildir. Cümleler, tüm belgeler, resimler, ses ve ürünlerin tümü yerleştirilebilir.
Neden yalnızca anahtar kelimeleri eşleştirmiyorsunuz?
| Sorgu ve belge | Anahtar kelime arama | Aramayı yerleştirme |
|---|---|---|
| “para iadesi” ve “geri ödeme politikası” | Özledim, paylaşılan kelime yok | Onu bulabilirim |
| “dizüstü bilgisayar” ve “dizüstü bilgisayar” | Özlüyor | Onu bulabilirim |
| “hata E1042” ve “E1042” içeren bir sayfa | Tam olarak bulur | Özleyebilirim |
| “banka” (nehir) ve “banka” (para) | Onlara aynı şekilde davranır | Bağlam dikkate alındığında bunları ayırabilir |
RAG ile ilgili rehberimiz bunu pratikte göstermektedir. Basit bir kelime sayımı araması “Paramı ne zaman geri alabilirim?” sorusuna sıfır puan verdi. hiçbir kelime paylaşmadıkları için geri ödeme belgesine karşı. Üçüncü satıra da dikkat edin: tam tanımlayıcılar yerleştirmelerin zayıf noktasıdır, dolayısıyla anahtar kelime aramanın hala bir yeri vardır.
Bir harita düşünün
Her kelimeyi, konumun anlamı yansıttığı devasa bir haritaya yerleştirdiğinizi hayal edin. “Kedi” ve “yavru kedi” neredeyse yan yana oturuyor, “köpek” aynı mahallede, “fatura” ise farklı şehirde. İlgili kelimeleri bulmak için yakınınıza bakmanız yeterlidir.
Gerçek bir yerleştirme aynı şekilde çalışır; ancak haritanın iki yerine yüzlerce boyutu vardır. İnsanlar bunu hayal edemiyorlar ama matematik aynı şekilde çalışıyor. Bireysel sayıların genellikle “tüylülük” gibi net bir anlamı yoktur. Önemli olan genel konumdur.
Küçük bir çalışma örneği
El yapımı vektörlerimizi şu şekilde karşılaştırabilirsiniz:
import math
def cosine(a, b):
dot = sum(x * y for x, y in zip(a, b))
return dot / (math.sqrt(sum(x * x for x in a)) *
math.sqrt(sum(y * y for y in b)))
vectors = {
"kitten": [0.9, 0.8, 0.1],
"cat": [0.9, 0.7, 0.2],
"dog": [0.8, 0.3, 0.2],
"invoice": [0.0, 0.1, 0.9],
}
for word in ("kitten", "dog", "invoice"):
print(word, round(cosine(vectors["cat"], vectors[word]), 3))
# kitten 0.994
# dog 0.955
# invoice 0.238
“Kedi” karşısında “yavru kedi” en yüksek puanı alırken, onu “köpek” takip ediyor ve “fatura” çok daha düşük puan alıyor. Bu modeli oluşturmak için bu vektörleri seçtik, dolayısıyla sıralama gerçek dil hakkında hiçbir şey kanıtlamıyor. Yalnızca hesaplamanın nasıl davrandığını gösterir. Anlamsal arama aynı şeyi üç adımda yapar: sorguyu yerleştirin, depolanan her öğeye göre puanlayın ve sıralayın.
query = [0.85, 0.75, 0.15]
sorted(vectors, key=lambda w: cosine(query, vectors[w]), reverse=True)
# ['kitten', 'cat', 'dog', 'invoice']
Kosinüs benzerliği açıklandı
Her vektör orijinden gelen bir ok gibi düşünülebilir. Kosinüs benzerliği, iki ok arasındaki açıyı, ne kadar uzun olduklarını göz ardı ederek ölçer. Anahtar değerleri onayladık:
cosine([1, 2, 3], [2, 4, 6]) # 1.0 same direction
cosine([1, 0], [0, 1]) # 0.0 unrelated (at right angles)
cosine([1, 0], [-1, 0]) # -1.0 opposite directions
| Puan | Anlamı |
|---|---|
| 1’e yakın | Neredeyse aynı yöne doğrultun, çok benzer |
| 0’a yakın | ilgisiz |
| -1’e yakın | Zıt yönlere doğrultun |
İlk satıra bakın. [2, 4, 6], [1, 2, 3]‘nin iki katı uzunluğundadır, ancak puan mükemmel bir 1,0’dır, çünkü önemli olan tek şey yöndür. Bu, uzunluğun anlamdan ziyade belge boyutu gibi şeyleri yansıtabildiği metinler için kullanışlıdır. Eşiklere de dikkat edin. Kullanışlı aralıklar modelden modele farklılık gösterdiğinden “benzer” anlamına gelen evrensel bir puan yoktur; bu nedenle kendi verileriniz üzerinde test yapın.
Diğer mesafe önlemleri
| Ölçü | Neye bakıyor | Notlar |
|---|---|---|
| Kosinüs benzerliği | Yalnızca açı | Metin için ortak bir varsayılan |
| Nokta çarpımı | Açı ve uzunluk | Hızlıdır ve normalleştirilmiş vektörlerde kosinüse eşittir |
| Öklid mesafesi | Düz çizgi mesafesi | Daha küçük, daha benzer demektir |
Farkı görmek kolaydır. Kosinüs puanı 1,0 olan aynı iki vektörün Öklid mesafesi 3,742’dir çünkü biri diğerinden daha uzundur. Birçok sistem, vektörleri her birini 1 uzunluğa ölçeklendirerek normalleştirir. Bundan sonra, nokta çarpım ve kosinüs aynı cevabı verir ve biz de bunu doğruladık: her ikisi de “kedi” ve “köpek” için 0,955 verdi. Hangi ölçüyü önerdiğini görmek için modelinizin belgelerine bakın.
Gömmeler nasıl öğrenilir?
Gerçek sistemlerde hiç kimse bu numaraları elle atamaz. Bir sinir ağı bunları eğitim sırasında öğrenir. İlk ve etkili bir fikir, benzer bağlamlarda görünen kelimelerin, “kedimi besledim” ve “köpeğimi besledim” gibi benzer anlamlara sahip olma eğiliminde olmasıdır. Word2Vec ve GloVe gibi modeller bu kalıplardan kelime vektörlerini öğrendi.
Daha sonra BERT gibi transformatör tabanlı modeller, yerleştirmeleri bağlama duyarlı hale getirdi, böylece “banka”, “nehir kıyısı” ve “banka kredisi”nde farklı bir vektör elde edebildi. Birçok modern model tüm cümleleri veya pasajları aynı anda yerleştirir. Büyük dil modellerine ilişkin rehberimiz, transformatörlerin bağlamı nasıl ele aldığını açıklamaktadır.
Gömmelerin kullanıldığı yerler
| Kullanım | Nasıl yardımcı olur? |
|---|---|
| Anlamsal arama | Sonuçları tam kelimeler yerine anlamlara göre bulur |
| paçavra | Bir dil modeli için ilgili pasajları alır |
| Öneriler | Beğendiklerinize benzer öğeler önerir |
| Kümeleme | Gruplar, konuya göre destek taleplerini veya incelemeleri destekler |
| Yinelenen algılama | Benzer soruları veya listeleri tespit eder |
| sınıflandırma | Basit modeller için özellikler sağlar |
| Anormallik tespiti | Her şeyden uzaktaki öğeleri işaretler |
Geniş ölçekte arama
Örneğimiz, tam arama olarak bilinen bir sorguyu her öğeyle karşılaştırdı. Bu binlerce öğe için işe yarar, ancak milyonlarca öğe için yavaşlar. HNSW gibi yaklaşık en yakın komşu (ANN) endeksleri bu sorunu çözmektedir. Mutlak en iyi olanı kaçırmak için küçük bir şanstan vazgeçerek çok yakın eşleşmeleri hızlı bir şekilde bulurlar.
PostgreSQL için pgvector gibi vektör veritabanları ve uzantıları, filtreleme ve depolamanın yanı sıra bu dizinleri sağlar. Vektör veritabanı kılavuzumuz seçenekleri kapsar. Küçük bir proje için hiç ihtiyacınız olmayabilir ve bellek içi arama, başlamanın mükemmel bir yoludur.
İpucu: Karma aramayı erkenden değerlendirin. Gömme benzerliğini anahtar kelime eşlemeyle birleştirmek, özellikle kullanıcılar ürün kodlarını, adlarını veya hata mesajlarını aradığında genellikle tek başına yapmaktan daha iyi sonuçlar verir.
Bir gömme modeli seçme
- Dil. Örneğin içeriğiniz Hintçe veya Tamil dilindeyse modelin bunu iyi şekilde işleyip işlemediğini kontrol edin.
- Alan. Genel modeller, uzman hukuki veya tıbbi terimlerle zorluk yaşayabilir.
- Boyutlar. Daha fazla boyut daha fazla ayrıntı yakalayabilir ancak daha fazla depolama ve belleğe mal olur.
- Maliyet ve barındırma. Barındırılan bir API’yi, özellikle özel veriler için, kendi başınıza çalıştırabileceğiniz açık bir modelle karşılaştırın.
- Giriş uzunluğu. Modellerin bir sınırı vardır, bu nedenle uzun belgelerin önce parçalara bölünmesi gerekir.
En iyi test kendi verilerinizdir. Bulması gereken belgelerle birlikte yaklaşık 20 gerçek sorgu toplayın ve her modelin bunları nasıl sıraladığını karşılaştırın. Yayınlanan karşılaştırmalar içeriğinizi yansıtmayabilir.
Sınırlamalar
- Modele bağlılık. Farklı modellere ait vektörler karşılaştırılamaz. Modelleri değiştirirseniz her şeyi yeniden yerleştirmeniz gerekir.
- Kesin terimler. Kimlikler, kodlar ve nadir adlar güvenilir şekilde eşleştirilemeyebilir.
- Olumsuzlaştırma. “Geri ödemelere izin veriliyor” ve “geri ödemelere izin verilmiyor”, zıt anlamlara rağmen birbirine yakın olabilir.
- Benzer, doğru anlamına gelmez. Yakın bir eşleşme güncelliğini kaybetmiş veya tamamen yanlış olabilir.
- Önyargı. Yerleştirmeler, eğitim verilerinden stereotipleri emebilir.
- Kosinüs sihirli değildir. Araştırmacılar bazı öğrenilmiş yerleştirmelerde bunun ne kadar anlamlı olduğunu sorguladılar; bu nedenle puanları bir doğruluk ölçüsü olarak değil, yararlı bir sinyal olarak ele alın.
Yaygın hatalar
- Modelleri karıştırma. Sorguları ve belgeleri aynı model ve sürüme yerleştirin.
- Her yerde tek bir benzerlik eşiği kullanma. Her model ve görev için bunu ayarlayın.
- Devasa belgeleri bütünüyle gömmek. Anlam seyreltilir, bu nedenle ilk önce onları parçalara ayırın.
- Değerlendirme atlanıyor. Test sorguları olmadan, bir değişikliğin yardımcı olup olmadığını anlayamazsınız.
- Her şey için yerleştirmelerin kullanılması. Kullanıcılar tam kimlikleri ararsa normal bir veritabanı dizini daha iyidir.
Son sözler
Gömme, anlamı sayılara dönüştürür, böylece yazılım dizeler yerine fikirleri karşılaştırabilir. Konsept basittir, ancak pratik çalışma bir model seçmek, verileri parçalara ayırmak ve gerçek sorgular üzerinde test etmekten ibarettir. Kendiniz denemek için, kendi belgelerinizden birkaç düzinesini herhangi bir gömme modeliyle gömün, bunları gerçek sorularla arayın ve sonuçların sizi nerede şaşırttığını görün.
Sık sorulan sorular
Basit anlamda yerleştirmeler nelerdir?
Gömmeler anlamı temsil eden sayıların listeleridir. Benzer anlamlara sahip öğeler benzer sayılar alır, bu da bilgisayarın bunları matematiksel olarak karşılaştırmasına olanak tanır.
Kosinüs benzerliği nedir?
İki vektör arasındaki -1’den 1’e kadar olan açıyı ölçer. 1’e yakın bir puan, bunların neredeyse aynı yöne işaret ettiği anlamına gelir, bu da benzer içeriğe işaret eder.
Yerleştirmeler ve belirteçler arasındaki fark nedir?
Belirteç, bir modelin işlediği bir metin yığınıdır. Gömme, bir belirtecin, cümlenin veya belgenin anlamını temsil eden sayısal bir vektördür.
Bir yerleştirmenin kaç boyutu olmalıdır?
Modele bağlıdır ve yüzlerce ila birkaç bin arasında yaygındır. Daha fazlası daha fazla ayrıntı yakalayabilir ancak daha fazla depolama maliyetine neden olur; bu nedenle kullanım senaryonuzun neye ihtiyacı olduğunu test edin.
Gömmeleri kullanmak için bir vektör veritabanına ihtiyacım var mı?
Hayır. Bellekte küçük koleksiyonlar aranabilir. Vektör veritabanları daha büyük koleksiyonlar, sık güncellemeler veya filtreleme ihtiyaçlarıyla kullanışlı hale gelir.
Öğrenmeye devam et
Test, WordPress veya SEO konusunda yardıma mı ihtiyacınız var?
Ekiplerin daha iyi yazılımlar sunmasına ve sitelerini büyütmesine yardımcı oluyoruz. Bize ne üzerinde çalıştığınızı söyleyin, biz de bir sonraki adım için net bir öneride bulunalım.
Daha fazla kılavuz test, yapay zeka ve modern geliştirme
Bu makaleyi beğendiniz mi? Bir konu seçin ve doğrudan en yeni eğitimlerimize geçin.
Yapay Zeka Halüsinasyonları Açıklandı: Dil Modelleri Neden İşleri Düzeltiyor ve Nasıl Azaltılabilir?
Yapay zeka halüsinasyonları açıkladı: ne olduklarını, dil modellerinin bunları neden ürettiğini, yaygın türlerini, temellendirme ve yönlendirmelerle…
Makaleyi okuyun →DevOpsAçıklanan Ortam Değişkenleri: .env Dosyaları, Sırlar ve Yapılandırma Doğru Yapıldı
Çalıştırdığımız Python örnekleriyle açıklanan ortam değişkenleri: bunları okumak ve ayarlamak, neden her değerin bir dize olduğu, .env dosyaları, sü…
Makaleyi okuyun →Yazılım geliştirmeAPI Hız Sınırlamasının Açıklaması: Algoritmalar, Başlıklar ve 429 Hatalarının Ele Alınması
API hızı sınırlaması, çalıştırdığımız bir simülasyonla açıklanmıştır: belirteç kümesi, sabit pencere, kayan pencere, 429 yanıt, hız sınırı başlıklar…
Makaleyi okuyun →Test otomasyonuPython'da alay etme: Unittest.mock, patch ve Testleri Yalan Yapan Hatalar
Unittest.mock ile Python'da alay etme, test edildi: Sahte ve dönüş_değeri, yan_etki, bir adın kullanıldığı yerde yama uygulama, spesifikasyon ve oto…
Makaleyi okuyun →Yazılım testiKod Kapsamının Açıklaması: Hat ve Şube Kapsamı ve %100'ün Gerçek Anlamı
Kod kapsamı gerçek bir kapsama.py çalışmasıyla açıklanmıştır: hat, şube ve durum kapsamı, bir raporun okunması, %100 kapsamın neden hâlâ hataları ka…
Makaleyi okuyun →Veritabanları ve SQLSQL'de DELETE vs TRUNCATE vs DROP: Farklılıklar, Geri Alma ve Her Biri Ne Zaman Kullanılmalı
DELETE vs TRUNCATE vs DROP test edilmiş SQL ile açıklandı: her birinin neyi kaldırdığı, geri aldığı, tetiklediği, kimlik sıfırlaması, hızı ve Postgr…
Makaleyi okuyun →Veritabanları ve SQLAçıklanan SQL Görünümleri: Örneklerle Tuzakları Oluşturun, Kullanın ve Önleyin
Çalıştırdığımız sorgularla açıklanan SQL görünümleri: görünüm oluşturma, canlı sonuçlar, sütunları gizleme, performans, güncellenebilir ve gerçekleş…
Makaleyi okuyun →Yazılım geliştirmeTypeScript Arayüzü ve Tür: Gerçek Farklılıklar, Derleyiciyle Test Edildi
TypeScript arayüzü ve türü, gerçek derleyiciyle kontrol edildi: her ikisinin de yapabileceği, yalnızca birinin yapabileceği, bildirim birleştirme, g…
Makaleyi okuyun →Yazılım geliştirmePython *args ve **kwargs'ın Açıklaması: Açık Örneklerle Esnek Fonksiyonlar
Python *args ve **kwargs çalıştırdığımız kodla açıklanmıştır: paketleme ve paketten çıkarma, parametre sırası, yalnızca anahtar kelime ve yalnızca k…
Makaleyi okuyun →Yazılım geliştirmePython Lambda İşlevleri: Söz Dizimi, Gerçek Kullanımlar ve Ne Zaman Kullanılmaması Gerektiği
Çalıştırdığımız kodla açıklanan Python lambda işlevleri: sözdizimi, anahtarla sıralama, harita ve filtre, kapatmalar, geç bağlama tuzağı ve normal b…
Makaleyi okuyun →Yapay zekâYapay Zeka Ajanları Nelerdir? Çalıştırabileceğiniz Basit Bir Aracı Döngüsüyle Nasıl Çalışırlar?
Yapay zeka ajanları nedir? Aracı döngüsüne, araçlara, belleğe ve korkuluklara ilişkin basit bir kılavuz, çalıştırdığımız küçük bir Python döngüsü, g…
Makaleyi okuyun →DevOpsİzleme ve Gözlemlenebilirlik: Günlükler, Metrikler ve İzlerle Gerçek Fark
İzleme ve gözlemlenebilirliğin açıklanması: bilinen ve bilinmeyen arızalar, günlükler, ölçümler ve izler, ödeme olayının gözden geçirilmesi, altın s…
Makaleyi okuyun →DevOpsDocker Birimleri ve Bağlama Bağlantıları: Konteyner Verilerini Doğru Şekilde Kalıcılaştırın
Docker birimleri ile bağlama bağlamaları arasındaki karşılaştırma açıklandı: kapsayıcı verilerinin neden kaybolduğu, adlandırılmış birimler, bağlama…
Makaleyi okuyun →Test otomasyonuTDD ve BDD: Temel Farklılıklar, Her İki Şekilde Geliştirilmiş Bir Özellik ve Her Birinin Ne Zaman Kullanılacağı
TDD ve BDD, her iki yönde de oluşturulmuş bir indirim özelliğiyle açıklandı: çalıştırdığımız kodla kırmızı-yeşil-refactor, Verilen-Ne Zaman-O Zaman …
Makaleyi okuyun →Yazılım testiKullanıcı Kabul Testi (UAT): Süreç, Kontrol Listesi ve Gerçek Örnekler
Kullanıcı kabul testi açıklandı: bunu kimin yürüttüğü, QA'dan farkı, yedi adımlı bir süreç, bir UAT test senaryosu şablonu, bir kontrol listesi, otu…
Makaleyi okuyun →Veritabanları ve SQLAçıklanan SQL NULL Değerleri: IS NULL, COALESCE, NULLIF ve Kaçınılması Gereken Tuzaklar
SQL NULL değerleri, çalıştırdığımız sorgularla açıklandı: üç değerli mantık, IS NULL, COALESCE, NULLIF, toplamaların, birleştirmelerin ve sıralamanı…
Makaleyi okuyun →Veritabanları ve SQLSQL CASE WHEN İfadesi: Sözdizimi, Gerçek Örnekler ve Yaygın Hatalar
SQL CASE WHEN çalıştırdığımız sorgularla açıkladı: basit ve aranmış formlar, koşul sırası, SUM'lu pivotlar, COUNT hileleri, özel sıralama, güncellem…
Makaleyi okuyun →Yazılım geliştirmeJWT Nedir? JSON Web Belirteçleri Bir Çalışma Örneğiyle Açıklanıyor
JWT nedir? JSON Web Tokens açıkladı: üç bölüm, çalıştırdığımız kodda oluşturulan ve üzerinde değişiklik yapılan bir token, JWT ile oturumlar, depola…
Makaleyi okuyun →Yazılım geliştirmeJavaScript Olay Döngüsü Açıklaması: Örneklerle Çağrı Yığını, Mikro Görevler ve Zamanlayıcılar
JavaScript olay döngüsü çalıştırdığımız kodla açıklandı: çağrı yığını, görev ve mikro görev kuyrukları, setTimeout 0'ın neden anında olmadığı, engel…
Makaleyi okuyun →Yazılım geliştirmePython Jeneratörleri ve Verim Açıklaması: Gerçek Örneklerle Bellekten Tasarruf Edin
Python üreteçleri ve verim, çalıştırdığımız kodla açıklandı: nasıl duraklatılır ve devam ettirilir, ölçülen bellek tasarrufları, işlem hatları, sons…
Makaleyi okuyun →Yapay zekâGömmeler Nelerdir? Vektörler ve Kosinüs Benzerliği Basitçe Açıklandı
Gömmeler nedir? Vektörler, kosinüs benzerliği ve anlamsal aramaya ilişkin sade dilli bir kılavuz; çalıştırdığımız küçük bir örnek, yaygın kullanımla…
Makaleyi okuyun →DevOpsMavi-Yeşil ve Kanarya Konuşlandırılması: Farklılıklar, Takaslar ve Nasıl Seçilir
Mavi-yeşil ve kanarya konuşlandırması açıklandı: her birinin nasıl çalıştığı, maliyet, risk ve geri alma, test ettiğimiz istikrarlı kullanıcı grubu,…
Makaleyi okuyun →Yazılım geliştirmeGit merge vs rebase: farklar, örnekler ve hangisi ne zaman kullanılır
Git merge vs rebase; gerçek log çıktısı, karşılaştırma tablosu, rebase'in altın kuralı ve güvenli bir ekip iş akışıyla anlatılıyor.
Makaleyi okuyun →Yazılım geliştirmePython Liste Üreteci (List Comprehension): Sözdizimi, Örnekler ve Kaçınılacak Durumlar
Python list comprehension anlatımı: sözdizimi, filtreleme, if-else, iç içe döngüler, ölçülmüş süreler ve düz for döngüsünün daha iyi olduğu durumlar.
Makaleyi okuyun →Veritabanları ve SQLSQL JOIN Örneklerle Açıklama (Inner, Left, Right, Full)
SQL JOIN'leri örnek tablolar ve sorgularla adım adım öğrenin: INNER, LEFT, RIGHT, FULL, CROSS ve SELF; yaygın hatalar ve performans ipuçları.
Makaleyi okuyun →