This Post is under 軟體開發
前文 使用網路套件 – google-gemini-php 來實作在網站伺服器端呼叫 Google Gemini 生成內容(generate content),本文將繼續說明「文字嵌入(text embedding)」的實作。「嵌入(embedding)」在人工智慧領域非常重要,可以想像是把一個物件(object,實體物件或虛擬的概念皆可)轉換成多維度空間的向量(以gemini 來說,維度是768);轉換成向量後才可以被電腦程式當作輸入項以進一步套用到人工智慧的演算法模式再產生各種應用的輸出(如分類…)。
舉個例子來說,如果要說明一個人所處的地理位置,可以用經緯度來表示,這是二度空間;但如果該處是101大樓,可以再加上高度或樓層來表示更精確的所在,這是三度空間;如果又加上日期時間以說明是在何時到過該樓層,這是四度空間。那有沒有五度(或是更高維的)空間呢?想必有(但處在低維度的,通常想像不出高維度的世界模樣)。有人說人的心理狀態也是一個維度,譬如「我的心遺留在愛情海」,現實現地身體與心靈同時處在不同的三度空間。
或許,神鬼也是處在比我們更高維度的空間,祂想讓我們看到就會出現。我則猜想,每對時間的一次微分就會增加一個維度(譬如速度、加速度…)。關於觀察者的心理狀態與時間的感知,可參考愛因斯坦美女與火爐的巧妙譬喻。總之,這裡想表達的是,如果一個物件能轉成更高維度向量就會被越精準的描述。於是兩個物件是不是處在相近的地方,只要比對這兩個物件的向量之餘弦相似性即可。又譬如「某個人的『頻率』(可能是性情、嗜好…)跟你相近,所以你們很合得來」、「比對『DNA』來確認血緣關係」,這裡所說的『頻率』、『DNA』都必須是很具體的基本單元所組合而成,因此也都可以用來表示一種總和概念(concept)或是一個獨立個體。
產生文句的「嵌入(embedding)」
透過 google-gemini-php 套件取得一段文句的「嵌入(embedding)」,按下「嵌入」按鈕,將產生一個大小為768元素,值介於 +1~-1之間的浮點數(float)陣列。這個陣列可以這樣認知,在Google訓練出來語言嵌入模型(此例來說是 text-embedding-004)所認知的世界裏頭,「誰是世界上最美麗的女人?」這句話就相當於這串768長度的向量表示式。呼叫google gemini產生embedding的程式碼如下,主要的不同只有粗體字的那短短的一行。要注意的是, 截至本文發表之時,text-embedding-004 尚未加入到 enum ModelName 之中,可自行修改加入,找到 Enums/ModelName.php 加入這一行:case Embedding004 = ‘models/text-embedding-004’;。
<?php require '/lib/gemini-api-php/vendor/autoload.php'; use GeminiAPI\Client; use GeminiAPI\Resources\Parts\TextPart; use GeminiAPI\Enums\ModelName; $geminiQuery = isset($_REQUEST['q']) ? $_REQUEST['q'] : ""; if(empty($geminiQuery)) { die('{ "error": "invalid query" }'); } $api_key = "YOUR_GEMINI_KEY"; $client = new Client($api_key); $response = $client->embeddingModel(ModelName::Embedding004)->embedContent( new TextPart($geminiQuery) ); header('Content-type: application/json'); print(json_encode($response));
比對不同文句的相似程度
得到文句在語言模型的嵌入(embedding,向量表示式,whatever…),就可以來比對不同文句(甚或知識單元)的相似程度,以進一步產生「關聯」(relation)。「關聯」或許可以說是形成(或稱維繫)我們所認知的這個世界非常重要的關鍵;這世界萬物不斷細分下去,可說本來是離散分立的(discrete)的能量(粒子或是波,whatever),有賴無明的力量將之聚合起來(參考宇宙物質間最基本的交互作用),然後人的認知又賦予其意義;大部分人都認同的社會生存法則,就叫常識;不同社會的常識,必須有所調整(對於人工智慧來說,可以是遷移學習或是其他Tunning方式)。
目前的GPT的智識程度看似可以產生一般人所認同的內容(依據要求,生成對話或是產生圖像),但其實只不過是GPT被餵了海量的訓練資料,再加上許多人為介入的答案校正,調整了內部神經網路的節點連結權重,產出的結果可說是造句與拼湊(取依據權重計算所得到的機率最大者)來回應使問者的提問,因此出現牛頭不對馬嘴,一本正經地胡說八道的結果,自然也不足為奇了。在我看來,目前的生成式人工智慧應還不具有知識單元的概念(因為不具有將訓練資料轉成「本體論的基本要素:物質,屬性,關係」的能力);然而人類隨著不斷成長,卻能不斷將所習得的五花八門知識分門別類,萃取綜整,更有甚者看到目前已知知識外所無,另生創見。
不過目前我們既然已經透過 textEmbedding 取得文句(在某個模型)的向量表示式了,可以當作這個向量是透過某種神秘力量(就是深度學習)考慮了:文句也是一種「物質」,上下文的文字排列也是一種「屬性」,而在語彙的世界誕生了這個文句了;而比對相似性這個動作,就相當於確認不同文句之間的「關係」強度(其實只是像不像而已)。
以上的測試,相似度越接近 1,即表示兩文句越相似。你還可以這樣玩玩看,兩個文句都是英文有沒有比較準?文句二是文句一的英文翻譯,這樣兩句話的相似度又如何?玩了一陣子你應該會發現,中文文句的比對實在不夠準啊。我們也可以大概知道原因可能是,書讀得不夠多(努力不夠,有讀沒有懂…)、學習的路途上缺乏良師益友的回饋…,這些原因不就很像我們常常在罵小孩為什麼考試成績總是不理想,問題到底出在哪裡嗎?但搞不好根本就是用錯方法、不是這塊料…。
其實不只有文字可以嵌入,圖像,影片都可以產生 embedding才是,就如同物質也具有波的特性(物質波),比對波長(反之為頻率),或許人終將了解為何此生此世在此時此地彼此交會。我要講的是,你一定可以想出關於 embedding 的許多巧妙應用。