Traffine I/O

Bahasa Indonesia

2023-05-15

Metadata dalam Pinecone

Pengantar

Metadata adalah fitur yang kuat dan fleksibel dalam Pinecone yang memberikan konteks tambahan pada representasi vektor objek data. Dengan memungkinkan lampiran metadata pasangan kunci-nilai ke vektor dalam indeks, Anda dapat membuat pencarian vektor lebih presisi dan disesuaikan dengan kasus penggunaan khusus Anda. Artikel ini menjelaskan berbagai aspek metadata dalam Pinecone, mulai dari implementasinya dan tipe yang didukung, hingga utilitasnya dalam memperhalus kueri pencarian, dan peran dalam tugas manajemen data seperti penyisipan, pengkuerian, dan penghapusan.

Penyaringan dengan Metadata

Tujuan utama metadata dalam Pinecone adalah membatasi pencarian vektor berdasarkan atribut atau kondisi tertentu. Fungsionalitas tersebut dicapai dengan menentukan ekspresi penyaringan saat mengkueri indeks. Penyaringan metadata sangat efektif dalam mengambil jumlah hasil tetangga terdekat yang tepat sesuai dengan penyaringan yang ditentukan.

Salah satu keuntungan utama penggunaan penyaringan metadata adalah bahwa, dalam kebanyakan kasus, latency pencarian bahkan lebih rendah dibandingkan pencarian tanpa penyaringan. Peningkatan kecepatan ini tidak mengorbankan akurasi atau relevansi, membuat penyaringan metadata menjadi alat yang efisien untuk memperhalus pencarian vektor Anda dalam Pinecone.

Tipe Metadata yang Didukung

Dalam Pinecone, setiap vektor dalam indeks dapat dikaitkan dengan muatan metadata. Muatan ini berupa objek JSON yang terdiri dari pasangan kunci-nilai di mana kunci adalah string, dan nilai dapat berupa tipe berikut:

  • String
  • Number (bilangan bulat atau pecahan, yang dikonversi menjadi pecahan 64-bit)
  • Boolean (true, false)
  • Daftar String

Contoh Muatan Metadata yang Valid

Berikut adalah beberapa contoh muatan metadata yang valid dalam Pinecone:

{
  "genre": "action",
  "year": 2020,
  "length_hrs": 1.5
}

Dalam contoh ini, metadata terkait dengan film. Setiap pasangan kunci-nilai mewakili atribut yang berbeda dari film tersebut.

{
  "color": "blue",
  "fit": "straight",
  "price": 29.99,
  "is_jeans": true
}

Dalam contoh kedua, metadata terkait dengan item pakaian. Pasangan kunci-nilai menggambarkan warna, model, harga, dan jenis item tersebut.

Ukuran Metadata yang Didukung

Pinecone mendukung metadata sebesar 40kb per vektor. Batasan ini memungkinkan Pinecone menjaga kinerja pencarian dan pengambilan yang efisien sambil tetap memberikan ruang yang cukup untuk metadata deskriptif.

Bahasa Kueri Metadata

Bahasa kueri metadata Pinecone memungkinkan penggabungan penyaringan metadata menggunakan operator logika seperti DAN (AND) dan ATAU (OR). Berikut adalah berbagai operator yang dapat Anda gunakan:

  • $eq: Sama dengan (berlaku untuk angka, string, boolean)
  • $ne: Tidak sama dengan (berlaku untuk angka, string, boolean)
  • $gt: Lebih besar dari (berlaku untuk angka)
  • $gte: Lebih besar dari atau sama dengan (berlaku untuk angka)
  • $lt: Kurang dari (berlaku untuk angka)
  • $lte: Kurang dari atau sama dengan (berlaku untuk angka)
  • $in: Dalam array (berlaku untuk string atau angka)
  • $nin: Tidak dalam array (berlaku untuk string atau angka)

Menggunakan Array String sebagai Nilai Metadata atau sebagai Penyaring Metadata

Dalam Pinecone, Anda dapat menggunakan array string sebagai nilai metadata atau sebagai penyaring metadata. Fleksibilitas ini memungkinkan adanya ekspresi penyaringan yang lebih kompleks dan dapat menyesuaikan berbagai skenario data.

Sebagai contoh, pertimbangkan vektor dengan muatan metadata berikut:

{ "genre": ["comedy", "documentary"] }

Berikut adalah beberapa kueri dengan penyaring yang akan cocok dengan vektor di atas:

{"genre":"comedy"}

{"genre": {"$in":["documentary","action"]}}

{"$and": [{"genre": "comedy"}, {"genre":"documentary"}]}

Sebaliknya, kueri dengan penyaring berikut tidak akan cocok dengan vektor tersebut:

{ "$and": [{ "genre": "comedy" }, { "genre": "drama" }] }

Menyisipkan Metadata ke dalam Indeks

Metadata dapat disertakan dalam permintaan upsert saat menyisipkan vektor.

Berikut adalah contoh cara menyisipkan vektor dengan metadata terkait, yang mewakili film, ke dalam indeks Pinecone dengan klien Python:

python
import pinecone

pinecone.init(api_key="your-api-key", environment="us-west1-gcp")
index = pinecone.Index("example-index")

index.upsert([
    ("A", [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1], {"genre": "comedy", "year": 2020}),
    ("B", [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2], {"genre": "documentary", "year": 2019}),
    ("C", [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3], {"genre": "comedy", "year": 2019}),
    ("D", [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4], {"genre": "drama"}),
    ("E", [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], {"genre": "drama"})
])

Mengkueri Indeks dengan Penyaring Metadata

Dengan metadata yang dilampirkan pada vektor Anda, Anda dapat memperhalus pencarian dengan menyertakan ekspresi penyaring metadata dalam kueri Anda. Hal ini memungkinkan Anda membatasi pencarian hanya pada vektor-vektor yang cocok dengan ekspresi penyaring.

Sebagai contoh, Anda dapat mencari dokumenter dari tahun 2019 di indeks film yang dibuat pada bab sebelumnya. Contoh ini juga menggunakan flag include_metadata untuk menyertakan metadata vektor dalam respons.

python
index.query(
    vector=[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
    filter={
        "genre": {"$eq": "documentary"},
        "year": 2019
    },
    top_k=1,
    include_metadata=True
)
{'matches': [{'id': 'B',
              'metadata': {'genre': 'documentary', 'year': 2019.0},
              'score': 0.0800000429,
              'values': []}],
 'namespace': ''}

Untuk alasan kinerja, disarankan untuk tidak mengembalikan data vektor dan metadata ketika top_k > 1000. Kueri dengan top_k di atas 1000 tidak harus mengandung include_metadata=True atau include_data=True.

Menghapus Vektor dengan Penyaring Metadata

Anda dapat menentukan vektor yang akan dihapus berdasarkan nilai metadata mereka dengan mengirimkan ekspresi penyaring metadata ke operasi penghapusan. Fungsionalitas ini memungkinkan penghapusan efisien dari semua vektor yang cocok dengan ekspresi penyaring metadata.

Berikut adalah contoh yang menghapus semua vektor dengan genre "documentary" dan tahun 2019 dari sebuah indeks:

python
index.delete(
    filter={
        "genre": {"$eq": "documentary"},
        "year": 2019
    }
)

Referensi

https://docs.pinecone.io/docs/metadata-filtering

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!