加速你的故障排查:使用 Elasticsearch 構建家電手冊的 RAG 應用

作者:來自 Elastic?Alessandro Brofferio

學習如何使用 Elasticsearch 構建 RAG 應用,輕松排查你的家電問題。

想要獲得 Elastic 認證嗎?來看看下一次 Elasticsearch 工程師培訓什么時候開始吧!

Elasticsearch 擁有大量新功能,可以幫助你根據使用場景構建最佳搜索解決方案。深入學習我們的示例筆記本,了解更多信息,開啟免費的云試用,或者現在就在本地機器上嘗試 Elastic。


RAG(Retrieval Augmented Generation)通過使用外部知識庫來豐富生成的答案,從而增強了 LLM 的能力。這篇博客詳細介紹了一個基于 Elasticsearch 構建的簡單 RAG 應用的實現。該應用旨在幫助用戶排查家電問題,回答常見問題,比如 “如何將我的洗碗機恢復到出廠設置?”

我們將一步步指導你,涵蓋以下內容:

  • 使用 Eland 庫上傳嵌入模型,并在 Elastic 中設置推理 API 來使用上傳的模型進行文本嵌入

  • 創建一個使用 semantic_text 類型來存儲 PDF 正文內容的 Elasticsearch 索引

  • 設置一個 LLM completion 推理端點,用來與所選的 LLM 交互

  • 使用 semantic_text 查詢類型,根據用戶查詢檢索相關文檔

  • 將所有內容結合在一起,構建一個出色的原型

你需要:

  • 一個至少更新到 Elastic 8.18.x 的 Elastic Cloud 部署

  • 一個 LLM API 服務(我使用的是 OpenAI Azure)

該應用基于一個簡單的 Flask 應用構建,可以無縫集成 Elasticsearch API 來執行 RAG。同時配有一個簡單的前端,允許用戶上傳用戶手冊進行處理。完整代碼在這里可以獲取。

這個 RAG 應用接收你選擇的家電 PDF 手冊。上傳后,它會智能地逐頁解析 PDF 文檔,并將每一頁提取的文本內容發送到 Elasticsearch。在那里,會依靠導入 Elasticsearch 的推理模型為內容創建文本嵌入,并將其存儲為 dense_vectors。一旦手冊處理完成,用戶就可以輸入查詢,利用這些知識快速找到家電問題的解決方案。

數據收集

如上所述,我們在 Elastic Cloud 部署上運行了一個 Elasticsearch 實例。Elasticsearch 集群請求受配置設置控制,包括 http:max_content_length。這個網絡 HTTP 設置會限制 HTTP 請求體的最大大小,默認值為 100MB,在 Elastic Cloud 中目前不可配置。

為了繞過這一限制來處理更大的文檔,我實現了一個簡單的 Python 函數,將提供的 PDF 拆分為單獨的頁面,并存儲在一個單獨的文件夾中。

下面是該函數的部分代碼示例:

def split_pdf(input_pdf_path, output_folder, filename_prefix=''):"""Splits a PDF file into individual pages and saves them to an output folder.Args:input_pdf_path (str): The full path to the input PDF file.output_folder (str): The directory where split pages will be saved.filename_prefix (str): A prefix to use for the output filenames (e.g., "manual_")."""logging.info(f"[{time.strftime('%H:%M:%S')}] Splitting PDF: {input_pdf_path}")try:# Open the PDF filewith open(input_pdf_path, 'rb') as file:pdf_reader = PdfReader(file)# Iterate through each pagefor page_num in range(len(pdf_reader.pages)):pdf_writer = PdfWriter()pdf_writer.add_page(pdf_reader.pages[page_num])# Generate the output file name# Uses the original filename (without extension) as part of the prefixoriginal_filename_base = os.path.splitext(os.path.basename(input_pdf_path))[0]output_filename = f'{filename_prefix}{original_filename_base}_pg_{page_num + 1}.pdf'output_path = os.path.join(output_folder, output_filename)# Save the page as a new PDFwith open(output_path, 'wb') as output_file:pdf_writer.write(output_file)logging.info(f'[{time.strftime("%H:%M:%S")}] Saved split page: {output_filename}')logging.info(f"[{time.strftime('%H:%M:%S')}] Finished splitting PDF: {input_pdf_path}")except Exception as e:logging.error(f"[{time.strftime('%H:%M:%S')}] Error during PDF splitting for {input_pdf_path}: {e}")

為你的 PDF 內容創建嵌入

文本嵌入是指將文本(或其他數據類型)轉換為數值向量表示的過程 —— 具體來說,就是稠密向量。這是現代搜索和機器學習應用中的關鍵技術,特別適用于語義搜索、相似性搜索和生成式 AI。

Elastic 提供了多種依賴文本嵌入模型的方式:

  • 內置模型:這些模型在 Elasticsearch 中即可使用,開箱即用并已預訓練,這意味著你不需要在自己的數據上進行微調,使它們能夠適應各種使用場景。例如,你可以使用:

    • ELSER:生成文本的稀疏向量表示,僅支持英文文檔。

    • E5:通過稠密向量表示實現多語言語義搜索。

  • 導入 HuggingFace 模型:用戶可以從 HuggingFace 等平臺導入預訓練模型。這個過程依賴 Eland,它是一個 Python 客戶端,提供與 Pandas 兼容的 API,用于在 Elasticsearch 中進行數據探索和分析。

在本項目中,我們將上傳一個 HuggingFace 模型。你可以通過以下方式安裝 Eland:

python -m pip install eland

現在,打開 Bash 編輯器并創建一個 .sh 腳本,正確填寫每個參數:

MODEL_ID="sentence-transformers/all-MiniLM-L6-v2"
CLOUD_URL='<<YOUR_CLOUD_URL>>'
ELASTIC_API_KEY='<<YOUR_API_KEY>>'
eland_import_hub_model \--url "$CLOUD_URL" \--es-api-key "$ELASTIC_API_KEY" \--hub-model-id "$MODEL_ID" \--insecure \--task-type text_embedding\--start

MODEL_ID 指的是從 HuggingFace 獲取的模型。我們將使用 all-MiniLM-L6-v2,因為它體積小,可以輕松在 CPU 上運行,并且性能優異,尤其適合本次演示。

運行這個 Bash 腳本后,你的模型會出現在 Elastic 部署中的 Machine Learning -> Model Management -> Trained Models 下。

創建推理端點

從 8.11 版本開始,Elastic 已經普遍提供了推理 API 服務(inference API service)。該功能允許用戶創建推理端點,使用 Elastic 服務執行各種推理任務。

在本次演示中,我們將創建一個名為 minilm-l6 的端點,用來使用通過 Eland 上傳的模型。這個端點會傳遞與剛剛上傳模型對應的正確 model_id

PUT _inference/text_embedding/minilm-l6
{"service": "elasticsearch","service_settings": {"num_allocations": 1,"num_threads": 1,"model_id": "sentence-transformers__all-minilm-l6-v2" }
}

創建存儲 PDF 內容的索引

接下來,我們將創建一個索引,并使用默認映射,其中包含 semantic_text 字段。此設置需要你指定之前創建的端點 ID。該端點定義了在攝取過程中為 body 字段內容生成嵌入的推理服務。

作為背景說明,semantic_text 是在 Elasticsearch 8.15 中引入的,它簡化了語義搜索。若要深入了解我們的方法,建議查看我們的原始博客文章和 Elasticsearch 文檔。

PUT pdf-documentation-reader
{"mappings": {"properties": {"body": {"type": "semantic_text","inference_id": "minilm-l6"}}}
}

設置 completion 端點

在生成主要組件后,一個關鍵步驟是創建 Elasticsearch 中的推理完成端點(inference completion endpoint)。該端點可以通過生成提示與所選的 Large Language Model (LLM) 進行交互,并提供必要的認證密鑰。

具體來說,你將使用名為 completion 的 completion 任務類型(更多細節請參考 Elasticsearch 文檔)。

PUT _inference/completion/openai_chat_completions
{"service": "openai","service_settings": {"api_key": "<<Your API KEY>>","model_id": "<<Chosen Model>>","url": "<<Your Service URL>>"}
}

創建完成后,你可以通過發送一個簡單問題來測試 LLM 集成,如下面的示例所示。

POST _inference/completion/openai_chat_completions
{"input": "When Elasticsearch was created ?"
}

輸出:

{"completion": [{"result": "**Elasticsearch** was first released in **2010**. It was created by Shay Banon, who began working on the project in 2009, and released the first version (0.4) in February **2010**. Elasticsearch is a distributed, open-source search and analytics engine built on top of Apache Lucene."}]
}

搜索你的數據

當用戶通過界面提交查詢時,它會在現有內容中啟動語義搜索,以識別相關的 PDF 段落。與用戶輸入語義相似的段落隨后會被整合到提示中,由 LLM 生成最終答案。語義查詢使用之前介紹的 semantic_text 字段來簡化處理。

"query": {"semantic": {"field": "body","query": "How long does the ECO program last ?"}}

雖然我們的示例提供了一個簡化的方法,但關于查詢 semantic_text 字段的更多細節可以在這里找到。對于需要增強相關性和精確度的高級應用,可以實現一種混合搜索方法,將經典詞匯搜索(BM25)與語義搜索結合起來。

整合所有內容:基于 Elasticsearch 的家電手冊 RAG 應用

構建故障排查應用的最后一步是將文檔檢索過程與 LLM 無縫集成,以提供智能、具上下文感知的響應。

下圖的系統概覽展示了各個組件的交互,并對所涉及的步驟進行了高層次的回顧。

1)PDF 攝取、嵌入與存儲

  • 該過程從原始 PDF 家電手冊開始,這些手冊包含大量文本、圖像和復雜布局。每個 PDF 手冊被拆分為單獨的頁面,然后將每頁提取的文本攝取到 Elasticsearch 中。使用解析庫提取文本內容和元數據(如型號、制造商和文檔類型),并識別關鍵章節或圖表。
  • 從每頁 PDF 提取的文本被仔細劃分為較小的、語義連貫的 “塊”。這些塊作為 dense_vectors 存儲在 Elasticsearch 索引中,利用 semantic_text 字段類型,并依賴為 text_embedding 任務創建的 inference_endpoint

2)用戶查詢與上下文檢索

當用戶提出故障排查問題(例如,“How long does the ECO Program last?”)時,這作為起點。用戶的查詢使用與攝取的文檔塊相同的嵌入模型轉換為稠密向量嵌入。這確保查詢向量與文檔塊向量處于相同語義空間,從而允許進行有意義的相似性比較。然后使用嵌入的用戶查詢在 Elasticsearch 文檔存儲中執行相似性搜索。這些文檔塊最可能包含回答問題所需的相關信息。

3)提示構建與 LLM 輸入

  • 上下文化:檢索到的文檔塊(原始文本)被動態插入到一個構建好的提示中,該提示將發送給 LLM。提示通常包括:
    • LLM 的指令:關于如何使用提供的信息、期望的輸出格式以及任何約束的明確指南。

    • 用戶的原始查詢:用戶實際提出的問題。

    • 檢索到的上下文:最相關塊的文本內容,通常明確標注為 “Context” 或 “Relevant Documents”。

  • 示例提示結構
You are an expert appliance troubleshooter. Using *only* the following context, answer the user's question. If the information is not in the context, state that you cannot answer based on the provided information.**Context:**
[Retrieved Chunk 1 Text]
[Retrieved Chunk 2 Text]
[Retrieved Chunk 3 Text]
...**User Question:** [User's Original Query]

4)LLM 生成

  • 答案綜合:完整構建的提示,包括用戶查詢和相關檢索到的上下文,然后發送給 LLM。LLM 處理該輸入,并基于提供的信息生成連貫、上下文準確且類人化的響應。它綜合檢索到的文檔塊中的信息,為用戶的問題提供直接答案。

以下是對我們之前問題 How long does the ECO program last?” 的輸出示例:

結論

在本文中,我們演示了如何利用 Elasticsearch 構建 RAG 應用,通過使用 semantic_text 映射等功能。這簡化了數據攝取過程,使你可以輕松開始使用語義搜索,同時提供合理的默認設置。它還讓你專注于搜索,而不必擔心如何索引、生成或查詢嵌入。

此外,我們還展示了如何利用最新的 inference_API,它簡化了在數據上使用機器學習模型的過程。例如,你可以用它執行推理操作(如為語義搜索生成嵌入),并將其與 LLM 集成進行提示回答。

希望這個應用也能幫助你解決技術問題,而不必額外花錢請技術人員上門。

在本文中,我們可能使用了第三方生成式 AI 工具,這些工具由各自的所有者擁有和運營。Elastic 對這些第三方工具沒有控制權,也不對其內容、操作或使用承擔任何責任,也不對你使用這些工具可能產生的任何損失或損害負責。在使用 AI 工具處理個人、敏感或機密信息時,請謹慎操作。你提交的任何數據可能會被用于 AI 訓練或其他用途。無法保證你提供的信息會被安全或保密地保存。使用前,你應熟悉任何生成式 AI 工具的隱私政策和使用條款。

原文:Turbocharge your troubleshooting: Building a RAG application for appliance manuals with Elasticsearch - Elasticsearch Labs

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

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

相關文章

6.Shell腳本修煉手冊---grep命令使用指南

grep 命令&#xff1a;從文本中精準篩選信息的實用指南 文章目錄grep 命令&#xff1a;從文本中精準篩選信息的實用指南一、什么是 grep&#xff1f;為什么要用它&#xff1f;二、grep 基本語法三、常用選項詳解&#xff08;附實例&#xff09;&#xff08;一&#xff09;模式選…

Python day51

浙大疏錦行 Python day51 復習日&#xff0c;DDPM class DenoiseDiffusion():def __init__(self, eps_model: nn.Module, n_steps: int, device: torch.device):super().__init__()self.eps_model eps_modelself.n_steps n_stepsself.device deviceself.beta torch.linsp…

數據結構:生成 (Generating) 一棵 AVL 樹

目錄 搭建“創世”的舞臺 注入序列&#xff0c;觀察演化 注入 10 注入 20 注入 30 注入 40 注入 50 注入 25 再次審視 上一講&#xff0c;我們已經從最根本的邏輯出發&#xff0c;推導出了 AVL 樹失衡時所必需的修復操作——旋轉 (Rotation)。 現在&#xff0c;我們將…

github 上傳代碼步驟

登錄GitHub → 點擊右上角 ?? → New Repository??。填寫倉庫名稱&#xff08;建議與本地項目同名&#xff09;&#xff0c;選擇 ??Public/Private??。??關鍵&#xff1a;不要勾選?? “Initialize with README”&#xff08;避免與本地倉庫沖突&#xff09;。點擊 …

陪診小程序系統開發:開啟智慧就醫新時代

在數字化浪潮的推動下&#xff0c;智慧醫療正逐漸成為現實。陪診小程序系統的開發&#xff0c;作為智慧醫療領域的一次重要創新&#xff0c;正以其獨特的魅力與優勢&#xff0c;引領著就醫新時代的到來。它不僅改變了傳統就醫模式&#xff0c;更以科技的力量&#xff0c;讓醫療…

朝花夕拾(七)--------從混淆矩陣到分類報告全面解析?

目錄 ??機器學習模型評估指南&#xff1a;從混淆矩陣到分類報告全面解析?? ??1. 引言?? ??2. 混淆矩陣&#xff1a;模型評估的基石?? ??2.1 什么是混淆矩陣&#xff1f;?? 2.2二分類問題的混淆矩陣 ??二分類場景下的具體案例? ?分析案例: 1.??案例…

Python讀取和設置PNG圖片的像素值

在Python中&#xff0c;可以使用Pillow庫或OpenCV庫來讀取和寫入PNG圖片的像素值。以下是兩種方法的詳細說明&#xff1a;1. 使用Pillow庫Pillow是Python中常用的圖像處理庫&#xff0c;支持多種圖像格式&#xff0c;包括PNG。讀取像素值from PIL import Imageimg Image.open(…

SkyWalking + Elasticsearch8 容器化部署指南:國內鏡像加速與生產級調優

SkyWalking Elasticsearch8 Docker 部署文檔本文提供在 Ubuntu 服務器上&#xff0c;使用 Docker Compose 部署 SkyWalking&#xff08;OAPUI&#xff09;與 Elasticsearch 8 的完整步驟&#xff0c;數據/日志落地到 /media/disk2 前置條件 Ubuntu&#xff0c;已具備 sudo 權限…

有符號和無符號的區別

有符號&#xff08;Signed&#xff09;和無符號&#xff08;Unsigned&#xff09;是計算機編程中用來描述整數數據類型能否表示負數的兩個概念。它們的主要區別在于能否表示負數以及數值的表示范圍。以下是它們的核心區別&#xff1a;1. 能否表示負數有符號&#xff08;Signed&…

8月21日作業

1、Makefile中頭文件發生過修改的解決&#xff1a; 處插入*.h依賴&#xff0c;對.h文件打的時間戳進行檢查2、頭刪和輸出//五、頭刪 void delete_head(seq_p s) {empty(s);for(int i1;i<s->len;i){s->data[i-1]s->data[i];}s->len--; }//六、輸出 void output(s…

Lucene 8.5.0 的 `.pos` 文件**邏輯結構**

Lucene 8.5.0 的 .pos 文件**邏輯結構**&#xff08;按真實實現重新整理&#xff09; .pos 文件 ├─ Header (CodecHeader) ├─ TermPositions TermCount ← 每個 term 一段&#xff0c;順序由詞典隱式決定 │ ├─ PackedPosDeltaBlock N ← 僅當 **無 payl…

基于Matlab多技術融合的紅外圖像增強方法研究

紅外圖像在低照度、強干擾和復雜環境下具有較強的成像能力&#xff0c;但受傳感器噪聲、成像條件及大氣衰減等因素影響&#xff0c;原始紅外圖像往往存在對比度低、細節模糊及光照不均等問題。本文針對紅外圖像質量退化的特點&#xff0c;提出了一種基于多算法融合的紅外圖像增…

【時時三省】集成測試 簡介

山不在高,有仙則名。水不在深,有龍則靈。 ----CSDN 時時三省 目錄 1,集成測試含義 2,集成測試 驗證方法 3,集成測試 用例設計方法 4,集成測試輸出物 5,集成測試注意點 1,集成測試含義 單元測試在以V模型的流程中,對應的是架構設計階段。在 單元測試 和 架構設計…

leetcode 76 最小覆蓋子串

一、題目描述二、解題思路整體思路&#xff1a;模擬尋找最小覆蓋子集的過程&#xff0c;由于可借助同向雙指針且可以做到指針不回退&#xff0c;所以可以用滑動窗口的思想來解決這個問題。具體思路&#xff1a;(1)數組hash1用于統計t中每一個字符出現的頻次&#xff0c;變量kin…

阿里云ECS服務器的公網IP地址

文章目錄環境背景查詢公網IP地址阿里云控制臺阿里云客戶端工具&#xff08;圖形界面&#xff09;阿里云CLI工具&#xff08;命令行&#xff09;其它方法元數據服務器ipinfo.io參考注&#xff1a;本文介紹了如何獲取阿里云ECS服務器的公網IP地址&#xff0c;可以順便了解一下和阿…

IPSec 與 IKE 核心知識點總結

一、IPSec 安全基礎IPSec 是保障 IP 數據傳輸安全的核心協議&#xff0c;其核心圍繞密鑰管理和安全策略約定展開&#xff0c;具體包括以下關鍵內容&#xff1a;1. 對稱密鑰的作用與要求對稱密鑰是 IPSec 實現加密、驗證的基礎&#xff0c;主要用于三個場景&#xff1a;加密 / 解…

C2ComponentStore

1. C2ComponentStore這是 Codec 2.0 HAL 的抽象接口&#xff08;frameworks/av/media/codec2/core/include/C2ComponentStore.h&#xff09;。代表一個「組件工廠」&#xff0c;負責&#xff1a;枚舉當前可用的 Codec2 組件&#xff08;解碼器、編碼器&#xff09;。創建組件&a…

AI 在醫療領域的應用與挑戰

引言介紹 AI 技術迅猛發展的大背景&#xff0c;引出其在醫療領域的重要應用。闡述研究 AI 醫療應用及挑戰對推動醫療行業進步的重要意義。AI 在醫療領域的應用現狀疾病診斷輔助&#xff1a;描述 AI 影像識別技術在識別 X 光、CT、MRI 影像中疾病特征的應用&#xff0c;如對肺癌…

【GPT入門】第51課 Conda環境遷移教程:將xxzh環境從默認路徑遷移到指定目錄

【GPT入門】第51課 Conda環境遷移教程&#xff1a;將xxzh環境從默認路徑遷移到指定目錄步驟1&#xff1a;創建目標目錄&#xff08;若不存在&#xff09;步驟2&#xff1a;克隆環境到新路徑步驟3&#xff1a;驗證新環境可用性步驟4&#xff1a;刪除舊環境&#xff08;可選&…

應急響應-模擬服務器掛馬后的應急相關操作

工具&#xff1a;攻擊機&#xff1a; kail:192.168.108.131 kail下載地址&#xff1a;https://mirrors.aliyun.com/kali-images/kali-2021.3/kali-linux-2021.3-live-i386.iso靶機&#xff1a;windows 7: 192.168.108.1321、在kali中制作木馬文件&#xff1a;vhost.exe&#xf…