如何結(jié)合 Elasticsearch 的搜索相關(guān)性和 OpenAI 的 ChatGPT 的問(wèn)答功能來(lái)查詢(xún)您的數(shù)據(jù)?在此博客中,您將了解如何使用 Elasticsearch 將 ChatGPT 連接到專(zhuān)有數(shù)據(jù)存儲(chǔ),并為您的數(shù)據(jù)構(gòu)建問(wèn)答功能。
(資料圖片僅供參考)
近幾個(gè)月來(lái),人們對(duì) ChatGPT 充滿(mǎn)了熱情,這是一種由 OpenAI 創(chuàng)建的開(kāi)創(chuàng)性人工智能模型。但 ChatGPT 到底是什么?
基于強(qiáng)大的 GPT 架構(gòu),ChatGPT 旨在理解文本輸入并生成類(lèi)似人類(lèi)的響應(yīng)。GPT 代表“生成式預(yù)訓(xùn)練Transformer(Generative Pre-trained Transformer)”。Transformer 是一種尖端模型架構(gòu),徹底改變了自然語(yǔ)言處理 (NLP) 領(lǐng)域。這些模型在海量數(shù)據(jù)上進(jìn)行了預(yù)訓(xùn)練,能夠理解上下文、生成相關(guān)響應(yīng),甚至進(jìn)行對(duì)話. 要了解更多關(guān)于 transformer 模型的歷史和 Elastic Stack 中的一些 NLP 基礎(chǔ)知識(shí),請(qǐng)務(wù)必查看很棒的Elastic ML 工程師 Josh Devins 的演講。
ChatGPT 的主要目標(biāo)是促進(jìn)人機(jī)之間有意義且引人入勝的交互。通過(guò)利用 NLP 的最新進(jìn)展,ChatGPT 模型可以提供廣泛的應(yīng)用程序,從聊天機(jī)器人和虛擬助手到內(nèi)容生成、代碼完成等等。這些人工智能驅(qū)動(dòng)的工具已迅速成為無(wú)數(shù)行業(yè)的寶貴資源,幫助企業(yè)簡(jiǎn)化流程并增強(qiáng)服務(wù)。
然而,盡管 ChatGPT 具有不可思議的潛力,但用戶(hù)仍應(yīng)注意某些限制。一個(gè)值得注意的限制是知識(shí)截止日期。目前,ChatGPT 接受的數(shù)據(jù)訓(xùn)練截至 2021 年 9 月,這意味著它不知道此后發(fā)生的事件、發(fā)展或變化。因此,用戶(hù)在依賴(lài) ChatGPT 獲取最新信息時(shí)應(yīng)牢記這一限制。在討論快速變化的知識(shí)領(lǐng)域(例如軟件增強(qiáng)和功能甚至世界大事)時(shí),這可能會(huì)導(dǎo)致反應(yīng)過(guò)時(shí)或不正確。
ChatGPT 雖然是一種令人印象深刻的 AI 語(yǔ)言模型,但偶爾會(huì)在其響應(yīng)中產(chǎn)生幻覺(jué),當(dāng)它無(wú)法訪問(wèn)相關(guān)信息時(shí)通常會(huì)加劇這種情況。這種過(guò)度自信會(huì)導(dǎo)致向用戶(hù)提供不正確的答案或誤導(dǎo)性信息。重要的是要意識(shí)到這一限制,并在必要時(shí)以一定程度的懷疑態(tài)度、交叉檢查和驗(yàn)證信息來(lái)處理 ChatGPT 生成的響應(yīng),以確保準(zhǔn)確性和可靠性。
ChatGPT 的另一個(gè)限制是它缺乏關(guān)于特定領(lǐng)域內(nèi)容的知識(shí)。雖然它可以根據(jù)接受過(guò)培訓(xùn)的信息生成連貫且與上下文相關(guān)的響應(yīng),但它無(wú)法訪問(wèn)特定領(lǐng)域的數(shù)據(jù)或提供依賴(lài)于用戶(hù)獨(dú)特知識(shí)庫(kù)的個(gè)性化答案。例如,它可能無(wú)法深入了解組織的專(zhuān)有軟件或內(nèi)部文檔。因此,用戶(hù)在直接從 ChatGPT 尋求有關(guān)此類(lèi)主題的建議或答案時(shí)應(yīng)謹(jǐn)慎行事。
最小化這些限制的一種方法是為 ChatGPT 提供對(duì)與您的域和問(wèn)題相關(guān)的特定文檔的訪問(wèn)權(quán)限,并啟用 ChatGPT 的語(yǔ)言理解功能以生成定制的響應(yīng)。
這可以通過(guò)將 ChatGPT 連接到 Elasticsearch 等搜索引擎來(lái)實(shí)現(xiàn)。
Elasticsearch 是一個(gè)高效的搜索引擎,旨在提供相關(guān)文檔檢索,確保用戶(hù)可以快速準(zhǔn)確地訪問(wèn)他們需要的信息。Elasticsearch 的主要重點(diǎn)是向用戶(hù)提供最相關(guān)的結(jié)果、簡(jiǎn)化搜索過(guò)程并增強(qiáng)用戶(hù)體驗(yàn)。
Elasticsearch 擁有眾多可確保一流搜索性能的功能,包括支持傳統(tǒng)關(guān)鍵字和基于文本的搜索 ( BM25 )以及一個(gè)具備精確匹配和近似kNN的AI向量搜索(k-Nearest Neighbor)。這些高級(jí)功能使 Elasticsearch 不僅可以檢索相關(guān)的結(jié)果,還可以檢索使用自然語(yǔ)言表達(dá)的查詢(xún)的結(jié)果。通過(guò)利用傳統(tǒng)、向量或混合搜索 (BM25 + kNN),Elasticsearch 可以提供無(wú)與倫比的精確結(jié)果,幫助用戶(hù)輕松找到他們需要的信息。
Elasticsearch 的主要優(yōu)勢(shì)之一是其強(qiáng)大的 API,它可以與其他服務(wù)無(wú)縫集成以擴(kuò)展和增強(qiáng)其功能。通過(guò)將 Elasticsearch 與各種第三方工具和平臺(tái)集成,用戶(hù)可以根據(jù)自己的特定需求創(chuàng)建功能強(qiáng)大的自定義搜索解決方案。這種靈活性和可擴(kuò)展性使 Elasticsearch 成為希望提高搜索能力并在競(jìng)爭(zhēng)激烈的數(shù)字環(huán)境中保持領(lǐng)先地位的企業(yè)的理想選擇。
通過(guò)與 ChatGPT 等高級(jí)人工智能模型協(xié)同工作,Elasticsearch 可以為 ChatGPT 提供最相關(guān)的文檔以用于其響應(yīng)。Elasticsearch 和 ChatGPT 之間的這種協(xié)同作用可確保用戶(hù)收到與其查詢(xún)相關(guān)的事實(shí)、上下文相關(guān)和最新的答案。從本質(zhì)上講,Elasticsearch 的檢索能力與 ChatGPT 的自然語(yǔ)言理解能力相結(jié)合,提供了無(wú)與倫比的用戶(hù)體驗(yàn),為信息檢索和 AI 支持的協(xié)助樹(shù)立了新標(biāo)準(zhǔn)。
為 Elasticsearch 生成混合搜索請(qǐng)求
title字段上的 BM25 匹配kNN 搜索title向量字段提升 kNN 搜索結(jié)果以對(duì)齊分?jǐn)?shù)設(shè)置 size=1 只返回得分最高的文檔2.搜索請(qǐng)求發(fā)送到Elasticsearch。
3.文檔正文和原始url返回給python應(yīng)用程序。
對(duì) OpenAI ChatCompletion 進(jìn)行 API 調(diào)用:prompt:"answer this questionElasticDoc ChatGPT 流程利用 Python 界面接受用戶(hù)問(wèn)題并為 Elasticsearch 生成混合搜索請(qǐng)求,結(jié)合 BM25 和 kNN 搜索方法從 Elastic的官方文檔中查找最相關(guān)的文檔,這些文檔現(xiàn)已在 Elasticsearch 中編制索引。但是,您不必使用混合搜索甚至向量搜索。Elasticsearch 可以靈活地使用最適合您需求的搜索模式,并為您的特定數(shù)據(jù)集提供最相關(guān)的結(jié)果。
在檢索到最佳結(jié)果后,該程序會(huì)為 OpenAI 的 ChatCompletion API 制作Prompt
,指示它僅使用所選文檔中的信息來(lái)回答用戶(hù)的問(wèn)題。此提示是確保 ChatGPT 模型僅使用官方文檔中的信息、這是減少ChatGPT產(chǎn)生幻覺(jué)的關(guān)鍵。
最后,該程序向用戶(hù)展示 API 生成的響應(yīng)和源文檔的鏈接,提供無(wú)縫且用戶(hù)友好的體驗(yàn),集成了前端交互、Elasticsearch 查詢(xún)和 OpenAI API 使用以實(shí)現(xiàn)高效的問(wèn)答。
請(qǐng)注意,雖然為簡(jiǎn)單起見(jiàn)我們只返回得分最高的文檔,但最佳做法是返回多個(gè)文檔以為 ChatGPT 提供更多上下文??梢栽诓恢挂粋€(gè)文檔頁(yè)面中找到正確的答案,或者如果我們要為完整的正文文本生成向量,那么這些較大的文本正文可能需要分塊并存儲(chǔ)在多個(gè) Elasticsearch 文檔中。通過(guò)利用 Elasticsearch 與傳統(tǒng)搜索方法協(xié)同搜索大量矢量字段的能力,您可以顯著提高您的頂級(jí)文檔召回率。
技術(shù)要求相當(dāng)?shù)停枰恍┎襟E才能將所有部分組合在一起。對(duì)于此示例,我們將配置Elasticsearch 網(wǎng)絡(luò)爬蟲(chóng)以攝取 Elastic 文檔并在攝取時(shí)為title生成向量。您可以跟隨本文并復(fù)制此設(shè)置,或使用自己的數(shù)據(jù)。為了跟隨本文,我們需要:
Elasticsearch集群Eland Python 庫(kù)OpenAI API 賬號(hào)運(yùn)行我們的 python 前端和 api 后端的服務(wù)器本節(jié)中的步驟假設(shè)您當(dāng)前沒(méi)有在 Elastic Cloud 中運(yùn)行的 Elasticsearch 集群。如果你已經(jīng)有一個(gè) Elastic Cloud
的集群,可以跳到下一部分。
注冊(cè)
如果您還沒(méi)有 Elasticsearch 集群,您可以通過(guò)Elastic Cloud注冊(cè)免費(fèi)試用。
創(chuàng)建部署
注冊(cè)后,系統(tǒng)會(huì)提示您創(chuàng)建第一個(gè)部署。
為您的部署創(chuàng)建一個(gè)名稱(chēng)。您可以接受默認(rèn)的云提供商和區(qū)域,或單擊“編輯設(shè)置”并選擇其他位置。單擊創(chuàng)建部署。很快將為您配置一個(gè)新的部署,您將登錄到 Kibana。回到云端
在繼續(xù)之前,我們需要在 Cloud Console 中做幾件事:
單擊左上角的導(dǎo)航圖標(biāo)并選擇管理此部署。
添加機(jī)器學(xué)習(xí)節(jié)點(diǎn)。
返回 Cloud Console,單擊左側(cè)導(dǎo)航欄中部署名稱(chēng)下的Edit。向下滾動(dòng)到 Machine Learning instances 框并單擊 +Add Capacity。在Size per zone下,單擊并選擇 2 GB RAM大小的機(jī)器學(xué)習(xí)節(jié)點(diǎn)向下滾動(dòng)并單擊保存:在彈出的 summarizing the architecture changes窗口中,單擊“Confirm”。片刻之后,您的部署現(xiàn)在將能夠運(yùn)行機(jī)器學(xué)習(xí)模型!重置 Elasticsearch 部署用戶(hù)和密碼:
單擊部署名稱(chēng)下方左側(cè)導(dǎo)航欄中的安全性。單擊重置密碼并使用重置進(jìn)行確認(rèn)。(注意:因?yàn)檫@是一個(gè)新集群,所以不應(yīng)使用此 Elastic 密碼。)下載為“elastic”用戶(hù)新創(chuàng)建的密碼。(我們將使用它從 Hugging Face 和我們的 python 程序中加載我們的模型。)復(fù)制 Elasticsearch 部署云 ID。
單擊您的部署名稱(chēng)以轉(zhuǎn)到概覽頁(yè)面。在右側(cè)單擊復(fù)制圖標(biāo)以復(fù)制您的 Cloud ID。(保存此以備后用連接到 Deployment。)接下來(lái),我們需要將embedding模型加載到 Elasticsearch 中,用于為我們的博客title生成向量,以及為用戶(hù)的搜索問(wèn)題生成向量。我們將使用由 SentenceTransformers 訓(xùn)練并托管在 Hugging Face 模型中心上的all-distilroberta-v1模型。在此示例中,我們之所以選擇這個(gè)模式,是因?yàn)樗窃诤w廣泛主題的非常大的數(shù)據(jù)集上訓(xùn)練的,適合一般用途。但是,我們并非一定要選擇這個(gè)模型,對(duì)于向量搜索用例,使用針對(duì)您的特定數(shù)據(jù)集進(jìn)行微調(diào)的模型通常會(huì)提供最佳相關(guān)性。
為此,我們將使用Elastic 創(chuàng)建的Eland python 庫(kù)。該庫(kù)提供了廣泛的數(shù)據(jù)科學(xué)功能,但我們將使用它作為橋梁,將模型從 Hugging Face 模型中心加載到 Elasticsearch,以便它可以部署在機(jī)器學(xué)習(xí)節(jié)點(diǎn)上以供推理使用。
Eland 可以作為 python 腳本的一部分運(yùn)行,也可以在命令行上運(yùn)行。該存儲(chǔ)庫(kù)還為希望走這條路的用戶(hù)提供了一個(gè) Docker 容器。今天我們將在一個(gè)小型 python notebook中運(yùn)行 Eland ,它可以在網(wǎng)絡(luò)瀏覽器中免費(fèi)運(yùn)行在谷歌的 Colab 中。
打開(kāi)程序鏈接并單擊頂部的“在 Colab 中打開(kāi)”按鈕以在 Colab 中啟動(dòng)筆記本。
將變量 hf_model_id 設(shè)置為模型名稱(chēng)。此模型已在示例代碼中設(shè)置,但如果您想使用不同的模型可自行修改:
hf_model_id="sentence-transformers/all-distilroberta-v1"
從 Hugging Face 復(fù)制模型名稱(chēng)。最簡(jiǎn)單的方法是單擊模型名稱(chēng)右側(cè)的復(fù)制圖標(biāo)。運(yùn)行 cloud auth 部分,系統(tǒng)會(huì)提示您輸入:
Cloud ID(您可以在 Elastic Cloud 控制臺(tái)中找到它)Elasticsearch 用戶(hù)名(最簡(jiǎn)單的方法是使用在創(chuàng)建部署時(shí)創(chuàng)建的“Elastic”用戶(hù))Elasticsearch的密碼運(yùn)行剩余的步驟:
這將從 Hugging face 下載模型,將其分塊,并將其加載到 Elasticsearch 中。將模型部署(啟動(dòng))到機(jī)器學(xué)習(xí)節(jié)點(diǎn)上。接下來(lái)我們將創(chuàng)建一個(gè)新的 Elasticsearch 索引來(lái)存儲(chǔ)我們的 Elastic 文檔,將網(wǎng)絡(luò)爬蟲(chóng)配置為自動(dòng)抓取這些文檔并為其編制索引,并使用攝取管道為文檔title生成向量。
請(qǐng)注意,您可以在此步驟中使用您的專(zhuān)有數(shù)據(jù),以創(chuàng)建適合您的領(lǐng)域的問(wèn)答體驗(yàn)。
如果您尚未打開(kāi) Kibana,請(qǐng)從 Cloud Console 打開(kāi)它。在 Kibana 中,導(dǎo)航到Enterprise Search -> Overview。單擊創(chuàng)建 Elasticsearch 索引。使用 Web Crawler 作為攝取方法,輸入 elastic-docs 作為索引名稱(chēng)。然后,單擊創(chuàng)建索引。單擊“ingest Pipeline”選項(xiàng)卡。單擊 Ingest Pipeline中的 Copy and customize。單擊 Add Inference Pipeline為新管道輸入名稱(chēng) elastic-docs_title-vector。選擇您在上面的 Eland 步驟中加載的經(jīng)過(guò)訓(xùn)練的 ML 模型。選擇title作為源字段。單擊Continue,然后在測(cè)試階段再次單擊Continue在 Review 階段點(diǎn)擊 Create Pipeline更新 dense_vector 字段的映射。(注意:對(duì)于 Elasticsearch 8.8+ 版本,此步驟應(yīng)該是自動(dòng)的。)
在導(dǎo)航菜單中,單擊 Dev Tools。如果這是您第一次打開(kāi) Dev Tools,您可能必須在帶有文檔的彈出窗口中單擊“關(guān)閉”。在 Console 選項(xiàng)卡的 Dev Tools 中,使用以下代碼更新dense_vector
目標(biāo)字段的映射。您只需將其粘貼到代碼框中,然后單擊第 1 行右側(cè)的小箭頭。POST search-elastic-docs/_mapping{ "properties": { "title-vector": { "type": "dense_vector", "dims": 768, "index": true, "similarity": "dot_product" } }}了解詳情
您應(yīng)該會(huì)在屏幕的右半部分看到以下響應(yīng):{ "acknowledged": true}
這將允許我們稍后在title字段上運(yùn)行 kNN 向量搜索。配置網(wǎng)絡(luò)爬蟲(chóng)以爬取 Elastic官方文檔:
再次單擊導(dǎo)航菜單,然后單擊 Enterprise Search -> Overview。在內(nèi)容下,單擊索引。單擊 search-elastic-docs。單擊“Manage Domains”選項(xiàng)卡。單擊“Add domain”。輸入https://www.elastic.co/guide/en,然后單擊驗(yàn)證域。檢查運(yùn)行后,單擊Add domain。然后單擊抓取規(guī)則。逐個(gè)添加以下爬行規(guī)則。從底部開(kāi)始,逐步向上。規(guī)則按照第一個(gè)匹配進(jìn)行評(píng)估。Disallow | Contains | release-notes |
---|---|---|
Allow | Regex | /guide/en/.*/current/.* |
Disallow | Regex | .* |
Elasticsearch 的網(wǎng)絡(luò)爬蟲(chóng)現(xiàn)在將開(kāi)始爬取文檔站點(diǎn),為title字段生成向量,并對(duì)文檔和向量建立索引。
第一次爬網(wǎng)需要一些時(shí)間才能完成。同時(shí),我們可以設(shè)置 OpenAI API 憑證和 Python 后端。
要向 ChatGPT 發(fā)送文檔和問(wèn)題,我們需要一個(gè) OpenAI API 帳戶(hù)和密鑰。如果您還沒(méi)有帳戶(hù),可以創(chuàng)建一個(gè)免費(fèi)帳戶(hù),您將獲得初始數(shù)量的免費(fèi)積分。
前往https://platform.openai.com并點(diǎn)擊注冊(cè)。您可以通過(guò)電子郵件地址和密碼進(jìn)行注冊(cè),也可以使用Google或Microsoft登錄。創(chuàng)建帳戶(hù)后,您需要?jiǎng)?chuàng)建一個(gè) API 密鑰:
單擊API Key。單擊創(chuàng)建新密鑰。復(fù)制新密鑰并將其保存在安全的地方,因?yàn)槟鷮o(wú)法再次查看該密鑰。Github 代碼鏈接
安裝所需的 python 庫(kù)。我們?cè)诰哂懈綦x環(huán)境的 Replit 中運(yùn)行示例程序。如果您在筆記本電腦或 VM 上運(yùn)行它,最佳做法是為 python 設(shè)置一個(gè)VENV。運(yùn)行 pip install -r requirements.txt2.設(shè)置身份驗(yàn)證和連接環(huán)境變量(例如,如果在命令行上運(yùn)行:export openai_api=”123456abcdefg789”)
openai_api - OpenAI API Keycloud_id - Elastic Cloud IDcloud_user - Elasticsearch 集群用戶(hù)cloud_pass - Elasticsearch 用戶(hù)密碼3.運(yùn)行streamlit程序。有關(guān) streamlit 的更多信息可以在其文檔中找到。
Streamlit 有自己的啟動(dòng)命令:streamlit run elasticdocs_gpt.py這將啟動(dòng)網(wǎng)絡(luò)瀏覽器,并將 url 打印到命令行。一切都已攝取且前端啟動(dòng)并運(yùn)行后,您可以開(kāi)始詢(xún)問(wèn)有關(guān) Elastic 官方文檔的問(wèn)題。
詢(xún)問(wèn)“Show me the API call for an inference processor”現(xiàn)在會(huì)返回一個(gè) API 調(diào)用的例子和有關(guān)配置設(shè)置的信息。
詢(xún)問(wèn)將新集成添加到 Elastic Agent 的步驟:
如前所述,允許 ChatGPT 僅根據(jù)訓(xùn)練過(guò)的數(shù)據(jù)回答問(wèn)題的風(fēng)險(xiǎn)之一是它容易產(chǎn)生錯(cuò)誤答案的幻覺(jué)。該項(xiàng)目的目標(biāo)之一是為 ChatGPT 提供包含正確信息的數(shù)據(jù),并讓它制定答案。
那么當(dāng)我們給 ChatGPT 一個(gè)不包含正確信息的文檔時(shí)會(huì)發(fā)生什么?比方說(shuō),請(qǐng)它告訴您如何造船(Elastic 的官方文檔不包含此內(nèi)容):
當(dāng) ChatGPT 無(wú)法在我們提供的文檔中找到問(wèn)題的答案時(shí),它會(huì)退回到我們的提示指令,簡(jiǎn)單地告訴用戶(hù)它無(wú)法回答問(wèn)題。
在這個(gè)例子中,我們展示了如何將Elasticsearch強(qiáng)大的搜索檢索功能與GPT模型生成的最新進(jìn)展的AI響應(yīng)集成,從而將用戶(hù)體驗(yàn)提升到一個(gè)全新的水平。
這些組件可以根據(jù)您的具體要求進(jìn)行定制,并進(jìn)行調(diào)整以提供最佳結(jié)果。雖然我們使用了Elastic網(wǎng)絡(luò)爬蟲(chóng)來(lái)攝取公共數(shù)據(jù),但您并不局限于此方法。你隨意嘗試其他embedding模型,尤其是那些針對(duì)特定領(lǐng)域數(shù)據(jù)進(jìn)行微調(diào)的模型。
您今天可以嘗試本博客中討論的所有功能!要構(gòu)建您自己的 ElasticDocs GPT 體驗(yàn),請(qǐng)注冊(cè)一個(gè)Elastic 試用帳戶(hù),然后查看此示例代碼庫(kù)以開(kāi)始使用。
如果您想了解更多Elasticsearch在搜索相關(guān)性上的新可能,可以嘗試以下兩個(gè):
[博客] 使用 Elasticsearch 部署 NLP 文本嵌入和矢量搜索[博客] 使用 Elastic 實(shí)現(xiàn)圖像相似度搜索[責(zé)任編輯:linlin]
標(biāo)簽: