開發者獨立搭建一個跨模態搜尋應用有多難?

語言: CN / TW / HK

00 背景介紹

你是否也有這樣的時刻,不管是每天工作要處理的 PDF 文件,還是打發時間看的小影片,偶爾突然回憶湧上心頭,憑藉模糊的記憶卻總是難以準確找到它。對於開發者來說,不論是隨手拍攝的照片到大紅大紫的元宇宙 3D 模型,我們總是希望能用一種更加智慧的方式去檢索到它,而不是通過打標籤這種費時耗力的笨辦法。

如何對非結構化資料進行搜尋,正在成為一個越來越重要的問題。人工神經網路模型在解決非結構化資料搜尋問題上扮演著重要的角色,但是從零開始搭建這樣的神經搜尋系統,通常需要極高的開發和維護成本。而 Jina 框架就是為解決這一問題而生。

01 神經搜尋

什麼是神經搜尋?神經搜尋聽起來是個非常抽象的名詞,最經典的場景就是各大電商平臺裡非常普遍的 以圖搜圖 ,這個功能背後就是一整套神經搜尋系統。第二個被廣泛應用的場景是 客服問答機器人 。當消費者發出一個問題,系統會根據問題去找到相似的問題,再把對應的答案返回給消費者。如果這個路徑不通,它則會根據問題去對應的知識庫裡查詢對應的答案,再把反饋給消費者。這也是神經搜尋的經典應用。

神經搜尋 vs 傳統搜尋

傳統的圖片搜尋,更多是把圖片和對應的文字標籤進行關聯,以實現從文字到圖片的搜尋。而神經搜尋能幾乎像人類一樣“看懂”圖片裡面到底有什麼。使用神經搜尋實現一個文字到圖片的跨模態搜尋應用時,不需要像傳統搜尋把所有圖片都打上標籤,才能開始搜尋。利用神經搜尋,只需要把圖片進行索引,就可以直接用文字去對圖片進行搜尋,這適用於很多場景。免去了給圖片打標籤的步驟,所以 提質、降本、增效 就是神經搜尋較傳統搜尋最突出的特點。總的來說,神經搜尋系統就是基於深度學習、神經網路和向量索引的資訊檢索技術,它尤其適合於去處理多模態和跨模態的非結構化資料。

在過去的十幾年間,解決非結構化資料的方式有兩種:

方法之一:通過手動或半自動地方式,由人類資料標註師給非結構化資料,如圖片、影片等打上標籤,把它們轉化為結構化資料,再進行搜尋;

方式之二:利用神經網路模型,讓向量表示資料,並在向量空間中進行相似度搜索。而神經搜尋的關鍵就在於用神經網路模型得到資料的向量表示,接著將向量表示儲存起來,再利用這些向量表示去查詢相似的資料。因此,如果你要想從零開始搭一套生產級別的神經搜尋,這還是相當有挑戰的。

02 神經搜尋的挑戰

第一大塊的挑戰來自於整個系統的複雜性,尤其是整個工具鏈的複雜性。搭建系統的第一步就是要用神經網路模型對資料進行向量表示。那麼到底選擇什麼樣的神經網路模型?選擇了對應的模型之後,又該怎樣去訓練呢?

另外一方面,除了生成向量之外,還需要對非結構化資料進行一些處理。比如說想要去搜索影片,就需要對影片幀進行抽取,抽取出幀之後,需要對每一幀去做 OCR 識別,或者去做一些物體識別地處理。也可以把影片中的音訊資訊抽取出來,識別出人聲部分,轉化成文字等等。每一個步驟都涉及到很多不同的工具,而每增加一個工具都會讓整個系統的複雜程度指數級增長。

第二大塊的挑戰是向量檢索部分。因為把資料轉換成向量之後,需要把這些向量儲存起來,否則每次都需要重新生成向量。除此之外,在查詢時也需要保證效能——在龐大的向量空間裡 高速高效 地找到這些相似的資料。以及各種各樣的向量資料庫、向量索引技術等等。當一個開發者想要從零搭建一套神經搜尋系統,這些技術細節都是需要了解學習的。

第三大塊是非常關鍵的部署部分。如果想在線上去搭建一套神經搜尋系統,部署在生產環境裡面是非常複雜的,雲原生的技術是必須要了解的。簡單來說,神經搜尋系統是一個完整的流水線, 要保證不同的模組能在不同的環境裡面,獨立並且分散式地執行 。比如說可能有一個很古老的模型,它還在用 Tensorflow 1.0,而其它模型已經都在 Tensorflow 2.x 上面執行,這時就需要保證每一個模型所在的模組都有自己獨立的執行環境。

另一方面需要 保證每一個模組可以獨立地進行縮放 。比如說問答機器人的例子裡面,有專門的模組對使用者的問題進行分類,判斷問題是否可以回答。因為使用者可能發一些和知識庫完全沒關係的資訊,需要拒絕回答,這是一個簡單的文字二分類問題。因此不需要去使用複雜的 GPU 機器來進行運算,完全可以在一臺 CPU 機器上進行運算。但與此同時,流水線需要對這個問題進行編碼,計算它的向量表示,需要用到非常複雜的 Bert 模型,涉及到大量的運算量,必須要在 GPU 上面跑。

那麼,如何保證同一個流水線上不同的模組能在不同的硬體環境上跑?這也是神經搜尋需要應付的挑戰。更關鍵的是,神經搜尋提供的搜尋功能,只屬於整個龐大產品體系中一個非常基礎的元件。在你日常使用或自己搭建的網站裡,搜尋框只是網站中一部分功能,網站的核心還是在於網頁其它的功能部分。而對搜尋的要求就是—— 這個搜尋框能夠穩定高效地運轉

而以上這些功能恰好是雲原生生態體系要去解決的問題。首先,在雲原生體系裡面,微服務和容器化兩個技術結合起來,可以保證每一個模組獨立的執行,而且以分散式的形式去執行,可以獨立地進行縮放,並且不會有版本依賴的問題。其次,雲原生裡的編排系統,恰好對應了神經搜尋系統所需要的流水線,使用一套完整的編排系統來保證流水線的持續穩定的運轉,並且能保證整個流水線的彈性的伸縮。最後,系統出錯時,我們不僅需要知道哪裡出了故障,而且要知道出了什麼樣的故障。而云原生框架能提供對 IT 系統狀態的監測與診斷的一體化方案,包含可觀測的方法,如何去追蹤日誌,如何報警,如何捕獲故障的原因。如果想要搭一套神經搜尋系統,就必須要具備一定的雲原生知識。

綜上所述,要搭一套神經搜尋系統,需要開發者知道深度學習技術,需要知道向量索引技術,同時也需要知道雲原生技術,在這三個技術背後都有非常龐大的技術棧,以及一套不斷在更新地生態體系。

03 神經搜尋與 Jina 全家桶

基於這三個非常龐大,並且在快速變化的系統上,想要去構建一套神經搜尋系統,這個複雜度是可想而知的。而 Jina 就是為了解決這一問題而生。我們希望為開發者來提供一個統一的工具集, 提供端到端的神經搜尋開發體驗 。基於這個工具集,開發者不需要去擔心,這些不斷迭代更新的技術棧,通通都交給 Jina 來負責。開發者只需要關心如何利用神經搜尋來實現自己業務上的需求。

到目前為止,我們提供了七個不同的工具,接下來我將結合開發者在搭建神經搜尋系統的完整流程,來分享這七個工具會如何具體幫助到每一個開發者。

1. DocArray

搭建一個神經搜尋系統,第一步往往是對資料進行封裝,因為多模態資料往往是非結構化的,所涉及的資料內容非常豐富,只有進行封裝後才能保證在整個系統裡順利流轉,並作對應處理。這時你就可以用到 DocArray,DocArray 是針對非結構化資料的一個 Python 庫,在 DocArray 裡面我們定義了整個 Jina 生態的基礎資料型別,同時 DocArray 提供了在本地去搭建神經搜尋所需要的各種函式,開發者可以在本地快速搭建起一套神經搜尋系統。

2. Jina Hub

如果開發者有自己的模型,可以使用自己的模型來對資料進行向量表示。如果開發者希望使用一些現成的模型,這時你就可以使用 Jina Hub。在 Jina Hub 中我們提供了各種各樣資料處理模組,也包括很多預訓練的模型,可以快速對圖片、文字、聲音、影片進行向量化處理。當然這些向量化處理大多是基於一些預訓練的模型。

3. Finetuner

如果你希望進一步提升搜尋系統的準確率、召回率,這時你就需要對模型進行一些微調,我們提供了 Finetuner 的工具,Finetuner 針對神經搜尋這個場景,封裝了不同深度學習框架的模型、損失函式和訓練過程,你只需要告訴 Finetuner,你希望做一個什麼樣的神經搜尋系統,你的資料是什麼樣的,我們就可以使用你的資料,針對你選擇的任務,對你的模型,對相應的模型進行微調。比方說 Finetuner 對 CLIP 模型的召回效果提升了 200%。

4. Jina

有了 DocArray、Hub 和 Finetuner 之後,你就可以在本地搭起了一套神經搜尋系統,下一步你大概會希望把這套系統部署在雲端,以服務化的形式向外提供服務。這時你就需要使用 Jina,Jina 全面地支援了雲原生的整個生態,你可以使用 Jina 直接去匯出 kubernetes 的部署檔案,同時也提供了各種雲原生的監控和日誌追蹤的介面。而且 Jina 可以對外提供各種不同的網路介面,無論你是希望以 Websocket 還是 Restful,還是 gRPC 的形式,甚至是 GraphQL 的形式,Jina 都完全支援,Jina 也會為你的服務去生成自動生成 Open API 定義。

5. JCloud

如果說開發者並不瞭解雲原生的知識,但還是希望在雲端有一套非常穩定的神經搜尋系統,那麼你就可以選擇 JCloud。JCloud 是針對雲端部署提供的一套託管服務,開發者只需要對 Flow 做一些簡單的定義,就可以快速把這套神經搜尋系統在 JCloud 上部署。

6. Jina NOW

Jina NOW 是一套無程式碼和低程式碼的開發環境。Jina NOW 主要針對的是非開發者的使用者,或者說非 Python 開發者,對神經搜尋瞭解非常有限,但是想在整個產品裡面快速地把神經搜尋系統搭建起來的使用者。在 Jina NOW 裡,使用者只需要去選擇對應的神經搜尋任務,提供對應資料,就可以搭建一套完整的神經搜尋系統。Jina NOW 會使用你的資料對模型進行微調,並且定義好整個神經搜尋系統的架構,在雲端來使用 JCloud,為你的神經搜尋系統進行一個雲端的部署。

7. CLIP-as-service

我們觀察到很多使用者用 Jina 去計算資料的向量表示,前面我們也提到在神經搜尋系統裡面非常重要的一點就是,用到人工神經網路模型,對資料進行向量表示的計算。因此我們就針對使用者的使用場景,專門去開發了 CLIP-as-service,使用 CLIP-as-service 你就可以快速地搭建起這樣一套向量計算的服務。

剛才我們提到的在神經搜尋系統搭建過程中遇到了各種各樣的問題,下面我們看看 Jina 全家桶是怎麼樣解決的。首先針對 AI 模型,Jina Hub 提供了各種各樣的針對各種不同模態資料的模型,同時也提供了各種垂直領域對資料進行處理的模組。比如說你有一個 PDF 檔案,希望把 PDF 檔案裡面的圖片、文字、圖表分別抽取出來,預處理的模組就可以直接在 Jina Hub 上面找到。除此之外,Jina Hub 是一個開放的平臺,不僅 Jina 官方會維護一些模組,同時社群的小夥伴也都在積極地把自己的開發模組貢獻到 Jina Hub 上面去。

如果你對 Jina Hub 上面提供的預訓練模型不滿意,可以使用 Finetuner 提供的 SaaS 服務,對模型進行微調。在整個微調的過程中,你也不需要去了解模型在神經搜尋場景下,需要用到什麼損失函式,需要怎樣生成樣本,這些細節都通通交給 Finetuner 為你解決。

針對向量索引這部分的問題,DocArray 本身提供了原生的向量索引實現,如果對原生的向量索引實現不滿意的話,DocArray 同時也提供了對其它向量資料庫的整合。我們在保證效率的前提下,讓使用者以最小的成本,從一個本地的神經搜尋系統快速地擴充套件到一個雲端的搜尋系統。在本地如果資料量小的時候,可以使用一些 DocArray 提供的原生向量搜尋的實現;當資料量達到 e 級別時候,就可以去考慮使用一些這種更專業的向量資料庫,或者更成熟的向量資料庫來保證資料的一致性。

針對就是線上部署的問題,前面提到了整個 Jina 全家桶在設計的時候,我們是全面擁抱雲原生和分散式系統的。當你在本地開發完一套神經搜尋系統,希望遷移到雲端時,使用 Jina 就可以快速獲得 Kubernetes 的部署配置,同時你可以開箱即用地去使用 Prometheus、Grafana 的監控工具。

總的來說,Jina 全家桶就是這樣一套完整的神經搜尋的框架,我們希望是幫助到開發者去高效地,以最低的成本去開發一套神經搜尋系統,讓大家能夠在自己的搜尋系統裡面越來越多的應用到 AI 模型。

04 神經搜尋與多模態應用

最後想和大家分享,兩個利用 AI 去生成藝術作品的新專案,一個是 DALL·E FLOW,另外一個是 DISCOART。

Repo:Github.com/jina-ai/discoart

Repo:Github.com/jina-ai/dalle-flow

DALL·E FLOW 是一套 AI 模型的服務,輸入是一個文字,輸出時,模型會根據這句話來生成一幅高度對應的圖片。這張圖所對應的輸入文字就是兩個古希臘的學者在做結對程式設計。

DISCOART 和 DALL·E FLOW 非常近似,但是區別在於它不僅能夠接受文字輸入,而且它能接受圖片輸入,它能夠結合這兩者來生成一張圖片。

AI 生成技術的本質是用人工神經網路模型來表示資料,同時表示不同模 s 態之間資料的關係。在拿到輸入之後,在預測的時候,實際上是利用這些人工網路模型去生成一些和輸入相似的資料。比如說輸入了文字,整個系統就會去生成一些和文字相似的資料。需要注意的是這些資料並不是以前存在的資料,而是模型生成出來的新資料,因此這些模型根本不會儲存資料,它儲存的是不同模態之間,從文字到圖片資料的關係。

那麼,這和神經搜尋有什麼關係?從差異上講,神經搜尋實際上是用了人工神經網路模型去表示資料,把資料表示成向量,儲存這些向量,再去查詢對應的資料。但是 AI 生成技術是用人工神經網路來表示這個資料的關係,它並不會去表示資料本身,同時它會把資料的關係以模型的權重的形式儲存起來,最後根據這些關係去生成資料。

這兩個應用——神經搜尋和 AI 生成技術,它們背後之所以都可以用 Jina 全家桶來搭建,本質的原因在於,Jina 全家桶提供了一套針對多模態資料的處理工具,使用 Jina 的全家桶,我們可以非常有效地來表示多模態的資料,同時我們可以對這些多模態資料進行非常便捷地操作和處理。藉此希望起到拋磚引玉的作用,啟發大家去構建屬於自己的多模態、跨模態的應用!

劃線

評論

複製