在 Oracle Cloud (OCI) Always Free Tier 上部署这套基于 Elasticsearch 8 的高精度 RAG 系统,是目前性价比最高的方案。Oracle 提供的 ARM 架构(Ampere A1)拥有 4 核 CPU 和 24GB 内存,完全足以支撑 ES8 的本地运行、ELSER 稀疏模型的 CPU 推理以及自定义 API 后端。
以下是从零开始部署这套系统的保姆级实操步骤:
### 第一阶段:云服务器创建与网络配置
**1. 创建 A1 计算实例**
– 登录 Oracle Cloud 控制台,进入“计算” -> “实例” -> “创建实例”。
– **映像和配置**:
– 映像选择 **Ubuntu 22.04 / 24.04 (aarch64)**。
– 配置(Shape)选择 **Ampere A1 Compute (VM.Standard.A1.Flex)**。
– 将 OCPU 数量拉到 **4**,内存拉到 **24GB**(这都在 Always Free 额度内)。
– **网络与存储**:
– 选择默认的 VCN(虚拟云网络)。
– 分配公有 IPv4 地址。
– 引导卷(Boot Volume)大小设置为 **100 GB**(免费最高 200GB,留点余量或直接拉满)。
– **SSH 密钥**:下载或上传你的公钥,然后点击创建。
**2. 配置云端防火墙 (VCN 入站规则)**
– 进入实例详情,点击子网链接,进入“安全列表 (Security Lists)”。
– 添加入站规则(Ingress Rules),开放所需端口:
– `80` (HTTP), `443` (HTTPS)用于前端与 API 通信。
– `9200` (如果需要远程管理 ES,建议限制来源 IP)。
– `8000` (FastAPI 后端测试端口)。
### 第二阶段:服务器系统初始化
使用 SSH 连接到服务器后,必须处理 Oracle 默认的严格本地防火墙,并安装基础运行环境。
**1. 放行本地防火墙 (巨坑警告)**
Oracle 的 Ubuntu 默认配置了极严的 `iptables`,云控制台开放端口后,本地也要放行:
“`bash
# 开放所有常用端口,或直接清除复杂规则换用 UFW
sudo iptables -I INPUT 6 -m state –state NEW -p tcp –dport 80 -j ACCEPT
sudo iptables -I INPUT 6 -m state –state NEW -p tcp –dport 443 -j ACCEPT
sudo netfilter-persistent save
“`
**2. 安装 Docker 与 Docker Compose**
RAG 系统的各组件通过容器化部署最稳定,且完全兼容 ARM 架构:
“`bash
# 安装 Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker ubuntu
# 安装 Docker Compose
sudo apt-get install docker-compose-plugin -y
“`
**3. 配置系统级参数 (Elasticsearch 必备)**
ES 运行需要调整虚拟内存映射限制:
“`bash
echo “vm.max_map_count=262144” | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
“`
### 第三阶段:部署 Elasticsearch 8 与中文支持
**1. 准备目录与自定义字典**
“`bash
mkdir -p ~/rag_project/elasticsearch/{
# 将您的《生命读经》专属神学字典上传到 custom 目录
# 例如:spiritual_dict.dic (包含三一神, 生机拯救, 终极完成等)
“`
**2. 编写 `docker-compose.yml`**
在 `~/rag_project` 目录下创建文件:
“`yaml
version: ‘3.8’
services:
elasticsearch:
image: docker.elastic.co/
container_name: es8_rag
environment:
– node.name=es-node-1
– cluster.name=rag-cluster
– discovery.type=single-node
– bootstrap.memory_lock=true
– “ES_JAVA_OPTS=-Xms8g -Xmx8g” # 分配8G内存给ES,剩下留给后端和系统
– xpack.security.enabled=false # 内网环境为简化开发可先关闭,生产建议开启
ulimits:
memlock:
soft: -1
hard: -1
volumes:
– ./elasticsearch//usr/share/
– ./elasticsearch/plugins:/usr/
ports:
– “9200:9200”
networks:
– rag_net
networks:
rag_net:
driver: bridge
“`
**3. 安装 IK 分词器并启动**
先启动一次以生成必要文件,进入容器安装插件后重启:
“`bash
docker compose up -d
# 进入容器安装与版本匹配的 IK 分词器
docker exec -it es8_rag /usr/share/elasticsearch/bin/
docker compose restart
“`
*提示:在此阶段,利用 Kibana(可临时在本地部署连接)或 API 接口,在 ES 内部下载并启动 ELSER V2 模型,准备用于稀疏向量检索。*
### 第四阶段:构建 RAG 后端 API (FastAPI)
在同一台服务器上,部署基于 Python 的后端服务,负责桥接大模型与数据库。
**1. 核心代码架构 (`main.py`)**
建议使用 FastAPI,它在 ARM 架构上运行极快且支持异步。其核心逻辑如下:
* **请求接收**:接收前端用户的提问。
* **向量化 (Dense)**:调用 Jina Embeddings API 将 Query 转为 1024 维向量。
* **三路搜索 (ES8)**:
* 构建 Elasticsearch 的混合查询 JSON,包含 `match` (BM25) + `text_expansion` (ELSER 稀疏) + `knn` (Jina 稠密)。
* 通过 ES 的 `rrf` (Reciprocal Rank Fusion) 参数将三路结果融合。
* **重排校验 (Reranking)**:提取 Top-15 Chunk,调用 Jina Reranker v3 API 逐一打分,丢弃分数 < 0.6 的无用神学噪音。
* **生成组装**:若最高分 > 0.6,将原文段落与预设的“严格引用 Prompt”打包,发送给 Claude 4.5 API / DeepSeek API。若均低于 0.6,直接返回“未找到资料”。
**2. 后端部署**
同样使用 Docker 部署,将其加入 `docker-compose.yml` 中:
“`yaml
api_backend:
build: ./backend
container_name: rag_api
environment:
– ES_HOST=http://elasticsearch:
– CLAUDE_API_KEY=your_key
– JINA_API_KEY=your_key
ports:
– “8000:8000”
depends_on:
– elasticsearch
networks:
– rag_net
“`
### 第五阶段:发布与保活优化
**1. 前端解耦与加速**
为了节省 Oracle 实例的带宽与算力,**千万不要在服务器上部署繁重的前端框架*
– 将基于 React/Vue 的前端界面部署到 **Vercel** 或 **Cloudflare Pages**(完全免费)。
– 前端通过 API 发起跨域请求(CORS)调用 Oracle 服务器上的 `http://<您的IP>:8000`。
**2. 反向代理与 SSL (Nginx)**
直接暴露 8000 端口不安全。在 Oracle VM 上安装 Nginx 作为反向代理,并使用 Certbot 申请免费的 Let’s Encrypt HTTPS 证书:
“`bash
sudo apt install nginx -y
sudo snap install –classic certbot
sudo certbot –nginx -d api.yourdomain.com
“`
**3. Oracle 免费实例防回收策略**
Oracle 对资源占用率低的 Always Free 实例有回收机制(过去 7 天内 CPU 利用率低于 10%,网络低于 10MB,内存低于 10%)。
– **优化点**:由于您分配了 8GB 内存给 Elasticsearch,您的内存占用率将永久保持在 30% 以上,完美避开了 Oracle 的自动回收条件。系统将会非常稳定。
Sources