DockerでOpenAI互換のEmbedding & Rerank APIサービスを高速構築



## はじめに
AIを活用した検索システムやレコメンデーションエンジンを構築する際、**テキストのベクトル化（Embeddings）**と**結果の再ランキング（Reranking）**は重要な処理工程です。本記事ではDockerを使い、2つのコアサービスを迅速に構築する方法を解説します：

1. **Embeddings API**：`multilingual-e5-large-instruct`モデルによるテキストベクトル生成
2. **Rerank API**：`bce-reranker-base_v1`モデルを用いた意味的関連性による並び替え

> 注意：OpenAI は Rerank API を提供していません。こちらは Rerank API は Dify用のために構築したものです。

これらのサービスを連携させることで、ベクトル検索による候補抽出と、意味的な精度向上を実現するパイプラインを構築できます。

---

## 環境準備
### ハードウェア要件
- 推奨構成：16GBメモリ + NVIDIA GPU（CUDA対応）

### ソフトウェア要件
- Docker
- NVIDIA Container Toolkit
- 空きポート：7965（Embeddings）、7987（Rerank）

---

## デュアルサービスデプロイガイド

### 1. Embeddings APIのデプロイ
#### コンテナ起動
```bash
docker run -d --name embeddings-api \
  -p 7965:7965 \
  --gpus all \
  engchina/embeddings-api:multilingual-e5-large-instruct
```

#### 主要パラメータ
| パラメータ       | 説明                         |
|------------------|------------------------------|
| `--gpus all`     | GPUアクセラレーション有効化  |
| `-p 7965:7965`   | サービス公開ポート           |

### 2. Rerank APIのデプロイ
#### コンテナ起動
```bash
docker run -d --name rerank-api \
  -p 7987:7987 \
  engchina/rerank-api:bce-reranker-base_v1
```

---

## サービス検証とテスト

### 共通確認方法
APIドキュメントにアクセス（起動約1分後）：
- Embeddings API: [http://localhost:7965/docs](http://localhost:7965/docs)
- Rerank API: [http://localhost:7987/docs](http://localhost:7987/docs)

### 1. Embeddings APIテスト
#### リクエスト例
```bash
curl -X POST "http://localhost:7965/v1/embeddings" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "text-embedding-3-large",
    "input": "OpenAI API互換性テスト",
    "encoding_format": "float"
  }' | jq
```

#### レスポンス特徴
```json
{
  "object": "list",
  "data": [
    {
      "object": "embedding",
      "embedding": [
        0.015018302015960217,
        0.020674465224146843,
        0.006224486045539379,
        -0.05334381014108658,
        0.021632926538586617,
        略
        -0.029829557985067368,
        -0.024390950798988342,
        0.015266106463968754
      ],
      "index": 0
    }
  ],
  "model": "text-embedding-3-large",
  "usage": {
    "prompt_tokens": 16,
    "total_tokens": 16,
    "completion_tokens": 0
  }
}
```

### 2. Rerank APIテスト
#### リクエスト例
```bash
curl -X POST "http://localhost:7987/v1/rerank" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "rerank-multilingual-v3.0",
    "query": "機械学習の学び方",
    "documents": [
      "深層学習入門チュートリアル",
      "Python基本構文ガイド",
      "機械学習実践ハンドブック"
    ],
    "top_n": 3,
    "return_documents": true
  }' | jq
```

#### レスポンス解析
```json
{
  "results": [
    {
      "credentials": "set to no dict to skip update",
      "index": 0,
      "relevance_score": 0.4491826891899109,
      "document": "深層学習入門チュートリアル"
    },
    {
      "credentials": "set to no dict to skip update",
      "index": 1,
      "relevance_score": 0.3655696511268616,
      "document": "Python基本構文ガイド"
    },
    {
      "credentials": "set to no dict to skip update",
      "index": 2,
      "relevance_score": 0.565743625164032,
      "document": "機械学習実践ハンドブック"
    }
  ]
}
```

---

## 連携ワークフロー
### 典型的な適用シナリオ
```
ユーザークエリ → Embeddings API → ベクトルDB検索 → Rerank API → 最適化結果
```

### 連携呼び出し例
```python
import requests

# ステップ1: ベクトル化
embedding_res = requests.post(
    "http://localhost:7965/v1/embeddings",
    json={"model": "text-embedding-3-large", "input": "推薦アルゴリズムの種類"}
).json()
vector = embedding_res['data'][0]['embedding']
print(vector)

# # ステップ2: ベクトルDB検索（疑似コード）
# candidates = vector_db.search(vector, top_k=50)
candidates = [
    "富士山は綺麗です。",
    "ABCを推薦します。",
    "天気がいいですね。"
]

# ステップ3: 再ランキング
rerank_res = requests.post(
    "http://localhost:7987/v1/rerank",
    json={
        "model": "bce-reranker-base_v1",
        "query": "推薦アルゴリズムの種類",
        "documents": candidates,
        "top_n": 10
    }
).json()

final_results = [(doc['document'], doc["relevance_score"]) for doc in rerank_res['results']]
print(final_results)

```

---

## パフォーマンス最適化
1. **GPUリソース割当**：
   ```bash
   docker run -d --gpus '"device=0,1"' # 特定GPU指定
   ```
2. **サービスオーケストレーション**：
   ```yaml
   # docker-compose.yml
   version: '3'
   services:
     embeddings:
       image: engchina/embeddings-api:multilingual-e5-large-instruct
       ports: ["7965:7965"]
       
     rerank:
       image: engchina/rerank-api:bce-reranker-base_v1 
       ports: ["7987:7987"]
   ```

---

## FAQ
**Q1 モデルのアップグレード方法**
```bash
# 最新イメージ取得後に再起動
docker pull engchina/embeddings-api:multilingual-e5-large-instruct
docker restart embeddings-api
```

**Q2 APIパフォーマンス監視**
```bash
# ログ確認（最新100行）
docker logs -f embeddings-api --tail 100
```

---

## まとめ
本手法により以下を迅速に構築可能：
- 即時利用可能なベクトル化サービス（7965ポート）
- 高精度な意味的再ランキングサービス（7987ポート）

AIアプリケーション開発の基盤として、ぜひご活用ください。