上一篇 下一篇 分享链接 返回 返回顶部

企业内网 AI 浏览器落地指南:架构、安全与配置文件全套方案

发布人:慈云数据-客服中心 发布时间:7小时前 阅读量:0

AI浏览器 私有化部署方案|附配置文件

面向企业内网、政企客户、金融/医疗/制造等对数据安全要求较高的场景,AI浏览器的私有化部署不仅能够提升员工检索、阅读、总结、问答与办公自动化效率,还能有效避免敏感数据流向公有云模型平台。本文将从架构设计、部署环境、组件选型、安全策略、配置文件、运维建议等方面,完整介绍一套可落地的 AI 浏览器私有化部署方案。


一、为什么需要私有化部署 AI 浏览器?

随着大模型技术在办公场景中的普及,越来越多企业开始将 AI 能力嵌入浏览器中,例如:

  • 网页内容总结
  • 网页问答
  • 文档解析
  • 内部知识库检索
  • 表单自动填写
  • 多页面信息对比
  • 会议纪要生成
  • 企业应用智能助手
  • 内网系统自然语言操作

传统浏览器只负责访问网页,而 AI 浏览器则进一步承担“理解网页内容”和“辅助用户完成任务”的角色。

但是在企业真实环境中,直接使用公有云 AI 浏览器或外部大模型服务,往往会遇到以下问题:

1. 数据安全风险

用户访问的网页、复制的文本、上传的文档、内部系统页面内容,可能包含:

  • 客户信息
  • 合同数据
  • 财务数据
  • 研发文档
  • 源代码
  • 员工信息
  • 经营报表
  • 内部流程数据

如果这些内容被发送到外部模型平台,就可能产生合规和泄密风险。

2. 内网系统无法访问外部服务

很多企业核心系统部署在内网环境,例如 OA、ERP、CRM、MES、BI、知识库、文档系统等。这些系统无法暴露到公网,外部 AI 服务也无法直接访问。

私有化 AI 浏览器可以部署在企业内网,与内部系统、内网知识库、本地模型服务打通。

3. 合规要求

金融、政务、能源、医疗等行业通常要求:

  • 数据不出域
  • 日志可审计
  • 权限可控
  • 模型调用可追踪
  • 账号统一认证
  • 敏感信息可脱敏
  • 支持国产化或信创环境

私有化部署能够更好满足这些合规要求。

4. 成本可控

对于高频使用 AI 能力的企业,如果长期调用公有云模型 API,费用可能不可控。通过本地部署大模型、向量库和推理服务,可以在一定规模后降低边际成本。


二、整体方案目标

本文设计的 AI 浏览器私有化部署方案,主要实现以下目标:

  1. 浏览器端提供 AI 助手能力
    支持网页总结、选中文本问答、页面翻译、知识库检索、内部系统问答等能力。

  2. 服务端完全私有化部署
    AI 网关、模型服务、向量数据库、文档解析服务、权限系统等均部署在企业内网。

  3. 支持本地大模型或私有云模型
    可接入 Ollama、vLLM、Xinference、OpenAI Compatible API、通义千问私有化、百川、智谱、DeepSeek 私有部署等。

  4. 支持知识库增强 RAG
    企业可上传制度文档、产品手册、技术文档、FAQ,浏览器助手可结合知识库回答问题。

  5. 支持统一身份认证
    可对接 LDAP、AD、OIDC、企业微信、钉钉、飞书或内部 SSO。

  6. 支持安全审计
    对用户请求、模型调用、敏感词命中、文件上传、知识库访问进行记录。

  7. 支持 Docker Compose 快速部署
    提供可直接改造使用的配置文件,便于测试和生产落地。


三、系统架构设计

AI 浏览器私有化部署可分为五层:

┌──────────────────────────────────────────────┐
│                用户终端层                      │
│  AI浏览器 / 浏览器插件 / 企业定制浏览器          │
└──────────────────────────────────────────────┘
                    │ HTTPS
                    ▼
┌──────────────────────────────────────────────┐
│                接入网关层                      │
│  Nginx / API Gateway / WAF / TLS / 限流         │
└──────────────────────────────────────────────┘
                    │
                    ▼
┌──────────────────────────────────────────────┐
│                AI服务层                        │
│  AI Gateway / Prompt管理 / 会话管理 / 权限控制   │
└──────────────────────────────────────────────┘
          │                         │
          ▼                         ▼
┌──────────────────────┐   ┌──────────────────────┐
│      模型推理层        │   │      知识库层          │
│ Ollama/vLLM/Xinference│   │ Embedding/向量库/RAG   │
└──────────────────────┘   └──────────────────────┘
          │                         │
          ▼                         ▼
┌──────────────────────────────────────────────┐
│                数据存储层                      │
│ PostgreSQL / Redis / MinIO / Milvus / Qdrant   │
└──────────────────────────────────────────────┘

四、核心组件说明

1. AI 浏览器客户端

客户端可以有三种形态:

形态 说明 适用场景
浏览器插件 基于 Chrome / Edge 插件开发 快速上线、低成本
企业定制浏览器 基于 Chromium 二次开发 强管控、安全浏览
Web 端 AI 工作台 通过网页访问 AI 助手 轻量使用、跨平台

在多数企业中,推荐先采用“浏览器插件 + 私有化 AI 后端”的方式落地,成本低、迭代快、用户迁移成本小。

2. AI Gateway

AI Gateway 是整个方案的核心后端,主要负责:

  • 接收浏览器端请求
  • 校验用户身份
  • 判断用户权限
  • 拼接 Prompt
  • 调用模型服务
  • 调用知识库检索
  • 记录审计日志
  • 对敏感信息进行过滤或脱敏
  • 统一返回结果

它相当于企业 AI 能力的统一出口。

3. 大模型推理服务

根据企业环境,可以选择以下方案:

方案 特点
Ollama 部署简单,适合测试和中小规模使用
vLLM 高性能推理,适合生产环境
Xinference 管理多模型方便,支持多种模型后端
私有云模型 API 由厂商提供专属实例,企业内网访问
国产化推理平台 适合信创、政企场景

如果是试点阶段,推荐使用 Ollama 或 Xinference;如果是高并发生产环境,推荐使用 vLLM。

4. 向量数据库

知识库问答通常需要向量数据库,常见选择包括:

  • Milvus
  • Qdrant
  • Elasticsearch Vector
  • pgvector
  • Weaviate

本文示例采用 Qdrant,因为它部署简单、性能较好、易于维护。

5. 结构化数据存储

推荐使用 PostgreSQL 存储:

  • 用户信息
  • 会话记录
  • Prompt 模板
  • 知识库元数据
  • 文件索引
  • 权限配置
  • 审计日志

6. Redis

Redis 用于:

  • 会话缓存
  • 访问令牌缓存
  • 限流计数
  • 异步任务状态
  • 热点 Prompt 缓存

7. MinIO

MinIO 用于存储用户上传的原始文件,例如:

  • PDF
  • Word
  • Excel
  • PPT
  • Markdown
  • HTML
  • 图片 OCR 结果

五、服务器规划建议

测试环境配置

适用于 20~100 人试点:

组件 配置建议
CPU 16 核
内存 64GB
GPU 可选,1 张 24GB 显存 GPU
磁盘 1TB SSD
系统 Ubuntu 22.04 / Rocky Linux 9
部署方式 Docker Compose

生产环境配置

适用于 500~3000 人企业使用:

组件 配置建议
接入网关 2 台,负载均衡
AI Gateway 2~4 台
模型服务 独立 GPU 服务器
数据库 PostgreSQL 主从或高可用集群
Redis Sentinel 或 Cluster
对象存储 MinIO 分布式
向量库 Qdrant/Milvus 集群
监控 Prometheus + Grafana
日志 Loki / ELK

六、Docker Compose 部署目录结构

建议目录如下:

ai-browser-private/
├── docker-compose.yml
├── .env
├── nginx/
│   └── nginx.conf
├── ai-gateway/
│   └── config.yaml
├── postgres/
│   └── init.sql
├── qdrant/
│   └── config.yaml
├── minio/
│   └── data/
├── logs/
└── data/

七、环境变量配置文件

下面是 .env 示例:

# =========================
# 基础配置
# =========================
DEPLOY_ENV=production
TZ=Asia/Shanghai

# =========================
# 域名配置
# =========================
AI_BROWSER_DOMAIN=ai-browser.example.local
AI_GATEWAY_PORT=8080

# =========================
# PostgreSQL 配置
# =========================
POSTGRES_DB=ai_browser
POSTGRES_USER=ai_browser_user
POSTGRES_PASSWORD=ChangeMe_Postgres_2025
POSTGRES_PORT=5432

# =========================
# Redis 配置
# =========================
REDIS_PASSWORD=ChangeMe_Redis_2025
REDIS_PORT=6379

# =========================
# MinIO 配置
# =========================
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=ChangeMe_Minio_2025
MINIO_API_PORT=9000
MINIO_CONSOLE_PORT=9001

# =========================
# Qdrant 配置
# =========================
QDRANT_PORT=6333
QDRANT_GRPC_PORT=6334

# =========================
# Ollama 配置
# =========================
OLLAMA_PORT=11434
OLLAMA_MODEL=qwen2.5:14b

# =========================
# JWT 配置
# =========================
JWT_SECRET=ChangeMe_JWT_Secret_Key_At_Least_32_Chars
JWT_EXPIRE_SECONDS=7200

# =========================
# 安全配置
# =========================
ENABLE_AUDIT_LOG=true
ENABLE_DATA_MASKING=true
ENABLE_REQUEST_RATE_LIMIT=true
RATE_LIMIT_PER_MINUTE=60

生产环境中务必修改所有 ChangeMe 字段,并使用密钥管理工具保存敏感信息,例如 Vault、KMS 或 Kubernetes Secret。


八、Docker Compose 配置文件

以下是 docker-compose.yml 示例:

version: "3.9"

services:
  nginx:
    image: nginx:1.25
    container_name: ai-browser-nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./logs/nginx:/var/log/nginx
      - ./nginx/certs:/etc/nginx/certs:ro
    depends_on:
      - ai-gateway
    networks:
      - ai-browser-net

  ai-gateway:
    image: registry.example.local/ai-browser/ai-gateway:1.0.0
    container_name: ai-browser-gateway
    restart: always
    env_file:
      - .env
    ports:
      - "${AI_GATEWAY_PORT}:8080"
    volumes:
      - ./ai-gateway/config.yaml:/app/config.yaml:ro
      - ./logs/ai-gateway:/app/logs
    depends_on:
      - postgres
      - redis
      - qdrant
      - minio
      - ollama
    networks:
      - ai-browser-net

  postgres:
    image: postgres:16
    container_name: ai-browser-postgres
    restart: always
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      TZ: ${TZ}
    ports:
      - "${POSTGRES_PORT}:5432"
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
      - ./postgres/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
    networks:
      - ai-browser-net

  redis:
    image: redis:7.2
    container_name: ai-browser-redis
    restart: always
    command:
      [
        "redis-server",
        "--requirepass",
        "${REDIS_PASSWORD}",
        "--appendonly",
        "yes"
      ]
    ports:
      - "${REDIS_PORT}:6379"
    volumes:
      - ./data/redis:/data
    networks:
      - ai-browser-net

  qdrant:
    image: qdrant/qdrant:v1.9.5
    container_name: ai-browser-qdrant
    restart: always
    ports:
      - "${QDRANT_PORT}:6333"
      - "${QDRANT_GRPC_PORT}:6334"
    volumes:
      - ./data/qdrant:/qdrant/storage
      - ./qdrant/config.yaml:/qdrant/config/production.yaml:ro
    networks:
      - ai-browser-net

  minio:
    image: minio/minio:RELEASE.2024-06-13T22-53-53Z
    container_name: ai-browser-minio
    restart: always
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: ${MINIO_ROOT_USER}
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
      TZ: ${TZ}
    ports:
      - "${MINIO_API_PORT}:9000"
      - "${MINIO_CONSOLE_PORT}:9001"
    volumes:
      - ./data/minio:/data
    networks:
      - ai-browser-net

  ollama:
    image: ollama/ollama:latest
    container_name: ai-browser-ollama
    restart: always
    ports:
      - "${OLLAMA_PORT}:11434"
    volumes:
      - ./data/ollama:/root/.ollama
    networks:
      - ai-browser-net
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

networks:
  ai-browser-net:
    driver: bridge

如果服务器没有 GPU,可以删除 ollama 服务中的 deploy.resources 配置,但模型推理速度会明显下降。


九、Nginx 反向代理配置

nginx/nginx.conf 示例:

user nginx;
worker_processes auto;

events {
    worker_connections 4096;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$request_time"';

    access_log /var/log/nginx/access.log main;
    error_log  /var/log/nginx/error.log warn;

    sendfile on;
    keepalive_timeout 65;
    client_max_body_size 100m;

    gzip on;
    gzip_types text/plain application/json application/javascript text/css text/xml;

    upstream ai_gateway {
        server ai-gateway:8080;
    }

    server {
        listen 80;
        server_name ai-browser.example.local;

        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl http2;
        server_name ai-browser.example.local;

        ssl_certificate     /etc/nginx/certs/server.crt;
        ssl_certificate_key /etc/nginx/certs/server.key;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;

        add_header X-Frame-Options SAMEORIGIN always;
        add_header X-Content-Type-Options nosniff always;
        add_header X-XSS-Protection "1; mode=block" always;
        add_header Referrer-Policy no-referrer-when-downgrade always;

        location / {
            proxy_pass http://ai_gateway;
            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 https;

            proxy_connect_timeout 60s;
            proxy_send_timeout 300s;
            proxy_read_timeout 300s;
        }

        location /api/chat/stream {
            proxy_pass http://ai_gateway;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            proxy_buffering off;
            proxy_cache off;
            chunked_transfer_encoding on;

            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

注意:如果浏览器端使用流式输出,Nginx 必须关闭 proxy_buffering,否则用户无法看到模型逐字输出效果。


十、AI Gateway 配置文件

ai-gateway/config.yaml 示例:

server:
  host: "0.0.0.0"
  port: 8080
  base_url: "https://ai-browser.example.local"
  enable_stream: true
  request_timeout_seconds: 300

auth:
  mode: "oidc"
  jwt_secret: "${JWT_SECRET}"
  jwt_expire_seconds: 7200

  oidc:
    issuer: "https://sso.example.local"
    client_id: "ai-browser"
    client_secret: "ChangeMe_OIDC_Client_Secret"
    redirect_uri: "https://ai-browser.example.local/auth/callback"
    scopes:
      - "openid"
      - "profile"
      - "email"

database:
  type: "postgres"
  host: "postgres"
  port: 5432
  name: "${POSTGRES_DB}"
  username: "${POSTGRES_USER}"
  password: "${POSTGRES_PASSWORD}"
  max_open_connections: 50
  max_idle_connections: 10

redis:
  host: "redis"
  port: 6379
  password: "${REDIS_PASSWORD}"
  db: 0

storage:
  type: "minio"
  endpoint: "minio:9000"
  access_key: "${MINIO_ROOT_USER}"
  secret_key: "${MINIO_ROOT_PASSWORD}"
  bucket: "ai-browser-files"
  use_ssl: false

llm:
  provider: "ollama"
  default_model: "qwen2.5:14b"
  temperature: 0.3
  max_tokens: 4096

  ollama:
    base_url: "http://ollama:11434"
    chat_endpoint: "/api/chat"
    generate_endpoint: "/api/generate"

embedding:
  provider: "ollama"
  model: "bge-m3"
  dimension: 1024
  base_url: "http://ollama:11434"

vector_store:
  provider: "qdrant"
  endpoint: "http://qdrant:6333"
  collection: "enterprise_knowledge"
  distance: "Cosine"
  top_k: 5
  score_threshold: 0.35

rag:
  enabled: true
  chunk_size: 800
  chunk_overlap: 120
  rerank_enabled: false
  cite_source: true

security:
  audit_log_enabled: true
  data_masking_enabled: true
  block_external_url: true
  allow_upload_file_types:
    - ".pdf"
    - ".docx"
    - ".xlsx"
    - ".pptx"
    - ".txt"
    - ".md"
    - ".html"

  sensitive_words:
    - "绝密"
    - "机密"
    - "身份证号"
    - "银行卡号"
    - "客户手机号"

rate_limit:
  enabled: true
  per_user_per_minute: 60
  per_ip_per_minute: 120

prompt:
  system_prompt: |
    你是企业内部AI浏览器助手,只能基于用户授权访问的网页内容、用户输入内容和企业知识库回答问题。
    如果问题涉及未知信息,请明确说明无法确认,不得编造。
    如果引用知识库内容,请尽量给出来源。
    对涉及敏感数据的问题,应遵循企业安全策略,必要时拒绝回答。

该配置文件中,auth.mode 可根据企业实际情况调整:

auth:
  mode: "ldap"

或者:

auth:
  mode: "local"

如果是生产环境,建议优先对接企业统一身份认证系统,避免 AI 浏览器形成独立账号体系。


十一、PostgreSQL 初始化 SQL

postgres/init.sql 示例:

CREATE TABLE IF NOT EXISTS users (
    id BIGSERIAL PRIMARY KEY,
    username VARCHAR(128) NOT NULL UNIQUE,
    display_name VARCHAR(128),
    email VARCHAR(255),
    department VARCHAR(128),
    role VARCHAR(64) DEFAULT 'user',
    status VARCHAR(32) DEFAULT 'active',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS chat_sessions (
    id BIGSERIAL PRIMARY KEY,
    user_id BIGINT NOT NULL,
    title VARCHAR(255),
    source_url TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS chat_messages (
    id BIGSERIAL PRIMARY KEY,
    session_id BIGINT NOT NULL,
    role VARCHAR(32) NOT NULL,
    content TEXT NOT NULL,
    model_name VARCHAR(128),
    token_count INTEGER DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS knowledge_files (
    id BIGSERIAL PRIMARY KEY,
    file_name VARCHAR(255) NOT NULL,
    file_type VARCHAR(64),
    file_size BIGINT,
    storage_path TEXT,
    uploader_id BIGINT,
    status VARCHAR(32) DEFAULT 'pending',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS audit_logs (
    id BIGSERIAL PRIMARY KEY,
    user_id BIGINT,
    username VARCHAR(128),
    action VARCHAR(128),
    resource_type VARCHAR(128),
    resource_id VARCHAR(128),
    ip_address VARCHAR(64),
    user_agent TEXT,
    request_summary TEXT,
    risk_level VARCHAR(32) DEFAULT 'low',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_chat_sessions_user_id ON chat_sessions(user_id);
CREATE INDEX IF NOT EXISTS idx_chat_messages_session_id ON chat_messages(session_id);
CREATE INDEX IF NOT EXISTS idx_audit_logs_user_id ON audit_logs(user_id);
CREATE INDEX IF NOT EXISTS idx_audit_logs_created_at ON audit_logs(created_at);

该 SQL 只是基础示例,生产环境还应补充:

  • 组织架构表
  • 角色权限表
  • 知识库权限表
  • Prompt 模板表
  • 模型调用统计表
  • 敏感词策略表
  • 操作审计归档表

十二、Qdrant 配置文件

qdrant/config.yaml 示例:

log_level: INFO

storage:
  storage_path: ./storage
  snapshots_path: ./snapshots
  on_disk_payload: true

service:
  host: 0.0.0.0
  http_port: 6333
  grpc_port: 6334
  enable_cors: false

cluster:
  enabled: false

telemetry_disabled: true

对于单机部署,cluster.enabled 设置为 false 即可。生产环境如需高可用,可部署 Qdrant Cluster 或改用 Milvus 集群。


十三、模型初始化

容器启动后,需要拉取模型。以 Ollama 为例:

docker exec -it ai-browser-ollama ollama pull qwen2.5:14b
docker exec -it ai-browser-ollama ollama pull bge-m3

其中:

  • qwen2.5:14b 用于对话、总结、问答
  • bge-m3 用于文本向量化

如果机器显存有限,可以选择更小模型:

docker exec -it ai-browser-ollama ollama pull qwen2.5:7b

如果企业有更高性能要求,可将 Ollama 替换为 vLLM,例如部署 Qwen、DeepSeek、Llama、Yi 等模型,并通过 OpenAI Compatible API 接入 AI Gateway。


十四、部署启动步骤

1. 创建目录

mkdir -p ai-browser-private/{nginx,ai-gateway,postgres,qdrant,logs,data}
cd ai-browser-private

2. 放置配置文件

将前文提供的:

  • .env
  • docker-compose.yml
  • nginx/nginx.conf
  • ai-gateway/config.yaml
  • postgres/init.sql
  • qdrant/config.yaml

分别放入对应目录。

3. 准备证书

测试环境可以使用自签名证书:

mkdir -p nginx/certs

openssl req -x509 -nodes -days 3650 \
  -newkey rsa:2048 \
  -keyout nginx/certs/server.key \
  -out nginx/certs/server.crt \
  -subj "/CN=ai-browser.example.local"

生产环境建议使用企业内部 CA 签发证书。

4. 启动服务

docker compose up -d

5. 查看服务状态

docker compose ps

6. 查看日志

docker logs -f ai-browser-gateway
docker logs -f ai-browser-ollama

7. 拉取模型

docker exec -it ai-browser-ollama ollama pull qwen2.5:14b
docker exec -it ai-browser-ollama ollama pull bge-m3

8. 验证模型服务

curl http://127.0.0.1:11434/api/tags

9. 验证网关服务

curl https://ai-browser.example.local/health -k

如果返回:

{
  "status": "ok"
}

说明服务已正常启动。


十五、浏览器端接入配置

如果使用浏览器插件,可在插件配置中填写:

{
  "apiBaseUrl": "https://ai-browser.example.local",
  "authMode": "oidc",
  "enablePageSummary": true,
  "enableSelectionAsk": true,
  "enableKnowledgeSearch": true,
  "enableStreaming": true,
  "maxPageContentLength": 120000,
  "uploadEnabled": true
}

浏览器端建议实现以下安全策略:

  1. 默认不自动上传页面全文
  2. 用户点击“总结当前页面”后才上传页面内容
  3. 对密码框、身份证号、银行卡号字段进行前端过滤
  4. 对内网系统页面设置白名单
  5. 对上传内容进行长度限制
  6. 对用户行为提供明确提示
  7. 支持管理员下发统一策略

十六、RAG 知识库处理流程

AI 浏览器的知识库能力一般包括以下流程:

文件上传
  ↓
文件解析
  ↓
文本清洗
  ↓
文本切分
  ↓
生成向量
  ↓
写入向量库
  ↓
用户提问
  ↓
问题向量化
  ↓
向量检索
  ↓
召回相关片段
  ↓
组装Prompt
  ↓
大模型生成答案
  ↓
返回答案与引用来源

为了提升知识库效果,建议:

  • PDF 文档优先使用可复制文本版本
  • 扫描件需要 OCR
  • 文档标题、章节层级要保留
  • 表格数据需要结构化处理
  • 长文档应按语义切分,而不是机械按长度切分
  • 重要制度文件应设置版本号
  • 召回结果应带来源引用
  • 不同部门知识库应设置访问权限

十七、安全与权限设计

私有化部署不是简单地把服务放到内网,更重要的是权限和安全治理。

1. 用户认证

推荐对接企业统一身份认证:

  • LDAP
  • Active Directory
  • OIDC
  • SAML
  • CAS
  • 企业微信
  • 钉钉
  • 飞书

2. 权限控制

至少应包括:

权限对象 示例
用户权限 普通用户、管理员、审计员
知识库权限 部门可见、项目组可见、全员可见
模型权限 不同用户可调用不同模型
功能权限 上传文件、网页总结、批量分析
数据权限 是否允许访问历史会话

3. 数据脱敏

常见脱敏规则:

  • 手机号:138****1234
  • 身份证号:110101********1234
  • 银行卡号:仅保留后四位
  • 邮箱:u***@example.com
  • 客户名称:按规则替换为客户 A、客户 B

4. 审计日志

审计日志应记录:

  • 用户
  • 时间
  • IP
  • 访问来源
  • 调用模型
  • 请求类型
  • 知识库命中
  • 上传文件
  • 风险等级
  • 失败原因

注意:审计日志不一定要完整保存用户输入原文。对于高敏环境,可只保存摘要、哈希或脱敏后的内容。


十八、生产环境优化建议

1. 模型服务独立部署

不要将模型服务与数据库、网关部署在同一台服务器上。模型推理通常占用大量 CPU、内存、GPU 显存,会影响其他组件稳定性。

2. 使用队列处理文档解析

大文件解析、向量化任务建议异步执行,例如:

  • RabbitMQ
  • Kafka
  • Redis Stream
  • Celery
  • Argo Workflow

3. 增加限流与熔断

必须限制:

  • 单用户每分钟请求数
  • 单用户每日 Token 用量
  • 单文件上传大小
  • 单次网页内容长度
  • 单会话最大轮数

4. 增加监控指标

建议监控:

  • API QPS
  • 请求平均耗时
  • 模型推理耗时
  • Token 消耗
  • GPU 利用率
  • 显存占用
  • 向量库查询耗时
  • 数据库连接数
  • Redis 内存使用
  • 失败率

5. 日志集中化

建议使用:

  • Grafana Loki
  • ELK
  • OpenSearch
  • ClickHouse

日志集中化后,管理员可以快速定位问题,也便于安全审计。


十九、常见问题排查

1. 浏览器无法访问服务

检查:

docker compose ps
docker logs ai-browser-nginx

确认:

  • 域名是否解析到服务器
  • 端口 80/443 是否开放
  • Nginx 配置是否正确
  • 证书路径是否正确

2. 模型响应很慢

可能原因:

  • 使用 CPU 推理
  • 模型过大
  • 显存不足
  • 并发过高
  • Prompt 太长
  • RAG 召回内容过多

优化方式:

  • 换用更小模型
  • 使用 GPU
  • 降低上下文长度
  • 开启模型量化
  • 使用 vLLM
  • 做请求排队和限流

3. 知识库问答不准确

可能原因:

  • 文档切分不合理
  • Embedding 模型效果较差
  • top_k 太小或太大
  • 没有 rerank
  • 文档内容过旧
  • 权限过滤后召回内容不足

优化方式:

  • 优化 chunk_size 和 overlap
  • 使用更好的 embedding 模型
  • 增加 rerank
  • 保留标题层级
  • 增加引用来源
  • 定期重建索引

4. 流式输出不生效

检查 Nginx 是否配置:

proxy_buffering off;
proxy_cache off;

同时确认后端接口是否使用 SSE 或 chunked streaming。


二十、总结

AI 浏览器的价值不只是“在浏览器里加一个聊天窗口”,而是将大模型能力与企业网页、内部系统、知识库、文档中心和业务流程结合起来,让员工在浏览、阅读、检索和处理信息的过程中获得实时智能辅助。

对于企业而言,私有化部署 AI 浏览器的核心收益包括:

  • 数据不出内网
  • 权限可控
  • 日志可审计
  • 模型可替换
  • 知识库可沉淀
  • 成本更可控
  • 能与内部系统深度集成

本文提供的 Docker Compose、Nginx、AI Gateway、PostgreSQL、Qdrant 等配置文件,可以作为试点项目的基础模板。实际生产落地时,还需要根据企业规模、安全等级、模型选型、并发压力和合规要求进行进一步增强。

如果是从零开始建设,建议采用“三步走”路线:

  1. 第一阶段:试点验证
    使用 Docker Compose 部署单机版本,接入本地模型,实现网页总结和知识库问答。

  2. 第二阶段:部门推广
    对接统一身份认证,增加权限控制、审计日志和知识库管理。

  3. 第三阶段:生产级建设
    引入高可用架构、GPU 推理集群、监控告警、日志审计和安全治理体系。

当 AI 浏览器真正与企业内部知识和业务流程结合后,它将不再只是一个浏览工具,而会成为企业员工日常工作的智能入口。

目录结构
全文