Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Membina Sistem Carian Semantik yang Pantas dan Cekap Menggunakan OpenVINO dan Postgres

Membina Sistem Carian Semantik yang Pantas dan Cekap Menggunakan OpenVINO dan Postgres

Susan Sarandon
Susan Sarandonasal
2024-10-21 16:31:02483semak imbas

Building a Fast and Efficient Semantic Search System Using OpenVINO and Postgres

Foto oleh real-napster di Pixabay

Dalam salah satu projek saya baru-baru ini, saya terpaksa membina sistem carian semantik yang boleh berskala dengan prestasi tinggi dan menyampaikan respons masa nyata untuk carian laporan. Kami menggunakan PostgreSQL dengan pgvector pada AWS RDS, dipasangkan dengan AWS Lambda, untuk mencapai ini. Cabarannya ialah untuk membenarkan pengguna mencari menggunakan pertanyaan bahasa semula jadi dan bukannya bergantung pada kata kunci yang tegar, sambil memastikan respons berada di bawah 1-2 saat atau lebih rendah dan hanya boleh memanfaatkan sumber CPU.

Dalam siaran ini, saya akan menelusuri langkah yang saya ambil untuk membina sistem carian ini, daripada mendapatkan semula kepada penarafan semula, dan pengoptimuman yang dibuat menggunakan OpenVINO dan kumpulan pintar untuk tokenisasi.

Gambaran Keseluruhan Carian Semantik: Pengambilan semula dan Pendudukan Semula

Sistem carian tercanggih moden biasanya terdiri daripada dua langkah utama: mendapatkan semula dan penilaian semula.

1) Pendapatan semula: Langkah pertama melibatkan mendapatkan semula subset dokumen yang berkaitan berdasarkan pertanyaan pengguna. Ini boleh dilakukan menggunakan model benam yang telah dilatih, seperti benam kecil dan besar OpenAI, model Benam Cohere atau benam mxbai Mixbread. Pengambilan semula memfokuskan pada mengecilkan kumpulan dokumen dengan mengukur persamaannya dengan pertanyaan.

Berikut ialah contoh ringkas menggunakan perpustakaan pengubah ayat Huggingface untuk mendapatkan semula yang merupakan salah satu perpustakaan kegemaran saya untuk ini:

from sentence_transformers import SentenceTransformer
import numpy as np

# Load a pre-trained sentence transformer model
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")

# Sample query and documents (vectorize the query and the documents)
query = "How do I fix a broken landing gear?"
documents = ["Report 1 on landing gear failure", "Report 2 on engine problems"]

# Get embeddings for query and documents
query_embedding = model.encode(query)
document_embeddings = model.encode(documents)

# Calculate cosine similarity between query and documents
similarities = np.dot(document_embeddings, query_embedding)

# Retrieve top-k most relevant documents
top_k = np.argsort(similarities)[-5:]
print("Top 5 documents:", [documents[i] for i in top_k])

2) Penyusunan Semula: Sebaik sahaja dokumen yang paling berkaitan telah diambil, kami meningkatkan lagi kedudukan dokumen ini menggunakan model pengekod silang. Langkah ini menilai semula setiap dokumen berhubung dengan pertanyaan dengan lebih tepat, memfokuskan pada pemahaman konteks yang lebih mendalam.
Penarafan semula bermanfaat kerana ia menambahkan lapisan penghalusan tambahan dengan menjaringkan perkaitan setiap dokumen dengan lebih tepat.

Berikut ialah contoh kod untuk menyusun semula menggunakan pengekod silang/ms-marco-TinyBERT-L-2-v2, pengekod silang yang ringan:

from sentence_transformers import CrossEncoder

# Load the cross-encoder model
cross_encoder = CrossEncoder("cross-encoder/ms-marco-TinyBERT-L-2-v2")

# Use the cross-encoder to rerank top-k retrieved documents
query_document_pairs = [(query, doc) for doc in documents]
scores = cross_encoder.predict(query_document_pairs)

# Rank documents based on the new scores
top_k_reranked = np.argsort(scores)[-5:]
print("Top 5 reranked documents:", [documents[i] for i in top_k_reranked])

Mengenalpasti Bottleneck: Kos Tokenisasi dan Ramalan

Semasa pembangunan, saya mendapati bahawa peringkat tokenisasi dan ramalan mengambil masa yang agak lama apabila mengendalikan 1,000 laporan dengan tetapan lalai untuk pengubah ayat. Ini menimbulkan kesesakan prestasi, terutamanya kerana kami menyasarkan respons masa nyata.

Di bawah saya memprofilkan kod saya menggunakan SnakeViz untuk menggambarkan persembahan:

Building a Fast and Efficient Semantic Search System Using OpenVINO and Postgres

Seperti yang anda lihat, langkah tokenisasi dan ramalan adalah tidak seimbang dengan perlahan, yang membawa kepada kelewatan yang ketara dalam menyampaikan hasil carian. Secara keseluruhan ia mengambil masa 4-5 saat secara purata. Ini disebabkan oleh fakta bahawa terdapat operasi menyekat antara langkah tokenisasi dan ramalan. Jika kami turut menjumlahkan operasi lain seperti panggilan pangkalan data, penapisan dsb, kami dengan mudah berakhir dengan jumlah 8-9 saat.

Mengoptimumkan Prestasi dengan OpenVINO

Soalan yang saya hadapi ialah: Bolehkah kita membuatnya lebih pantas? Jawapannya ya, dengan memanfaatkan OpenVINO, bahagian belakang yang dioptimumkan untuk inferens CPU. OpenVINO membantu mempercepatkan inferens model pembelajaran mendalam pada perkakasan Intel, yang kami gunakan pada AWS Lambda.

Contoh Kod untuk Pengoptimuman OpenVINO
Begini cara saya menyepadukan OpenVINO ke dalam sistem carian untuk mempercepatkan inferens:

from sentence_transformers import SentenceTransformer
import numpy as np

# Load a pre-trained sentence transformer model
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")

# Sample query and documents (vectorize the query and the documents)
query = "How do I fix a broken landing gear?"
documents = ["Report 1 on landing gear failure", "Report 2 on engine problems"]

# Get embeddings for query and documents
query_embedding = model.encode(query)
document_embeddings = model.encode(documents)

# Calculate cosine similarity between query and documents
similarities = np.dot(document_embeddings, query_embedding)

# Retrieve top-k most relevant documents
top_k = np.argsort(similarities)[-5:]
print("Top 5 documents:", [documents[i] for i in top_k])

Dengan pendekatan ini kita boleh mendapatkan kelajuan 2-3x mengurangkan 4-5 saat asal kepada 1-2 saat. Kod kerja penuh ada pada Github.

Penalaan Halus untuk Kelajuan: Saiz Kelompok dan Tokenisasi

Satu lagi faktor kritikal dalam meningkatkan prestasi ialah mengoptimumkan proses tokenisasi dan melaraskan saiz kelompok dan panjang token. Dengan meningkatkan saiz kelompok (saiz_kelompok=16) dan mengurangkan panjang token (panjang_maks=512), kami boleh menyelaraskan tokenisasi dan mengurangkan overhed operasi berulang. Dalam percubaan kami, kami mendapati bahawa saiz_kelompok antara 16 dan 64 berfungsi dengan baik, dengan apa-apa prestasi merendahkan yang lebih besar. Begitu juga, kami menyelesaikan pada panjang_maks 128, yang berdaya maju jika purata panjang laporan anda agak pendek. Dengan perubahan ini, kami mencapai kelajuan keseluruhan 8x, mengurangkan masa penyusunan semula kepada di bawah 1 saat, walaupun pada CPU.

Dalam amalan, ini bermakna mencuba dengan saiz kelompok dan panjang token yang berbeza untuk mencari keseimbangan yang betul antara kelajuan dan ketepatan untuk data anda. Dengan berbuat demikian, kami melihat peningkatan yang ketara dalam masa respons, menjadikan sistem carian boleh berskala walaupun dengan 1,000 laporan.

Kesimpulan

Dengan menggunakan OpenVINO dan mengoptimumkan tokenisasi dan batching, kami dapat membina sistem carian semantik berprestasi tinggi yang memenuhi keperluan masa nyata pada persediaan CPU sahaja. Malah, kami mengalami kelajuan 8x secara keseluruhan. Gabungan pengambilan semula menggunakan pengubah ayat dan penyusunan semula dengan model pengekod silang mencipta pengalaman carian yang mesra pengguna yang berkuasa.

Jika anda membina sistem yang serupa dengan kekangan pada masa tindak balas dan sumber pengiraan, saya amat mengesyorkan anda meneroka OpenVINO dan kumpulan pintar untuk membuka kunci prestasi yang lebih baik.

Semoga, anda menikmati artikel ini. Jika anda mendapati artikel ini berguna, berikan saya suka supaya orang lain juga dapat menemuinya, dan kongsikannya dengan rakan anda. Ikuti saya di Linkedin untuk mengikuti perkembangan kerja saya. Terima kasih kerana membaca!

Atas ialah kandungan terperinci Membina Sistem Carian Semantik yang Pantas dan Cekap Menggunakan OpenVINO dan Postgres. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn