文章目录
-
- 引言
- 1 整体架构设计与方案对比
-
- 1.1 整体分层架构
- 1.2 核心请求流程
- 1.3 不同方案横向对比
- 2 环境准备
-
- 2.1 硬件要求
- 2.2 软件依赖
- 3 详细部署步骤
-
- 3.1 安装配置Ollama
- 3.2 部署OpenWebUI
- 3.3 配置手机访问
-
- 3.3.1 同局域网访问(在家使用)
- 3.3.2 外网访问(在外随时使用)
- 4 生产级优化与安全审计
-
- 4.1 性能优化
- 4.2 安全加固(生产级必须配置)
- 5 常见问题排查
- 6 技术前瞻性分析
- 附录:完整技术图谱
引言
随着大模型应用的普及,用户对隐私保护的需求越来越高,使用第三方云AI聊天服务不可避免会上传对话内容,存在敏感信息泄露的风险。本地部署私人AI聊天系统既可以享受大模型的便利,又能保证所有数据都留在本地,同时支持手机随时随地访问,完全不需要依赖外部服务。
本文选择当前最轻量化的Ollama作为模型管理工具,搭配功能完整的OpenWebUI作为前端界面,从架构设计到落地部署全流程讲解,小白也可以按照步骤一步一步完成可使用的私人AI聊天系统。
1 整体架构设计与方案对比
1.1 整体分层架构
本方案采用四层分层架构,各模块解耦,方便后续扩展和维护:
1.2 核心请求流程
#mermaid-svg-eNcLPiMtqzo5Adxf{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-eNcLPiMtqzo5Adxf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-eNcLPiMtqzo5Adxf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-eNcLPiMtqzo5Adxf .error-icon{fill:#552222;}#mermaid-svg-eNcLPiMtqzo5Adxf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-eNcLPiMtqzo5Adxf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-eNcLPiMtqzo5Adxf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-eNcLPiMtqzo5Adxf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-eNcLPiMtqzo5Adxf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-eNcLPiMtqzo5Adxf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-eNcLPiMtqzo5Adxf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-eNcLPiMtqzo5Adxf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-eNcLPiMtqzo5Adxf .marker.cross{stroke:#333333;}#mermaid-svg-eNcLPiMtqzo5Adxf svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-eNcLPiMtqzo5Adxf p{margin:0;}#mermaid-svg-eNcLPiMtqzo5Adxf .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-eNcLPiMtqzo5Adxf .cluster-label text{fill:#333;}#mermaid-svg-eNcLPiMtqzo5Adxf .cluster-label span{color:#333;}#mermaid-svg-eNcLPiMtqzo5Adxf .cluster-label span p{background-color:transparent;}#mermaid-svg-eNcLPiMtqzo5Adxf .label text,#mermaid-svg-eNcLPiMtqzo5Adxf span{fill:#333;color:#333;}#mermaid-svg-eNcLPiMtqzo5Adxf .node rect,#mermaid-svg-eNcLPiMtqzo5Adxf .node circle,#mermaid-svg-eNcLPiMtqzo5Adxf .node ellipse,#mermaid-svg-eNcLPiMtqzo5Adxf .node polygon,#mermaid-svg-eNcLPiMtqzo5Adxf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-eNcLPiMtqzo5Adxf .rough-node .label text,#mermaid-svg-eNcLPiMtqzo5Adxf .node .label text,#mermaid-svg-eNcLPiMtqzo5Adxf .image-shape .label,#mermaid-svg-eNcLPiMtqzo5Adxf .icon-shape .label{text-anchor:middle;}#mermaid-svg-eNcLPiMtqzo5Adxf .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-eNcLPiMtqzo5Adxf .rough-node .label,#mermaid-svg-eNcLPiMtqzo5Adxf .node .label,#mermaid-svg-eNcLPiMtqzo5Adxf .image-shape .label,#mermaid-svg-eNcLPiMtqzo5Adxf .icon-shape .label{text-align:center;}#mermaid-svg-eNcLPiMtqzo5Adxf .node.clickable{cursor:pointer;}#mermaid-svg-eNcLPiMtqzo5Adxf .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-eNcLPiMtqzo5Adxf .arrowheadPath{fill:#333333;}#mermaid-svg-eNcLPiMtqzo5Adxf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-eNcLPiMtqzo5Adxf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-eNcLPiMtqzo5Adxf .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eNcLPiMtqzo5Adxf .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-eNcLPiMtqzo5Adxf .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eNcLPiMtqzo5Adxf .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-eNcLPiMtqzo5Adxf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-eNcLPiMtqzo5Adxf .cluster text{fill:#333;}#mermaid-svg-eNcLPiMtqzo5Adxf .cluster span{color:#333;}#mermaid-svg-eNcLPiMtqzo5Adxf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-eNcLPiMtqzo5Adxf .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-eNcLPiMtqzo5Adxf rect.text{fill:none;stroke-width:0;}#mermaid-svg-eNcLPiMtqzo5Adxf .icon-shape,#mermaid-svg-eNcLPiMtqzo5Adxf .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eNcLPiMtqzo5Adxf .icon-shape p,#mermaid-svg-eNcLPiMtqzo5Adxf .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-eNcLPiMtqzo5Adxf .icon-shape .label rect,#mermaid-svg-eNcLPiMtqzo5Adxf .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eNcLPiMtqzo5Adxf .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-eNcLPiMtqzo5Adxf .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-eNcLPiMtqzo5Adxf :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-eNcLPiMtqzo5Adxf .dark>*{fill:#2d3748!important;stroke:#1a202c!important;stroke-width:2px!important;color:#ffffff!important;}#mermaid-svg-eNcLPiMtqzo5Adxf .dark span{fill:#2d3748!important;stroke:#1a202c!important;stroke-width:2px!important;color:#ffffff!important;}#mermaid-svg-eNcLPiMtqzo5Adxf .dark tspan{fill:#ffffff!important;}#mermaid-svg-eNcLPiMtqzo5Adxf .node>*{fill:#3182ce!important;stroke:#2b6cb0!important;stroke-width:2px!important;color:#ffffff!important;}#mermaid-svg-eNcLPiMtqzo5Adxf .node span{fill:#3182ce!important;stroke:#2b6cb0!important;stroke-width:2px!important;color:#ffffff!important;}#mermaid-svg-eNcLPiMtqzo5Adxf .node tspan{fill:#ffffff!important;}
用户手机/PC发起对话请求
OpenWebUI验证用户身份
封装对话上下文转发给Ollama API
Ollama调度本地大模型完成推理
推理结果返回OpenWebUI
渲染对话界面返回用户端
1.3 不同方案横向对比
#mermaid-svg-S5mjOmO16IuiHsNz{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-S5mjOmO16IuiHsNz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-S5mjOmO16IuiHsNz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-S5mjOmO16IuiHsNz .error-icon{fill:#552222;}#mermaid-svg-S5mjOmO16IuiHsNz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-S5mjOmO16IuiHsNz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-S5mjOmO16IuiHsNz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-S5mjOmO16IuiHsNz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-S5mjOmO16IuiHsNz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-S5mjOmO16IuiHsNz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-S5mjOmO16IuiHsNz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-S5mjOmO16IuiHsNz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-S5mjOmO16IuiHsNz .marker.cross{stroke:#333333;}#mermaid-svg-S5mjOmO16IuiHsNz svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-S5mjOmO16IuiHsNz p{margin:0;}#mermaid-svg-S5mjOmO16IuiHsNz .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-S5mjOmO16IuiHsNz .cluster-label text{fill:#333;}#mermaid-svg-S5mjOmO16IuiHsNz .cluster-label span{color:#333;}#mermaid-svg-S5mjOmO16IuiHsNz .cluster-label span p{background-color:transparent;}#mermaid-svg-S5mjOmO16IuiHsNz .label text,#mermaid-svg-S5mjOmO16IuiHsNz span{fill:#333;color:#333;}#mermaid-svg-S5mjOmO16IuiHsNz .node rect,#mermaid-svg-S5mjOmO16IuiHsNz .node circle,#mermaid-svg-S5mjOmO16IuiHsNz .node ellipse,#mermaid-svg-S5mjOmO16IuiHsNz .node polygon,#mermaid-svg-S5mjOmO16IuiHsNz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-S5mjOmO16IuiHsNz .rough-node .label text,#mermaid-svg-S5mjOmO16IuiHsNz .node .label text,#mermaid-svg-S5mjOmO16IuiHsNz .image-shape .label,#mermaid-svg-S5mjOmO16IuiHsNz .icon-shape .label{text-anchor:middle;}#mermaid-svg-S5mjOmO16IuiHsNz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-S5mjOmO16IuiHsNz .rough-node .label,#mermaid-svg-S5mjOmO16IuiHsNz .node .label,#mermaid-svg-S5mjOmO16IuiHsNz .image-shape .label,#mermaid-svg-S5mjOmO16IuiHsNz .icon-shape .label{text-align:center;}#mermaid-svg-S5mjOmO16IuiHsNz .node.clickable{cursor:pointer;}#mermaid-svg-S5mjOmO16IuiHsNz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-S5mjOmO16IuiHsNz .arrowheadPath{fill:#333333;}#mermaid-svg-S5mjOmO16IuiHsNz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-S5mjOmO16IuiHsNz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-S5mjOmO16IuiHsNz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-S5mjOmO16IuiHsNz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-S5mjOmO16IuiHsNz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-S5mjOmO16IuiHsNz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-S5mjOmO16IuiHsNz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-S5mjOmO16IuiHsNz .cluster text{fill:#333;}#mermaid-svg-S5mjOmO16IuiHsNz .cluster span{color:#333;}#mermaid-svg-S5mjOmO16IuiHsNz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-S5mjOmO16IuiHsNz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-S5mjOmO16IuiHsNz rect.text{fill:none;stroke-width:0;}#mermaid-svg-S5mjOmO16IuiHsNz .icon-shape,#mermaid-svg-S5mjOmO16IuiHsNz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-S5mjOmO16IuiHsNz .icon-shape p,#mermaid-svg-S5mjOmO16IuiHsNz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-S5mjOmO16IuiHsNz .icon-shape .label rect,#mermaid-svg-S5mjOmO16IuiHsNz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-S5mjOmO16IuiHsNz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-S5mjOmO16IuiHsNz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-S5mjOmO16IuiHsNz :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-S5mjOmO16IuiHsNz .dark>*{fill:#2d3748!important;stroke:#1a202c!important;stroke-width:2px!important;color:#fff!important;}#mermaid-svg-S5mjOmO16IuiHsNz .dark span{fill:#2d3748!important;stroke:#1a202c!important;stroke-width:2px!important;color:#fff!important;}#mermaid-svg-S5mjOmO16IuiHsNz .dark tspan{fill:#fff!important;}#mermaid-svg-S5mjOmO16IuiHsNz .good>*{fill:#2f855a!important;stroke:#276749!important;stroke-width:2px!important;color:#fff!important;}#mermaid-svg-S5mjOmO16IuiHsNz .good span{fill:#2f855a!important;stroke:#276749!important;stroke-width:2px!important;color:#fff!important;}#mermaid-svg-S5mjOmO16IuiHsNz .good tspan{fill:#fff!important;}#mermaid-svg-S5mjOmO16IuiHsNz .bad>*{fill:#c53030!important;stroke:#9b2c2c!important;stroke-width:2px!important;color:#fff!important;}#mermaid-svg-S5mjOmO16IuiHsNz .bad span{fill:#c53030!important;stroke:#9b2c2c!important;stroke-width:2px!important;color:#fff!important;}#mermaid-svg-S5mjOmO16IuiHsNz .bad tspan{fill:#fff!important;}
不同本地AI聊天方案横向对比
方案1: Ollama命令行直接使用
优点: 部署流程极简单
缺点: 无可视化界面、手机无法访问、无对话上下文记忆
方案2: 自行编译WebUI对接本地大模型
优点: 自定义程度高
缺点: 环境配置复杂、模型管理繁琐、兼容性问题多
方案3: Ollama + OpenWebUI
优点: 一键部署、自动适配硬件、多端自适应界面、支持多用户、功能完整
缺点: 需要占用本地硬件资源,大模型对配置有一定要求
2 环境准备
2.1 硬件要求
本方案对硬件要求很低,不同配置都可以找到适配的模型,以下是不同配置的推荐方案,量化性能对比如下:
| Qwen2-7B | 4-bit | 6GB 内存 | 25-35 | 日常聊天、手机轻使用 |
| Qwen2-7B | 8-bit | 8GB 内存 | 20-30 | 对精度要求稍高的场景 |
| Qwen2-14B | 4-bit | 10GB 显存 | 12-20 | 复杂推理、专业问答 |
| Llama3-8B | 4-bit | 6GB 内存 | 22-32 | 英文场景、开源通用场景 |
| Llama3-70B | 4-bit | 24GB 显存 | 5-10 | 专业场景、高性能主机 |
最低配置要求:8GB内存的普通笔记本即可运行,不需要独立显卡也可以CPU推理,只是速度稍慢。
2.2 软件依赖
本方案支持Windows/macOS/Linux全平台,只需要提前安装Docker和Docker Compose即可(原生部署不需要Docker,推荐生产环境使用Docker部署)。
3 详细部署步骤
3.1 安装配置Ollama
不同系统安装方式如下:
- Windows/macOS:直接到Ollama官网下载安装包,一键安装即可,安装完成后Ollama会自动作为后台服务运行。
- Linux:执行以下命令一键安装:
curl -fsSL https://ollama.com/install.sh | sh
安装完成后,拉取你需要的大模型,这里以国产通义千问2 7B为例,适合日常聊天:
ollama pull qwen2:7b
验证Ollama服务是否正常运行,执行以下命令,能返回模型列表说明服务正常:
curl http://localhost:11434/api/tags
3.2 部署OpenWebUI
推荐生产环境使用Docker Compose部署,数据持久化方便管理,以下是完整的docker-compose.yml配置文件:
version: '3.8'
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: always
ports:
– "127.0.0.1:11434:11434"
volumes:
– ./ollama:/root/.ollama
devices:
– /dev/kfd:/dev/kfd
– /dev/dri:/dev/dri
environment:
– OLLAMA_NUM_PARALLEL=4
– OLLAMA_MAX_LOADED_MODELS=2
openwebui:
image: ghcr.io/open–webui/open–webui:main
container_name: openwebui
restart: always
ports:
– "0.0.0.0:3000:3000"
volumes:
– ./openwebui/data:/app/backend/data
environment:
– OLLAMA_BASE_URL=http://ollama:11434
– WEBUI_SECRET_KEY=your_secure_random_string_32bit
– WEBUI_AUTH=true
depends_on:
– ollama
将上述内容保存为docker-compose.yml,执行以下命令启动服务:
docker compose up -d
如果不想用Docker,也可以使用Python原生部署,执行以下命令:
# 安装OpenWebUI
pip install open-webui
# 启动服务,开启身份验证
OPENWEBUI_AUTH=true open-webui serve –host 0.0.0.0 –port 3000
3.3 配置手机访问
3.3.1 同局域网访问(在家使用)
3.3.2 外网访问(在外随时使用)
如果需要在外网访问,推荐使用FRP内网穿透,将本地服务映射到公网,以下是FRP客户端配置示例frpc.ini:
[common]
server_addr = 你的公网服务器IP
server_port = 7000
token = 你的自定义加密密钥
[openwebui]
type = tcp
local_ip = 127.0.0.1
local_port = 3000
remote_port = 30000
如果绑定了自定义域名,需要配置HTTPS保证访问安全,以下是Nginx反向代理配置示例:
server {
listen 80;
server_name ai.yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name ai.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/ai.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ai.yourdomain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 100M;
}
}
配置完成后,手机就可以通过域名或者公网IP随时随地访问你的私人AI聊天系统了。
4 生产级优化与安全审计
4.1 性能优化
4.2 安全加固(生产级必须配置)
5 常见问题排查
6 技术前瞻性分析
本地私人AI是未来的重要发展方向,相比云AI,本地AI完全保护用户隐私,没有调用成本,不需要联网即可使用。当前Ollama的生态已经非常成熟,支持几乎所有主流开源大模型,并且持续优化推理性能,未来在更低端的硬件上也能运行更大的模型。OpenWebUI也在快速迭代,已经支持函数调用、本地RAG知识库、多模型切换等功能,本方案可以无缝扩展为本地AI Agent和私人知识库,扩展性非常强。随着移动端NPU性能的提升,未来整个系统都可以运行在手机上,真正实现全端本地化隐私AI。
附录:完整技术图谱
#mermaid-svg-tBFH6ZKfmhT67g5U{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tBFH6ZKfmhT67g5U .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tBFH6ZKfmhT67g5U .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tBFH6ZKfmhT67g5U .error-icon{fill:#552222;}#mermaid-svg-tBFH6ZKfmhT67g5U .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tBFH6ZKfmhT67g5U .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tBFH6ZKfmhT67g5U .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tBFH6ZKfmhT67g5U .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tBFH6ZKfmhT67g5U .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tBFH6ZKfmhT67g5U .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tBFH6ZKfmhT67g5U .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tBFH6ZKfmhT67g5U .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tBFH6ZKfmhT67g5U .marker.cross{stroke:#333333;}#mermaid-svg-tBFH6ZKfmhT67g5U svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tBFH6ZKfmhT67g5U p{margin:0;}#mermaid-svg-tBFH6ZKfmhT67g5U .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-tBFH6ZKfmhT67g5U .cluster-label text{fill:#333;}#mermaid-svg-tBFH6ZKfmhT67g5U .cluster-label span{color:#333;}#mermaid-svg-tBFH6ZKfmhT67g5U .cluster-label span p{background-color:transparent;}#mermaid-svg-tBFH6ZKfmhT67g5U .label text,#mermaid-svg-tBFH6ZKfmhT67g5U span{fill:#333;color:#333;}#mermaid-svg-tBFH6ZKfmhT67g5U .node rect,#mermaid-svg-tBFH6ZKfmhT67g5U .node circle,#mermaid-svg-tBFH6ZKfmhT67g5U .node ellipse,#mermaid-svg-tBFH6ZKfmhT67g5U .node polygon,#mermaid-svg-tBFH6ZKfmhT67g5U .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tBFH6ZKfmhT67g5U .rough-node .label text,#mermaid-svg-tBFH6ZKfmhT67g5U .node .label text,#mermaid-svg-tBFH6ZKfmhT67g5U .image-shape .label,#mermaid-svg-tBFH6ZKfmhT67g5U .icon-shape .label{text-anchor:middle;}#mermaid-svg-tBFH6ZKfmhT67g5U .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tBFH6ZKfmhT67g5U .rough-node .label,#mermaid-svg-tBFH6ZKfmhT67g5U .node .label,#mermaid-svg-tBFH6ZKfmhT67g5U .image-shape .label,#mermaid-svg-tBFH6ZKfmhT67g5U .icon-shape .label{text-align:center;}#mermaid-svg-tBFH6ZKfmhT67g5U .node.clickable{cursor:pointer;}#mermaid-svg-tBFH6ZKfmhT67g5U .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tBFH6ZKfmhT67g5U .arrowheadPath{fill:#333333;}#mermaid-svg-tBFH6ZKfmhT67g5U .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tBFH6ZKfmhT67g5U .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tBFH6ZKfmhT67g5U .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tBFH6ZKfmhT67g5U .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tBFH6ZKfmhT67g5U .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tBFH6ZKfmhT67g5U .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tBFH6ZKfmhT67g5U .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tBFH6ZKfmhT67g5U .cluster text{fill:#333;}#mermaid-svg-tBFH6ZKfmhT67g5U .cluster span{color:#333;}#mermaid-svg-tBFH6ZKfmhT67g5U div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tBFH6ZKfmhT67g5U .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tBFH6ZKfmhT67g5U rect.text{fill:none;stroke-width:0;}#mermaid-svg-tBFH6ZKfmhT67g5U .icon-shape,#mermaid-svg-tBFH6ZKfmhT67g5U .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tBFH6ZKfmhT67g5U .icon-shape p,#mermaid-svg-tBFH6ZKfmhT67g5U .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tBFH6ZKfmhT67g5U .icon-shape .label rect,#mermaid-svg-tBFH6ZKfmhT67g5U .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tBFH6ZKfmhT67g5U .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tBFH6ZKfmhT67g5U .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tBFH6ZKfmhT67g5U :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-tBFH6ZKfmhT67g5U .root>*{fill:#3182ce!important;stroke:#2b6cb0!important;color:#fff!important;}#mermaid-svg-tBFH6ZKfmhT67g5U .root span{fill:#3182ce!important;stroke:#2b6cb0!important;color:#fff!important;}#mermaid-svg-tBFH6ZKfmhT67g5U .root tspan{fill:#fff!important;}#mermaid-svg-tBFH6ZKfmhT67g5U .group>*{fill:#2f855a!important;stroke:#276749!important;color:#fff!important;}#mermaid-svg-tBFH6ZKfmhT67g5U .group span{fill:#2f855a!important;stroke:#276749!important;color:#fff!important;}#mermaid-svg-tBFH6ZKfmhT67g5U .group tspan{fill:#fff!important;}#mermaid-svg-tBFH6ZKfmhT67g5U .item>*{fill:#2d3748!important;stroke:#1a202c!important;color:#fff!important;}#mermaid-svg-tBFH6ZKfmhT67g5U .item span{fill:#2d3748!important;stroke:#1a202c!important;color:#fff!important;}#mermaid-svg-tBFH6ZKfmhT67g5U .item tspan{fill:#fff!important;}
本地私人AI聊天系统
硬件层
模型管理层
服务层
网络访问层
安全层
X86台式机/笔记本
ARM开发板/树莓派
Nvidia/AMD/Intel GPU
Ollama模型调度
开源大模型仓库
GGUF量化模型格式
OpenWebUI前后端
Nginx反向代理
Docker容器编排
局域网直连访问
路由器端口映射
FRP内网穿透
DDNS动态域名解析
用户身份认证
HTTPS传输加密
防火墙访问控制
定期漏洞更新维护




