你好。
我是トライベック株式会社的岡山。
因為想在本機驗證 LLM + RAG,最近買了 Mac mini(M4 Pro / 48GB 記憶體)。
雖然只有外殼是「mini」,價格可一點都不 mini。
一開始會有這個念頭,主要是因為我對雲端 AI 服務有以下幾點疑慮:
能解決這些問題的選項,就是「本機 LLM + 本機 RAG」。因為全部都在自己電腦上完成,資訊不會外流,而且怎麼嘗試都免費。
本文將整理在 Apple Silicon 的 Mac 上,使用 Ollama 與 LlamaIndex 建立完全本機的 RAG 環境的步驟。
本文是以「先跑起來」為目的的入門文章。精度調校與持久化會預計在下一篇之後再介紹。
談到本機 LLM 時,GPU 的 VRAM 容量常常是焦點,但 Apple Silicon 有一個強項叫做統一記憶體。CPU 和 GPU 共用記憶體,因此可直接把大部分的實體記憶體拿來載入模型。
一般電腦常見的配置是「記憶體有 32GB,但 GPU VRAM 只有 8GB」,這種情況下,8GB 幾乎就會成為模型大小上限。相對地,在 M4 Pro / 48GB 的情況下,GPU 可使用的記憶體預設大約是 65~75%(約 32~36GB)。
以實測來看,在這個配置下可順暢運作的大致範圍如下:
也就是說,可以在同一台機器上運行 14B~32B 的高品質模型,同時還能放入 RAG 所需的嵌入模型,這就是這台機器可達到的目標。
這次要建置的環境全貌如下。
職責使用工具補充推論引擎Ollama負責模型管理與執行生成模型(LLM)qwen3:14b產生回答文字嵌入模型bge-m3將文件向量化,對日文也很強RAG 框架LlamaIndex串接搜尋與生成
在 RAG 中,需要兩種模型:「用來搜尋文件的嵌入模型」以及「用來產生答案的生成模型」。這是最容易先混淆的地方。
使用 Homebrew 安裝。
brew install ollama
安裝完成後,啟動伺服器。
ollama serve
如果你已經安裝 GUI 版的 Ollama,只要它常駐在選單列,伺服器就已經在運作了。這種情況下再執行 ollama serve 會出現 address already in use 錯誤。
可以用以下指令確認是否正常啟動:
ollama list
取得生成模型與嵌入模型。
# 生成模型(整體平衡型)
ollama pull qwen3:14b
# 也順便下載較大的模型作比較
ollama pull gemma3:27b
# 嵌入模型(支援包含日文在內的多語言)
ollama pull bge-m3
bge-m3 是專用於嵌入的模型,不能拿來聊天。它會在 RAG 背後負責檢索工作。
在組 RAG 之前,先確認模型本身能不能正常運作。
ollama run qwen3:14b
看到提示字元後,試著用日文對話。
>>> 自己紹介して
如果有回覆就代表成功。結束時輸入 /bye。
若想用數值確認生成速度,可以加上 --verbose。
ollama run gemma3:27b --verbose
回答後會顯示 eval rate(tokens/s)。以體感來看,15 tokens/s 以上通常可舒服地日常使用,低於 10 就會開始有明顯的等待感。
將 14B 與 27B 用同一個問題比較,會有助於決定日常要使用哪個模型。我自己的環境最後是分成兩種用途:日常用 14B,需要它慢慢思考時再用 27B。
接下來進入 RAG 的建置。先建立專案資料夾與虛擬環境。
mkdir ~/local-rag && cd ~/local-rag
python3 -m venv venv
source venv/bin/activate
安裝必要套件。
pip install llama-index \
llama-index-llms-ollama \
llama-index-embeddings-ollama \
llama-index-vector-stores-chroma \
chromadb
如果要讀取 PDF,另外還需要安裝以下套件:
pip install pypdf
把要讀取的文件放到 data 目錄。
mkdir data
# 將 PDF 或文字檔放到 ./data
建議一開始先從 1~2 個檔案開始。若檔案太多,初次做嵌入處理會花比較久時間,不利於確認是否能正常運作。
將以下內容儲存為 rag.py。
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding
# 指定要使用的模型
Settings.llm = Ollama(model="qwen3:14b", request_timeout=180)
Settings.embed_model = OllamaEmbedding(model_name="bge-m3")
# 讀取 ./data 的文件 → 嵌入 → 建立索引
docs = SimpleDirectoryReader("./data").load_data()
index = VectorStoreIndex.from_documents(docs)
# 提問
qe = index.as_query_engine(similarity_top_k=4)
resp = qe.query("請告訴我這份資料的三個重點")
print(resp)
執行:
python rag.py
如果能根據放入的資料內容回傳回答,就代表本機 RAG 已經完成了。
雖然只有十幾行,卻包含了 RAG 的主要要素。

Settings.llm 與 Settings.embed_model
將生成模型與嵌入模型分開指定。兩者都會參照本機的 Ollama,因此不會產生對外網路通訊。
SimpleDirectoryReader
自動讀取目錄內的檔案。會依副檔名選擇適當的解析器,例如 PDF、文字檔、Markdown 等。
VectorStoreIndex.from_documents
將文件切成適當長度的片段(chunk 化),再透過嵌入模型向量化並建立索引。第一次執行時這裡最花時間。
similarity_top_k=4
表示針對問題,取出相關度最高的前 4 個 chunk 並交給 LLM。調整這個數字會改變回答傾向,因此它是精度調校的第一個重點。
常見錯誤與處理方式:
Connection refused 錯誤:Ollama 沒有啟動。請用 ollama list 確認是否有回傳模型列表。如果你同時有使用 LM Studio,請確認是 Ollama 那邊有啟動。address already in use 錯誤:Ollama 已經在執行了。通常發生在 GUI 版已常駐時,這時不需要再執行 ollama serve。bge-m3 正在把全文做向量化,並非異常。請先用少量檔案測試。pip install pypdf。優先選擇 MLX 格式
針對 Apple Silicon 最佳化的 MLX 格式模型,即使參數量相同,也通常比 GGUF 更快、更省記憶體。在 Ollama 或 LM Studio 選模型時,如果有標示 -mlx,優先選那個會比較有利。
注意模型同時占用記憶體
在 RAG 中,生成模型與嵌入模型會同時消耗記憶體。如果想常駐使用 32B 級模型,建議嵌入端選較輕量的 bge-m3,會更有餘裕。
先從輕量模型開始
如果一開始就選很大的模型,執行速度會變慢,也很難分辨是「沒跑成功」還是「只是很慢」。先用 14B 跑通整個流程,再往上擴充,反而是更快的方法。
這次是用 Python 建置,但也有不寫程式就能試 RAG 的方法。
這兩者都能在底層搭配 Ollama 使用,因此可以和這次建好的環境並用。如果只是想先體驗「RAG 到底是什麼」,從 GUI 入門也是很不錯的選擇。
我在 Mac mini(M4 Pro / 48GB)上,建立了完全本機的 LLM + RAG 環境。
回頭整理後,重點可以濃縮成以下三點:
資訊不會外流,而且怎麼試都免費,這種環境大幅降低了反覆實驗的門檻。當我把 RAG 的概念整理成文章時,理解還停留在概念層面;但實際動手後,像「chunk 分割」、「檢索數量」這些參數的意義就能更有感地掌握。
不過,目前這個腳本還是有課題。因為每次執行都會重新做嵌入處理,當文件變多時,等待時間就會變得不能忽視。
原文出處:https://qiita.com/y-okayama-tb/items/0127a7c5203f44507474