繼前文介紹完聊天模型的使用方式後,本篇將介紹另一類重要的模型:內嵌 Embedding。
Embedding 模型能夠將一段文字轉換成數學中的向量,在 NLP 中是一個非常大的研究領域,不過本篇不會包含任何理論方面的說明,主要還是會把重心放在如何透過 Azure OpenAI 的 Embedding API 快速的產生詞向量。
部署 Embedding 模型
Embedding 模型其實在 OpenAI 最一開始推出時,根據不同任務屬性區分成了數個模型,而在後來的更新中又推出了 text-embedding-ada-002 (Version 2) 才統一了所有的 Embedding 模型,所以目前最多人使用,同時也是官方建議使用的 Embedding 模型即為 text-embedding-ada-002。
模型部署一樣是透過 Azure OpenAI Studio,操作步驟也都是類似的,可以參考之前的基礎設定文章。
模型部署完成的畫面 |
必要條件
- 需要具備可使用 Azure OpenAI 服務的 Azure 訂閱,可參考下方連結中的申請流程。
- 此系列文皆使用 Python 的 openai 函式庫,安裝與引入方式可參考下方連結中的基本設定。
- 可先設定 Azure OpenAI 端點與金鑰,以下設定方式不會再重複出現在每個範例中。
import openai
openai.api_type = "azure"
openai.api_version = "2023-08-01-preview"
openai.api_base = "https://xxxxx.openai.azure.com/" # 你的 Azure OpenAI 端點
openai.api_key = "OPENAI_API_KEY" # 你的 Azure OpenAI 金鑰
相關連結:【Azure OpenAI】Azure OpenAI Python SDK 使用方式:基本設定
Embedding API 呼叫方式
使用方式直接看以下最基本的範例:
response = openai.Embedding.create(
deployment_id="text-embedding-ada-002",
input="Hello"
)
與先前介紹的 Chat Completion API 類似, deployment_id 是在 Aazure OpenAI 中模型的部署名稱;而在這邊的 Embedding 模型中,短至一個單詞,長至一整篇文章,都可以使用相同的 API 呼叫方式快速轉換成詞向量,將文字直接以字串型式給在 input 即可。
Embedding API 回應
Embedding API 回傳的是一個多層的 Json 物件,可以使用以下方式取出轉換後的向量:
embedding = response['data'][0]['embedding'] # [-0.02181987278163433, -0.00725163146853447, -0.02838272973895073, ..., -0.0034146346151828766]
len_embedding = len(embedding) # 1536
text-embedding-ada-002 模型將回傳的詞向量壓在了 1536 維,這邊官方號稱可以有更便宜的儲存成本與更好的準確度,對比最初代 Embedding 模型的 8000 多維,確實有很大的進步。
向量之後呢?
如果讀者是完全沒有 NLP 的概念(應該只有我),到這邊可能會想為什麼要把文字轉換成向量?而最先看到一件事是:不分語言,因為 Embedding 模型只限制輸入需要字串格式,可以嘗試看看以下範例。
多個輸入
將輸入的字串修改為字串列表,就能在一次呼叫中包含多個輸入。
response = openai.Embedding.create(
deployment_id="text-embedding-ada-002",
input=["Hello", "Bonjour"]
)
不論是英文或法語的 Bonjour,在 Embedding API 中都一致的轉換為長度是 1536 的向量。
相似度
而相同長度的向量在數學中可以計算兩向量間的距離,這時可以很直觀的將向量間的距離看成是兩段文字的相似度;在計算時一般可以使用餘弦相似度 cosine_similarity,而 openai 也已經把公式包進函式庫中。
from openai.embeddings_utils import cosine_similarity
cosine_similarity(response['data'][0]["embedding"], response['data'][1]["embedding"])
# 0.9476516594734119
簡單調用 cosine_similarity 函數可以快速計算出兩向量的餘弦相似度。
回到範例,這兩個向量是由英文的 Hello 與法語的 Bonjour 轉換而成的,而兩者計算出了 94.7% 的相似度!
總結
這邊透過一個簡單的範例快速了解 Python 呼叫 Embedding 模型與計算相似度的使用方式。在後面的文章中會再進一步介紹,如何結合「Embedding 計算相似度」與「ChatGPT 聊天模型」來實做「搜尋推薦引擎」、「企業使用聊天助手」等應用。
系列文章
- 【Azure OpenAI】Azure OpenAI 申請流程全紀錄
- 【Azure OpenAI】Azure OpenAI Python SDK 使用方式:基本設定
- 【Azure OpenAI】Azure OpenAI Python SDK 使用方式:聊天模型
- 【Azure OpenAI】Azure OpenAI Python SDK 使用方式:Embedding
- 【Azure OpenAI】Azure OpenAI Python SDK 使用方式:Function Calling
- 【Azure OpenAI】Azure OpenAI Python SDK 使用方式:Whisper
留言
張貼留言