大型語言模型的語義搜索(一):關鍵詞搜索

關鍵詞搜索(Keyword Search)是文本搜索種一種常用的技術,很多知名的應用app比如Spotify、YouTube 或 Google map等都會使用關鍵詞搜索的算法來實現用戶的搜索任務,關鍵詞搜索是構建搜索系統最常用的方法,最常用的搜索算法是Okapi BM25,簡稱BM25。在信息檢索中,Okapi BM25(BM是最佳匹配的縮寫)是搜索引擎用來估計文檔與給定搜索查詢的相關性的排名函數。它基于Stephen E. Robertson、Karen Sp?rck Jones等人 在 20 世紀 70 年代和 80 年代開發的概率檢索框架。今天我們會教大家使用Cohere的API來調用BM25算法搜索維基百科的數據庫。

一、環境配置

我們需要安裝如下的python包:

pip install cohere
pip install weaviate-client

這里簡單介紹一下cohere是一家從事大模型應用開發的公司,而weaviate是一個開源的向量數據庫,本次實驗我們會用到weaviate-client這個包。接下來我們需要導入一些基礎配置,這些基礎配置主要包含cohere和weaviate的相關的api_key:

import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file

接下來我們來創建一個weaviate的client,它將會允許我們連接一個在線數據庫。

import weaviate#創weaviate建驗證配置
auth_config = weaviate.auth.AuthApiKey(api_key=os.environ['WEAVIATE_API_KEY'])#創建weaviate client
client = weaviate.Client(url=os.environ['WEAVIATE_API_URL'],auth_client_secret=auth_config,additional_headers={"X-Cohere-Api-Key": os.environ['COHERE_API_KEY'],}
)#測試client連接
client.is_ready() 

這里需要說明的是Weaviate 是一個開源的向量數據庫。 它具有關鍵字搜索功能,同時還具有基于大語言模型(LLM)的向量搜索功能。 我們在這里使用的 API key是公共的,它是公共Demo的一部分,因此它是公開的,您可以使用它通過一個url地址來訪問在線Demo數據庫。?另外需要說明的是這個在線數據庫是一個公共數據庫,包含1000萬條自維基百科的數據記錄。數據庫中的每一行記錄表示維基百科文章的一個段落。這 1000 萬條記錄來自 10 種不同的語言。 因此,其中一百萬是英語,另外九百萬對應其他9種不同語言。 我們在執行查詢時可以設置不同的語言。這種語言包括:en, de, fr, es, it, ja, ar, zh, ko, hi

二、關于API KEY

這里我們會用到3個配置參數:COHERE_API_KEY、?WEAVIATE_API_KEY、WEAVIATE_API_URL。其中COHERE_API_KEY我們需要去cohere的網站自己注冊一個cohere賬號然后自己創建一個自己的api_key, 而WEAVIATE_API_KEY和WEAVIATE_API_URL我們使用的是對外公開的api_key和url":

  • weaviate_api_key: "76320a90-53d8-42bc-b41d-678647c6672e"
  • weaviate_api_url: "https://cohere-demo.weaviate.network/"

Keyword Search在基本原理是它會比較問題和文檔中的相同詞匯的數量,從而找出和問題最相關的文檔,如下圖所示:

?

在上圖中Query表示用戶的問題,而Responses表示根據問題檢索到的結果,Number of words in common表示query和responses中出現重復單詞的數量,在這個例子中我們的問題是:“what color is the grass?”?與結果中第二個結果?“The grass is green” 重復的單詞數量最多,因此第二個結果是最優的結果。

下面我們來定義一個關鍵詞搜索函數:

def keyword_search(query,results_lang='en',properties = ["title","url","text"],num_results=3):where_filter = {"path": ["lang"],"operator": "Equal","valueString": results_lang}response = (client.query.get("Articles", properties).with_bm25(query=query).with_where(where_filter).with_limit(num_results).do())result = response['data']['Get']['Articles']return result

這里在定義keyword_search函數時設置了如下四個參數

  • query: 用戶的問題
  • results_lang:使用的語言,默認使用英語。
  • properties :結果的組成結構。
  • num_results:結果的數量,默認3個結果。

由于該在在線數據庫中的數據由10種不同的語言組成,其中包括:en, de, fr, es, it, ja, ar, zh, ko, hi。因此我們可以在查詢時設置不同的語言來進行查詢。另外在該函數中我們還指定了BM25算法(“with_bm25”)來實現關鍵詞搜索,下面我們就來使用默認的英文來進行關鍵詞搜索:

query = "Who is Donald Trump?"
keyword_search_results = keyword_search(query)
print(keyword_search_results)

?

?由于上面的多條結果混在一起看上去比較亂,因此我們可以定義一個整理結果的函數:

def print_result(result):""" Print results with colorful formatting """for i,item in enumerate(result):print(f'item {i}')for key in item.keys():print(f"{key}:{item.get(key)}")print()print()print_result(keyword_search_results)

?

?這里我們看到了關鍵詞搜索函數返回了3條包含“Donald Trump”的文檔。接下來我們使用中文來進行搜索:

query = "安史之亂"
keyword_search_results = keyword_search(query, results_lang='zh')
print_result(keyword_search_results)

?

四、關鍵詞搜索基本原理

這里我們需要解釋一下該關鍵詞搜索系統的基本原理,這里主要包含了查詢(query)和搜索系統(Search System)兩個主要的組件,搜索系統可以訪問它預先處理過的文檔數據,然后響應查詢,系統最后為我們提供一個按與問題最相關的文檔排序結果列表,如下圖所示:

?

搜索系統(Search System)的內部結構

然而在搜索系統內部包含了2個主要的工作階段, 第一個階段通常是檢索或搜索階段,之后還有另一個階段,稱為重新排名即所謂的re-ranking。第一階段通常使用 BM25 算法對文檔集中的文檔與問題進行評分,第一階段檢索的實現通常包含倒排索引的思想(inverted index)。第二階段(re-ranking)則對評分結果進行排序后輸出結果,如下圖所示:

?

從上圖種我們看到了在倒排序表中包含了2列,第一列時關鍵詞,第二列是該關鍵詞所在的文檔的Id. 設計這樣的倒排序表主要是為了優化搜索速度。 當您在搜索引擎中輸入查詢的問題時,系統便能在幾毫秒內得到結果。另外在執行搜索任務時關鍵詞對應的文檔id出現的頻率是評分的重要依據,在上圖中的例子中“Color” 在804文檔中出現,而“Sky”也在804文檔中出現,因此804文檔被命中的次數較多,所以會有較高的評分,最后它在檢索結果中出現的位置會比較靠前。

五,關鍵詞檢索的局限性

我們知道關鍵詞檢索并非是根據關鍵詞的語義來檢索,而是根據問題和文檔中出現的重復單詞數量來進行檢索,這就會帶來一個棘手的問題,那就是如果文檔和問題在語義相關,但是它們之間卻沒有重復的單詞,那么就會照成關鍵詞檢索無法檢索到相關的文檔,如下圖所示:

?

?當文檔與問題在語義上相關,但它們之間又沒有出現重復詞匯,此時關鍵詞檢索將會失效,它將無法檢索到相關文檔,當遇到這種情況時則需要借助語言模型來通過語義識別來進行檢索。后續我們將會借助語言模型來改進關鍵詞搜索的兩個階段,如下圖所示:

?

參考資料


The Cohere Platform

Home | Weaviate - Vector Database

https://en.wikipedia.org/wiki/Okapi_BM25

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697078.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697078.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697078.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Liunx使用nginx和http搭建yum-server倉庫

文章目錄 1. yum-server的搭建方式2. nginx搭建yum-server倉庫2.1. 安裝配置nginx2.2 配置yum-server的rpm2.3. 同步yum源相關包2.3.1 rsync同步源3.3.1 reposync同步源 2.4. 配置客戶端訪問yum配置2.5. 驗證測試 3. http服務搭建yum-server倉庫3.1. 安裝配置http3.2 配置yum-s…

基于微信小程序校園洗衣系統設計與實現(PHP后臺)可行性分析

博主介紹:黃菊華老師《Vue.js入門與商城開發實戰》《微信小程序商城開發》圖書作者,CSDN博客專家,在線教育專家,CSDN鉆石講師;專注大學生畢業設計教育和輔導。 所有項目都配有從入門到精通的基礎知識視頻課程&#xff…

Firewalld防火墻

Firewalld概述 Firewalld firewalld防火墻是centos7系統默認防火墻的防火墻管理工具,取代了之前的iptables防火墻,也是工作在網絡層,屬于包過濾防火墻。 支持網絡區域所定義的網絡鏈接以及接口安全等級的動態防火墻管理工具至此IPv4、IPv6…

ECMAScript modules規范示例詳解

ECMAScript modules(簡稱 ES modules)是JavaScript的標準模塊系統。每個模塊都是一個獨立的JavaScript文件,可以在其中定義導出的變量、函數或類,并從其他模塊中導入這些變量、函數或類。以下是ES modules規范的一些示例和詳解&am…

Go 線程池實現案例

Go 語言并不像其他一些語言(例如 Java 或 C#)那樣直接提供一個線程池的概念。相反,Go 使用 goroutines 來實現并發,它是一種比線程更輕量級的并發執行單元。不過,仍然可以實現一個類似線程池的結構,來管理和…

studio one 6正版多少錢?怎么購買studio one 更便宜,有優惠券哦

Presonus Studio One Studio One是由美國PreSonus公司開發的數字音頻工作站,作為DAW屆的新人,功能強大且全面,雖然它不像其他DAW那樣擁有歷史和聲譽,但它是一個可愛的軟件,包含許多其它DAW所不具備的實用功能&#xff…

web基礎及http協議 (二)----------Apache相關配置與優化

一、httpd 安裝組成 http 服務基于 C/S 結構 1 .常見http 服務器程序 httpd apache,存在C10K(10K connections)問題 nginx 解決C10K問題lighttpd IIS .asp 應用程序服務器 tomcat .jsp 應用程序服務器 jetty 開源的servlet容器&#xf…

選擇 Python IDE(VSCode、Spyder、Visual Studio 2022和 PyCharm)

前言 當選擇 Python 開發工具時,你需要考慮自己的需求、偏好和項目類型。下面是對VSCode、Spyder、Visual Studio 2022和 PyCharm的對比推薦總結: 結論 1、如果你專注于“數據科學”,選擇SpyDer沒錯。 內容 Visual Studio Code (VS Code)…

react項目中的redux以及react-router-dom

掃盲知識點&#xff1a; 1 傳遞自定義事件&#xff1a; <button onClick{(e)>{change(e)}}>獲取事件對象e</button> 將事件對象e傳遞到了change的這個方法中。 2 同時傳遞自定義事件和參數&#xff1a; <button onClick{(e)>{change(‘我…

基于微信小程序失物招領系統設計與實現(PHP后臺+Mysql)可行性分析

博主介紹&#xff1a;黃菊華老師《Vue.js入門與商城開發實戰》《微信小程序商城開發》圖書作者&#xff0c;CSDN博客專家&#xff0c;在線教育專家&#xff0c;CSDN鉆石講師&#xff1b;專注大學生畢業設計教育和輔導。 所有項目都配有從入門到精通的基礎知識視頻課程&#xff…

CleanMyMac2024蘋果電腦清理工具最新使用全面評價

作為軟件評價專家&#xff0c;我對CleanMyMac X進行了全面的評估&#xff0c;以下是我的詳細評價&#xff1a; CleanMyMac X4.14.6全新版下載如下: https://wm.makeding.com/iclk/?zoneid49983 一、功能 CleanMyMac X的功能相當全面&#xff0c;幾乎涵蓋了Mac電腦清理所需的…

nginx 具體介紹

一&#xff0c;nginx 介紹 &#xff08;一&#xff09;nginx 與apache 1&#xff0c; Apache event 模型 相對于 prefork 模式 可以同時處理更多的請求 相對于 worker 模式 解決了keepalive場景下&#xff0c;長期被占用的線程的資源浪費問題 因為有監聽線程&#…

【數據結構】鏈式隊列

鏈式隊列實現&#xff1a; 1.創建一個空隊列 2.尾插法入隊 3.頭刪法出隊 4.遍歷隊列 一、main函數 #include <stdio.h> #include "./3.linkqueue.h" int main(int…

文檔控件DevExpress Office File API v23.2新版亮點 - 支持SVG

DevExpress Office File API是一個專為C#, VB.NET 和 ASP.NET等開發人員提供的非可視化.NET庫。有了這個庫&#xff0c;不用安裝Microsoft Office&#xff0c;就可以完全自動處理Excel、Word等文檔。開發人員使用一個非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…

數據結構之單鏈表的操作

main函數 #include <stdio.h> #include "./03_linkList.h" int main(int argc, const char *argv[]) { linkList* head creatr_linkList(); insertHead_linkL…

運維SRE-19 網站Web中間件服務-http-nginx

Ans自動化流程 1.網站集群核心協議&#xff1a;HTTP 1.1概述 web服務&#xff1a;網站服務&#xff0c;網站協議即可. 協議&#xff1a;http協議,https協議 服務&#xff1a;Nginx服務&#xff0c;Tengine服務....1.2 HTTP協議 http超文本傳輸協議&#xff0c;負責數據在網站…

更高效的構建工具-vite

更高效的構建工具-vite 前言Vite是什么Vite和webpack的比較1. 運行原理2. 使用成本 Vite的初體驗 前言 首先我們要認識什么時構建工具&#xff1f; 企業級項目都具備什么功能呢&#xff1f; Typescript&#xff1a;如果遇到ts文件&#xff0c;我們需要使用tsc將typescript代碼…

Android約束布局中用ConstraintHelper實現過渡動畫效果

前些天發現了一個蠻有意思的人工智能學習網站,8個字形容一下"通俗易懂&#xff0c;風趣幽默"&#xff0c;感覺非常有意思,忍不住分享一下給大家。 &#x1f449;點擊跳轉到教程 一.創建一個類CircularRevealHelper繼承ConstraintHelper代碼如下 /*** Author: ly* Da…

【Linux從青銅到王者】 基礎IO

本篇重點&#xff1a;文件描述符&#xff0c;重定向&#xff0c;緩沖區&#xff0c;磁盤結構&#xff0c;文件系統&#xff0c;inode理解文件的增刪查改&#xff0c;查找一個文件為什么一定要有路徑&#xff0c;動靜態庫&#xff0c;有的時候為什么找不到庫&#xff0c;動態庫的…

JavaWeb——003Axios Vue組件庫(Element)

目錄 一、Ajax 1、同步與異步?編輯 2、原生Ajax&#xff08;繁瑣&#xff09;?編輯 2.1、寫一個簡易的Ajax 3、Axios&#xff08;推薦使用&#xff09;?編輯 3.1、Axios入門 3.2、Axios請求方式別名 3.3、案例&#xff1a;基于Vue及Axios完成數據的動態加載展示?編…