如何實(shí)現AI的矢量數據庫
推薦:使用NSDT場(chǎng)景編輯器助你快速搭建3D應用場(chǎng)景
然而,人工智能模型有點(diǎn)像美食廚師。他們可以創(chuàng )造奇跡,但他們需要優(yōu)質(zhì)的成分。人工智能模型在大多數輸入上都做得很好,但如果它們以最優(yōu)化的格式接收輸入,它們就會(huì )真正發(fā)光。這就是矢量數據庫的重點(diǎn)。
在本文的過(guò)程中,我們將深入探討什么是矢量數據庫,為什么它們在人工智能世界中變得越來(lái)越重要,然后我們將查看實(shí)現矢量數據庫的分步指南。
跳躍前進(jìn):
什么是矢量數據庫?
為什么需要矢量數據庫?
實(shí)現矢量數據庫:分步指南
先決條件
設置Weaviate項目
創(chuàng )建我們的節點(diǎn).js項目
設置我們的矢量數據庫
設置客戶(hù)端
遷移數據
添加文檔
刪除文檔
向數據庫添加查詢(xún)函數
結合向量嵌入和 AI
人工智能模型設置
查詢(xún)我們的數據
測試我們的查詢(xún)
在我們開(kāi)始探索矢量數據庫之前,了解在編程和機器學(xué)習的上下文中什么是矢量非常重要。
在編程中,向量本質(zhì)上是一個(gè)一維數字數組。如果您曾經(jīng)編寫(xiě)過(guò)涉及 3D 圖形或機器學(xué)習算法的代碼,那么您很可能使用過(guò)向量。
const vector4_example = [0.5, 1.5, 6.0, 3.4]
它們只是數字數組,通常是浮點(diǎn)數,我們用它們的維度來(lái)指代。例如,a 是浮點(diǎn)數的三元素數組,a 是浮點(diǎn)數的四元素數組。就這么簡(jiǎn)單!vector3vector4
但向量不僅僅是數字數組。在機器學(xué)習的背景下,向量在高維空間中表示和操作數據方面發(fā)揮著(zhù)關(guān)鍵作用。這使我們能夠執行驅動(dòng)AI模型的復雜操作和計算。
現在我們已經(jīng)掌握了向量,讓我們把注意力轉向向量數據庫。
乍一看,你可能會(huì )想,“嘿,既然向量只是數字數組,我們不能使用常規數據庫來(lái)存儲它們嗎?好吧,從技術(shù)上講,你可以。但這就是事情變得有趣的地方。
矢量數據庫是一種特殊類(lèi)型的數據庫,針對存儲和執行對大量矢量數據的操作進(jìn)行了優(yōu)化。因此,雖然您的常規數據庫確實(shí)可以存儲數組,但矢量數據庫更進(jìn)一步,提供了專(zhuān)門(mén)的工具和操作來(lái)處理矢量。
在下一節中,我們將討論為什么矢量數據庫是必要的,以及它們帶來(lái)的優(yōu)勢。所以堅持下去,因為事情會(huì )變得更加有趣!
為什么需要矢量數據庫?現在我們已經(jīng)對什么是矢量數據庫有了深入的了解,讓我們深入了解為什么它們在人工智能和機器學(xué)習領(lǐng)域如此必要。
這里的關(guān)鍵詞是性能。矢量數據庫通常每次查詢(xún)處理數億個(gè)向量,這種性能比傳統數據庫在處理向量時(shí)能夠達到的性能要快得多。
那么,是什么讓矢量數據庫如此快速高效呢?讓我們來(lái)看看使它們與眾不同的一些關(guān)鍵功能。
復雜的數學(xué)運算向量數據庫旨在對向量執行復雜的數學(xué)運算,例如過(guò)濾和定位“附近”向量。這些操作在機器學(xué)習環(huán)境中至關(guān)重要,其中模型通常需要在高維空間中找到彼此接近的向量。
例如,一種常見(jiàn)的數據分析技術(shù)余弦相似性通常用于測量?jì)蓚€(gè)向量的相似程度。矢量數據庫擅長(cháng)這些類(lèi)型的計算。
專(zhuān)用矢量索引與組織良好的庫一樣,數據庫需要一個(gè)良好的索引系統來(lái)快速檢索請求的數據。矢量數據庫提供專(zhuān)門(mén)的矢量索引,與傳統數據庫相比,檢索數據的速度更快、更確定(與隨機數據庫相反)。
借助這些索引,向量數據庫可以快速定位 AI 模型所需的向量并快速生成結果。
緊湊的存儲在大數據的世界里,存儲空間是一種寶貴的商品。矢量數據庫在這里也大放異彩,以使其更緊湊的方式存儲矢量。壓縮和量化向量等技術(shù)用于在內存中保留盡可能多的數據,從而進(jìn)一步減少負載和查詢(xún)延遲。
分片在處理大量數據時(shí),將數據分布在多臺機器上可能是有益的,這個(gè)過(guò)程稱(chēng)為分片。許多數據庫都可以執行此操作,但 SQL 數據庫尤其需要付出更多努力才能橫向擴展。另一方面,矢量數據庫通常在其架構中內置分片,使它們能夠輕松處理大量數據。
簡(jiǎn)而言之,雖然傳統數據庫可以存儲和對向量執行操作,但它們并未針對任務(wù)進(jìn)行優(yōu)化。另一方面,矢量數據庫正是為此目的而構建的。它們提供了處理大量矢量數據所需的速度、效率和專(zhuān)用工具,使其成為人工智能和機器學(xué)習領(lǐng)域必不可少的工具。
在下一節中,我們將向量數據庫與其他類(lèi)型的數據庫進(jìn)行比較,并解釋它們如何適應更大的數據庫生態(tài)系統。我們才剛剛開(kāi)始!
實(shí)現矢量數據庫:分步指南出于本指南的目的,我們將使用 Weaviate(一種流行的矢量數據庫服務(wù))來(lái)實(shí)現一個(gè)簡(jiǎn)單的矢量數據庫,您可以基于該數據庫為任何用例進(jìn)行構建。
您可以在此處克隆初學(xué)者模板并運行以進(jìn)行設置。npm install
先決條件先前的JS知識將有所幫助:本教程中編寫(xiě)的所有代碼都將使用JavaScript,我們也將使用Weaviate JavaScript SDK。
Node 和 npm:我們將在服務(wù)器上的 JavaScript 環(huán)境中工作。
OpenAI API密鑰:我們將使用他們的嵌入模型將我們的數據轉換為嵌入以存儲在我們的數據庫中
Weaviate帳戶(hù):我們將使用他們的托管數據庫服務(wù);您可以在此處獲得免費帳戶(hù)
創(chuàng )建帳戶(hù)后,您需要通過(guò)Weaviate儀表板設置項目。轉到 WCS 控制臺,然后單擊創(chuàng )建集群:
選擇“免費沙盒”層并提供群集名稱(chēng)。當它要求您啟用身份驗證時(shí),請選擇“是”:
單擊創(chuàng )建。幾分鐘后,您應該會(huì )在完成后看到一個(gè)復選標記。
單擊“詳細信息”以查看群集詳細信息,因為我們將在下一部分用到它們。其中包括:
一個(gè)編織的****
身份驗證詳細信息(Weaviate API 密鑰;單擊密鑰圖標以顯示)
有了先決條件,我們可以創(chuàng )建向量數據庫并查詢(xún)它。要繼續操作,您需要一個(gè)新的 Node 項目;您可以在此處克隆 GitHub 上的模板,其中包括入門(mén)所需的一切。
或者,您可以通過(guò)運行以下命令創(chuàng )建一個(gè):
mkdir weaviate-vector-database && cd weaviate-vector-database
npm init -y && npm install dotenv openai weaviate-ts-client
mkdir src
編輯文件并添加腳本,如下所示:package.jsonstart
// ...rest of package.json
"scripts": {
"start": "node src/index.js"
},
// ...rest of package.json
創(chuàng )建一個(gè)文件來(lái)存儲敏感信息,如 API 密鑰。編寫(xiě)命令并在代碼編輯器中打開(kāi)新創(chuàng )建的文件,然后粘貼以下內容并確保將占位符替換為實(shí)際值:.envtouch .env.env
// .env
OPENAI_KEY="<OPENAI_API_KEY>"
WEAVIATE_API_KEY="<WEAVIATE_API_KEY>"
WEAVIATE_URL="<WEAVIATE_URL>"
DATA_CLASSNAME="Document"
項目設置完成后,我們可以添加一些代碼來(lái)設置和使用我們的矢量數據庫。讓我們快速總結一下我們將要實(shí)現的內容:
幫助程序函數,它:
連接到我們的數據庫
批量矢量化和上傳文檔
查詢(xún)最相似的項目
一個(gè) main 函數,它使用上面的輔助函數一次性上傳文檔和查詢(xún)數據庫
話(huà)雖如此,讓我們創(chuàng )建第一個(gè)文件來(lái)存儲數據庫連接和幫助程序函數。通過(guò)運行創(chuàng )建一個(gè)新文件,讓我們開(kāi)始填寫(xiě)它:touch src/database.js
// src/database.js
import weaviate, { ApiKey } from "weaviate-ts-client";
import { config } from "dotenv";
config();
async function setupClient() {
let client;
try {
client = weaviate.client({
scheme: "https",
host: process.env.WEAVIATE_URL,
apiKey: new ApiKey(process.env.WEAVIATE_API_KEY),
headers: { "X-OpenAI-Api-Key": process.env.OPENAI_API_KEY },
});
} catch (err) {
console.error("error >>>", err.message);
}
return client;
}
// ... code continues below
讓我們分解一下這里發(fā)生的事情。首先,我們導入必要的軟件包,Weaviate客戶(hù)端和dotenv配置。dotenv 是一個(gè)將環(huán)境變量從文件加載到 .Weaviate和OpenAI密鑰和URL通常存儲在環(huán)境變量中,以保持機密性并遠離代碼庫。.envprocess.env
以下是函數中發(fā)生的情況:setupClient()
我們初始化了一個(gè)變量client
我們有一個(gè)塊,用于設置與 Weaviate 服務(wù)器的連接。如果在此過(guò)程中發(fā)生任何錯誤,我們會(huì )將錯誤消息打印到控制臺try…catch
在塊內,我們使用該方法創(chuàng )建一個(gè)新的 Weaviate 客戶(hù)端。、 和 參數取自我們設置的環(huán)境變量tryweaviate.client()schemehostapiKey
最后,我們傳入OpenAI的標頭,因為我們將使用OpenAI的Ada模型來(lái)矢量化我們的數據。
設置客戶(hù)端后,讓我們使用一些虛擬數據、虛構生物、地點(diǎn)和事件的集合來(lái)運行遷移。稍后,我們將針對此數據查詢(xún) GPT-3。
如果您沒(méi)有克隆初學(xué)者模板,請按照以下步驟操作:
通過(guò)運行創(chuàng )建新文件touch src/data.js
從此處復制文件的內容并將其粘貼到
花一些時(shí)間瀏覽 中的數據。然后,在文件頂部添加新導入:src/data.jssrc/database.js
// ...other imports
import { FAKE_XORDIA_HISTORY } from "./data";
在函數下方,添加一個(gè)新函數,如下所示:setupClient
async function migrate(shouldDeleteAllDocuments = false) {
try {
const classObj = {
class: process.env.DATA_CLASSNAME,
vectorizer: "text2vec-openai",
moduleConfig: {
"text2vec-openai": {
model: "ada",
modelVersion: "002",
type: "text",
},
},
};
const client = await setupClient(); try { const schema = await client.schema .classCreator() .withClass(classObj) .do(); console.info("created schema >>>", schema); } catch (err) { console.error("schema already exists"); } if (!FAKE_XORDIA_HISTORY.length) { console.error(`Data is empty`); process.exit(1); } if (shouldDeleteAllDocuments) { console.info(`Deleting all documents`); await deleteAllDocuments(); } console.info(`Inserting documents`); await addDocuments(FAKE_XORDIA_HISTORY);
} catch (err) {
console.error("error >>>", err.message);
}
}
再一次,讓我們分解一下這里發(fā)生的事情。
該函數接受單個(gè)參數,該參數確定在遷移數據時(shí)是否清除數據庫。migrateshouldDeleteAllDocuments
在我們的塊中,我們創(chuàng )建一個(gè)名為 .此對象表示 Weaviate 中類(lèi)的架構(確保在文件中添加 a),該類(lèi)使用矢量化器。這決定了文本文檔在數據庫中的配置和表示方式,并告訴Weaviate使用OpenAI的“ada”模型對我們的數據進(jìn)行矢量化。try…catchclassObjCLASS_NAME.envtext2vec-openai
然后,我們使用方法鏈創(chuàng )建模式。這會(huì )向 Weaviate 服務(wù)器發(fā)送請求,以創(chuàng )建 中定義的文檔類(lèi)。成功創(chuàng )建架構后,我們將模式對象記錄到控制臺,并顯示消息 .現在,錯誤通過(guò)記錄到控制臺的簡(jiǎn)單消息進(jìn)行處理。client.schema.classCreator().withClass(classObj).do()classObjcreated schema >>>
我們可以檢查要遷移的虛擬數據的長(cháng)度。如果為空,則代碼在此處結束。我們可以使用函數(稍后會(huì )添加)清除數據庫,如果 是 .deleteAllDocumentsshouldDeleteAllDocumentstrue
最后,使用一個(gè)函數(我們接下來(lái)將添加),我們上傳所有要矢量化并存儲在 Weaviate 中的條目。addDocuments
添加文檔我們可以繼續矢量化和上傳我們的文本文檔。這實(shí)際上是一個(gè)兩步過(guò)程,其中:
原始文本字符串使用 OpenAI Ada 模型轉換為矢量
轉換后的載體將上傳到我們的 Weaviate 數據庫
值得慶幸的是,這些是由我們使用的Weaviate SDK自動(dòng)處理的。讓我們繼續創(chuàng )建函數來(lái)執行此操作。打開(kāi)同一文件并粘貼以下內容:src/database.js
// code continues from above
const addDocuments = async (data = []) => {
const client = await setupClient();
let batcher = client.batch.objectsBatcher();
let counter = 0;
const batchSize = 100;
for (const document of data) {
const obj = {
class: process.env.DATA_CLASSNAME,
properties: { ...document },
};
batcher = batcher.withObject(obj); if (counter++ == batchSize) { await batcher.do(); counter = 0; batcher = client.batch.objectsBatcher(); }
}
const res = await batcher.do();
return res;
};
// ... code continues below
和以前一樣,讓我們分解一下這里發(fā)生的事情。
首先,我們調用前面定義的函數來(lái)設置并獲取 Weaviate 客戶(hù)端實(shí)例setupClient()
我們使用初始化一個(gè)批處理器,用于收集文檔并一次性將它們上傳到Weaviate,使過(guò)程更高效client.batch.objectsBatcher()
我們還定義了一個(gè)計數器變量和一個(gè)變量,并將其設置為 100。計數器跟蹤已添加到當前批次的文檔數,并定義每個(gè)批次中應包含的文檔數batchSizebatchSize
然后,我們遍歷數據數組中的每個(gè)文檔:
對于每個(gè)文檔,我們創(chuàng )建一個(gè)對象,該對象以Weaviate期望的格式表示文檔,以便可以將其擴展到該對象的屬性中
然后,我們使用batcher.withObject(obj)
如果計數器等于批大?。ㄒ馕吨?zhù)批已滿(mǎn)),我們將批上傳到 Weaviate,將計數器重置為 ,并為下一批文檔創(chuàng )建一個(gè)新的批處理器batcher.do()0
處理完所有文檔并將其添加到批處理后,如果還有剩余的批處理尚未上載(因為它未到達 ),則可以使用 上載剩余的批處理。batchSizebatcher.do()
此處的最后一步發(fā)生在函數返回上次調用的響應時(shí)。此響應將包含有關(guān)上傳的詳細信息,例如上傳是否成功以及發(fā)生的任何錯誤。batcher.do()
從本質(zhì)上講,該函數通過(guò)將大量文檔分組為可管理的批次來(lái)幫助我們有效地將大量文檔上傳到我們的 Weaviate 實(shí)例。addDocuments()
刪除文檔讓我們添加函數中使用的代碼。在函數下方,添加以下代碼:deleteAllDocumentsmigrateaddDocuments
// code continues from above
async function deleteAllDocuments() {
const client = await setupClient();
const documents = await client.graphql
.get()
.withClassName(process.env.DATA_CLASSNAME)
.withFields("_additional { id }")
.do();
for (const document of documents.data.Get[process.env.DATA_CLASSNAME]) {
await client.data
.deleter()
.withClassName(process.env.DATA_CLASSNAME)
.withId(document._additional.id)
.do();
}
}
// ... code continues below
這個(gè)函數相對簡(jiǎn)單。
我們使用類(lèi)名為setupClientidDocument
然后使用循環(huán),我們使用其刪除每個(gè)文檔for...ofid
這種方法之所以有效,是因為我們擁有少量數據。對于較大的數據庫,需要一種技術(shù)來(lái)刪除所有文檔,因為每個(gè)請求的限制是一次只有 200 個(gè)條目。batching
向數據庫添加查詢(xún)函數現在我們有了將數據上傳到數據庫的方法,讓我們添加一個(gè)函數來(lái)查詢(xún)數據庫。在本例中,我們將執行“最近鄰搜索”以查找與我們的查詢(xún)相似的文檔。
在同一文件中,添加以下內容:src/database.js
// code continues from above
async function nearTextQuery({
concepts = [""],
fields = "text category",
limit = 1,
}) {
const client = await setupClient();
const res = await client.graphql
.get()
.withClassName("Document")
.withFields(fields)
.withNearText({ concepts })
.withLimit(limit)
.do();
return res.data.Get[process.env.DATA_CLASSNAME];
}
export { migrate, addDocuments, deleteAllDocuments, nearTextQuery };
同樣,讓我們對這里發(fā)生的事情進(jìn)行細分:
nearTextQuery()是一個(gè)接受對象作為參數的異步函數。此對象可以包含三個(gè)屬性:
概念:表示我們正在搜索的術(shù)語(yǔ)的字符串數組
字段:一個(gè)字符串,表示我們希望在搜索結果中返回的字段。在本例中,我們從 和 字段請求textcategory
限制:我們希望從搜索查詢(xún)中返回的最大結果數
我們調用函數來(lái)獲取 Weaviate 客戶(hù)端實(shí)例setupClient()
我們使用一系列方法構建 GraphQL 查詢(xún):
client.graphql.get():初始化 GraphQL 查詢(xún)
.withClassName("Document"):我們指定要在“文檔”對象中搜索
.withFields(fields):我們指定要在結果中返回哪些字段
.withNearText({ concepts }):這就是魔術(shù)發(fā)生的地方!我們指定了 Weaviate 將用于搜索語(yǔ)義相似的文檔的概念
.withLimit(limit):我們指定要返回的最大結果數
最后,執行查詢(xún).do()
來(lái)自查詢(xún)的響應存儲在變量中,然后在下一行返回res
最后,我們導出此處定義的所有函數以在其他地方使用
簡(jiǎn)而言之,該函數幫助我們根據提供的術(shù)語(yǔ)在 Weaviate 實(shí)例中搜索語(yǔ)義相似的文檔。nearTextQuery()
讓我們遷移數據,以便在下一節中查詢(xún)它。打開(kāi)終端并運行 。npm run start"migrate"
結合向量嵌入和 AI像 GPT-3 和 ChatGPT 這樣的大型語(yǔ)言模型旨在處理輸入并生成有用的輸出,這是一項需要了解單詞和短語(yǔ)之間復雜含義和關(guān)系的任務(wù)。
他們通過(guò)將單詞、句子甚至整個(gè)文檔表示為高維向量來(lái)做到這一點(diǎn)。通過(guò)分析這些向量之間的異同,人工智能模型可以理解我們語(yǔ)言中的上下文、語(yǔ)義甚至細微差別。
那么,矢量數據庫從何而來(lái)?讓我們將矢量數據庫視為 AI 模型的圖書(shū)館員。在龐大的書(shū)籍庫(或者,在我們的例子中,向量)中,人工智能模型需要快速找到與特定查詢(xún)最相關(guān)的書(shū)籍。矢量數據庫通過(guò)有效地存儲這些“書(shū)籍”并在需要時(shí)提供快速精確的檢索來(lái)實(shí)現這一點(diǎn)。
這對于許多AI應用程序至關(guān)重要。例如,在聊天機器人應用程序中,AI 模型需要找到對用戶(hù)問(wèn)題最相關(guān)的響應。它通過(guò)將用戶(hù)的問(wèn)題和潛在響應轉換為向量,然后使用向量數據庫查找與用戶(hù)問(wèn)題最相似的響應來(lái)實(shí)現這一點(diǎn)。
考慮到這一點(diǎn),我們將使用上面的數據庫來(lái)提供一個(gè) AI 模型 GPT-3.5,其中包含我們自己數據的上下文。這將允許模型回答有關(guān)未訓練的數據的問(wèn)題。
人工智能模型設置通過(guò)運行并粘貼以下內容來(lái)創(chuàng )建新文件:touch src/data.js
import { Configuration, OpenAIApi } from "openai";
const configuration = new Configuration({
apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
async function getChatCompletion({ prompt, context }) {
const chatCompletion = await openai.createChatCompletion({
model: "gpt-3.5-turbo",
messages: [
{
role: "system",
content: You are a knowledgebase oracle. You are given a question and a context. You answer the question based on the context. Analyse the information from the context and draw fundamental insights to accurately answer the question to the best of your ability. Context: ${context} ,
},
{ role: "user", content: prompt },
],
});
return chatCompletion.data.choices[0].message;
}
export { getChatCompletion };
像往常一樣,讓我們分解一下文件:
我們從包中導入一些必需的模塊并初始化一個(gè)實(shí)例openaiopenai
我們定義了一個(gè)函數,該函數接受提示、一些上下文,并將 GPT-3.5 模型配置為作為知識庫預言機進(jìn)行響應getChatCompletion
最后,我們返回響應并導出函數
通過(guò)設置我們的矢量數據庫和 AI 模型,我們最終可以通過(guò)結合這兩個(gè)系統來(lái)查詢(xún)我們的數據。利用嵌入的強大效果和 GPT-3.5 令人印象深刻的自然語(yǔ)言功能,我們將能夠以更具表現力和可定制的方式與我們的數據進(jìn)行交互。
首先創(chuàng )建一個(gè)新文件并運行 .然后粘貼以下內容:touch src/index.js
import { config } from "dotenv";
import { nearTextQuery } from "./database.js";
import { getChatCompletion } from "./model.js";
config();
const queryDatabase = async (prompt) => {
console.info(Querying database);
const questionContext = await nearTextQuery({
concepts: [prompt],
fields: "title text date",
limit: 50,
});
const context = questionContext
.map((context, index) => {
const { title, text, date } = context;
return Document ${index + 1} Date: ${date} Title: ${title} ${text} ;
})
.join("\n\n");
const aiResponse = await getChatCompletion({ prompt, context });
return aiResponse.content;
};
const main = async () => {
const command = process.argv[2];
const params = process.argv[3];
switch (command) {
case "migrate":
return await migrate(params === "--delete-all");
case "query":
return console.log(await queryDatabase(params));
default:
// do nothing
break;
}
};
main();
在此文件中,我們將到目前為止所做的所有工作匯集在一起,以允許我們通過(guò)命令行查詢(xún)數據。像往常一樣,讓我們探討一下這里發(fā)生了什么:
首先,我們導入必要的模塊并使用包設置我們的環(huán)境變量dotenv
接下來(lái),我們創(chuàng )建一個(gè)接受文本提示的函數,我們使用它對向量數據庫執行“近文本”查詢(xún)。我們將結果限制為 50 個(gè),并且我們特別要求提供匹配概念的“標題”、“文本”和“日期”字段queryDatabase
這基本上返回了語(yǔ)義上類(lèi)似于我們搜索查詢(xún)中的任何重要術(shù)語(yǔ)的文檔(嵌入功能強大!
然后,我們映射接收到的上下文,對其進(jìn)行格式化,并將其傳遞給AI模型以生成完成。使用上下文,GPT-3.5 的自然語(yǔ)言處理 (NLP) 功能大放異彩,因為它能夠根據我們的數據生成更準確和有意義的響應
最后,我們到達函數。在這里,我們使用命令行參數來(lái)執行各種任務(wù)。如果我們通過(guò),我們可以遷移我們的數據(帶有可選標志,以防萬(wàn)一我們想清理我們的石板并重新開(kāi)始),并且有了,我們可以測試我們的查詢(xún)函數mainmigrate--delete-allquery
祝賀。如果你走到了這一步,你應該得到拍拍——你終于可以測試你的代碼了。
打開(kāi)終端并運行以下命令:
npm run start "query" "what are the 3 most impressive achievements of humanity in the story?"
查詢(xún)將發(fā)送到您的 Weaviate 矢量數據庫,在那里它與其他類(lèi)似矢量進(jìn)行比較,并根據其文本返回 50 個(gè)最相似的矢量。然后,此上下文數據將被格式化并與您的查詢(xún)一起發(fā)送到 OpenAI 的 GPT-3.5 模型,在那里對其進(jìn)行處理并生成響應。
如果一切順利,您應該得到與以下類(lèi)似的響應:
隨意探索這個(gè)虛構的世界,更多的查詢(xún),或者更好的是,帶上自己的數據,親眼目睹向量和嵌入的力量。
如果此時(shí)遇到任何錯誤,請在此處將您的代碼與最終版本進(jìn)行比較,并確保已創(chuàng )建并填寫(xiě)文件。.env
結論和今后的步驟在本教程中,我們略微探索了矢量和矢量數據庫的強大功能。使用Weaviate和GPT-3等工具,我們親眼目睹了這些技術(shù)在塑造AI應用程序方面的潛力,從改進(jìn)個(gè)性化聊天機器人到增強機器學(xué)習算法。請務(wù)必也看看我們的GitHub!
然而,這僅僅是個(gè)開(kāi)始。如果您想了解有關(guān)使用矢量數據庫的更多信息,請考慮:
深入了解高級概念,例如使用矢量元數據、分片、壓縮,以實(shí)現更靈活、更高效的數據存儲和檢索
嘗試更復雜的方法將向量嵌入集成到 AI 應用程序中,以獲得更豐富、更細微的結果
感謝您堅持到最后,希望這是對您的時(shí)間的有效利用。
您是否正在添加新的 JS 庫以提高性能或構建新功能?如果他們反其道而行之呢?毫無(wú)疑問(wèn),前端變得越來(lái)越復雜。當您向應用添加新的 JavaScript 庫和其他依賴(lài)項時(shí),您將需要更高的可見(jiàn)性,以確保您的用戶(hù)不會(huì )遇到未知問(wèn)題。
LogRocket 是一個(gè)前端應用程序監控解決方案,可讓您重播 JavaScript 錯誤,就好像它們發(fā)生在您自己的瀏覽器中一樣,這樣您就可以更有效地對錯誤做出反應。
LogRocket 可以完美地與任何應用程序配合使用,無(wú)論框架如何,并且具有用于記錄來(lái)自 Redux、Vuex 和 @ngrx/store 的其他上下文的插件。無(wú)需猜測問(wèn)題發(fā)生的原因,您可以匯總并報告問(wèn)題發(fā)生時(shí)應用程序所處的狀態(tài)。LogRocket 還會(huì )監控應用的性能,報告客戶(hù)端 CPU 負載、客戶(hù)端內存使用情況等指標。
原文鏈接:如何實(shí)現AI的矢量數據庫 (mvrlink.com)
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。