Traffine I/O

Bahasa Indonesia

2023-06-11

Vektor Pinecone Sparse-Dense

Vektor Sparse-Dense Pinecone

Pinecone adalah database vektor yang mengkhususkan diri dalam pengelolaan data vektor berdimensi tinggi, dirancang untuk menawarkan kemampuan pencarian yang canggih. Fitur unik dari Pinecone adalah dukungannya terhadap vektor sparse-dense, yang memungkinkan pendekatan hibrida yang menggabungkan pencarian kata kunci dan pencarian semantik.

Pencarian semantik dan pencarian kata kunci memiliki keunggulan yang berbeda. Pencarian semantik, yang menggunakan vektor dense, sangat baik dalam menghasilkan hasil yang mirip bahkan tanpa adanya kecocokan kata kunci yang tepat. Pencarian kata kunci, yang menggunakan vektor sparse, dapat memberikan hasil yang sangat relevan ketika terdapat kecocokan kata kunci yang tepat. Fitur vektor sparse-dense dalam Pinecone memanfaatkan keunggulan kedua pendekatan ini, meningkatkan relevansi hasil pencarian bahkan untuk pertanyaan di luar domain yang dimaksudkan.

Perbedaan Vektor Sparse dan Dense dalam Pinecone

Pinecone mendukung penggunaan vektor dense, yang merupakan representasi numerik dari makna semantik. Vektor dense dapat memungkinkan pencarian semantik, menghasilkan hasil yang paling mirip berdasarkan metrik jarak tertentu, bahkan jika tidak ada kecocokan kata kunci yang tepat. Vektor dense sering kali dihasilkan oleh model embedding seperti SBERT (Sentence-BERT), yang menciptakan representasi bermakna dari data teks.

Berbeda dengan vektor dense, vektor sparse adalah struktur data berdimensi tinggi di mana hanya sebagian kecil nilai yang bukan nol. Dalam konteks pencarian kata kunci, setiap vektor sparse mewakili sebuah dokumen; dimensi-dimensi tersebut mewakili kata-kata dari kamus, dan nilai-nilai bukan nol mewakili pentingnya kata-kata tersebut dalam dokumen.

Algoritma pencarian kata kunci, seperti algoritma BM25, memanfaatkan vektor sparse untuk menghitung relevansi dokumen teks. Algoritma-algoritma ini mengevaluasi jumlah kecocokan kata kunci, frekuensinya, dan faktor-faktor lain untuk memberikan hasil pencarian yang relevan.

Dengan menggabungkan keunggulan vektor dense dan sparse, Pinecone menyediakan database vektor yang tangguh dan serbaguna yang dapat menyesuaikan berbagai skenario pencarian, meningkatkan ketepatan dan kelengkapan hasil pencarian.

Langkah-langkah dalam Membuat dan Menggunakan Vektor Sparse-Dense

  1. Buat vektor dense menggunakan model embedding eksternal. Ini biasanya melibatkan tahap pra-pemrosesan di mana data mentah, seperti teks, dikonversi menjadi representasi numerik menggunakan model seperti SBERT.

  2. Buat vektor sparse menggunakan model eksternal. Representasi ini sering mencakup pengukuran TF-IDF atau ukuran frekuensi kata kunci lainnya untuk membuat representasi berdimensi tinggi di mana setiap dimensi sesuai dengan kata atau fitur tertentu.

  3. Buat indeks yang mendukung vektor sparse-dense (s1 atau p1 dengan metrik dotproduct). Indeks ini akan menyimpan vektor-vektor Anda dan memungkinkan pencarian kemiripan yang efisien.

  4. Tambahkan vektor dense dan sparse ke indeks Anda. Ini melibatkan penambahan vektor-vektor Anda ke dalam indeks, di mana mereka disimpan dan dapat dicari.

  5. Cari indeks menggunakan vektor sparse-dense. Kueri mencakup nilai vektor sparse dan dense.

  6. Pinecone mengembalikan vektor sparse-dense. Hasil kueri akan menjadi daftar terurut dari vektor-vektor dari indeks Anda, yang dinilai berdasarkan kemiripan dengan vektor kueri.

Membuat Penanaman Vektor Sparse

Saat membuat penanaman vektor sparse, Anda perlu mengingat bahwa indeks Pinecone menerima indeks yang bersifat sparse bukan dokumen. Oleh karena itu, tanggung jawab pengguna adalah mengontrol pembuatan vektor sparse untuk mewakili dokumen.

Representasi Dokumen dengan Vektor Sparse

Untuk mengimplementasikan pencarian semantik yang memperhatikan kata kunci, setiap dokumen perlu diwakili sebagai vektor. Proses vektorisasi biasanya melibatkan ekstraksi kata kunci dan fitur lain dari dokumen, mengukur tingkat kepentingan mereka, dan mengkodekannya ke dalam vektor berdimensi tinggi di mana setiap dimensi sesuai dengan suatu fitur.

Dukungan Pinecone untuk Ukuran Vektor Sparse

Pinecone mendukung nilai vektor sparse dengan ukuran hingga 1000 nilai non-nol. Kapasitas ini memberikan fleksibilitas yang cukup dalam mewakili dokumen, bahkan ketika dokumen tersebut mengandung sejumlah besar fitur atau kata kunci yang berbeda.

Nilai Sparse dan Dense dalam Vektor

Saat membuat vektor di Pinecone, setiap vektor dapat terdiri dari nilai dense dan sparse. Nilai dense mewakili makna semantik dari konten, sedangkan nilai sparse mewakili informasi kata kunci yang spesifik. Namun, perlu diingat bahwa Pinecone tidak mendukung vektor yang hanya terdiri dari nilai sparse.

Kueri Sparse-Dense

Melakukan kueri menggunakan vektor sparse-dense dalam Pinecone melibatkan memberikan vektor kueri yang mengandung nilai sparse dan dense. Pinecone memproses kueri ini dengan mempertimbangkan perkalian titik penuh pada seluruh vektor, dan skor vektor merupakan penjumlahan perkalian titik nilai dense-nya dengan bagian dense kueri, ditambah perkalian titik nilai sparse-nya dengan bagian sparse kueri.

Representasi Nilai Sparse dalam Pinecone

Pinecone merepresentasikan nilai sparse sebagai kamus dari dua larik:

  • indices: posisi-nilai bukan dalam vektor
  • values: nilai-nilai bukan nol itu sendiri

Nilai-nilai ini dapat diupsert ke dalam parameter vektor untuk memperbarui vektor sparse-dense.

Memperbarui Vektor dengan Nilai Sparse dan Dense

Pinecone menyediakan cara yang sederhana untuk memperbarui vektor yang mengandung nilai sparse dan dense. Contoh Python yang umum melibatkan penggunaan metode upsert dari Indeks Pinecone untuk menambahkan vektor dengan id, values, dan sparse_values yang ditentukan ke dalam indeks yang ada.

python
index = pinecone.Index('example-index')

upsert_response = index.upsert(
    vectors=[
    {'id': 'vec1',
        'values': [0.1, 0.2, 0.3],
        'metadata': {'genre': 'drama'},
        'sparse_values': {
        'indices': [10, 45, 16],
        'values': [0.5, 0.5, 0.2]
    }},
    {'id': 'vec2',
        'values': [0.2, 0.3, 0.4],
        'metadata': {'genre': 'action'},
        'sparse_values': {
        'indices': [15, 40, 11],
        'values': [0.4, 0.5, 0.2]
    }}
    ],
    namespace='example-namespace'
)

Mengkueri Indeks Menggunakan Vektor Sparse-Dense

Mengkueri indeks Pinecone menggunakan vektor sparse-dense sama mudahnya. Anda memberikan vektor dense dan vektor sparse sebagai bagian dari kueri Anda, dan Pinecone akan mengembalikan vektor-vektor dalam indeks yang paling mirip dengan vektor kueri Anda, berdasarkan sistem skoring hibridanya.
Contoh berikut mengkueri indeks menggunakan vektor sparse-dense.

python
query_response = index.query(
    namespace="example-namespace",
    top_k=10,
    vector=[0.1, 0.2, 0.3], # dense vector
    sparse_vector={ # sparse vector
        'indices': [10, 45, 16],
        'values': [0.5, 0.5, 0.2]
    }
)

Pemberian Bobot Sparse-Dense

Indeks Pinecone memperlakukan vektor sparse-dense Anda sebagai entitas yang bersatu, dan sebagai hasilnya, tidak secara inheren menyediakan mekanisme untuk memvariasikan pengaruh bagian dense dan bagian sparse dari kueri. Pinecone tetap netral terhadap kepadatan atau kejaran dalam koordinat vektor Anda. Namun, Anda dapat menerapkan skema bobot linier melalui modifikasi vektor kueri Anda, seperti yang diilustrasikan dalam fungsi berikut.

Dalam contoh berikut, nilai-nilai vektor dimodifikasi dengan menggunakan parameter alpha.

python
def hybrid_score_norm(dense, sparse, alpha: float):
"""Hybrid score using a convex combination

    alpha * dense + (1 - alpha) * sparse

    Args:
        dense: Array of floats representing
        sparse: a dict of `indices` and `values`
        alpha: scale between 0 and 1
    """
    if alpha < 0 or alpha > 1:
        raise ValueError("Alpha must be between 0 and 1")
    hs = {
        'indices': sparse['indices'],
        'values':  [v * (1 - alpha) for v in sparse['values']]
    }
    return [v * alpha for v in dense], hs

Contoh berikut menerapkan fungsi transformasi ke sebuah vektor, kemudian menggunakan vektor yang telah diubah ini untuk melakukan kueri pada indeks Pinecone.

python
sparse_vector = {
    'indices': [10, 45, 16],
    'values': [0.5, 0.5, 0.2]
}
dense_vector = [0.1, 0.2, 0.3]

hdense, hsparse = hybrid_score_norm(dense_vector, sparse_vector, alpha=0.75)

query_response = index.query(
    namespace="example-namespace",
    top_k=10,
    vector=hdense,
    sparse_vector=hsparse
)

Referensi

https://docs.pinecone.io/docs/hybrid-search

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!