「RAG を本番に乗せようとしたとき、Vector DB 選定で1週間溶かした」
実際に複数のプロダクトで RAG パイプラインを構築してきた経験から言うと、Vector DB の選定ミスは後から修正しづらい意思決定のひとつです。インデックス再構築のコスト、SDK の書き直し、本番データの移行——これを避けるには、最初に 4 つの主要 DB の特性を正確に理解しておく必要があります。
この記事では、Pinecone・Weaviate・Qdrant・Chroma を料金・OSS/SaaS区分・次元数上限・メタデータフィルタ・Python SDK の観点で比較し、各 DB での RAG 構築コードをそのままコピペできる形式で全公開します。2026年4月時点の公式情報に基づいています。
- 4大 Vector DB の料金・無料枠・OSS/SaaS 区分(2026年4月確認)
- Pinecone / Weaviate / Qdrant / Chroma それぞれの RAG 実装コード
- 用途別おすすめ選定フロー(プロトタイプ→本番→エンタープライズ)
Vector DB とは何か——なぜ今、選定が重要なのか
Vector DB は、テキストや画像を数値ベクトルに変換して保存し、意味的に近いものを高速に検索するデータベースです。LLM の RAG(Retrieval-Augmented Generation)パイプラインでは、ユーザーのクエリをベクトル化し、ドキュメントの中から関連性の高いチャンクを取り出して LLM に渡すという役割を担います。
従来のキーワード検索では「同じ意味の違う表現」が拾えませんでした。Vector DB はこの問題をコサイン類似度やドット積で解決します。OpenAI の text-embedding-3-small は 1536 次元、text-embedding-3-large は 3072 次元のベクトルを生成しますが、これらを格納・検索するための専用インフラが Vector DB です。
2026 年時点では、エージェントのメモリ基盤としても Vector DB が広く使われています。AIエージェントのメモリ設計パターン(ID 110)で解説したように、Long-term Memory を実装する際の事実上の標準となっています。
4大 Vector DB 徹底比較——料金・仕様・特徴
まず結論となる比較表を示します。詳細は各セクションで解説します。
スペック比較表(2026年4月確認)
| 項目 | Pinecone | Weaviate | Qdrant | Chroma |
|---|---|---|---|---|
| タイプ | SaaS(フルマネージド) | OSS + SaaS | OSS + SaaS | OSS + SaaS(初期) |
| 無料枠 | 永続(Starter) | 14日間トライアルのみ | 永続(Free Tier) | Cloud:1M ベクトルまで |
| 自己ホスト | 非対応 | 可(OSS) | 可(OSS) | 可(OSS) |
| 最大次元数 | 20,000 | 65,535 | 65,535 | 制限なし(実用 ~16,000) |
| メタデータフィルタ | あり | GraphQL / REST | あり(高性能) | あり(基本的) |
| ハイブリッド検索 | あり(Sparse+Dense) | あり(BM25+Vector) | あり(Sparse+Dense) | 限定的 |
| Python SDK | pinecone-client | weaviate-client | qdrant-client | chromadb |
| 有料プラン最低額 | $50/月 | $45/月(Flex) | 従量課金(時間単位) | $100/月(Team) |
料金情報の最終確認: 2026-04-28
用途別おすすめ早見表
| 用途 | おすすめ DB | 理由 | 月額目安 |
|---|---|---|---|
| プロトタイプ・ローカル開発 | Chroma | インストール不要、コード数行で動く | 無料(OSS) |
| 個人プロジェクト・スモールスタート | Qdrant(Cloud Free) | 永続無料枠、本番移行パスあり | 無料〜従量 |
| マネージドで運用ゼロにしたい | Pinecone | SaaS 完結、SDK がシンプル | $50〜 |
| ハイブリッド検索重視 | Weaviate | BM25+Vector の統合が最も成熟 | $45〜(Cloud)/ 無料(OSS) |
| 大規模・高パフォーマンス要件 | Qdrant | p50レイテンシ 4ms、フィルタ最速 | 従量課金 |
Pinecone——SaaS の王道、運用ゼロで本番直結
Pinecone は 2019 年創業のフルマネージド Vector DB です。インフラ管理が不要で、API キーを取得した次の瞬間から本番グレードのベクトル検索が使えます。2026 年時点ではサーバーレスアーキテクチャに完全移行しており、スケールアウトは自動です。
Pinecone の料金(2026年4月)
- Starter(無料): 1プロジェクト・1インデックス・2GBストレージ
- Standard: $50/月〜(従量課金上乗せ)
- Enterprise: $500/月〜
- 書き込み単価: $0.0000004/WU、読み取り単価: $0.00000025/RU
以下は Pinecone Serverless で RAG パイプラインを構築するコードです。
# 動作環境: Python 3.11+, pinecone>=3.0.0, openai>=1.30.0
# pip install pinecone openai
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
import os
from pinecone import Pinecone, ServerlessSpec
from openai import OpenAI
pc = Pinecone(api_key=os.environ["PINECONE_API_KEY"])
oai = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
INDEX_NAME = "rag-demo"
# インデックス作成(初回のみ)
if INDEX_NAME not in [idx.name for idx in pc.list_indexes()]:
pc.create_index(
name=INDEX_NAME,
dimension=1536, # text-embedding-3-small の次元数
metric="cosine",
spec=ServerlessSpec(cloud="aws", region="us-east-1")
)
index = pc.Index(INDEX_NAME)
def embed(text: str) -> list[float]:
"""テキストをベクトルに変換する"""
resp = oai.embeddings.create(
model="text-embedding-3-small",
input=text
)
return resp.data[0].embedding
def upsert_doc(doc_id: str, text: str, metadata: dict) -> None:
"""ドキュメントをインデックスに登録する"""
vec = embed(text)
index.upsert(vectors=[{
"id": doc_id,
"values": vec,
"metadata": {"text": text, **metadata}
}])
def rag_query(question: str, top_k: int = 3) -> str:
"""RAG クエリを実行して LLM に回答させる"""
q_vec = embed(question)
results = index.query(
vector=q_vec,
top_k=top_k,
include_metadata=True
)
context = "\n".join([m["metadata"]["text"] for m in results["matches"]])
response = oai.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "以下のコンテキストに基づいて回答してください。"},
{"role": "user", "content": f"コンテキスト:\n{context}\n\n質問: {question}"}
]
)
return response.choices[0].message.content
# 使用例
upsert_doc("doc-001", "RAGはRetrieval-Augmented Generationの略です。", {"source": "intro"})
answer = rag_query("RAGとは何ですか?")
print(answer)
ポイント: ServerlessSpec を使うことで、キャパシティプランニングが不要になります。Pinecone の最大次元数は 20,000 で、現在公開されているほぼすべての埋め込みモデルをカバーしています。
Weaviate——ハイブリッド検索最強、エンタープライズ向け
Weaviate はオランダ発の OSS Vector DB で、BM25(キーワード)とベクトル検索を組み合わせたハイブリッド検索が最も成熟しています。RAG でキーワード精度も求める場合や、マルチテナント管理が必要なエンタープライズ用途に強みがあります。
Weaviate の料金(2026年4月)
- OSS(自己ホスト): 無料
- Cloud Flex: $45/月〜(共有クラウド、SLA 99.5%)
- Cloud Premium: $400/月〜(専用デプロイ、SLA 99.95%)
- 注意: マネージドクラウドには永続無料枠なし(14日間トライアルのみ)
# 動作環境: Python 3.11+, weaviate-client>=4.0.0
# pip install weaviate-client openai
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
import os
import weaviate
from weaviate.classes.config import Configure, Property, DataType
from weaviate.classes.query import MetadataQuery
from openai import OpenAI
oai = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
# Weaviate Cloud に接続(ローカル開発は weaviate.connect_to_local() を使用)
client = weaviate.connect_to_weaviate_cloud(
cluster_url=os.environ["WEAVIATE_URL"],
auth_credentials=weaviate.auth.AuthApiKey(os.environ["WEAVIATE_API_KEY"])
)
COLLECTION_NAME = "RagDocument"
def get_or_create_collection():
"""コレクションを取得または作成する"""
if client.collections.exists(COLLECTION_NAME):
return client.collections.get(COLLECTION_NAME)
return client.collections.create(
name=COLLECTION_NAME,
vectorizer_config=Configure.Vectorizer.none(), # 外部埋め込みを使用
properties=[
Property(name="text", data_type=DataType.TEXT),
Property(name="source", data_type=DataType.TEXT),
]
)
def embed(text: str) -> list[float]:
resp = oai.embeddings.create(model="text-embedding-3-small", input=text)
return resp.data[0].embedding
collection = get_or_create_collection()
def upsert_doc(text: str, source: str) -> None:
"""ドキュメントを登録する"""
vec = embed(text)
collection.data.insert(
properties={"text": text, "source": source},
vector=vec
)
def rag_query_hybrid(question: str, top_k: int = 3) -> str:
"""ハイブリッド検索(BM25 + Vector)で RAG を実行する"""
q_vec = embed(question)
results = collection.query.hybrid(
query=question, # BM25 用テキスト
vector=q_vec, # ベクトル検索用
limit=top_k,
return_metadata=MetadataQuery(score=True)
)
context = "\n".join([obj.properties["text"] for obj in results.objects])
response = oai.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "以下のコンテキストに基づいて回答してください。"},
{"role": "user", "content": f"コンテキスト:\n{context}\n\n質問: {question}"}
]
)
return response.choices[0].message.content
# 使用例
upsert_doc("Weaviateはハイブリッド検索に強いVector DBです。", "docs")
answer = rag_query_hybrid("Weaviateの強みは何ですか?")
print(answer)
client.close()
ポイント: collection.query.hybrid() が Weaviate 最大の差別化機能です。BM25 スコアとベクトルスコアを alpha パラメータ(0=BM25のみ、1=Vectorのみ)で調整できます。専門用語が多いドメイン(医療・法務・金融)では alpha=0.3〜0.5 が有効です。
Qdrant——OSS最高パフォーマンス、フィルタ処理が最速
Qdrant はロシア発の OSS Vector DB で、Rust で実装されています。p50 レイテンシ 4ms というベンチマーク(1M ベクトル・1536次元)は主要 Vector DB 中で最速クラスです。メタデータフィルタを組み合わせた検索でも速度が落ちにくいのが特徴で、ユーザー属性やセキュリティレベルで事前絞り込みを行う本番 RAG に適しています。
Qdrant の料金(2026年4月)
- OSS(自己ホスト): 無料
- Cloud Free Tier: 永続無料(1ノード・0.5 vCPU・1GB RAM・4GB disk)
- Cloud Standard: 時間単位の従量課金(SLA 99.5%)
- Cloud Premium: 月額最低スペンド制(SSO・プライベートネットワーク・SLA 99.9%)
# 動作環境: Python 3.11+, qdrant-client>=1.8.0
# pip install qdrant-client openai
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
import os
from qdrant_client import QdrantClient
from qdrant_client.models import (
Distance, VectorParams, PointStruct,
Filter, FieldCondition, MatchValue
)
from openai import OpenAI
oai = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
# Qdrant Cloud に接続(ローカルは QdrantClient(":memory:") または QdrantClient("localhost", port=6333))
client = QdrantClient(
url=os.environ["QDRANT_URL"],
api_key=os.environ["QDRANT_API_KEY"]
)
COLLECTION = "rag_docs"
DIM = 1536 # text-embedding-3-small
def ensure_collection():
"""コレクションが存在しない場合は作成する"""
existing = [c.name for c in client.get_collections().collections]
if COLLECTION not in existing:
client.create_collection(
collection_name=COLLECTION,
vectors_config=VectorParams(size=DIM, distance=Distance.COSINE)
)
def embed(text: str) -> list[float]:
resp = oai.embeddings.create(model="text-embedding-3-small", input=text)
return resp.data[0].embedding
ensure_collection()
def upsert_doc(doc_id: int, text: str, department: str) -> None:
"""メタデータ付きでドキュメントを登録する"""
vec = embed(text)
client.upsert(
collection_name=COLLECTION,
points=[PointStruct(
id=doc_id,
vector=vec,
payload={"text": text, "department": department}
)]
)
def rag_query_with_filter(question: str, department: str, top_k: int = 3) -> str:
"""部署フィルタ付きで RAG を実行する(マルチテナント的な使用例)"""
q_vec = embed(question)
results = client.search(
collection_name=COLLECTION,
query_vector=q_vec,
query_filter=Filter(
must=[FieldCondition(
key="department",
match=MatchValue(value=department)
)]
),
limit=top_k,
with_payload=True
)
context = "\n".join([hit.payload["text"] for hit in results])
response = oai.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "以下のコンテキストに基づいて回答してください。"},
{"role": "user", "content": f"コンテキスト:\n{context}\n\n質問: {question}"}
]
)
return response.choices[0].message.content
# 使用例:engineering 部門のドキュメントのみ対象に検索
upsert_doc(1, "Qdrantは高性能なフィルタ処理に優れています。", "engineering")
upsert_doc(2, "売上目標は前年比120%です。", "sales")
answer = rag_query_with_filter("Qdrantの特徴は?", department="engineering")
print(answer) # sales のドキュメントは含まれない
ポイント: query_filter でメタデータ絞り込みを行ってからベクトル検索する「フィルタード検索」が Qdrant の真骨頂です。部署・ユーザーID・セキュリティレベルによる事前フィルタリングを、パフォーマンスを落とさずに実現できます。
Chroma——ローカル開発・プロトタイプに最適なインプロセス DB
Chroma はプロセス内(インプロセス)で動作する Vector DB で、追加のサーバー設定なしに Python スクリプト内でそのまま使えます。プロトタイプ段階で「まず動かしてみる」ための選択肢として圧倒的に導入が速い点が強みです。
Chroma の料金(2026年4月)
- OSS(自己ホスト・インプロセス): 無料
- Chroma Cloud 無料枠: 1M ベクトルまで(ベータ段階)
- Chroma Cloud Team: $100/月〜
- 注意: 本番スケールでの単一ノード制限あり(〜1000万ベクトル程度が実用上限)
# 動作環境: Python 3.11+, chromadb>=0.5.0
# pip install chromadb openai
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
import os
import chromadb
from openai import OpenAI
oai = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
# インメモリ(テスト用)または永続化(永続化: chromadb.PersistentClient(path="./chroma_db"))
chroma = chromadb.Client()
collection = chroma.get_or_create_collection(
name="rag_docs",
metadata={"hnsw:space": "cosine"} # コサイン類似度を使用
)
def embed(text: str) -> list[float]:
resp = oai.embeddings.create(model="text-embedding-3-small", input=text)
return resp.data[0].embedding
def upsert_docs(ids: list[str], texts: list[str], metadatas: list[dict]) -> None:
"""バッチでドキュメントを登録する"""
embeddings = [embed(t) for t in texts]
collection.upsert(
ids=ids,
documents=texts,
embeddings=embeddings,
metadatas=metadatas
)
def rag_query(question: str, top_k: int = 3, where: dict = None) -> str:
"""Chroma で RAG クエリを実行する"""
q_vec = embed(question)
query_params = {
"query_embeddings": [q_vec],
"n_results": top_k,
"include": ["documents", "metadatas", "distances"]
}
if where:
query_params["where"] = where # メタデータフィルタ(例: {"source": "manual"})
results = collection.query(**query_params)
context = "\n".join(results["documents"][0])
response = oai.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "以下のコンテキストに基づいて回答してください。"},
{"role": "user", "content": f"コンテキスト:\n{context}\n\n質問: {question}"}
]
)
return response.choices[0].message.content
# 使用例
upsert_docs(
ids=["doc-1", "doc-2"],
texts=["Chromaはプロトタイプに最適です。", "インプロセス動作が強みです。"],
metadatas=[{"source": "blog"}, {"source": "blog"}]
)
answer = rag_query("Chromaの特徴を教えてください。")
print(answer)
ポイント: Chroma はインプロセスで動くため、Docker や外部サーバーの起動が不要です。PersistentClient に切り替えるだけでローカルファイルに永続化できます。ただし水平スケール(シャーディング)には非対応なので、1000万ベクトルを超える規模では別の選択肢を検討してください。
RAG 本番構築——4 DB 統合比較と失敗パターン
実際に複数プロジェクトで RAG を本番運用してきた経験から、よくある失敗パターンをまとめます。
共通 RAG パイプラインのコード(DB 切り替え可能)
# 動作環境: Python 3.11+
# Vector DB 実装を差し替えられる共通インターフェース
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import Optional
from openai import OpenAI
oai = OpenAI()
@dataclass
class SearchResult:
text: str
score: float
metadata: dict
class VectorStore(ABC):
"""Vector DB の共通インターフェース"""
@abstractmethod
def upsert(self, doc_id: str, text: str, metadata: dict) -> None: ...
@abstractmethod
def search(self, query_vec: list[float], top_k: int, filters: Optional[dict]) -> list[SearchResult]: ...
def embed(text: str) -> list[float]:
"""テキストをベクトルに変換する"""
resp = oai.embeddings.create(model="text-embedding-3-small", input=text)
return resp.data[0].embedding
def rag_pipeline(store: VectorStore, question: str, filters: Optional[dict] = None) -> str:
"""任意の VectorStore 実装で動く RAG パイプライン"""
q_vec = embed(question)
results = store.search(q_vec, top_k=4, filters=filters)
if not results:
return "関連するドキュメントが見つかりませんでした。"
context_parts = []
for r in results:
source = r.metadata.get("source", "不明")
context_parts.append(f"[ソース: {source}]\n{r.text}")
context = "\n\n".join(context_parts)
response = oai.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": (
"あなたは提供されたコンテキストに基づいて正確に回答するアシスタントです。"
"コンテキストにない情報は「分かりません」と答えてください。"
)},
{"role": "user", "content": f"コンテキスト:\n{context}\n\n質問: {question}"}
],
temperature=0.1 # RAG では低温度が推奨
)
return response.choices[0].message.content
よくある失敗パターンと回避策
失敗1:チャンクサイズを考えずにドキュメントをそのまま格納する
❌ 10,000字のドキュメントを1件のベクトルとして格納
⭕ 500〜1000トークン程度にチャンク分割し、重複(overlap: 50〜100トークン)を持たせる
なぜ重要か: ベクトルは意味の「平均」を取るため、長文ではピンポイントな意味が薄まります。適切なチャンク分割は RAG 精度に直結します。
失敗2:埋め込みモデルとクエリモデルを揃えない
❌ ドキュメントは text-embedding-ada-002、クエリは text-embedding-3-small で埋め込む
⭕ 登録時とクエリ時で必ず同じモデル・次元数を使う
なぜ重要か: 異なるモデルの空間は互換性がなく、類似度計算が無意味になります。インデックスを再構築するしかないため、最初から統一してください。
失敗3:メタデータフィルタなしで全ドキュメントを検索する
❌ 全ユーザーのドキュメントを単一コレクションに混在させる
⭕ ユーザーID・テナントID・ドキュメントカテゴリをメタデータとして付与し、検索時にフィルタを適用
なぜ重要か: ユーザーAの質問にユーザーBのドキュメントが混入するセキュリティリスクと、検索精度の両方に影響します。
失敗4:Chroma をプロトタイプから本番にそのまま持ち込む
❌ 500万ベクトルを PersistentClient のまま本番運用
⭕ 100万ベクトルを超えたタイミングで Qdrant または Pinecone に移行する計画を立てる
なぜ重要か: Chroma は水平スケールに非対応です。急成長するユースケースでは早期移行計画が必要です。
用途別おすすめと選定フロー
Vector DB の選定は「今の規模」と「半年後の規模」の両方を考える必要があります。
選定フロー
Vector DB 選定フロー(2026年4月版)
まずベクトル数の規模を確認する
│
├── 〜100万ベクトル(小規模)
│ ├── 運用ゼロ優先 → Pinecone Starter(無料)
│ ├── コスト最小 → Qdrant Cloud Free(永続無料)
│ └── ローカル開発のみ → Chroma(OSS)
│
├── 100万〜1000万ベクトル(中規模)
│ ├── マネージド優先 → Pinecone Standard ($50/月〜)
│ ├── ハイブリッド検索重視 → Weaviate Cloud Flex ($45/月〜)
│ └── 高パフォーマンス・コスト重視 → Qdrant Cloud(従量課金)
│
└── 1000万ベクトル以上(大規模)
├── フルマネージド → Pinecone Enterprise
├── 自社インフラあり → Weaviate / Qdrant 自己ホスト
└── GPU 加速 → Milvus(GPU インデックス対応)を検討
RAG パイプライン全体の設計については、AIエージェントのメモリ設計ガイド(Short/Long/Episodic)も参照してください。Vector DB は Long-term Memory の実装基盤として位置づけられています。
FAQ
Q. OpenAI の埋め込み API(text-embedding-3-large、3072次元)はどの DB で使えますか?
A. Pinecone(上限20,000次元)、Weaviate(上限65,535次元)、Qdrant(上限65,535次元)はいずれも対応しています。Chroma は次元数の公式上限を設けていませんが、実用上 16,000次元程度が目安です。どの DB でも 3072次元は問題なく扱えます。
Q. Chroma から Pinecone に移行する際のコストは?
A. インデックスの再構築が必要です。ドキュメントの再埋め込みは不要で、Chroma から全ベクトルをエクスポートして Pinecone に upsert する形になります。100万ベクトルの場合、書き込みコストは $0.0000004/WU で計算できます(WU はベクトルサイズと次元数による)。
Q. 日本語ドキュメントへの対応は問題ありませんか?
A. Vector DB 自体は言語に依存しません。日本語テキストの品質は埋め込みモデル(OpenAI の text-embedding-3-small や Cohere の multilingual モデルなど)に依存します。どの DB を選んでも、日本語対応の埋め込みモデルを選択すれば問題ありません。
Q. Weaviate のマルチテナント機能は他の DB にもありますか?
A. Qdrant はコレクション分離やペイロードフィルタでマルチテナントを実装できます。Pinecone はネームスペース機能でテナント分離が可能です。Chroma はコレクションの複数作成で対応できますが、大量テナントには向きません。本格的なマルチテナント SaaS を構築する場合は Weaviate または Qdrant が推奨です。
参考・出典
- Pinecone 公式料金ページ — Pinecone(参照日: 2026-04-28)
- Weaviate 公式料金ページ — Weaviate(参照日: 2026-04-28)
- Qdrant 公式料金ページ — Qdrant(参照日: 2026-04-28)
- Qdrant Fundamentals FAQ(最大次元数 65,535) — Qdrant(参照日: 2026-04-28)
- Weaviate 最大ベクトル次元数(65,535) — Weaviate Community Forum(参照日: 2026-04-28)
- Best vector databases for production RAG in 2026 — Engineers Guide(参照日: 2026-04-28)
まとめ:今日から始める3つのアクション
- 今日やること: Chroma を
pip install chromadbしてローカルで RAG を 10 分で動かす - 今週中: 本番想定のデータ量・テナント要件を整理し、上記選定フローで DB を1つに絞る
- 今月中: 選定した DB の無料枠で実際のドキュメントを格納し、検索精度・レイテンシを計測する
あわせて読みたい:
- 【2026年最新】AIエージェントのメモリ設計パターン|実装ガイド — Vector DB を Long-term Memory として活用する設計パターン
- 【2026年4月】OpenAI Agents SDK完全ガイド|実装とコスト試算 — RAG と Agents SDK を組み合わせたマルチエージェント構築
著者: 佐藤傑(さとう・すぐる)
株式会社Uravation代表取締役。X(@SuguruKun_ai)フォロワー10万人超。
100社以上の企業向けAI研修・導入支援。著書累計3万部突破。
SoftBank IT連載7回執筆(NewsPicks最大1,125ピックス)。
ご質問・ご相談は お問い合わせフォーム からお気軽にどうぞ。
この記事を読んで導入イメージが固まってきた方へ
UravationではAIエージェント導入の研修・コンサルを行っています。