<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          干貨:向量檢索庫總結|收藏夾必備

          共 8362字,需瀏覽 17分鐘

           ·

          2022-11-24 16:34

          ?↓↓ 文末 福利↓↓

          不論是在推薦系統(tǒng),還是信息匹配,都包含召回 和排序兩個階段,而在召回階段,向量檢索庫起著至關重要的作用。 在推薦 系統(tǒng)的召回階段,向量的最近鄰檢索是必不可少的一步。 當在 召回階段使用離線模型訓練好item向量后,通常會存儲至數(shù)據(jù)庫中,在線上推理時,模 型實時計算出user向量,會通過Annoy或Faiss進行最近鄰檢索。 而在基于FAQ的智能問答的召回階段,目標是從知識庫中快速召回一小 批與query相關的候選集。

          本文會重點介紹幾種常用的向量檢索庫及使用方式。包括: Annoy、Faiss、Milvus、ElasticSearch等

          01

          Annoy


          Annoy 是高維空間求近似最近鄰的一個開源庫 。 全稱: Approximate Nearest Neighbors Oh Yeah,是一種適合實際應用的快速相似查找算法。

          Annoy構建一個二叉樹,查詢時間為O(logn)。

          github:https://github.com/spotify/annoy

          Annoy的使用

          直接通過pip install annoy安裝。

                
                  from annoy import AnnoyIndex
                
                
                  import random
                
                
                  
                    # 向量的維度
                  
                
                
                  f = 40  # Length of item vector that will be indexed
                
                
                  
                    # 返回一個可讀可寫的存儲 f 維向量的索引
                  
                
                
                  t = AnnoyIndex(f, 'angular')
                
                
                  for i in range(1000):
                
                
                      # random.gauss為隨機生成高斯分布的隨機數(shù)
                
                
                      v = [random.gauss(0, 1) for z in range(f)]
                
                
                      # 在位置 i 添加向量
                
                
                      t.add_item(i, v)
                
                
                  
                    # 建立一棵 n_trees的森林,樹越多,精度越高
                  
                
                
                  t.build(10) # 10 trees
                
                
                  
                    # 保存
                  
                
                
                  t.save('test.ann')
                
                
                  
                    
          # ...
          u = AnnoyIndex(f, 'angular') # 直接加載 u.load('test.ann') # super fast, will just mmap the file print(u.get_nns_by_item(0, 1000)) # will find the 1000 nearest neighbors
              
            

          上面的例子為官方github提供的例子。

          向量檢索時用到的函數(shù)

          • a.get_nns_by_item(i, n, search_k=-1, include_distances=False): 返回最接近 i 的n個item。查詢過程中,將檢查search_k個節(jié)點,默認為n_trees* n。serarch_k實現(xiàn)了準確性和速度之間的運行時間權衡。include_distances為True時將返回一個包含兩個列表的2元素元組:第二個包含所有相應的距離。

          • a.get_nns_by_vector(v, n, search_k=-1, include_distances=False): 和上面的根據(jù)item查詢一樣,只不過這里給定一個查詢向量v,比如給定一個用戶embedding, 返回n個最近鄰的item, 一般這樣用的時候, 后面的距離會帶著,可能作為精排那面的強特。

          • a.get_item_vector(i): 返回索引i對應的向量。

          • a.get_distance(i, j): 返回item_i和item_j的平方距離。

          索引屬性函數(shù)

          • a.get_n_items(): 返回索引中的items個數(shù),即詞典大小。

          • a.get_n_trees(): 索引樹的個數(shù)。

          • annoy接口中一般需要調(diào)整的參數(shù)有兩個:樹的數(shù)量n_trees和搜索過程中檢查的節(jié)點數(shù)量search_k

          • n_trees: 在構建期間提供,影響構建時間和索引大小。值越大,結果越準確,但索引越大。

          • search_k: 在運行時提供,并影響搜索性能。值越大,結果越準確,但返回的時間越長。如果不提供,就是n_trees * n, n是最近鄰的個數(shù)。


          02

          Faiss



          Faiss庫是由 Facebook 開發(fā)的適用于稠密向量匹配的開源庫,支持 c++ 與 python 調(diào)用。 Faiss提供了高效的索引類庫。 是向量化檢索開山鼻祖的應用。

          Faiss 支持多種向量檢索方式,包括內(nèi)積、歐氏距離等,同時支持精確檢索與模糊搜索。

                
                  github: https://github.com/facebookresearch/faiss
                
                
                  tutorial: https://github.com/facebookresearch/faiss/wiki/Getting-started
                
              
              
            

          Faiss 主要特性:

          • 支持相似度檢索和聚類;

          • 支持多種索引方式;

          • 支持CPU和GPU計算;

          • 支持Python和C++調(diào)用

          Faiss的使用

          直接通過pip install faiss-cpu --no-cache進行安裝。

          faiss的使用方法也比較簡單,歸納為以下三個步驟:

          1. 構建向量庫,對已知的數(shù)據(jù)進行向量,最終以矩陣的形式表示

          2. 為矩陣選擇合適的index,將第一步得到的矩陣add到index中

          3. search得到最終結果

                
                  import numpy as np 
                
                
                  import faiss 
                
                
                  
                    
          d = 64 nb = 100000 nq = 10000 # 構建向量庫 xb = np.random.random((nb, d)).astype('float32') xb[:, 0] += np.arange(nb) / 1000. xq = np.random.random((nq, d)).astype('float32') xq[:, 0] += np.arange(nq) / 1000.
          # 關鍵步驟,build index index = faiss.IndexFlatL2(d) index.add(xb)
          k = 4 D, I = index.search(xq[:5], k) # 分別返回距離和索引
              

          03

          Milvus


          M ilvus 是一款開源 特征向量相似度搜索引擎 ,使用方便、 實用可靠、易于擴展、穩(wěn)定高效和搜索迅速。
          • 高性能:涵蓋如Faiss、Annoy和hnswl

            ib等主流第三方索引庫,性能高,支持對海量向量數(shù)據(jù)進行相似搜索。

          • 高可用、高可靠:Milvus支持使用Kubernetes部署,支持在云上擴展。其容災能力能夠保證服務的高可用。Milvus依照日志及數(shù)據(jù)的理念,使用如Pulsar、Kafka等消息隊列的技術實現(xiàn)組件間的通信,對組件進行解耦,擁抱云原生。

          • 混合查詢:Milvus支持在向量檢索過程中進行標量字段過濾,實現(xiàn)混合查詢。

          • 開發(fā)者友好:支持多語言、多工具的Milvus生態(tài)。如今Milvus已經(jīng)支持Python、Java、Go和Node.js,未來可能還會擴展對更多語言的支持。Milvus提供了如Attu等工具,幫助用戶簡化操作。

          Milvus的更多介紹可以查看:https://gitee.com/milvus-io/milvus

          04

          ElasticSearch



          Elasticsearch 是?個分布式可擴展的實時搜索和分析引擎,?個建?在全?搜索引擎 Apache Lucene(TM)基礎上的搜索引擎,當然 Elasticsearch 并不僅僅是 Lucene 那么簡單,它不僅包括了全?搜索功能,還可以進行以下?作:

          • 分布式 實時?件存儲,并將每?個字段都編入索引,使其可以被搜索。

          • 實時分析的分布式搜索引擎。

          • 可以擴展到上百臺服務器,處理PB級別的結構化或非結構化數(shù)據(jù) 。

          ES本質(zhì)上是一個支持全文搜索的分布式內(nèi)存數(shù)據(jù)庫,特別適用于構建搜索系統(tǒng),比如內(nèi)容檢索、文本檢索、日志檢索。 其原因是采用了倒排索引。

          什么是倒排索引呢?

          倒排索引是一種特別為搜索而設計的索引結構。

          先對需要索引的字段進行分詞,然后以分詞為索引組成一個查找樹,這樣就把一個全文匹配的查找轉換成了對樹的查找。

          倒排索引相比于一般數(shù)據(jù)庫采用B樹索引,其寫入和更新的性能比較差,因此倒排索引只適合全文搜索,不適合更新頻繁的交易類數(shù)據(jù)。

          ES機制

          Elasticsearch的?件存儲, Elasticsearch是?向?檔型數(shù)據(jù)庫,?條數(shù)據(jù)在這?就是?個?檔,?JSON作為?檔序列化的格式,比如下面這條用戶數(shù)據(jù):

                
                  {
                
                
                  "name" : "John",
                
                
                  "sex" : "Male",
                
                
                  "age" : 25,
                
                
                  "birthDate": "1990/05/01",
                
                
                  "about" : "I love to go rock climbing",
                
                
                  "interests": [ "sports", "music" ]
                
                
                  }
                
              
              
            

          也就是說Elasticsearch比較適合存儲非結構化或半結構化數(shù)據(jù)。

          ?Mysql這樣的數(shù)據(jù)庫存儲就會容易想到建??張User表,有?戶信息的字段等,在Elasticsearch?這就是?個?檔,當然這個?檔會屬于?個User的類型,各種各樣的類型存在于?個索引當中。這?有?份將Elasticsearch和關系型數(shù)據(jù)術語對照表:

          關系數(shù)據(jù)庫【數(shù)據(jù)庫關系系統(tǒng)】 ? 數(shù)據(jù)庫 ? 表 ? ? ? 列(Columns)

          Elasticsearch ? 索引(Index) ? 類型(type) ? ?檔(Docments) ? 字段(Fields)

          ES安裝使用

          • 官方安裝:https://www.elastic.co/cn/downloads/elasticsearch

          • 安裝案例:https://blog.csdn.net/willingtolove/article/details/118017928

          • Python Client:https://elasticsearch-py.readthedocs.io?

          本文主要介紹了常用的幾種向量檢索庫,在機器學習集訓營18期中的電商商品檢索系統(tǒng)項目中有更多相關講解,包含基于關鍵詞的檢索和基于向量相似度的檢索。


          免費試聽

          如果你是應屆生或打算從傳統(tǒng)IT轉型AI,想要系統(tǒng)深入地學習,建議你看下七月在線的 【機器學習集訓營】 。

          b381da2dcec1ef039a3584816d12a23a.webp


          其集訓營每一期都涌現(xiàn)出了很多offer,或應屆研究生高薪就業(yè),或從Java等傳統(tǒng)IT行業(yè)成功轉型AI拿到年薪三四十萬 ,部分超過四十萬拿到五十萬,有的甚至年薪百萬。

          d838da499c6a3a04916feffcf8953369.webp

          0f3dbd5ccdcca62425119e810bc46bf4.webp

          如果你已經(jīng)有一定基礎想要繼續(xù)進行深度學習、挑戰(zhàn)高薪,也可以看一下七月在【高級小班】系列課程,包含CV、NLP、推薦等方向!

          ??掃碼查看課程 ??

          對上面集訓營、高級班感興, 可掃碼 (或找七月在線任一老師)申請免費試聽,每天有5個免費試聽名額!

          (掃碼?。合聢D 8本電子書+免費試聽課程

          需要七月在線內(nèi)部電子書的同學也可找老師要。

          ?↓以下8本書電子版免費領,直接送↓

          109112992ae9468d1e513b2931e03d56.webp

          79d0f8f4f8579bedeeb6cb904f442286.webp

          點擊 閱讀原文 了解課程詳情~ 16558b9353d1bb661cfd4f90705eaf86.webp
          瀏覽 118
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  永久免费在线观看不卡黄网站 | 日本二区 在线观看 | 永久免费无人区一区 | 亚洲成人超碰在线观看 | 男操女逼射逼心国产中字传媒视频 |