絕對域名做網站軟文營銷的概念
關鍵詞搜索(Keyword Search)是文本搜索種一種常用的技術,很多知名的應用app比如Spotify、YouTube 或 Google map等都會使用關鍵詞搜索的算法來實現用戶的搜索任務,關鍵詞搜索是構建搜索系統(tǒng)最常用的方法,最常用的搜索算法是Okapi BM25,簡稱BM25。在信息檢索中,Okapi BM25(BM是最佳匹配的縮寫)是搜索引擎用來估計文檔與給定搜索查詢的相關性的排名函數。它基于Stephen E. Robertson、Karen Sp?rck Jones等人 在 20 世紀 70 年代和 80 年代開發(fā)的概率檢索框架。今天我們會教大家使用Cohere的API來調用BM25算法搜索維基百科的數據庫。
一、環(huán)境配置
我們需要安裝如下的python包:
pip install cohere
pip install weaviate-client
這里簡單介紹一下cohere是一家從事大模型應用開發(fā)的公司,而weaviate是一個開源的向量數據庫,本次實驗我們會用到weaviate-client這個包。接下來我們需要導入一些基礎配置,這些基礎配置主要包含cohere和weaviate的相關的api_key:
import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
接下來我們來創(chuàng)建一個weaviate的client,它將會允許我們連接一個在線數據庫。
import weaviate#創(chuàng)weaviate建驗證配置
auth_config = weaviate.auth.AuthApiKey(api_key=os.environ['WEAVIATE_API_KEY'])#創(chuàng)建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種不同語言。 我們在執(zhí)行查詢時可以設置不同的語言。這種語言包括: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賬號然后自己創(chuàng)建一個自己的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)
Keyword Search在基本原理是它會比較問題和文檔中的相同詞匯的數量,從而找出和問題最相關的文檔,如下圖所示:
?
在上圖中Query表示用戶的問題,而Responses表示根據問題檢索到的結果,Number of words in common表示query和responses中出現重復單詞的數量,在這個例子中我們的問題是:“what color is the grass?”?與結果中第二個結果?“The grass is green” 重復的單詞數量最多,因此第二個結果是最優(yōu)的結果。
下面我們來定義一個關鍵詞搜索函數:
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)
?
四、關鍵詞搜索基本原理
這里我們需要解釋一下該關鍵詞搜索系統(tǒng)的基本原理,這里主要包含了查詢(query)和搜索系統(tǒng)(Search System)兩個主要的組件,搜索系統(tǒng)可以訪問它預先處理過的文檔數據,然后響應查詢,系統(tǒng)最后為我們提供一個按與問題最相關的文檔排序結果列表,如下圖所示:
?
搜索系統(tǒng)(Search System)的內部結構
然而在搜索系統(tǒng)內部包含了2個主要的工作階段, 第一個階段通常是檢索或搜索階段,之后還有另一個階段,稱為重新排名即所謂的re-ranking。第一階段通常使用 BM25 算法對文檔集中的文檔與問題進行評分,第一階段檢索的實現通常包含倒排索引的思想(inverted index)。第二階段(re-ranking)則對評分結果進行排序后輸出結果,如下圖所示:
?
從上圖種我們看到了在倒排序表中包含了2列,第一列時關鍵詞,第二列是該關鍵詞所在的文檔的Id. 設計這樣的倒排序表主要是為了優(yōu)化搜索速度。 當您在搜索引擎中輸入查詢的問題時,系統(tǒng)便能在幾毫秒內得到結果。另外在執(zhí)行搜索任務時關鍵詞對應的文檔id出現的頻率是評分的重要依據,在上圖中的例子中“Color” 在804文檔中出現,而“Sky”也在804文檔中出現,因此804文檔被命中的次數較多,所以會有較高的評分,最后它在檢索結果中出現的位置會比較靠前。
五,關鍵詞檢索的局限性
我們知道關鍵詞檢索并非是根據關鍵詞的語義來檢索,而是根據問題和文檔中出現的重復單詞數量來進行檢索,這就會帶來一個棘手的問題,那就是如果文檔和問題在語義相關,但是它們之間卻沒有重復的單詞,那么就會照成關鍵詞檢索無法檢索到相關的文檔,如下圖所示:
?
?當文檔與問題在語義上相關,但它們之間又沒有出現重復詞匯,此時關鍵詞檢索將會失效,它將無法檢索到相關文檔,當遇到這種情況時則需要借助語言模型來通過語義識別來進行檢索。后續(xù)我們將會借助語言模型來改進關鍵詞搜索的兩個階段,如下圖所示:
?
參考資料
The Cohere Platform
Home | Weaviate - Vector Database
https://en.wikipedia.org/wiki/Okapi_BM25