cari
Rumahpembangunan bahagian belakangTutorial PythonMembina Sistem Carian Semantik yang Pantas dan Cekap Menggunakan OpenVINO dan Postgres

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
Python: Permainan, GUI, dan banyak lagiPython: Permainan, GUI, dan banyak lagiApr 13, 2025 am 12:14 AM

Python cemerlang dalam permainan dan pembangunan GUI. 1) Pembangunan permainan menggunakan pygame, menyediakan lukisan, audio dan fungsi lain, yang sesuai untuk membuat permainan 2D. 2) Pembangunan GUI boleh memilih tkinter atau pyqt. TKInter adalah mudah dan mudah digunakan, PYQT mempunyai fungsi yang kaya dan sesuai untuk pembangunan profesional.

Python vs C: Aplikasi dan kes penggunaan dibandingkanPython vs C: Aplikasi dan kes penggunaan dibandingkanApr 12, 2025 am 12:01 AM

Python sesuai untuk sains data, pembangunan web dan tugas automasi, manakala C sesuai untuk pengaturcaraan sistem, pembangunan permainan dan sistem tertanam. Python terkenal dengan kesederhanaan dan ekosistem yang kuat, manakala C dikenali dengan keupayaan kawalan dan keupayaan kawalan yang mendasari.

Rancangan Python 2 jam: Pendekatan yang realistikRancangan Python 2 jam: Pendekatan yang realistikApr 11, 2025 am 12:04 AM

Anda boleh mempelajari konsep pengaturcaraan asas dan kemahiran Python dalam masa 2 jam. 1. Belajar Pembolehubah dan Jenis Data, 2.

Python: meneroka aplikasi utamanyaPython: meneroka aplikasi utamanyaApr 10, 2025 am 09:41 AM

Python digunakan secara meluas dalam bidang pembangunan web, sains data, pembelajaran mesin, automasi dan skrip. 1) Dalam pembangunan web, kerangka Django dan Flask memudahkan proses pembangunan. 2) Dalam bidang sains data dan pembelajaran mesin, numpy, panda, scikit-learn dan perpustakaan tensorflow memberikan sokongan yang kuat. 3) Dari segi automasi dan skrip, Python sesuai untuk tugas -tugas seperti ujian automatik dan pengurusan sistem.

Berapa banyak python yang boleh anda pelajari dalam 2 jam?Berapa banyak python yang boleh anda pelajari dalam 2 jam?Apr 09, 2025 pm 04:33 PM

Anda boleh mempelajari asas -asas Python dalam masa dua jam. 1. Belajar pembolehubah dan jenis data, 2. Struktur kawalan induk seperti jika pernyataan dan gelung, 3 memahami definisi dan penggunaan fungsi. Ini akan membantu anda mula menulis program python mudah.

Bagaimana Mengajar Asas Pengaturcaraan Pemula Komputer Dalam Kaedah Projek dan Masalah Dikemukakan Dalam masa 10 Jam?Bagaimana Mengajar Asas Pengaturcaraan Pemula Komputer Dalam Kaedah Projek dan Masalah Dikemukakan Dalam masa 10 Jam?Apr 02, 2025 am 07:18 AM

Bagaimana Mengajar Asas Pengaturcaraan Pemula Komputer Dalam masa 10 jam? Sekiranya anda hanya mempunyai 10 jam untuk mengajar pemula komputer beberapa pengetahuan pengaturcaraan, apa yang akan anda pilih untuk mengajar ...

Bagaimana untuk mengelakkan dikesan oleh penyemak imbas apabila menggunakan fiddler di mana-mana untuk membaca lelaki-dalam-tengah?Bagaimana untuk mengelakkan dikesan oleh penyemak imbas apabila menggunakan fiddler di mana-mana untuk membaca lelaki-dalam-tengah?Apr 02, 2025 am 07:15 AM

Cara mengelakkan dikesan semasa menggunakan fiddlerevery di mana untuk bacaan lelaki-dalam-pertengahan apabila anda menggunakan fiddlerevery di mana ...

Apa yang perlu saya lakukan jika modul '__builtin__' tidak dijumpai apabila memuatkan fail acar di Python 3.6?Apa yang perlu saya lakukan jika modul '__builtin__' tidak dijumpai apabila memuatkan fail acar di Python 3.6?Apr 02, 2025 am 07:12 AM

Memuatkan Fail Pickle di Python 3.6 Kesalahan Laporan Alam Sekitar: ModulenotFoundError: Nomodulenamed ...

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)