Mengelompokkan dan Memvisualisasikan Penyematan
Terapkan pengelompokan k-means pada sekumpulan penyematan dan visualisasikan hasilnya dalam 2D menggunakan UMAP untuk menemukan pengelompokan topik alami dalam data Anda.
Mengelompokkan dan Memvisualisasikan Penyematan adalah pelajaran AI Engineering Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Engineering Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Mengapa Embedding Perlu Dikelompokkan?
Saat memiliki ratusan atau ribuan dokumen, Anda sering ingin menemukan topik apa saja yang ada tanpa membaca semuanya secara manual. Pengelompokan embedding secara otomatis mengelompokkan dokumen yang mirip secara semantik, sehingga struktur alami data Anda terlihat.
Penerapan umumnya meliputi: memberi tag otomatis pada tiket dukungan, menemukan kategori konten, menemukan dokumen yang berulang, dan memahami hal-hal yang paling sering ditanyakan pengguna.
Ikhtisar Pengelompokan K-Means
K-means membagi n titik data menjadi k kelompok dengan menetapkan setiap titik secara berulang ke sentroid terdekat, lalu menghitung ulang sentroid sebagai nilai rata-rata titik yang ditetapkan. Proses ini konvergen saat penetapan berhenti berubah.
Untuk embedding, k-means menemukan dokumen yang berdekatan dalam ruang embedding berdimensi tinggi, sehingga secara efektif mengelompokkannya berdasarkan kemiripan semantik.
from sklearn.cluster import KMeans
import numpy as np
# corpus_embeddings: (n_docs, 1536) — pre-computed
corpus_embeddings = np.random.randn(200, 1536) # placeholder
kmeans = KMeans(n_clusters=5, random_state=42, n_init='auto')
kmeans.fit(corpus_embeddings)
labels = kmeans.labels_
print(f'Cluster assignments: {labels[:10]}')
print(f'Unique clusters: {set(labels)}')Memilih Jumlah Kelompok yang Tepat
Memilih k (jumlah kelompok) adalah bagian tersulit. Metode siku memplot inersia (jumlah kuadrat jarak ke sentroid) untuk berbagai nilai k dan mencari titik saat penambahan kelompok tidak lagi mengurangi inersia secara signifikan.
Skor siluet mengukur seberapa jauh kecocokan suatu titik dengan kelompoknya sendiri lebih baik daripada dengan kelompok lain yang terdekat—skor yang mendekati 1 lebih baik. Cobalah nilai k dari 3 hingga 20 dan pilih skor terbaik.
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import numpy as np
corpus_embeddings = np.random.randn(200, 50) # placeholder (50D for speed)
best_k, best_score = 2, -1
for k in range(2, 11):
km = KMeans(n_clusters=k, random_state=42, n_init='auto')
labels = km.fit_predict(corpus_embeddings)
score = silhouette_score(corpus_embeddings, labels, sample_size=100)
print(f'k={k}: silhouette={score:.3f}')
if score > best_score:
best_score, best_k = score, k
print(f'Best k: {best_k}')Memberi Label Kelompok dengan LLM
Setelah pengelompokan, Anda dapat meminta LLM untuk menghasilkan label yang mudah dipahami manusia bagi setiap kelompok dengan memberikan beberapa dokumen perwakilan dari kelompok tersebut kepada model. Cara ini secara otomatis mengubah nomor kelompok mentah menjadi nama kategori yang bermakna.
from openai import OpenAI
client = OpenAI()
def label_cluster(cluster_docs, n_examples=3):
examples = '\n'.join(f'- {d}' for d in cluster_docs[:n_examples])
prompt = f'Given these documents, provide a 3-word category label:\n{examples}\nLabel:'
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}],
max_tokens=20
)
return response.choices[0].message.content.strip()
# Example usage:
# cluster_0_docs = [documents[i] for i in range(len(documents)) if labels[i] == 0]
# print(label_cluster(cluster_0_docs))Mengurangi Dimensi dengan UMAP
Vektor berdimensi 1536 tidak dapat langsung dibuat plot. UMAP (Uniform Manifold Approximation and Projection) mengurangi data berdimensi tinggi menjadi 2D atau 3D sambil mempertahankan struktur lingkungan lokal. Berbeda dari PCA, UMAP bersifat nonlinier dan jauh lebih baik dalam mempertahankan kelompok.
UMAP adalah pilihan standar untuk memvisualisasikan embedding teks karena dokumen yang mirip tetap berdekatan dalam plot 2D.
import umap
import numpy as np
corpus_embeddings = np.random.randn(200, 1536) # placeholder
reducer = umap.UMAP(
n_components=2,
metric='cosine', # important for text embeddings
random_state=42
)
embeddings_2d = reducer.fit_transform(corpus_embeddings)
print(f'Reduced shape: {embeddings_2d.shape}') # (200, 2)Memvisualisasikan Kelompok dengan Matplotlib
Setelah memperoleh koordinat 2D dari UMAP dan label kelompok dari k-means, plot sebar sederhana membuat struktur kelompok terlihat. Warnai setiap titik berdasarkan label kelompoknya dan tambahkan judul dokumen perwakilan sebagai anotasi teks agar grafik mudah dipahami.
import matplotlib.pyplot as plt
import numpy as np
# Assume: embeddings_2d (n, 2), labels (n,), documents list
# Placeholder data:
np.random.seed(42)
embeddings_2d = np.random.randn(50, 2)
labels = np.random.randint(0, 5, 50)
fig, ax = plt.subplots(figsize=(10, 7))
scatter = ax.scatter(
embeddings_2d[:, 0],
embeddings_2d[:, 1],
c=labels,
cmap='tab10',
s=60,
alpha=0.8
)
plt.colorbar(scatter, label='Cluster')
ax.set_title('Document Embedding Clusters (UMAP)')
plt.tight_layout()
plt.savefig('/tmp/clusters.png', dpi=150)
print('Saved cluster plot')Parameter UMAP yang Penting
Hiperparameter utama UMAP yang memengaruhi kualitas visualisasi:
- n_neighbors (bawaan 15): nilai yang lebih besar menangkap lebih banyak struktur global, sedangkan nilai yang lebih kecil menampilkan kelompok lokal
- min_dist (bawaan 0,1): seberapa rapat titik-titik berkumpul; nilai yang lebih kecil = kelompok lebih rapat, tetapi lebih banyak tumpang tindih di antaranya
- metric: selalu gunakan
'cosine'untuk embedding teks—jarak Euclidean tidak sesuai
Bereksperimenlah dengan n_neighbors antara 5 dan 50 untuk menemukan visualisasi yang paling baik menampilkan struktur data Anda.
Alternatif Pengelompokan Hierarkis
Pengelompokan hierarkis aglomeratif membangun pohon kelompok bertingkat tanpa mengharuskan Anda menentukan k terlebih dahulu. Anda memotong pohon pada ambang jarak yang dipilih untuk mendapatkan kelompok akhir. Cara ini berguna saat Anda belum mengetahui jumlah topik alami dalam data.
from sklearn.cluster import AgglomerativeClustering
import numpy as np
corpus_embeddings = np.random.randn(100, 50) # placeholder
cluster = AgglomerativeClustering(
n_clusters=None,
distance_threshold=1.5,
metric='cosine',
linkage='average'
)
labels = cluster.fit_predict(corpus_embeddings)
n_clusters = len(set(labels))
print(f'Found {n_clusters} natural clusters')Menemukan Pencilan dan Duplikat Hampir Sama
Embedding juga sangat baik untuk menemukan dokumen yang hampir duplikat. Hitung kemiripan kosinus berpasangan untuk semua dokumen dan tandai pasangan dengan kemiripan di atas 0,95 sebagai kemungkinan duplikat. Cara ini lebih andal daripada membandingkan perbedaan teks karena dapat menemukan duplikat yang ditulis ulang.
import numpy as np
def find_near_duplicates(corpus_vecs, threshold=0.95):
# corpus_vecs assumed L2-normalized
sim_matrix = corpus_vecs @ corpus_vecs.T # (n, n)
duplicates = []
n = len(corpus_vecs)
for i in range(n):
for j in range(i + 1, n):
if sim_matrix[i, j] >= threshold:
duplicates.append((i, j, float(sim_matrix[i, j])))
return duplicates
# pairs = find_near_duplicates(corpus_embeddings)
# print(f'Found {len(pairs)} near-duplicate pairs')Alur Kerja Pengelompokan Praktis
Alur kerja pengelompokan nyata mengikuti langkah-langkah berikut secara berurutan:
- Buat embedding semua dokumen dengan
text-embedding-3-small - Secara opsional, kurangi menjadi 50D dengan UMAP sebelum pengelompokan (mempercepat k-means)
- Lakukan pengelompokan dengan k-means, uji berbagai nilai k untuk menemukan skor siluet terbaik
- Beri label pada setiap kelompok dengan LLM menggunakan 5 dokumen perwakilan
- Visualisasikan plot sebar UMAP 2D yang diwarnai berdasarkan kelompok
- Tinjau pencilan (titik yang jauh dari semua sentroid)
Keterbatasan Pengelompokan
Pengelompokan embedding memiliki beberapa keterbatasan penting yang perlu diingat:
- K-means mengasumsikan kelompok berbentuk bulat—kelompok topik yang memanjang atau berbentuk tidak beraturan dapat terbagi secara keliru
- Embedding memadatkan makna—dua dokumen dapat berdekatan secara semantik, tetapi termasuk dalam kategori berbeda yang memerlukan tindakan berbeda
- Label kelompok perlu diverifikasi—selalu ambil sampel dokumen dari setiap kelompok untuk memeriksa kewajaran label yang dihasilkan LLM
Gunakan pengelompokan sebagai alat eksplorasi, bukan sebagai sistem kategorisasi yang menjadi kebenaran dasar.
Pemeriksaan Singkat
Uji pemahaman Anda tentang konsep Rekayasa AI dari pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini, Anda telah mempelajari: k-means mengelompokkan dokumen berdasarkan kedekatan semantik dalam ruang embedding, UMAP mereduksi embedding berdimensi tinggi menjadi 2D untuk visualisasi menggunakan jarak kosinus, dan skor siluet membantu Anda memilih jumlah klaster yang tepat tanpa data berlabel. Selanjutnya, kita akan melampaui pencarian dalam memori dan menjelajahi basis data vektor untuk penggunaan produksi.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengelompokkan dan Memvisualisasikan Penyematan” gratis?
Ya — teks lengkap “Mengelompokkan dan Memvisualisasikan Penyematan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Engineering Academy, upgrade ke CoddyKit PRO. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengelompokkan dan Memvisualisasikan Penyematan”?
Terapkan pengelompokan k-means pada sekumpulan penyematan dan visualisasikan hasilnya dalam 2D menggunakan UMAP untuk menemukan pengelompokan topik alami dalam data Anda. Kamu berlatih AI Engineering Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Engineering Academy?
Tidak diperlukan pengalaman sebelumnya. AI Engineering Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Mengelompokkan dan Memvisualisasikan Penyematan” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Engineering Academy ini?
Ya. Setiap pelajaran AI Engineering Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Apa Itu Penyematan Vektor?
- Membuat Penyematan dengan OpenAI
- Pencarian Semantik dengan NumPy
- Mengelompokkan dan Memvisualisasikan Penyematan