在今天的文章中,我將參考文章 “使用 Elastic 和 LM Studio 的 Herding Llama 3.1” 來部署 Qwen3 大模型。據測評,這是一個非常不錯的大模型。我們今天嘗試使用 LM Studio 來對它進行部署,并詳細描述如何結合?Elasticsearch 來對它進行使用。
關于 LM Studio
LM Studio 是本地大型語言模型 (LLM) 的瀏覽器/IDE,專注于使本地 AI 變得有價值且易于訪問,同時為開發人員提供構建平臺。
用戶考慮本地 LLMs 的原因有很多,但其中最主要的是能夠在不放棄對你或你公司的數據主權的情況下利用 AI。其他原因包括:
- 增強數據隱私和安全性
- 減少威脅檢測的延遲
- 獲得運營優勢
- 在現代威脅環境中保護你的組織
LM Studio 提供統一的界面,用于本地發現、下載和運行領先的開源模型,如 Llama 3.1、Phi-3 和 Gemini。使用 LM Studio 本地托管的模型允許 SecOps 團隊使用 Elastic AI Assistant 來幫助提供警報分類、事件響應等方面的情境感知指導。所有這些都不需要組織連接到第三方模型托管服務。
在本地電腦中部署阿里 Qwen3 大模型及連接到 Elasticsearch
安裝 Elasticsearch 及 Kibana
如果你還沒有安裝好自己的 Elasticsearch 及 Kibana,那么我們可以參考如下的文章來進行安裝:
-
如何在 Linux,MacOS 及 Windows 上進行安裝 Elasticsearch
-
Kibana:如何在 Linux,MacOS 及 Windows 上安裝 Elastic 棧中的 Kibana
特別值得注意的是,我們選擇 “Elastic Stack 8.x/9.x 安裝” 安裝指南。在本次的練習中,我們將使用最新的 Elastic Stack 9.0.1。
我們記下上面的密碼,并在下面的代碼中進行使用。
另外,為了能夠使得我們避免警告,我們在 Kibana 中針對?xpack.encryptedSavedObjects.encryptionKey 進行設置。這個也是我們需要使用 Playground 所必須的。詳細布置也可以參考文章 “Elasticsearch:使用 Playground 與你的 PDF 聊天”。 我們在 terminal 中打入如下的命令:
bin/kibana-encryption-keys generate
$ pwd
/Users/liuxg/elastic/kibana-9.0.1
$ bin/kibana-encryption-keys generate
## Kibana Encryption Key Generation UtilityThe 'generate' command guides you through the process of setting encryption keys for:xpack.encryptedSavedObjects.encryptionKeyUsed to encrypt stored objects such as dashboards and visualizationshttps://www.elastic.co/guide/en/kibana/current/xpack-security-secure-saved-objects.html#xpack-security-secure-saved-objectsxpack.reporting.encryptionKeyUsed to encrypt saved reportshttps://www.elastic.co/guide/en/kibana/current/reporting-settings-kb.html#general-reporting-settingsxpack.security.encryptionKeyUsed to encrypt session informationhttps://www.elastic.co/guide/en/kibana/current/security-settings-kb.html#security-session-and-cookie-settingsAlready defined settings are ignored and can be regenerated using the --force flag. Check the documentation links for instructions on how to rotate encryption keys.
Definitions should be set in the kibana.yml used configure Kibana.Settings:
xpack.encryptedSavedObjects.encryptionKey: 6f1fdc6da9e4cdb8558fc8b4d3fe1048
xpack.reporting.encryptionKey: a22c866f356cda8097ad1b9befc56a25
xpack.security.encryptionKey: f4d6361ebd74b385c6ed722244985321
我們必須把正在運行的 Kibana 停止再運行上面的命令。我們把上面最后面顯示的設置拷貝到 config/kibana.yml 文件的最后面,并保存。然后重新啟動 Kibana。
啟動白金試用功能
為了能夠創建 OpenAI 連接器,我們需要打開白金版試用功能:
這樣我們的白金版試用功能就設置好了。有了這個我們在下面就可以創建 OpenAI 的連接器了。
安裝 ES 向量模型
在我們的搜索中,我們需要使用一個嵌入向量模型來針對數據進行向量化。在本次練習中,我們使用 ES。這也是 Elasticsearch 自帶的模型。我們需要對它進行配置:
從上面的顯示中,我們已經成功地把 .multilingual-e5-small?模型部署到我們的 Elasticsearch 中了。
我們可以在 Kibana 中進行查看:
GET _inference
我們可以看到一個叫做?.multilingual-e5-small-elasticsearch 的 inference id 已經生成。
如何設置 LM Studio
下載并安裝最新版本的 LM Studio。
在下載完畢后,經過 checksum 驗證,我們最終可以看到上面的畫面。
在 Discover 界面搜索 “Qwen”,并下載安裝。如上所示,Qwen3 共有 18.45?GB,所以在下載之前,確保你有足夠的電腦硬盤容量來對它進行安裝。我們點擊 “Use in New Chat”:
在上面,我們提出問題 “中國最長的河流是哪個?”。它最終給出了答案:
我們接下來驗證一下它的英文能力:
What is the longest river in China?
很有意思的是它給出的結果是以中文的形式。這個是和 DeepSeek 及 ChatGPT 有不同的地方。通常在 DeepSeek 中,如果我們的提問是以英文形式的,那么你得到的答案就是英文格式的。
注意:由于模型是在本地電腦部署的。這個依賴于你自己的電腦算力。有時給出的結果有點慢,但是需要大家的耐心等待!
我們接下來進入 “My Models" 來進行驗證:
我們可以看到 qwen 已經被成功地安裝了。
我們接下來打開 Developer 窗口,我們可以看到 qwen 的接口 API:
我們將在下面的練習中進行使用。同時我們注意到它的接口是以 Open AI 的格式來進行提供的。我們對本地服務器做如下的配置:
打開上面的兩個配置:
我們還需要同時打開這個本地服務器:
一旦打開,我們可以看到日志,并看到服務器的狀態已經發生改變。
我們可以通過如下的方式來獲得本地電腦的 IP 地址:
ifconfig | grep inet | grep 192
$ ifconfig | grep inet | grep 192inet 192.168.101.158 netmask 0xffffff00 broadcast 192.168.101.255
注:如果你的 qwen3 不是和你自己的 Elasticsearch 處于同一個機器上,那么你需要使用到上面的私有地址(在同一局域網里)
我們可以通過如下的命令來驗證我們的服務器接口:
拷貝上面的 cURL 命令:
curl http://localhost:1234/v1/chat/completions \-H "Content-Type: application/json" \-d '{"model": "qwen/qwen3-32b","messages": [{ "role": "system", "content": "Always answer in rhymes. Today is Thursday" },{ "role": "user", "content": "What day is it today?" }],"temperature": 0.7,"max_tokens": -1,"stream": false
}'
我們可以直接在電腦的 terminal 中打入上面的命令:
我們得到了一個相關的結果。我們接下來稍微修改一下我們的問題:
curl http://localhost:1234/v1/chat/completions \-H "Content-Type: application/json" \-d '{"model": "qwen/qwen3-32b","messages": [{ "role": "system", "content": "You are a helpful AI Assistant that uses the following context to answer questions only use the following context. \n\nContext: 小明今天早上和媽媽一起去上學"},{ "role": "user", "content": "小明今天和誰一起去上學的?" }],"temperature": 0.7,"max_tokens": -1,"stream": false
}'
很顯然,它具備一定的推理能力。我們得到了我們想要的答案。
在 Kibana 中創建連接到 Qwen 的連接器
我們按照如下的步驟來進行:
使用以下設置配置連接器:
- Connector name:qwen3
- 選擇 OpenAI ?provider:other (OpenAI Compatible Service)
- URL:http://localhost:1234/v1/chat/completions
- 調整到你的 qwen3 的正確路徑。如果你從容器內調用,請記住替換 host.docker.internal 或等效項
- 默認模型:qwen/qwen3-32b
- API 密鑰:編造一個,需要輸入,但值無關緊要
點擊 Save 按鈕:
就這樣,我們成功地創建了一個叫做 qwen3 的 OpenAI 連接器。
將嵌入向量的數據導入 Elasticsearch
如果你已經熟悉 Playground 并設置了數據,則可以跳至下面的 Playground 步驟,但如果你需要一些快速測試數據,我們需要確保設置了 _inference API。從 8.17 開始,機器學習分配是動態的,因此要下載并打開 e5 多語言密集向量,我們只需在 Kibana Dev 工具中運行以下命令即可。
GET /_inferencePOST /_inference/text_embedding/.multilingual-e5-small-elasticsearch
{"input": "are internet memes about deepseek sound investment advice?"
}
如果你還沒有這樣做,這將觸發從 Elastic 的模型存儲庫下載 e5 模型。在上面的安裝部分,我們已經成功地部署了 es 模型,所以執行下面的命令時,不會觸發下載模型。我們從右邊的輸出中可以看到文字被轉換后的向量表示。
接下來,讓我們加載一本公共領域的書作為我們的 RAG 上下文。這是從 Project Gutenberg 下載 “愛麗絲夢游仙境” 的地方:鏈接。將其保存為 .txt 文件。
$ pwd
/Users/liuxg/data/alice
$ wget https://www.gutenberg.org/cache/epub/11/pg11.txt
--2025-02-10 16:59:19-- https://www.gutenberg.org/cache/epub/11/pg11.txt
Resolving www.gutenberg.org (www.gutenberg.org)... 152.19.134.47
Connecting to www.gutenberg.org (www.gutenberg.org)|152.19.134.47|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 174357 (170K) [text/plain]
Saving to: ‘pg11.txt’pg11.txt 100%[=====================================>] 170.27K 304KB/s in 0.6s 2025-02-10 16:59:21 (304 KB/s) - ‘pg11.txt’ saved [174357/174357]
等下載完文件后,我們可以使用如下的方法來上傳文件到 Elasticsearch 中:
?
我們或者使用如下的方法:
?
?
?
選擇剛剛下好的文件:
?
?
?
?
?
?
?
當加載和推理完成后,我們就可以前往 Playground 了。
在 Playground 中測試 RAG
在 Kibana 中導航到 Elasticsearch > Playground。可以在此處找到 Playground 的詳細指南。
?
在我們的 Playground 設置中,我們輸入了以下系統提示 “You are an assistant for question-answering tasks using relevant text passages from the book Alice in wonderland - 你是使用《愛麗絲夢游仙境》一書中的相關文本段落進行問答任務的助手”,并接受其他默認設置。
對于 “Who was at the tea party? - 誰參加了茶話會?”這個問題
?
我們嘗試使用中文來提問:
誰參加了茶話會?
從上面的輸出中我們看到了我們希望的答案。我們可以詳細查看原文,在如下的位置可以看到我們想要的答案:
?
非常好! Qwen3 能夠針對我們的英文和中文進行回答問題。 給出了我們想要的中文答案。
如果大家對如何使用代碼來實現上述查詢,你可以點擊 Playground 的右上角的 View code 來得到一個初始的代碼。然后我們可以做響應的修改。在這里我就不贅述了。對于感興趣的開發者,可以參考我的另外一篇文章 “Elasticsearch:在 Elastic 中玩轉 DeepSeek R1 來實現 RAG 應用” 來查看實現的方法。
祝大家學習 Qwen3 愉快!