Linux 伺服器

AnythingLLM + Ollama 搭建私有 AI 知識庫:在自有伺服器部署 RAG 文件問答機器人

8 個步驟 9 分鐘閱讀 29 次閱讀 0
本文目錄

通用聊天機器人並不瞭解你的產品、價格、流程和內部文件,而把這些資料貼上到公共 AI 服務中往往又不可接受。藉助檢索增強生成(RAG),助手會先在你自己的文件中檢索,再根據檢索到的內容作答,並附上引用來源。本文在你自己的伺服器上部署 AnythingLLM,並使用由 Ollama 提供的本地模型,內容包括:安裝、接入語言模型和向量嵌入模型、將文件上傳到工作區、配置僅基於文件作答、新增使用者以及通過 HTTPS 釋出。如需規劃更大規模的部署(地區、向量資料庫、資料保護),請參見在獨立伺服器上搭建私有 AI 客服知識庫。

本文建立在使用 Ollama 執行本地大模型教程的基礎上。請先完成該教程,包括其中的防火牆規則:Ollama 的 API 沒有任何身份驗證,11434 埠絕不能暴露在公網上。

步驟 1:準備模型

RAG 需要用到兩個模型:向量嵌入模型(embedding model)負責把文件片段和問題轉換成向量以便檢索,對話模型(chat model)負責生成回答。兩者都在 Ollama 中執行。

ollama pull nomic-embed-text      # embedding model (small and fast on CPU)
ollama pull qwen2.5:7b            # chat model; good with Chinese and English
ollama list

# AnythingLLM runs in a container, so Ollama must accept connections from Docker
# (OLLAMA_HOST=0.0.0.0 plus the firewall rules from the Ollama guide). Check:
curl -s http://172.17.0.1:11434/api/tags | head -c 300; echo

對於小團隊,一台 8 核及以上、16 GB 記憶體的伺服器即可流暢執行這套組合。上傳大量檔案時,文件向量化會佔用一段時間的 CPU;回答問題時使用的是對話模型。

步驟 2:啟動 AnythingLLM

AnythingLLM 執行在 Docker 中(參見我們的 Docker 安裝教程)。

export STORAGE_LOCATION=/opt/anythingllm
mkdir -p $STORAGE_LOCATION && touch "$STORAGE_LOCATION/.env"
chown -R 1000:1000 $STORAGE_LOCATION      # the container runs as user ID 1000

docker run -d --name anythingllm --restart always \
  -p 127.0.0.1:3002:3001 \
  --cap-add SYS_ADMIN \
  --add-host=host.docker.internal:host-gateway \
  -v ${STORAGE_LOCATION}:/app/server/storage \
  -v ${STORAGE_LOCATION}/.env:/app/server/.env \
  -e STORAGE_DIR="/app/server/storage" \
  mintplexlabs/anythingllm

docker logs -f anythingllm      # wait until the server reports it is listening

Web 介面在容器內監聽 3001 埠,並對映到宿主機的 127.0.0.1:3002,因此只能通過步驟 3 中的 HTTPS 反向代理訪問。

步驟 3:通過 HTTPS 釋出

將 kb.example.com 之類的子域名解析到伺服器,申請證書(參見使用 Certbot 或 acme.sh 申請免費 SSL 證書),然後反向代理到容器:

server {
    listen 443 ssl;
    http2 on;
    server_name kb.example.com;

    ssl_certificate     /etc/letsencrypt/live/kb.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/kb.example.com/privkey.pem;
    client_max_body_size 100m;          # document uploads

    location / {
        proxy_pass         http://127.0.0.1:3002;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";
        proxy_set_header   Host $host;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_read_timeout 600s;
    }
}

步驟 4:接入模型

開啟 https://kb.example.com 並完成初始設定,以下各項之後都可以在 Settings(設定)中修改:

  • LLM 提供方:選擇 Ollama,Base URL 填寫 http://host.docker.internal:11434,對話模型選擇 qwen2.5:7b。
  • 向量嵌入提供方:選擇 Ollama 並使用 nomic-embed-text(或使用 AnythingLLM 內建的嵌入器)。
  • 向量資料庫:使用內建的 LanceDB,無需額外配置。

步驟 5:啟用多使用者模式保障安全

上傳任何內容之前,先在安全設定中啟用多使用者模式,並設定管理員密碼。然後為每位同事建立帳號並分配 Default 角色,這樣他們可以在你分配的工作區中對話,但無法修改設定,也看不到其他工作區。

步驟 6:建立工作區並上傳文件

工作區是一個獨立的知識庫,擁有自己的文件和設定,例如“產品目錄”“客服流程”或“人事制度”。

  1. 建立工作區並開啟它的上傳對話方塊。
  2. 上傳 PDF、Word、純文本、Markdown 或 CSV 檔案,或者通過 URL 抓取網頁。
  3. 將上傳的檔案移入工作區,然後點選 Save and Embed(儲存並向量化)。AnythingLLM 會把檔案切分成片段並儲存其向量。

乾淨的文本型文件效果最好。掃描版 PDF 需要先做 OCR;標題清晰的長文件,比一個包羅永珍的超大檔案更容易檢索。

步驟 7:讓回答限定在文件範圍內

在工作區設定中:

  • 將對話模式設為 Query(查詢模式):助手只有在找到相關片段時才會作答,否則會說明沒有相關資訊,而不是憑空猜測。
  • 編寫系統提示詞,例如:“你是 ACME 的內部助手。只根據提供的文件回答,註明出處,並使用提問所用的語言回覆。”
  • 如果回答遺漏了相關事實或摻入了無關內容,可調整每次回答使用的片段數量和相似度閾值。

每條回答都會顯示引用來源,點選即可檢視使用了哪個文件片段。

步驟 8:維護知識庫

文件有更新時,先從工作區中移除舊版本,再上傳新版本,以免引用過時的價格或流程。請定期備份 /opt/anythingllm,其中包含文件、向量、使用者和聊天記錄。AnythingLLM 還提供 API 和可嵌入的聊天小部件,方便你以後在自己的網站或應用中呼叫某個工作區。

常見問題

助手給出了文件中沒有的內容

將工作區切換為 Query 模式,收緊繫統提示詞,並檢查引用來源。如果始終檢索不到正確的片段,請把文件拆分成多個標題清晰的小檔案,或嘗試更大的對話模型。

回答速度慢

大部分時間花在對話模型用 CPU 生成文本上。快速查詢可使用較小的模型,減少每次回答使用的片段數量,並讓模型常駐記憶體(參見 Ollama 教程中的效能最佳化建議)。

可以用雲端 AI API 代替 Ollama 嗎?

可以,AnythingLLM 支援多種模型服務商。但請注意,這樣一來你的文件和問題都會傳送給該服務商,並且只能使用其服務條款所允許的服務商和地區。對於機密資料,本文的本地部署方案可以讓所有資料都留在你的伺服器上。

如果按以上步驟操作後問題仍未解決,請提交工單聯絡 IMIDC 7×24 技術支援,並附上伺服器 IP、系統版本、CPU 和記憶體配置、docker logs anythingllm 的輸出以及完整報錯資訊,方便工程師快速定位。

這篇文章有幫助嗎?

相關教程