作者:來自 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