認知搜尋 Azure Cognitive Search,在需要限縮 ChatGPT 回答內容的對話機器人情境中,Cognitive Search 可以作為其中最關鍵的「知識庫」角色,其 PaaS 服務的方便性加上後期與 Azure OpenAI 的整合,可說是 2023 年最受益於 ChatGPT 的 Azure 服務之一。
此篇會由快速入門 Cognitive Search 的角度出發,使用 Python SDK 建立 Cognitive Search 的 Index ,並在其中載入測試資料與進行全文檢索。
建立服務
由 Portal 建立 Cognitive Search 服務是最簡單快速的,基本上在建立時只需要決定「定價層」、「復本數」與「分割區數量」。
選擇建立免費層的 Cognitive Search |
這邊我們先從最簡單的免費層開始就好,在這個層級中「復本數」與「分割區數量」都被限制在 1 份,所以只需要無腦點建立就可以囉。
免費層無法調動設定 |
看到預估成本是 0 元就莫名的開心..
API 金鑰
建立完成後進入 Cognitive Search 畫面左邊的「金鑰」頁籤,先複製下來備用。
查看 API 金鑰 |
測試資料
先借用以下官方放在 GitHub 上的範例資料,資料中包含了 108 項 Azure 服務的名稱與簡介,並存放於 Json 格式中。
相關連結:https://github.com/Azure/cognitive-search-vector-pr/blob/main/demo-python/data/text-sample.json
Python 套件安裝
Cognitive Search 的官方 Python SDK,使用以下指令安裝:
建立 Index
首先透過以下這段程式,使用剛剛暫存下來的金鑰連線到 Cognitive Search,記得將 endpoint 與 credential 替換成自己的。
在將測試資料放入 Cognitive Search 前,必須先建立 Index,這邊可以將 Index 想像成資料庫中的表,與在資料庫中建立表的流程一下,需要先定義表的欄位與其格式,在 Cognitive Search 中使用 Field 來設定這些。
配合測試資料中的 4 個欄位:id、title、content、category 分別建立 Field,簡單說明一下:
- 在 Index 中需要指定一個欄位作為 Primary Key,使用 key=True 來設定。
- 可以簡單將 SearchableField 理解為能被全文檢索到的欄位
以下程式碼使用設定好的欄位在 Cognitive Search 中建立 Index:
其中 SearchIndex 的 name 可以自行設定 Index 的名稱。
建立完成後就能在 Portal 上看到該 Index,切換到 Cognitive Search 畫面左邊的「索引」頁籤,其中可以看到所有欄位與相關設定:
由 Portal 查看建立完成的 Index |
在 Index 中寫入資料
建立好 Index 後就能開始將測試資料載入,因為測試資料已經揪甘心的整理成漂亮的 Json 格式,所以打開讀取後就能直接載入 Index,一樣記得要將 endpoint 與 credential 替換成自己的。
寫入完成,一樣回到 Cognitive Search 畫面左邊的「索引」頁籤,稍等幾分鐘後重新整理畫面,就能看到 108 筆資料成功被載入 Index 了!
108 筆資料成功被載入 Index |
全文檢索
資料載入 Index 後就能開始檢索這些資料了,第一次先使用 search_text="*" 查詢,代表不包含任何關鍵字的空查詢:
執行結果如下:
使用 search_text="*" 的空查詢會返還所有在 Index 內的資料,這也表示查詢是成功的。
再來使用關鍵字 web 搜尋有沒有相關的服務:
執行結果如下:
這次多印出了 @search.score,是由最常見的 BM25 算法計算而得,可以簡單將他視為這次檢索的分數,分數越高代表這個項目與關鍵字越相關。
總結
如同開頭提到的,Cognitive Search 已經是一個成熟的 PaaS 服務,在載入資料與檢索等都已經有簡單易用的 API,尤其在檢索時還有非常多可以塞選結果的語法可以使用,對於需要建立私有資料的檢索平台來說,Cognitive Search 幾乎把後端加資料庫都幫你做好了,真的非常方便阿!
而目前的檢索方式還建立在簡單的關鍵字搜尋,在這個大 ChatGPT 時代似乎在搜尋結果上還是差強人意了點,下一篇會繼續結合 Azure OpenAI ,讓 Cognitive Search 能使用自然語言的問答方式來做資料檢索,請繼續收看!
留言
張貼留言