国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 後端開發(fā) Python教學(xué) 使用 OpenVINO 和 Postgres 建立快速且有效率的語意搜尋系統(tǒng)

使用 OpenVINO 和 Postgres 建立快速且有效率的語意搜尋系統(tǒng)

Oct 21, 2024 pm 04:31 PM

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

照片由 real-napster 在 Pixabay上

在我最近的一個專案中,我必須建立一個語義搜尋系統(tǒng),該系統(tǒng)可以高效能擴(kuò)展並為報(bào)告搜尋提供即時回應(yīng)。我們在 AWS RDS 上使用 PostgreSQL 和 pgvector,並搭配 AWS Lambda 來實(shí)現(xiàn)這一目標(biāo)。面臨的挑戰(zhàn)是允許用戶使用自然語言查詢而不是依賴死板的關(guān)鍵字進(jìn)行搜索,同時確保響應(yīng)時間在 1-2 秒甚至更短,並且只能利用 CPU 資源。

在這篇文章中,我將逐步介紹建立此搜尋系統(tǒng)的步驟,從檢索到重新排名,以及使用 OpenVINO 和智慧批次進(jìn)行標(biāo)記化進(jìn)行的最佳化。

語義搜尋概述:檢索和重新排序

現(xiàn)代最先進(jìn)的搜尋系統(tǒng)通常包含兩個主要步驟:檢索重新排名

1) 檢索: 第一步涉及根據(jù)使用者查詢檢索相關(guān)文件的子集。這可以使用預(yù)先訓(xùn)練的嵌入模型來完成,例如 OpenAI 的小型和大型嵌入、Cohere 的嵌入模型或 Mixbread 的 mxbai 嵌入。檢索的重點(diǎn)是透過測量文件與查詢的相似性來縮小文檔池的範(fàn)圍。

這是一個使用 Huggingface 的句子轉(zhuǎn)換器庫進(jìn)行檢索的簡化示例,這是我最喜歡的庫之一:

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)重新排名:檢索到最相關(guān)的文件後,我們使用交叉編碼器模型進(jìn)一步提高這些文件的排名。此步驟會更準(zhǔn)確地重新評估與查詢相關(guān)的每個文檔,並專注於更深入的上下文理解。
重新排名是有益的,因?yàn)樗高^更精確地評估每個文件的相關(guān)性來增加額外的細(xì)化層。

這是使用 cross-encoder/ms-marco-TinyBERT-L-2-v2(一種輕量??級交叉編碼器)進(jìn)行重新排名的程式碼範(fàn)例:

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])

識別瓶頸:標(biāo)記化和預(yù)測的成本

在開發(fā)過程中,我發(fā)現(xiàn)在使用句子轉(zhuǎn)換器的預(yù)設(shè)設(shè)定處理 1,000 個報(bào)告時,標(biāo)記化和預(yù)測階段花費(fèi)了相當(dāng)長的時間。這造成了效能瓶頸,特別是因?yàn)槲覀兊哪繕?biāo)是即時回應(yīng)。

下面我使用 SnakeViz 分析了我的程式碼以視覺化效能:

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

如您所見,標(biāo)記化和預(yù)測步驟異常緩慢,導(dǎo)致搜尋結(jié)果的提供出現(xiàn)嚴(yán)重延遲??偟膩碚f,平均需要 4-5 秒。這是因?yàn)闃?biāo)記化和預(yù)測步驟之間存在阻塞操作。如果我們還添加其他操作,例如資料庫呼叫、過濾等,我們很容易就總共需要 8-9 秒。

使用 OpenVINO 最佳化效能

我面臨的問題是:我們可以讓它更快嗎? 答案是肯定的,透過利用 OpenVINO,一個針對 CPU 推理最佳化的後端。 OpenVINO 有助於加速英特爾硬體上的深度學(xué)習(xí)模型推理,我們在 AWS Lambda 上使用該硬體。

OpenVINO 最佳化的程式碼範(fàn)例
以下是我如何將 OpenVINO 整合到搜尋系統(tǒng)中以加快推理速度:

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-3 倍的加速,將原來的 4-5 秒減少到 1-2 秒。完整的工作代碼位於 Github 上。

速度微調(diào):批量大小和標(biāo)記化

提高效能的另一個關(guān)鍵因素是最佳化標(biāo)記化流程並調(diào)整批次大小標(biāo)記長度。透過增加批次大?。╞atch_size = 16)和減少令牌長度(max_length = 512),我們可以並行化令牌化並減少重複操作的開銷。在我們的實(shí)驗(yàn)中,我們發(fā)現(xiàn) 16 到 64 之間的 batch_size 效果很好,任何更大的值都會降低效能。同樣,我們將 max_length 設(shè)為 128,如果報(bào)告的平均長度相對較短,則該值是可行的。透過這些更改,我們實(shí)現(xiàn)了 8 倍的整體加速,將重新排名時間縮短至 1 秒以下,即使在 CPU 上也是如此。

在實(shí)踐中,這意味著嘗試不同的批量大小和令牌長度,以找到資料速度和準(zhǔn)確性之間的適當(dāng)平衡。透過這樣做,我們看到回應(yīng)時間顯著縮短,使得搜尋系統(tǒng)即使有 1,000 份報(bào)告也可擴(kuò)展。

結(jié)論

透過使用 OpenVINO 並最佳化標(biāo)記化和批次處理,我們能夠建立一個高效能語意搜尋系統(tǒng),滿足僅 CPU 設(shè)定的即時要求。事實(shí)上,我們的整體速度提升了 8 倍。使用句子轉(zhuǎn)換器進(jìn)行檢索與使用交叉編碼器模型進(jìn)行重新排名相結(jié)合,創(chuàng)造了強(qiáng)大的、用戶友好的搜尋體驗(yàn)。

如果您正在建立回應(yīng)時間和運(yùn)算資源受到限制的類似系統(tǒng),我強(qiáng)烈建議您探索 OpenVINO 和智慧批次以釋放更好的效能。

希望您喜歡這篇文章。如果您覺得這篇文章有用,請給我一個贊,以便其他人也可以找到它,並與您的朋友分享。在 Linkedin 上關(guān)注我,以了解我的最新工作。感謝您的閱讀!

以上是使用 OpenVINO 和 Postgres 建立快速且有效率的語意搜尋系統(tǒng)的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Python類中的多態(tài)性 Python類中的多態(tài)性 Jul 05, 2025 am 02:58 AM

多態(tài)是Python面向?qū)ο缶幊讨械暮诵母拍?,指“一種接口,多種實(shí)現(xiàn)”,允許統(tǒng)一處理不同類型的對象。 1.多態(tài)通過方法重寫實(shí)現(xiàn),子類可重新定義父類方法,如Animal類的speak()方法在Dog和Cat子類中有不同實(shí)現(xiàn)。 2.多態(tài)的實(shí)際用途包括簡化代碼結(jié)構(gòu)、增強(qiáng)可擴(kuò)展性,例如圖形繪製程序中統(tǒng)一調(diào)用draw()方法,或遊戲開發(fā)中處理不同角色的共同行為。 3.Python實(shí)現(xiàn)多態(tài)需滿足:父類定義方法,子類重寫該方法,但不要求繼承同一父類,只要對象實(shí)現(xiàn)相同方法即可,這稱為“鴨子類型”。 4.注意事項(xiàng)包括保持方

Python函數(shù)參數(shù)和參數(shù) Python函數(shù)參數(shù)和參數(shù) Jul 04, 2025 am 03:26 AM

參數(shù)(parameters)是定義函數(shù)時的佔(zhàn)位符,而傳參(arguments)是調(diào)用時傳入的具體值。 1.位置參數(shù)需按順序傳遞,順序錯誤會導(dǎo)致結(jié)果錯誤;2.關(guān)鍵字參數(shù)通過參數(shù)名指定,可改變順序且提高可讀性;3.默認(rèn)參數(shù)值在定義時賦值,避免重複代碼,但應(yīng)避免使用可變對像作為默認(rèn)值;4.args和*kwargs可處理不定數(shù)量的參數(shù),適用於通用接口或裝飾器,但應(yīng)謹(jǐn)慎使用以保持可讀性。

解釋Python發(fā)電機(jī)和迭代器。 解釋Python發(fā)電機(jī)和迭代器。 Jul 05, 2025 am 02:55 AM

迭代器是實(shí)現(xiàn)__iter__()和__next__()方法的對象,生成器是簡化版的迭代器,通過yield關(guān)鍵字自動實(shí)現(xiàn)這些方法。 1.迭代器每次調(diào)用next()返回一個元素,無更多元素時拋出StopIteration異常。 2.生成器通過函數(shù)定義,使用yield按需生成數(shù)據(jù),節(jié)省內(nèi)存且支持無限序列。 3.處理已有集合時用迭代器,動態(tài)生成大數(shù)據(jù)或需惰性求值時用生成器,如讀取大文件時逐行加載。注意:列表等可迭代對像不是迭代器,迭代器到盡頭後需重新創(chuàng)建,生成器只能遍歷一次。

python`@classmethod'裝飾師解釋了 python`@classmethod'裝飾師解釋了 Jul 04, 2025 am 03:26 AM

類方法是Python中通過@classmethod裝飾器定義的方法,其第一個參數(shù)為類本身(cls),用於訪問或修改類狀態(tài)。它可通過類或?qū)嵗{(diào)用,影響的是整個類而非特定實(shí)例;例如在Person類中,show_count()方法統(tǒng)計(jì)創(chuàng)建的對像數(shù)量;定義類方法時需使用@classmethod裝飾器並將首參命名為cls,如change_var(new_value)方法可修改類變量;類方法與實(shí)例方法(self參數(shù))、靜態(tài)方法(無自動參數(shù))不同,適用於工廠方法、替代構(gòu)造函數(shù)及管理類變量等場景;常見用途包括從

如何處理Python中的API身份驗(yàn)證 如何處理Python中的API身份驗(yàn)證 Jul 13, 2025 am 02:22 AM

處理API認(rèn)證的關(guān)鍵在於理解並正確使用認(rèn)證方式。 1.APIKey是最簡單的認(rèn)證方式,通常放在請求頭或URL參數(shù)中;2.BasicAuth使用用戶名和密碼進(jìn)行Base64編碼傳輸,適合內(nèi)部系統(tǒng);3.OAuth2需先通過client_id和client_secret獲取Token,再在請求頭中帶上BearerToken;4.為應(yīng)對Token過期,可封裝Token管理類自動刷新Token;總之,根據(jù)文檔選擇合適方式,並安全存儲密鑰信息是關(guān)鍵。

什麼是python魔法方法或dunder方法? 什麼是python魔法方法或dunder方法? Jul 04, 2025 am 03:20 AM

Python的magicmethods(或稱dunder方法)是用於定義對象行為的特殊方法,它們以雙下劃線開頭和結(jié)尾。 1.它們使對象能夠響應(yīng)內(nèi)置操作,如加法、比較、字符串表示等;2.常見用例包括對像初始化與表示(__init__、__repr__、__str__)、算術(shù)運(yùn)算(__add__、__sub__、__mul__)及比較運(yùn)算(__eq__、__lt__);3.使用時應(yīng)確保其行為符合預(yù)期,例如__repr__應(yīng)返回可重構(gòu)對象的表達(dá)式,算術(shù)方法應(yīng)返回新實(shí)例;4.應(yīng)避免過度使用或以令人困惑的方

Python內(nèi)存管理如何工作? Python內(nèi)存管理如何工作? Jul 04, 2025 am 03:26 AM

Pythonmanagesmemoryautomaticallyusingreferencecountingandagarbagecollector.Referencecountingtrackshowmanyvariablesrefertoanobject,andwhenthecountreacheszero,thememoryisfreed.However,itcannothandlecircularreferences,wheretwoobjectsrefertoeachotherbuta

描述Python中的Python垃圾收集。 描述Python中的Python垃圾收集。 Jul 03, 2025 am 02:07 AM

Python的垃圾回收機(jī)制通過引用計(jì)數(shù)和周期性垃圾收集來自動管理內(nèi)存。其核心方法是引用計(jì)數(shù),當(dāng)對象的引用數(shù)為零時立即釋放內(nèi)存;但無法處理循環(huán)引用,因此引入了垃圾收集模塊(gc)來檢測並清理循環(huán)。垃圾回收通常在程序運(yùn)行中引用計(jì)數(shù)減少、分配與釋放差值超過閾值或手動調(diào)用gc.collect()時觸發(fā)。用戶可通過gc.disable()關(guān)閉自動回收、gc.collect()手動執(zhí)行、gc.set_threshold()調(diào)整閾值以實(shí)現(xiàn)控制。並非所有對像都參與循環(huán)回收,如不包含引用的對象由引用計(jì)數(shù)處理,內(nèi)置

See all articles