通用聊天機器人並不瞭解你的產品、價格、流程和內部文件,而把這些資料貼上到公共 AI 服務中往往又不可接受。藉助檢索增強生成(RAG),助手會先在你自己的文件中檢索,再根據檢索到的內容作答,並附上引用來源。本文在你自己的伺服器上部署 AnythingLLM,並使用由 Ollama 提供的本地模型,內容包括:安裝、接入語言模型和向量嵌入模型、將文件上傳到工作區、配置僅基於文件作答、新增使用者以及通過 HTTPS 釋出。如需規劃更大規模的部署(地區、向量資料庫、資料保護),請參見在獨立伺服器上搭建私有 AI 客服知識庫。
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;回答問題時使用的是對話模型。
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 反向代理訪問。
將 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;
}
}
開啟 https://kb.example.com 並完成初始設定,以下各項之後都可以在 Settings(設定)中修改:
http://host.docker.internal:11434,對話模型選擇 qwen2.5:7b。nomic-embed-text(或使用 AnythingLLM 內建的嵌入器)。上傳任何內容之前,先在安全設定中啟用多使用者模式,並設定管理員密碼。然後為每位同事建立帳號並分配 Default 角色,這樣他們可以在你分配的工作區中對話,但無法修改設定,也看不到其他工作區。
工作區是一個獨立的知識庫,擁有自己的文件和設定,例如“產品目錄”“客服流程”或“人事制度”。
乾淨的文本型文件效果最好。掃描版 PDF 需要先做 OCR;標題清晰的長文件,比一個包羅永珍的超大檔案更容易檢索。
在工作區設定中:
每條回答都會顯示引用來源,點選即可檢視使用了哪個文件片段。
文件有更新時,先從工作區中移除舊版本,再上傳新版本,以免引用過時的價格或流程。請定期備份 /opt/anythingllm,其中包含文件、向量、使用者和聊天記錄。AnythingLLM 還提供 API 和可嵌入的聊天小部件,方便你以後在自己的網站或應用中呼叫某個工作區。
將工作區切換為 Query 模式,收緊繫統提示詞,並檢查引用來源。如果始終檢索不到正確的片段,請把文件拆分成多個標題清晰的小檔案,或嘗試更大的對話模型。
大部分時間花在對話模型用 CPU 生成文本上。快速查詢可使用較小的模型,減少每次回答使用的片段數量,並讓模型常駐記憶體(參見 Ollama 教程中的效能最佳化建議)。
可以,AnythingLLM 支援多種模型服務商。但請注意,這樣一來你的文件和問題都會傳送給該服務商,並且只能使用其服務條款所允許的服務商和地區。對於機密資料,本文的本地部署方案可以讓所有資料都留在你的伺服器上。
如果按以上步驟操作後問題仍未解決,請提交工單聯絡 IMIDC 7×24 技術支援,並附上伺服器 IP、系統版本、CPU 和記憶體配置、docker logs anythingllm 的輸出以及完整報錯資訊,方便工程師快速定位。