實驗場:在幾分鐘內使用 Elasticsearch 進行 RAG 應用程序實驗

作者:來自 Elastic?Joe McElroy, Serena Chou

什么是 Playground(實驗場)?

我們很高興發布我們的 Playground 體驗 —- 一個低代碼界面,開發人員可以在幾分鐘內使用自己的私人數據探索他們選擇的 LLM。

在對對話式搜索進行原型設計時,快速迭代和試驗 RAG 工作流的關鍵組件(例如:混合搜索或添加重新排名)的能力非常重要 —- 以便從 LLMs 獲得準確且無幻覺的響應。

Elasticsearch 向量數據庫和 Search AI 平臺為開發人員提供了廣泛的功能,例如全面的混合搜索,以及使用來自越來越多的 LLM 提供商的創新。我們在 Playground 體驗中的方法允許你使用這些功能的強大功能,而不會增加復雜性。

A/B 測試 LLMs 并選擇不同的推理提供商

Playground 的直觀界面允許你對來自模型提供商(如 OpenAI 和 Anthropic)的不同 LLM 進行 A/B 測試并改進你的檢索機制,以便使用你自己的數據(索引到一個或多個 Elasticsearch 索引中)來獲得答案。Playground 體驗可以直接在 Elasticsearch 中利用轉換器模型,但也可以通過 Elasticsearch Open Inference API 進行擴展,該 API 與越來越多的推理提供商集成,包括 Cohere 和 Azure AI Studio。

帶有檢索器(retrievers)和混合搜索的最佳上下文窗口

正如 Elasticsearch 開發人員已經知道的那樣,最佳上下文窗口是使用混合搜索構建的。你為實現此結果而構建的策略需要訪問多種形式的向量化和純文本數據,這些數據可以分塊并分布在多個索引中。

我們正在幫助你使用新引入的 query retrievers?簡化查詢構建以搜索所有內容!借助三個關鍵檢索器(現已在 8.14 和 Elastic Cloud Serverless 中提供),使用 RRF 規范化分數的混合搜索只需一個統一查詢即可完成。使用檢索器,playground 可以了解所選數據的形狀,并會自動為你生成統一查詢。存儲向量化數據并探索 kNN 檢索器,或者通過選擇數據添加元數據和上下文以生成混合搜索查詢。即將推出的語義重新排名可以輕松合并到你生成的查詢中,以實現更高質量的召回率。

一旦你根據生產標準調整和配置了語義搜索,你就可以導出代碼,并使用 Python Elasticsearch 語言客戶端或 LangChain Python 集成完成應用程序中的體驗。

Playground 現已在 Elastic Cloud Serverless 上可用,并且現已在 Elastic Cloud 8.14 中可用。

使用 Playground

可以從 Kibana(Elasticsearch UI)中訪問 Playground,方法是從側面導航欄導航到 “Playground”。

連接到你的 LLM

Playground 支持聊天完成模型,例如來自 OpenAI、Azure OpenAI 或通過 Amazon Bedrock 的 Anthropic 的 GPT-4o。首先,你需要連接到其中一個模型提供商,以獲取你選擇的 LLM。

與你的數據聊天

可以使用任何數據,甚至基于 BM25 的索引。你可以選擇使用文本嵌入模型(如我們的零樣本語義搜索模型 ELSER)轉換你的數據字段,但這不是必需的。入門非常簡單 - 只需選擇你想要用來作為答案依據的索引并開始提問即可。在此示例中,我們將使用 PDF 并從使用 BM25 開始,每個文檔代表 PDF 的一頁。

使用 Python 使用 BM25 索引 PDF 文檔

首先,我們安裝依賴項。我們使用 pypdf 庫讀取 PDF 并請求檢索它們。

!pip install -qU pypdf requests elasticsearch

然后我們讀取文件,創建一個包含文本的頁面數組。

    import PyPDF2import requestsfrom io import BytesIOdef download_pdf(url):response = requests.get(url)if response.status_code == 200:return BytesIO(response.content)else:print("Failed to download PDF")return Nonedef get_pdf_pages(pdf_file):pages = []pdf_reader = PyPDF2.PdfReader(pdf_file)for page in pdf_reader.pages:text = page.extract_text()pages.append(text)return pagespdf_file = download_pdf("https://arxiv.org/pdf/2103.15348.pdf")if pdf_file:pages = get_pdf_pages(pdf_file)

然后我們將其導入 elasticsearch 的 my_pdf_index_bm25 索引下。

    from elasticsearch import helpersclient = Elasticsearch("<my-cloud-url>",api_key=ELASTIC_API_KEY,)helpers.bulk(client,[{"_index": "my_pdf_index_bm25","_source": {"text": page,"page_number": i,},}for i, page in enumerate(pages)],request_timeout=60,)

使用 Playground 與你的數據進行對話

一旦我們將 LLM 與連接器連接并選擇索引,我們就可以開始詢問有關 PDF 的問題。LLM 現在將輕松為你的數據提供答案。

幕后發生了什么?

當我們選擇索引時,我們會自動確定最佳檢索方法。在這種情況下,僅提供 BM25 關鍵字搜索,因此我們生成多匹配類型查詢來執行檢索。

由于我們只有一個字段,因此我們默認搜索該字段。如果你有多個字段,你可以選擇要搜索的字段,以改進相關文檔的檢索。

提出問題

當你提出問題時,Playground 將使用查詢執行檢索,以查找與你的問題匹配的相關文檔。然后,它將以此為上下文并提供提示,為你選擇的 LLM 模型返回的答案打下基礎。

我們使用文檔中的特定字段作為上下文。在此示例中,Playground 選擇了名為 “text” 的字段,但可以在 “edit context” 操作中更改此字段。

默認情況下,我們最多檢索 3 個文檔作為上下文,但你也可以在編輯上下文彈出窗口中調整該數字。

提出后續問題

通常,后續問題與之前的對話有關。考慮到這一點,我們要求 LLM 使用對話將后續問題重寫為獨立問題,然后將其用于檢索。這使我們能夠檢索更好的文檔,以用作幫助回答問題的上下文。

上下文

當根據你的問題找到文檔時,我們會將這些文檔作為上下文提供給 LLM,以便 LLM 在回答時鞏固其知識。我們會自動選擇一個我們認為最好的索引字段,但你可以通過編輯上下文彈出窗口來更改此字段。

使用語義搜索和分塊改進檢索

由于我們的查詢是問題形式,因此檢索能夠根據語義進行匹配非常重要。使用 BM25,我們只能匹配詞匯上符合我們問題的文檔,因此我們還需要添加語義搜索。

使用 ELSER 進行稀疏向量語義搜索

開始語義搜索的一個簡單方法是將 Elastic 的 ELSER 稀疏嵌入模型用于我們的數據。與許多這種規模和架構的模型一樣,ELSER 具有典型的 512 個 token 限制,并且需要選擇適當的分塊策略來適應它。在即將推出的 Elasticsearch 版本中,我們將默認分塊作為向量化過程的一部分,但在此版本中,我們將遵循按段落分塊的策略作為起點。你的數據形狀可能會受益于其他分塊策略,我們鼓勵進行實驗以改進檢索。

使用 pyPDF 和 LangChain 對 PDF 進行分塊和提取

為了簡化示例,我們將使用 LangChain 工具加載頁面并將其拆分為段落。LangChain 是一種流行的 RAG 開發工具,可以與我們更新的集成集成,并與 Elasticsearch 向量數據庫和語義重新排名功能一起使用。

創建 ELSER 推理端點

可以執行以下 REST API 調用來下載、部署和檢查模型的運行狀態。你可以使用 Kibana 中的開發工具執行這些操作。

# Starts ELSER Service into Elasticsearch ML node
# This may take a while, depending on ML node autoscaling
PUT _inference/sparse_embedding/my-elser-model
{"service": "elser","service_settings": {"num_allocations": 1,"num_threads": 1}
}# Check to see if trained model status. Look at nodes.routing_state is "started"
GET _ml/trained_models/my-elser-model/_stats

導入 Elasticsearch

接下來,我們將設置一個索引并附加一個管道來為我們處理推理。

# Setup an elser pipeline to embed the contents in text field
# using ELSER into the text_embedding field
PUT /_ingest/pipeline/my-elser-pipeline
{"processors": [{"inference": {"model_id": "my-elser-model","input_output": [{"input_field": "text","output_field": "text_embedding"}]}}]
}# Setup an index which uses the embedding pipeline
# ready for our documents to be stored in
PUT /elser_index
{"mappings": {"properties": { "text": {"type": "text"},"text_embedding": {"type": "sparse_vector"}}},"settings": {"index": {"default_pipeline": "my-elser-pipeline"}}
}

將頁面拆分成段落并導入 Elasticsearch

現在 ELSER 模型已經部署完畢,我們可以開始將 PDF 頁面拆分成段落并導入 Elasticsearch。

from langchain_community.document_loaders import PyPDFLoaderfrom langchain.text_splitter import RecursiveCharacterTextSplitterfrom elasticsearch import helpersloader = PyPDFLoader("https://arxiv.org/pdf/2103.15348.pdf")data = loader.load()text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(chunk_size=512, chunk_overlap=256)docs = loader.load_and_split(text_splitter=text_splitter)helpers.bulk(client,[{"_index": "elser_index","_source": {"text": doc.page_content,"page_number": i,},}for i, doc in enumerate(docs)],request_timeout=60,)

就這樣!我們應該將嵌入 ELSER 的段落導入 Elasticsearch。

在 Playground 上查看實際操作

現在,在選擇索引時,我們使用 deployment_id 生成基于 ELSER 的查詢來嵌入查詢字符串。

當提出問題時,我們現在有一個語義搜索查詢,用于檢索與問題語義相匹配的文檔。

混合搜索變得簡單

啟用文本字段也可以啟用混合搜索。當我們檢索文檔時,我們現在會搜索關鍵字匹配和語義含義,并使用 RRF 算法對兩個結果集進行排序。

改進 LLM 的答案

使用 Playground,你可以調整提示、調整檢索并創建多個索引(分塊策略和嵌入模型)以改進和比較你的答案。

將來,我們將提供有關如何充分利用索引的提示,并建議優化檢索策略的方法。

System Prompt

默認情況下,我們提供一個簡單的系統提示,你可以在模型設置中更改它。它與更廣泛的系統提示一起使用。你只需編輯它即可更改簡單的系統提示。

優化上下文

良好的響應依賴于良好的上下文。使用諸如對內容進行分塊和優化數據分塊策略等方法非常重要。除了對數據進行分塊外,你還可以嘗試不同的文本嵌入模型來改進檢索,看看哪種模型能給你帶來最佳結果。在上面的例子中,我們使用了 Elastic 自己的 ELSER 模型,但推理服務支持大量嵌入模型,這些模型可能更適合你的需求。

優化上下文的其他好處包括更好的成本效率和速度:成本是根據標記(輸入和輸出)計算的。在分塊和 Elasticsearch 強大的檢索功能的幫助下,我們提供的相關文檔越多,你的用戶的成本就越低,延遲就越快。

如果你注意到,我們在 BM25 示例中使用的輸入 token 比 ELSER 示例中的要大。這是因為我們有效地對文檔進行了分塊,并且只向 LLM 提供了頁面上最相關的段落。

最后一步!將 RAG 集成到你的應用程序中

一旦你對響應感到滿意,你就可以將此體驗集成到你的應用程序中。查看代碼提供了如何在你自己的 API 中執行此操作的示例應用程序代碼。

目前,我們提供了使用 OpenAI 或 LangChain 的示例,但 Elasticsearch 查詢、系統提示以及模型與 Elasticsearch 之間的一般交互相對簡單,可供你自行調整使用。

結論

對話式搜索體驗的構建可以考慮多種方法,而選擇可能會讓人不知所措,尤其是隨著新的重新排名和檢索技術的創新步伐,這兩種技術都適用于 RAG 應用程序。

使用我們的 Playground,即使開發人員可以使用多種功能,這些選擇也會變得簡單直觀。我們的方法獨特之處在于,可以立即將混合搜索作為構建的主要支柱,直觀地了解所選和分塊數據的形狀,并擴大 LLMs 的多個外部提供商的訪問范圍。

使用 Playground 構建、測試、享受樂趣

立即前往 Playground 文檔開始吧!探索 GitHub 上的搜索實驗室,了解 Cohere、Anthropic、Azure OpenAI 等提供商的新手冊和集成。

準備好自己嘗試一下了嗎?開始免費試用。
Elasticsearch 集成了 LangChain、Cohere 等工具。加入我們的高級語義搜索網絡研討會,構建你的下一個 GenAI 應用程序!

原文:Playground: Experiment with RAG applications with Elasticsearch in minutes — Elastic Search Labs

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37856.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37856.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37856.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

41割隊伍

上海市計算機學會競賽平臺 | YACSYACS 是由上海市計算機學會于2019年發起的活動,旨在激發青少年對學習人工智能與算法設計的熱情與興趣,提升青少年科學素養,引導青少年投身創新發現和科研實踐活動。https://www.iai.sh.cn/problem/387 題目描述 給定 ??n 個數字 ??1,?…

一周小計(1):實習初體驗

實習的第一周&#xff0c;從最開始的配環境做好準備工作&#xff0c;到拉項目熟悉項目&#xff0c;然后自己去寫需求&#xff0c;每一步都有很大收獲&#xff0c;得到很多人幫助真的好感謝&#xff0c;以下是個人這幾天的記錄與感想。 &#xff08;這個其實是我寫的周報&#x…

Hi3861 OpenHarmony嵌入式應用入門--LiteOS Semaphore做同步使用

信號量作為同步使用 創建一個Semaphore對象&#xff0c;并指定一個初始的計數值&#xff08;通常稱為“許可”或“令牌”的數量&#xff09;。這個計數值表示當前可用的資源數量或可以同時訪問共享資源的線程數。當一個線程需要訪問共享資源時&#xff0c;它會嘗試從Semaphore…

加油站可視化:打造智能化運營與管理新模式

智慧加油站可視化通過圖撲 HT 構建仿真的三維模型&#xff0c;將加油站的布局、設備狀態、人員活動等信息動態呈現。管理者可以通過直觀的可視化界面實時監控和分析運營狀況&#xff0c;快速做出決策&#xff0c;提高管理效率和安全水平&#xff0c;推動加油站向智能化管理轉型…

后端之路第三站(Mybatis)——結合案例講Mybatis怎么操作sql

先講一下準備工作整體流程要做什么 我們要基于一個員工管理系統作為案例&#xff0c;進行員工信息的【增、刪、改、查】 原理就是用Mybatis通過java語言來執行sql語句&#xff0c;來達到【增、刪、改、查】 一、準備工作 1、引入數據庫數據 首先我們把一個員工、部門表的數…

【51單片機入門】速通定時器

文章目錄 前言定時器是什么初始化定時器初始化的大概步驟TMOD寄存器C/T寄存器 觸發定時器中斷是什么中斷函數定時器點亮led 總結 前言 在嵌入式系統的開發中&#xff0c;定時器是一個非常重要的組成部分。它們可以用于產生精確的時間延遲&#xff0c;或者在特定的時間間隔內觸…

對外發布的PDF文檔進行數字證書簽名的重要性?

對外發布的PDF文檔進行數字證書簽名具有以下幾個重要性&#xff1a; 身份驗證&#xff1a;數字簽名可以證明文檔的來源&#xff0c;即確認文檔的簽署者身份。這如同在紙質文檔上手寫簽名或加蓋公章&#xff0c;但更安全可靠&#xff0c;因為數字簽名是基于加密技術&#xff0c;…

Java--常用類APl(復習總結)

前言: Java是一種強大而靈活的編程語言&#xff0c;具有廣泛的應用范圍&#xff0c;從桌面應用程序到企業級應用程序都能夠使用Java進行開發。在Java的編程過程中&#xff0c;使用標準類庫是非常重要的&#xff0c;因為標準類庫提供了豐富的類和API&#xff0c;可以簡化開發過…

【接口自動化測試】第三節.實現項目核心業務接口自動化

文章目錄 前言一、實現登錄接口對象封裝和調用 1.0 登錄接口的接口測試文檔 1.1 接口對象層&#xff08;封裝&#xff09; 1.2 測試腳本層&#xff08;調用&#xff09;二、課程新增接口對象封裝和調用 2.0 課程新增接口的接口測試文檔 2.1 接口對象層…

AVL樹模擬

1.概念 雖然二叉搜索樹可以縮短查找的效率&#xff0c;但如果數據有序或者接近有序時二叉搜索樹樹將退化為單支樹&#xff0c;查找元素相當于在順序表中搜索元素&#xff0c;效率低下。AVL 樹是具有一下性質的二叉搜索樹&#xff1a; 1.它的左右子樹都是AVL樹 2.左右子…

Mac 如何安裝 wget

1.安裝 Homebrew2.安裝 wget3.檢測 wget 是否安裝成功 1.安裝 Homebrew 在安裝 wget 之前需要安裝一個適用于 mac 的包管理器 Homebrew&#xff0c;打開 mac 終端執行如下命令進行安裝&#xff1a; /usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/h…

【Git】GitIgnore不生效

這里可能有兩種原因&#xff0c;一個沒有刷新Git緩存&#xff0c;二是Git忽略規則有問題 更新Git緩存 git rm -r --cached . git add . git commit -m "modify git ignore rule"Ignore規則 檢查下忽略文件的目錄表示是否正確 XXX忽略任意目錄下名為XXX的文件 …

新手第一個漏洞復現:MS17-010(永恒之藍)

文章目錄 漏洞原理漏洞影響范圍復現環境復現步驟 漏洞原理 漏洞出現在Windows SMB v1中的內核態函數srv!SrvOs2FeaListToNt在處理FEA&#xff08;File Extended Attributes&#xff09;轉換時。該函數在將FEA list轉換成NTFEA&#xff08;Windows NT FEA&#xff09;list前&am…

【Golang - 90天從新手到大師】Day14 - 方法和接口

一&#xff0e; go方法 go方法&#xff1a;在函數的func和函數名間增加一個特殊的接收器類型&#xff0c;接收器可以是結構體類型或非結構體類型。接收器可以在方法內部訪問。創建一個接收器類型為Type的methodName方法。 func (t Type) methodName(parameter list) {}go引入…

在 MATLAB 中顯示 3D 圖像

文章目錄 前言1. 曲面圖 (Surface Plot)2. 網格圖 (Mesh Plot)3. 散點圖 (Scatter Plot)4. 等值線圖 (Contour Plot) 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 項目需要&#xff1a; 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例…

享元模式(設計模式)

享元模式&#xff08;Flyweight Pattern&#xff09;是一種結構型設計模式&#xff0c;它通過共享細粒度對象來減少內存使用&#xff0c;從而提高性能。在享元模式中&#xff0c;多個對象可以共享相同的狀態以減少內存消耗&#xff0c;特別適合用于大量相似對象的場景。 享元模…

解決“Duplicate keys detected: ‘ ‘.This may cause an update error.”問題

問題原因 出現“Duplicate keys detected”的錯誤&#xff0c;通常表示在v-for指令中使的:key綁定值有重復。 如果前端是靜態數據&#xff0c;一般能自我避免:key綁定值有重復。如果前端是綁定的動態數據&#xff0c;那么需要另外提供一個唯一的鍵。 在這個例子中&#xff0c…

【LeetCode】接雨水

目錄 一、題目二、解法完整代碼 一、題目 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 輸入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 輸出&#xff1a;6 解釋&#xff…

面向對象,常用類,集合,異常,JDBC,mysql數據庫內容的復習,

1&#xff0c;面向對象 面向對象與面向過程對比 面向過程&#xff1a;關注過程&#xff0c;適合解決簡單直接的問題&#xff0c;代碼結構以函數為單位&#xff0c;如C語言。 面向對象&#xff1a;關注類&#xff0c;適合解決復雜問題更加適合解決復雜的項目中的問題等等&…

跨平臺編程:在Conda中搭建R語言環境的終極指南

&#x1f310; 跨平臺編程&#xff1a;在Conda中搭建R語言環境的終極指南 &#x1f310; 在數據科學和統計分析領域&#xff0c;R語言以其強大的數據處理能力和豐富的圖形表示功能而廣受歡迎。然而&#xff0c;對于習慣了使用Linux操作系統的用戶來說&#xff0c;如何方便地在…