Menyimpan dan mencari vektor di Redis#
Redis bisa dipakai sebagai vector database lewat RedisVL: membuat index, menyimpan record, lalu mencari dengan vektor, teks, atau gabungan keduanya. Zul menyediakan dua kelas untuk itu. RedisHelper membaca skema dari file config, cocok untuk aplikasi. RedisVectorDB menerima skema lewat kode, cocok untuk notebook dan eksperimen.
Sebelum mulai: kamu butuh Zul yang sudah ter-install (Instalasi Zul) dan server Redis yang punya modul pencarian (RediSearch) versi 2.6 atau lebih baru, seperti yang ada di Redis Stack.
Menyiapkan RedisHelper dari file config#
-
Install Zul dengan extra
redis: -
Tulis file config awal di folder proyek:
Perintah itu membuat
redis_config.yaml. Opsinya ada di Referensi perintah zul. -
Buka file itu, lalu sesuaikan
connectiondengan server-mu dandimsdengan dimensi model embedding-mu:redis_config.yamlconnection: uri: http://localhost port: 6379 schema: index: name: my_index prefix: doc storage_type: hash fields: - name: content type: text - name: content_embedding_vector type: vector attrs: dims: 768 distance_metric: cosine algorithm: flat datatype: float32 hybrid_search: text_field_name: content vector_field_name: content_embedding_vector text_scorer: BM25 alpha: 0.5 num_results: 10 return_fields: - contentJika server-mu memakai password, tambahkan kunci
passworddi bawahconnection. Jangan menyimpan file berisi password ke Git. -
Periksa file config tanpa menyambung ke server:
from zul.utilities.vector_DB.config.config_loader_redis import ConfigLoader config = ConfigLoader.load("redis_config.yaml") print(config.connection.host, config.index_schema.index.name)Jika file valid, kode itu mencetak host dan nama index:
-
Buat helper dari file config:
from zul.utilities.vector_DB.redis_helper import RedisHelper redis_helper = RedisHelper(config_path="redis_config.yaml")Helper menyambung ke Redis dan membuat index jika belum ada. Index yang sudah ada beserta datanya tidak disentuh.
Menyimpan dan mencari dengan RedisHelper#
-
Ubah teks menjadi vektor, lalu ubah vektor itu menjadi bytes
float32. Untuk storagehash, vektor di record yang disimpan harus berbentuk bytes. Contoh ini memakaiFakeEmbeddingModelsupaya bisa dijalankan tanpa model embedding: -
Simpan record dengan
insert. Method ini menerima satu dict atau daftar dict, dan mengembalikan daftar key yang tersimpan: -
Cari dengan teks dan vektor sekaligus. Pengaturan pencarian diambil dari bagian
hybrid_searchdi config:query_vector = embedding.encode("ketentuan umum").flatten() hits = redis_helper.hybrid_search( query_text="ketentuan umum", query_vector=query_vector, ) for hit in hits: print(hit["content"])Vektor query boleh berupa
numpy.ndarray, daftar float, atau bytes. Helper mengubahnya ke bytesfloat32. -
Untuk pencarian vektor saja, panggil
vector_searchdan sebut field vektornya:
Note
Kunci alpha di bagian hybrid_search adalah bobot skor vektor: 0 berarti hanya skor teks yang dipakai, 1 berarti hanya skor vektor.
Memakai RedisVectorDB tanpa file config#
-
Buat koneksi dengan host dan port. Baca password dari environment, jangan menulisnya di kode:
-
Periksa apakah server mendukung pencarian vektor:
check_requirementsmencetak versi Redis dan versi modul pencarian, lalu mengembalikannya sebagai dict. Jikavector_search_supportedbernilaiFalse, server belum punya modul pencarian versi 2.6 atau lebih baru. -
Buat index dari skema berupa dict dalam format RedisVL:
schema = { "index": {"name": "user_simple", "prefix": "user_simple_docs"}, "fields": [ {"name": "user", "type": "tag"}, {"name": "job", "type": "text"}, {"name": "age", "type": "numeric"}, { "name": "user_embedding", "type": "vector", "attrs": { "dims": 3, "distance_metric": "cosine", "algorithm": "flat", "datatype": "float32", }, }, ], } db.create_index(schema)Jika index dengan nama itu sudah ada,
create_index(schema)membiarkannya. Untuk mengganti skema, panggilcreate_index(schema, overwrite=True), yang menghapus index lama lalu membuatnya ulang. -
Simpan data dengan
insert_data, yang mengirimnya per batch: -
Cari vektor termirip dengan
vector_search: -
Setelah selesai, tutup koneksi:
Warning
db.delete_index() menghapus index beserta semua record di dalamnya dan tidak bisa dibatalkan.
Menggabungkan pencarian teks dan vektor#
Bagian ini melanjutkan contoh RedisVectorDB di atas, sebelum koneksi ditutup. Ada dua cara menggabungkan hasil, pilih salah satu.
-
Untuk satu skor gabungan berbobot, panggil
hybrid_searchdan aturalpha, yaitu bobot skor vektor antara0(teks saja) dan1(vektor saja): -
Untuk menggabungkan peringkat, bukan skor, panggil
hybrid_search_rrf. Method ini menjalankan pencarian vektor dan pencarian teks secara terpisah, lalu menggabungkan urutannya dengan Reciprocal Rank Fusion, sehingga hasilnya tidak bergantung pada skala skor masing-masing pencarian:scored, ranked = db.hybrid_search_rrf( text_query="engineer", vector_query=query_vector, text_field_name="job", vector_field_name="user_embedding", return_fields=["job"], num_results=5, ) print(ranked)rankedberisi nilai field teks, urut dari yang paling relevan.return_fieldswajib memuat field teks, karena hasil digabung berdasarkan nilai field itu.
Memeriksa hasilnya#
Untuk memastikan record tersimpan, cetak jumlah key yang dikembalikan insert atau insert_data:
Untuk contoh di halaman ini, kode itu mencetak jumlah record yang kamu kirim:
Untuk melihat keadaan index di server, cetak informasinya:
get_info mengembalikan dict informasi index dari Redis. Jika kamu memakai RedisVectorDB langsung, panggil db.get_info().
Halaman terkait#
- Referensi RedisHelper dan RedisVectorDB untuk semua method, format vektor, dan setiap kunci config.
- Referensi perintah zul untuk opsi
zul install redis-helper. - Menyimpan dan mencari vektor di Milvus jika kamu memakai Milvus sebagai vector database.
- Memakai helper kecil untuk
FakeEmbeddingModeldan pengukur waktu.