


Membina Sistem Carian Semantik yang Pantas dan Cekap Menggunakan OpenVINO dan 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:
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!

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 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.

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

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.

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 masa 10 jam? Sekiranya anda hanya mempunyai 10 jam untuk mengajar pemula komputer beberapa pengetahuan pengaturcaraan, apa yang akan anda pilih untuk mengajar ...

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

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


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

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
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
Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

SublimeText3 versi Inggeris
Disyorkan: Versi Win, menyokong gesaan kod!

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)