授課者:Andrew Ng、Jay Allamar(Hands-On Large Language Models作者)和Luis Serrano
課程的目的是教你如何在你自己的應用中使用大型語言模型(LLMs)來進行資訊檢索
本課程由Cohere和DeepLearning.ai共同製作
這門課的的操作大部分使用cohere的API進行,很多細節被包在裡面,當然有些手刻的部分,例如文本切割還可以結合Langchain使用。以ML Engineer來說內容過於淺顯不過可以建立好的入門觀念、但以data scientist來說則多了一項更輕巧好使的匕首
以前在cv領域訓練模型、生成Embeddings表示、計算向量距離等還是一定程度手刻(至少用到numpy、pytorch啦),內部有很多細節設定需要考量,相對也會需要對演算法跟目的有更深層的理解,現在這些流程已經高度模組化,相信對於商業應用來說可以更便利、更快建立DEMO,現在不知道這些套件能客製到什麼程度、是否也會如keras般不好debug,學習上還是要更著重在基本的原理(深)跟建立系統性的理解(廣),這些方便的工具就可以成為手上眾多選擇之一
「當你手裡只有錘子,在你看起來,所有東西都像是釘子。」 如果你唯一的工具是把錘子,你很容易把每件事情都當成釘子來處理。
本節介紹關鍵字搜索的基本概念和原理。先連接到Weaviate這個開源數據庫,它包含1000萬條維基百科段落記錄。然后通過實例了解關鍵字搜索的運作 - 查詢時根據文本中的共同關鍵詞計算文檔相關性分數,返回匹配度最高的結果。同時討論了關鍵字搜索的一些局限,如文本中關鍵詞完全不一致时匹配困難。語言模型可以通過理解文本語意來改進搜索引擎。後續課程將學習如何結合語言模型提升搜索的兩個階段 - (retrieval)和(re-ranking)。最后還會介紹大語言模型如何根據搜索結果進行回副生成。
詞彙(lexical)搜索 vs 語意(semantic)搜索
詞彙(lexical)搜索 | 語意(semantic)搜索 | |
---|---|---|
定義 | 依賴關鍵字匹配,返回包含指定關鍵字的結果 | 利用自然語言處理技術瞭解用戶的搜索意圖,返回與意圖相關的結果 |
搜索引擎示例 | (Keyword-based search engines) (Google, Bing) |
ANS: (Semantic search engines) (Google Discover, Microsoft Bing Insights) |
匹配方式 | 匹配文檔中存在的確切關鍵字 | 匹配概念層面的意義,即使關鍵字不同也可找到相關內容 |
優點 | 簡單直接,容易實現 | 可識別不同表達方式的相同意思,結果更貼近用戶意圖 |
缺點 | 關鍵字選擇受限,可能漏掉相關資訊 | 更複雜,需要自然語言理解技術的支持 |
應用情境 | 用戶搜索需求簡單明確時很適用 | 用戶搜索意圖可能更抽象、概念性強時更適用 |
# !pip install cohere
# !pip install weaviate-client
import os
from dotenv import load_dotenv, find_dotenv
# Weaviate 是一個開源的向量資料庫(source vector)database
import weaviate
# 這段程式碼從環境變數取得 API 金鑰,
# 並使用它們建立連接到 Weaviate 資料庫的 client
# 從環境變數中取出 Weaviate 的 API key,並建立一個 auth_config 對象
這將用於後面連線時的驗證
auth_config = weaviate.auth.AuthApiKey(
api_key=os.environ['WEAVIATE_API_KEY'])
# 從 .env 檔案讀取環境變數
_ = load_dotenv(find_dotenv()) # read local .env file
auth_config = weaviate.auth.AuthApiKey(
api_key=os.environ['WEAVIATE_API_KEY'])
# 課程連結的DEMO資料庫是wikipedia的內容
# 包含100萬筆的資料、來自10種語言
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.is_ready()
# True
使用出現的共同字數當作指標來進行排序
def keyword_search
properties
中的views
代表文章的瀏覽數,是這個維基百科數據集裡的一個自定義屬性
BM25是一種常用的關鍵字搜索演算法,主要步驟如下:
* 對每個文檔計算詞頻(TF),即詞語在文檔中出現的頻率
* 對每個詞計算文檔頻率(DF),即包含該詞的文檔數量
* 根據TF和DF計算每個詞的權重,公式如下:
其中:
*
*
*
* 將詞的權重相加得到文檔與查詢的相關分數
* 按分數對結果排序後返回
def keyword_search(query,
results_lang='en', # 支援繁體中文在內的多種語言
properties = ["title","url","text", "views",
num_results=3):
# 加入篩選條件
where_filter = {
"path": ["lang"],
"operator": "Equal",
"valueString": results_lang
}
response = (
client.query.get("Articles", properties)
# 使用BM25演算法進行關鍵字搜索
.with_bm25(
query=query
)
.with_where(where_filter)
.with_limit(num_results)
.do()
)
result = response['data']['Get']['Articles']
return result
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()
query = "What is the most viewed televised event?"
keyword_search_results = keyword_search(query)
print_result(keyword_search_results)
item 0
text:"The most active Gamergate supporters or "Gamergaters"..."
title:Gamergate (harassment campaign)
url:https://zh.wikipedia.org/wiki?curid=1147446
item 1
text:"Rolling Stone" stated Jackson's Super Bowl performance "is far and away the most famous moment in the history of the Super Bowl halftime show".
title:Super Bowl XXXVIII halftime show controversy
url:https://en.wikipedia.org/wiki?curid=498971
關於Keyword Search Internals部分的演算法和執行流程,可以歸納如下:
語言模型可以改進搜索引擎的兩個階段:
Cohere技術文件內的學習資源