成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在 DUCKDB 中構建人工智能驅動的搜索功能

發布于 2024-5-17 11:07
瀏覽
0收藏

TLDR

本文將展示如何使用 DuckDB 的數組類型和余弦相似度函數實現高效的基于文本嵌入的向量搜索,并通過電影數據集實例演示其應用。

簡介

現在,許多分析任務涉及文本數據,例如電子商務商店的產品評論。這些任務包括但不限于分類、聚類和相似性比較。它們主要使用文本數據的向量嵌入表示來實現矢量搜索功能。

DuckDB 提供了 Array[2] 和 List[3] 數據類型,可以用來存儲和處理向量嵌入,以實現向量搜索。在這個系列博客的第一篇中,我們將探討相似性比較,學習如何在 DuckDB 中使用向量嵌入。我們將涵蓋向量嵌入、余弦相似度以及基于嵌入的向量搜索。

什么向量搜索?

在自然語言處理(NLP)的世界中,向量嵌入或稱為向量搜索,指的是文本數據的數值表示。這些嵌入將單詞、短語甚至整個文檔轉換為實數向量,捕捉詞之間的關系和文本數據的語義含義。通過將文本表示為向量嵌入,我們能夠應用數學運算,如相似性比較、聚類和分類。讓我們通過一個例子來進一步理解這一點。

這里有四個詞的向量嵌入,使用了一個簡單的向量嵌入模型:

在 DUCKDB 中構建人工智能驅動的搜索功能-AI.x社區

注意:上述向量嵌入是通過 mixedbread-ai/mxbai-embed-large-v1[4]

將它們在圖表上可視化后,我們得到:

在 DUCKDB 中構建人工智能驅動的搜索功能-AI.x社區

graph visualization

根據我們的語義知識(常識),我們知道“狗”和“吠叫”之間的關系類似于“貓”和“喵喵叫”。乍一看,我們在 x 軸的左側看到“狗”和“吠叫”,而在右側看到“貓”和“喵喵叫”。為了定量分析這些詞的關系,我們需要使用諸如余弦相似度之類的指標。

什么是余弦相似度?

余弦相似度是一種計算向量嵌入語義相似性的指標。它也常用于信息的語義檢索中。我們通過取兩個歸一化的向量之間的點積( dot product[5]

? 這個指標的值為 1 表示兩個向量完全相同

? 值為 0 意味著它們是獨立的(正交)

? 值為-1 表示它們是對立的(相反)

下面列出的是詞對的余弦值:

在 DUCKDB 中構建人工智能驅動的搜索功能-AI.x社區

通過比較余弦值(cosine(“dog”, “meow”)) 和 cosine(“cat”, “bark”)),我們可以推斷出"meow"幾乎與"dog"相反,而"cat"和"bark"也是如此。在我們擁有的詞匯中,可以看到"dog"與"bark"的關系最為密切,而"cat"與"meow"的關系最為緊密。有趣的是,盡管"meow"和"bark"是對立的,但"dog"和"cat"并不是。也許這個模型捕捉到了它們都是被馴化的動物、寵物,并且非常可愛這一共同點。??

DuckDB 的數組類型和余弦相似度函數

自 0.10 版本以來,DuckDB 提供了 ARRAY 類型來存儲固定大小的數組,非常適合存儲向量嵌入。這意味著 ARRAY 類型列中的所有字段都具有相同的長度和相同的底層類型。要使用此數據類型初始化表,您需要指定數組中每個元素的數據類型,后跟方括號和數組大小;例如, FLOAT[2] 將初始化一個大小為 2 的數組,其中每個元素都是 FLOAT 類型。

讓我們來看看如何將上述數據轉化為表格形式:

CREATE TABLE word_embeddings 
(word VARCHAR, embedding FLOAT[2]);

INSERT INTO word_embeddings
VALUES ("dog", [ 0.23, 0.37]),
       ("cat", [-0.27, 0.29]),
       ("bark", [ 0.35, -0.02]),
       ("meow", [-0.32, -0.09]);

這里我們提供了一個表格,其中包含單詞及其向量嵌入。DuckDB還提供了一個函數 array_cosine_similarity(array1, array2) ,用于計算兩個向量之間的余弦相似度指標。

對于上述表格,讓我們計算詞對之間的余弦相似度指標。

SELECT x.word as word_1,
       y.word as word_2,
       array_cosine_similarity(x.embedding, y.embedding) AS similarity_metric
FROM word_embeddings AS x
CROSS JOIN word_embeddings AS y
WHERE word_1 > word_2
ORDER BY similarity_metric DESC;

這為我們提供了與上述部分相同的結果:

在 DUCKDB 中構建人工智能驅動的搜索功能-AI.x社區

注意:在 DuckDB v0.10.0 之前,用于存儲可變大小數組的數據類型 LIST 也可用于存儲嵌入。在這種情況下,您需要使用 list_cosine_similarity 函數。

基于嵌入的檢索是如何實現向量搜索的?

嵌入式檢索背后的核心思想是,將查詢輸入和數據集中的項目都表示為高維空間中向量嵌入,這樣在對查詢與項目之間的余弦相似度進行排名時,語義相似性得到了體現。因此,根據給定查詢與數據集中項目的余弦相似度進行排名,排名靠前的項目是最相關的。讓我們使用 Kaggle 上的電影數據集[6]來說明這一點。

數據集中包含電影的標題和概述,我已經通過 sentence-transformers 包中的 mxbai-embed-large-v1 模型計算了標題和概述的向量嵌入。

在 DUCKDB 中構建人工智能驅動的搜索功能-AI.x社區

現在,假設我想要搜索一部與以下描述非常相似的電影:“一部關于戰士為他的部落而戰的電影”。為了檢索相關的電影,我們將計算描述的嵌入,并將其與數據集中條目的嵌入進行比較。

標題嵌入的相似性

下面的 SQL 查詢實現了上述描述嵌入的相似檢索,針對標題嵌入。查詢計算余弦相似度,并按降序排列結果,選擇前 5 項。我們看到這些項目的標題中都包含“戰士”這個詞。

SELECT title, overview
    FROM (
        SELECT *, 
        array_cosine_similarity(title_embeddings, [0.7058067321777344, -0.0012793205678462982, -0.08653011173009872...]) AS score
        FROM movies_embeddings
    ) sq
    WHERE score IS NOT NULL
    ORDER BY score DESC LIMIT 5;

在 DUCKDB 中構建人工智能驅動的搜索功能-AI.x社區

概述嵌入的相似性

當將上述描述的嵌入與電影概述的嵌入進行相似性檢索時,結果完全不同,因為它們匹配了概述。這是因為每部電影的概述屬性包含更多和不同的詞語,這些詞語與電影相關,而標題中這些詞語有時并不是電影本身的描述。概述嵌入將更好地與電影描述嵌入語義相似,而標題嵌入有時可能對電影的描述不夠充分。

在 DUCKDB 中構建人工智能驅動的搜索功能-AI.x社區

嵌入組合的相似性

由于我們的數據集中有2個嵌入,我們可以通過將兩個分數相加來計算它們的組合,并根據總和進行排名。

SELECT title, overview
    FROM (
        SELECT *,
        array_cosine_similarity(title_embeddings, [0.7058067321777344, ...]) AS score_1,
        array_cosine_similarity(overview_embeddings, [0.7058067321777344, ...]) AS score_2
        FROM movies_embeddings
    ) sq
    WHERE score_1 IS NOT NULL AND score_2 IS NOT NULL
    ORDER BY score_1+score_2 DESC LIMIT 5;

這一輪我們得到了一個不同的結果,它與第一個結果有些相似。

在 DUCKDB 中構建人工智能驅動的搜索功能-AI.x社區

結論

文本數據包含的信息深度和豐富性使其非常有價值。通過向量嵌入,我們將語言轉換為數學空間,從而能夠進行多種操作,這些操作提供了提取和轉換其中存儲的信息的機會,從而解鎖向量搜索功能。DuckDB 憑借其高效的處理能力和用戶友好的 SQL 界面,使得與向量嵌入的交互過程變得更加輕松。無論是在進行相似性搜索、聚類還是執行其他任何基于向量的操作時,DuckDB 都能提供無縫連接,讓您更接近文本數據進行分析實驗。

引用鏈接

[1]? BUILDING AI-POWERED SEARCH IN DUCKDB: ??https://motherduck.com/blog/search-using-duckdb-part-1/[2]??? Array: ??https://duckdb.org/docs/sql/data_types/array.html[3]??? List: ??https://duckdb.org/docs/sql/data_types/list.html[4]??? mixedbread-ai/mxbai-embed-large-v1: ??https://huggingface.co/mixedbread-ai/mxbai-embed-large-v1[5]??? dot product: ??https://simple.wikipedia.org/wiki/Dot_product#:~:text=In mathematics%2C the dot product,used to designate this operation.[6]??? Kaggle 上的電影數據集: ??https://www.kaggle.com/datasets/rounakbanik/the-movies-dataset/versions/7?resource=download??

本文轉載自??alitrack  ??,作者: alitrack

已于2024-5-17 14:03:49修改
收藏
回復
舉報
回復
相關推薦
主站蜘蛛池模板: 青青艹在线视频 | 亚洲精品一区二区三区在线观看 | 久久精品二区亚洲w码 | 91影院在线观看 | 久久精品二区亚洲w码 | 中国美女av | 伊人网站视频 | 黄视频网站免费观看 | 欧美久久久久久 | 99热欧美 | 第四色播日韩第一页 | 成人免费xxxxx在线视频 | 在线看黄免费 | 91就要激情 | 国产精品99精品久久免费 | 亚洲免费在线观看视频 | 91伦理片| 激情欧美一区二区三区 | 狠狠色香婷婷久久亚洲精品 | 成人毛片网站 | 黄色欧美 | 亚洲精品视频一区 | 999久久久 | 精产国产伦理一二三区 | 日韩av高清在线 | 日一区二区 | 国产区在线观看 | 婷婷桃色网 | 国产精品久久久久久久一区探花 | 国产a视频| 亚洲一区二区中文字幕在线观看 | 亚洲综合天堂网 | 久久综合伊人 | 免费在线观看成人 | 欧美日韩精品一区二区三区视频 | 91高清在线观看 | 欧美日韩高清一区 | 久久久久久久久中文字幕 | 最新国产精品精品视频 | 全免费a级毛片免费看视频免费下 | 国产美女一区二区 |