ragserver は、マルチモーダル(テキスト + 画像)検索のための Retrieval-Augmented Generation (RAG) 基盤サーバです。ragserver 本体が REST API サーバとして動作し、周辺の補助サーバ(ベクトルストア、埋め込み生成、リランカー)と協調することでドキュメントの取り込みと、関連情報の検索機能を提供します。標準構成ではローカル実行に必要なコンポーネントを含み、環境変数を書き換えるだけでクラウドサービスや外部 API に切り替えられます。
| 役割 | 実装ディレクトリ | 備考 | |
|---|---|---|---|
| ragserver 本体 | REST API、MCP サーバ、検索・投入制御 | ragserver/ |
main.py がエントリポイント |
| store | ベクトルストア(既定: Chroma) | ragserver/store/、chroma_db/、chroma_server/ |
ChromaManager がローカル永続 DB (chroma_db/) を使用 |
| embed | テキスト/画像埋め込み生成(既定: HuggingFace CLIP) | ragserver/embed/、embed_server/ |
HFCLIPEmbeddingsManager が embed_server/hfclip_embed_server.py に接続 |
| rerank | 検索結果のリランク(既定: HuggingFace BGE reranker) | ragserver/rerank/、rerank_server/ |
HFRerankManager が rerank_server/hf_rerank_server.py に接続 |
- ragserver 本体 (
ragserver/): FastAPI アプリ (main.py) が REST API と MCP の窓口。core/,store/,embed/,ingest/,retrieval/,rerank/がモジュール群です。 - store:
ragserver/store/で抽象化し、既定のChromaManagerがchroma_db/を永続ディレクトリとして使用。別途chroma_server/run.shでリモート Chroma にも切り替え可能。 - embed:
ragserver/embed/に埋め込みのインタフェース。既定はembed_server/hfclip_embed_server.py(HuggingFace CLIP)を叩く構成で、OpenAI/Cohere などへの切り替えも環境変数で対応。 - rerank:
ragserver/rerank/にリランク機構。既定は HuggingFace BGE (rerank_server/hf_rerank_server.py) を使用。
.env に設定を記述し、ベクトルストア/埋め込み/リランクを差し替えます。以下に 3 つの例を示します。
VECTOR_STORE=chroma
CHROMA_PERSIST_DIR=chroma_db
EMBED_PROVIDER=hfclip
HFCLIP_EMBED_BASE_URL=http://localhost:8001/v1
RERANK_PROVIDER=hf
HF_RERANK_BASE_URL=http://localhost:8002/v1
TOPK=10
TOPK_RERANK_SCALE=5embed_server/run.sh と rerank_server/run.sh を立ち上げ、ragserver/run.sh を実行するとローカル RAG が動作します。
VECTOR_STORE=chroma
CHROMA_PERSIST_DIR=chroma_db
EMBED_PROVIDER=openai
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_API_KEY=sk-...
RERANK_PROVIDER=cohere
COHERE_API_KEY=...
COHERE_RERANK_MODEL=rerank-multilingual-v3.0
TOPK=10
TOPK_RERANK_SCALE=3埋め込みは OpenAI Embeddings API、リランクは Cohere Rerank API に差し替え。embed_server/rerank_server は不要。
VECTOR_STORE=pgvector
PG_HOST=localhost
PG_PORT=5432
PG_DATABASE=ragserver
PG_USER=ragserver
PG_PASSWORD=ragserver
EMBED_PROVIDER=cohere
COHERE_API_KEY=...
COHERE_EMBED_MODEL_TEXT=embed-v4.0
COHERE_EMBED_MODEL_IMAGE=embed-v4.0
RERANK_PROVIDER=none
TOPK=20
TOPK_RERANK_SCALE=1pgvector_server/init_pgdb.sh で DB を初期化後、Cohere API による埋め込みと PgVector を組み合わせます。リランクは無効化されます。
ragserver/run.sh- FastAPI アプリ(
ragserver.main:app)のみ起動。
- FastAPI アプリ(
run_all.sh- embed → rerank → ragserver の順で起動。Chroma サーバ接続が必要であればコメントアウト部分を有効化します。
stop_all.sh- 8000/8001/8002/8003 ポートを LISTEN しているプロセスへ SIGINT → SIGTERM を送って順次停止。
各スクリプトはバックグラウンド起動 (&) を使用します。必要に応じて systemd 等で管理下さい。
また、起動中はログレベル INFO で標準出力にログが出力されます。必要に応じて ragserver/logger.py を修正下さい。
ragserver の API を利用するデモクライアントとして、ragclient を用意しています。
ragclient/run.sh- デフォルトで 8004 ボートを使用し、streamlit サーバが起動します。
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
以下は http://localhost:8000/v1 に API が公開されている場合の curl 例です。
# /reload : store を再ロード
curl -X POST http://localhost:8000/v1/reload \
-H "Content-Type: application/json" \
-d '{"target": "store"}'
# /upload : ファイルをアップロード
curl -X POST http://localhost:8000/v1/upload \
-F "files=@hoge.png" \
-F "files=@fuga.txt" \
-F "files=@piyo.pdf"
# /query/text : テキスト検索
curl -X POST http://localhost:8000/v1/query/text \
-H "Content-Type: application/json" \
-d '{"query": "What is ragserver?", "topk": 5}'
# /query/text_multi : テキストクエリによるマルチモーダル検索
curl -X POST http://localhost:8000/v1/query/text_multi \
-H "Content-Type: application/json" \
-d '{"query": "Find related images", "topk": 5}'
# /query/image : 画像クエリ検索
curl -X POST http://localhost:8000/v1/query/image \
-H "Content-Type: application/json" \
-d '{"path": "./image.png", "topk": 5}'
# /ingest/path : ローカルパスから取り込み
curl -X POST http://localhost:8000/v1/ingest/path \
-H "Content-Type: application/json" \
-d '{"path": "./documents"}'
# /ingest/path_list : パスリスト(テキストファイル)を指定
curl -X POST http://localhost:8000/v1/ingest/path_list \
-H "Content-Type: application/json" \
-d '{"path": "./path_list.txt"}'
# /ingest/url : 単一 URL を取り込み
curl -X POST http://localhost:8000/v1/ingest/url \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'
# /ingest/url_list : URL リストを取り込み
curl -X POST http://localhost:8000/v1/ingest/url_list \
-H "Content-Type: application/json" \
-d '{"path": "./url_list.txt"}'各 API は HTTP 500 でエラーメッセージを返す場合があります。詳細はログを参照してください。
FastApiMCP を通じて MCP (Model Context Protocol) サーバとして動作します。ragserver/main.py の末尾で FastApiMCP(app, name=PROJECT_NAME) を初期化し、mount_http() で HTTP エンドポイント(/mcp)を公開しています。
MCP クライアント側に ragserver を登録すると、query, ingest など FastAPI エンドポイントと同等の操作が可能です。クライアント側設定方法は利用するツールの詳細を参照下さい。以下は LM Studio での設定ファイル(json)記述例です。
{
"mcpServers": {
"my_mcp_server": {
"url": "http://localhost:8000/mcp"
}
}
}
ragserver/config.py が読み込む環境変数と値域は以下のとおりです。
| 変数名 | 用途 | 値域/例 |
|---|---|---|
VECTOR_STORE |
ベクトルストア選択 | chroma / pgvector |
LOAD_LIMIT |
メタ情報ロード上限件数 | 正の整数 |
CHECK_UPDATE |
既存ソースの更新チェックを有効化するか | true/false 等の真偽文字列 |
CHROMA_PERSIST_DIR |
Chroma 永続ディレクトリ | パス文字列 |
CHROMA_HOST |
Chroma サーバホスト | ホスト名/URL |
CHROMA_PORT |
Chroma サーバポート | 正の整数 |
CHROMA_API_KEY |
Chroma Cloud API キー | 文字列 |
CHROMA_TENANT |
Chroma Cloud テナント名 | 文字列 |
CHROMA_DATABASE |
Chroma Cloud データベース名 | 文字列 |
PG_HOST |
PgVector ホスト | 文字列 |
PG_PORT |
PgVector ポート | 正の整数 |
PG_DATABASE |
PgVector DB 名 | 文字列 |
PG_USER |
PgVector ユーザ名 | 文字列 |
PG_PASSWORD |
PgVector パスワード | 文字列 |
EMBED_PROVIDER |
埋め込みプロバイダ選択 | hfclip / openai / cohere |
OPENAI_EMBED_MODEL_TEXT |
OpenAI テキストモデル名 | 文字列 |
OPENAI_API_KEY |
OpenAI API キー | 文字列 |
OPENAI_BASE_URL |
OpenAI API Base URL | URL |
COHERE_EMBED_MODEL_TEXT |
Cohere テキストモデル名 | 文字列 |
COHERE_EMBED_MODEL_IMAGE |
Cohere 画像モデル名 | 文字列 |
COHERE_API_KEY |
Cohere API キー | 文字列 |
HFCLIP_EMBED_MODEL_TEXT |
HuggingFace CLIP 埋め込みテキストモデル | 文字列 |
HFCLIP_EMBED_MODEL_IMAGE |
HuggingFace CLIP 埋め込み画像モデル | 文字列 |
HFCLIP_EMBED_BASE_URL |
HuggingFace CLIP 埋め込み API の URL | URL |
CHUNK_SIZE |
テキスト分割チャンクサイズ | 正の整数 |
CHUNK_OVERLAP |
テキスト分割オーバーラップ | 0 <= value < CHUNK_SIZE |
USER_AGENT |
HTML 取得時の User-Agent | 文字列 |
RERANK_PROVIDER |
リランクプロバイダ | hf / cohere / none |
HF_RERANK_MODEL |
HuggingFace リランカーモデル名 | 文字列 |
HF_RERANK_BASE_URL |
HuggingFace リランカー API の URL | URL |
COHERE_RERANK_MODEL |
Cohere リランカーモデル名 | 文字列 |
TOPK |
取得件数 | 正の整数 |
TOPK_RERANK_SCALE |
リランキング前の取得倍率 | 正の整数 |
UPLOAD_DIR |
ファイルアップロード用ディレクトリ名 | upload |
ragserver/ingest/loader.Exts で許可された拡張子:
- テキスト:
.txt - マークダウン:
.md - 画像:
.jpg,.jpeg,.png,.gif - PDF:
.pdf
URL ingest(HTMLLoader)では、HTML に含まれるリンクから上記拡張子のアセットを取得します。
本プロジェクトでは、空間キーという概念でベクトルストアの管理を行います。
空間キー (space_key) は「埋め込み種別 × モデル × 用途」を識別するキーで、ベクトルストア内のコレクション/テーブル命名に使用します。
- 形式:
[embed provider]__[model name]__[text|image]- 例:
hfclip__openai/clip-vit-base-patch32__text
- 例:
- 埋め込みやストア構成を切り替えると異なる空間キーが生成され、既存データとは別コレクションとして扱われます。モデルを切り替えた場合は再インジェストが必要です。
- マルチモーダル構成ではテキスト用
space_keyと画像用space_key_multiの 2 種が存在し、それぞれ別コレクションに格納されます。
本プロジェクトではコサイン類似度を採用しており、以下を考慮の上、埋め込みベクトルは既定で L2 正規化(単位長化)します。
- 距離関数の一貫性:コサイン類似度 ≒ 正規化後の内積になり、DB や検索器の違いを吸収
- モデル差し替え耐性:埋め込みモデル(OpenAI/Cohere/CLIP 等)を変えても挙動が安定
- 数値安定性:極端なベクトル長によるスコアの偏りを抑制





