RAGとOpenAI Responses APIの連携ガイド

2025年5月調査|知識拡張の最新技術
📌 RAG(検索拡張生成)とは何か?

RAG(Retrieval-Augmented Generation)は、外部知識を検索して大規模言語モデルの生成に組み込む手法です。これにより、モデルの知識カットオフを超えた最新情報や特定ドメインの情報を応答に取り込むことができます。

「LLMの知識を外部データベースからの情報で拡張し、より正確で最新かつ文脈に沿った応答を生成する強力なパラダイム」
ユーザークエリ
関連データの検索・取得(Retrieval)
検索結果をコンテキストに組み込み
拡張コンテキストを基にAIが回答生成(Generation)
🧩

🔍 Responses APIにおけるRAGサポート

組込み機能

OpenAI Responses APIはRAG機能を直接サポートしており、複数の方法で外部知識を取り込むことができます。

内蔵ツール方式: APIに組み込まれたツールを使用(web_search, file_search, vector_store)
外部実装方式: 開発者が独自にRAGパイプラインを構築し、検索結果をコンテキストとして提供
ハイブリッド方式: 内蔵ツールと外部RAGを併用して相互補完
📝 注意: 内蔵ツールは便利ですが、独自のナレッジベースやデータソースがある場合は外部実装方式が柔軟性に優れます
🌐

🔎 Web検索ツールによるRAG

最新情報取得

Web検索ツールはインターネットから最新情報を取得してモデルに提供する最も簡単なRAGの実装方法です。

# Python
import openai
openai.api_key = "YOUR_API_KEY"

response = openai.Response.create(
    model="gpt-4.1",
    instructions="最新の情報を含めて回答してください",
    input="2025年の人工知能トレンドは?",
    tools=[{"type": "web_search"}],  # Web検索ツールを有効化
    temperature=0.7
)
print(response.output_text)  # 検索結果を含めた回答が返る
制御パラメータ: 検索範囲や結果数の上限を指定可能
引用機能: 情報ソースのURL自動引用で信頼性向上
価格: 1,000回の検索あたり約$35 コスト注意
⚠️ 制限: Web検索は公開情報のみが対象で、ログインが必要なサイトやごく最近の情報は取得できない場合があります
📁

📄 ファイル検索ツールの活用

文書知識

アップロードしたファイルから関連情報を検索し、モデルに提供する方法です。PDF、Word、テキストなど様々な形式に対応しています。

# Python - ファイルをアップロードしてIDを取得
file = openai.File.create(
    file=open("company_data.pdf", "rb"),
    purpose="file-search"
)

# ファイル検索ツールを使用して回答を生成
response = openai.Response.create(
    model="gpt-4.1",
    instructions="会社の資料に基づいて回答してください",
    input="弊社の2024年度の売上目標は?",
    tools=[{
        "type": "file_search",
        "file_ids": [file.id]
    }],
    temperature=0.3
)
ファイル管理: アップロード、削除、一覧取得などのAPIを提供
自動インデックス: アップロード時に自動的に検索インデックスを構築
価格: 1,000回の検索あたり約$2.50 低コスト
🧠

🔢 ベクターストアとの連携

埋め込みベクトル

OpenAIのVector Store APIを使用すると、テキストデータをベクトル化して保存・検索できます。これによりセマンティック検索を実現します。

# Python - ベクターストアを作成
vector_store = openai.VectorStore.create(
    name="company_knowledge_base"
)

# テキストを埋め込み、ベクターストアに追加
batch = openai.VectorStore.Batch.create(
    vector_store_id=vector_store.id,
    inputs=[
        {"text": "当社の主力商品はAIアシスタントです。"},
        {"text": "2024年度の売上目標は前年比120%です。"}
    ]
)

# ベクターストア検索を使用して回答を生成
response = openai.Response.create(
    model="gpt-4.1",
    instructions="社内知識ベースに基づいて回答してください",
    input="弊社の主力商品と今年度の売上目標を教えてください",
    tools=[{
        "type": "vector_store",
        "vector_store_ids": [vector_store.id]
    }],
    temperature=0.3
)
メタデータフィルタリング: カテゴリやタグなどのメタデータで検索結果を絞り込み可能
類似度スコア: 検索結果の関連性をスコアで評価、閾値設定も可能
料金: 保存1GB/日$0.10(初1GB無料)、検索1,000回あたり$0.50
💡 ヒント: チャンク(分割)サイズの最適化が重要です。小さすぎると文脈が失われ、大きすぎると関連性の低い情報まで取得されます
🔧

⚙️ カスタムRAGパイプラインの実装

外部実装

より柔軟なRAGを実現するため、独自の検索システムと連携するカスタム実装も可能です。

# Python - 外部検索システムからデータを取得し、コンテキストとして提供
def custom_rag_pipeline(user_query):
    # 1. 外部検索システム(Elasticsearch、Pinecone、自社DBなど)から関連データを取得
    search_results = external_search_system.search(user_query)
    
    # 2. 検索結果を整形してコンテキストとして準備
    context = format_search_results(search_results)
    
    # 3. コンテキストを含めてResponses APIに送信
    response = openai.Response.create(
        model="gpt-4.1",
        instructions="以下のコンテキスト情報に基づいて回答してください。",
        input=f"コンテキスト情報:\n{context}\n\n質問: {user_query}",
        temperature=0.3
    )
    
    return response.output_text
🔍 クエリ拡張

ユーザークエリを複数の検索クエリに展開し、より広範な情報を取得するテクニック

🔄 再ランキング

検索結果を再評価して関連性順に並べ替え、最も重要な情報を優先

📥 コンテキスト圧縮

長い検索結果を要約して重要なポイントのみを抽出し、トークン消費を節約

📊

📈 マルチステップRAG

高度な手法

より高度なRAG実装として、複数のステップや反復を組み込んだ拡張手法が効果的です。

🔁 反復RAG

初回の回答を生成後、不確かな点について追加検索を行い回答を洗練させる

🧠 思考連鎖RAG

複雑なクエリを段階的に処理し、推論ステップごとに必要な情報を検索

🔄 ハイパーRAG

複数の検索エンジンや知識ソースを組み合わせ、より多角的な情報を統合

# Python - 反復RAGの実装例
def iterative_rag(user_query):
    # 初回の回答を生成
    initial_response = openai.Response.create(
        model="gpt-4.1",
        instructions="質問に答え、不確かな点や追加で調査すべき点を特定してください",
        input=user_query,
        tools=[{"type": "web_search"}]
    )
    
    # 不確かな点を抽出
    uncertain_points = extract_uncertain_points(initial_response.output_text)
    
    # 追加情報を検索
    additional_context = ""
    for point in uncertain_points:
        search_results = perform_focused_search(point)
        additional_context += f"追加情報({point}): {search_results}\n\n"
    
    # 最終回答を生成
    final_response = openai.Response.create(
        model="gpt-4.1",
        instructions="初回の回答と追加情報を基に、より正確で包括的な回答を提供してください",
        input=f"初回回答: {initial_response.output_text}\n\n追加情報: {additional_context}\n\n質問: {user_query}",
        temperature=0.3
    )
    
    return final_response.output_text

🚀 性能最適化のベストプラクティス

効率化

RAGを効率的かつ費用対効果の高い方法で実装するためのベストプラクティスです。

適切なチャンクサイズ: ドキュメントを適切な大きさ(数百トークン程度)に分割してインデックス化
クエリ拡張: ユーザークエリをLLMで前処理して検索の効率を向上
重複除去: 類似した検索結果をフィルタリングしてトークン消費を削減
コンテキスト圧縮: 検索結果を要約してトークン数を削減(特に多数の結果がある場合)
キャッシング: 頻出クエリの検索結果をキャッシュして応答速度を向上
モデル選択: 軽量モデル(GPT-4o-mini等)を使った前処理と高性能モデルでの生成を使い分け
📊 測定: 精度(回答の正確さ)、レイテンシ(応答時間)、コスト効率(トークン消費)、網羅性(必要情報の取得率)などのメトリクスを測定して継続的に改善することが重要です
🎯

RAG応答の品質向上テクニック

精度向上

検索結果を効果的に応答に反映させるための高度なテクニックです。

📝 指示の工夫

「提供されたコンテキスト情報を注意深く分析し、関連する事実のみを使用して回答してください」など、明確な指示を与える

🧩 検索結果ラベリング

検索結果に出典やメタデータを付与し、モデルが情報の信頼性を評価しやすくする

⚖️ 情報の重み付け

検索結果の信頼性や関連性に基づいて重み付けし、より重要な情報を優先させる

🔍 根拠の表示

回答の各部分がどの検索結果に基づいているかを示す引用機能を実装

# 指示の最適化例
instructions = """
あなたは正確な情報提供を行うアシスタントです。以下のガイドラインに従ってください:

1. 提供されたコンテキスト情報のみに基づいて回答してください
2. コンテキストに情報がない場合は「その情報はコンテキストに含まれていません」と明示してください
3. 各情報の出典を[出典1]のように明記してください
4. コンテキスト情報の矛盾点があれば指摘してください
5. 確信が持てない場合は、その不確実性を伝えてください
"""
📚

📋 その他のResponses API連携情報

連携事例

RAGパイプラインをさらに強化するための追加情報です。

手法/機能 概要 適用場面
ハイブリッドRAG キーワード検索とセマンティック検索を組み合わせる 専門用語が多い技術文書
マルチモーダルRAG テキスト+画像データの検索と生成 図表を含む説明が必要な場合
Assistants API移行 既存のAssistants APIからResponses APIへの移行 新機能活用とコード簡素化
LangChain連携 外部LLMフレームワークとの統合 複雑なRAGワークフロー実装
「RAGは単なる検索結果表示ではなく、情報の理解と統合プロセスです。文脈に合わせた関連情報の取得と、それを自然に応答に組み込む能力が重要です」
比較

🔍 RAG実装方式の比較

実装方式 メリット デメリット 推奨ユースケース
内蔵Web検索 実装が簡単、最新情報取得可能 コスト高、情報ソース制御不可 一般的な質問、最新トレンド
内蔵ファイル検索 実装容易、標準化された処理 大規模データ向きでない 社内文書、製品マニュアル
Vector Store API セマンティック検索、管理容易 柔軟性に制限あり 中規模知識ベース
カスタムRAG実装 完全な制御性、柔軟なパイプライン 実装複雑、維持管理コスト高 大規模企業データ、特殊検索
ハイブリッド方式 内蔵ツールと自前実装の長所を組合せ 設計の複雑さ、統合の難しさ 多様なデータソースを扱う場合
🧩 選択基準: データ量、更新頻度、セキュリティ要件、予算、既存システムとの統合しやすさなどを総合的に検討して最適な実装方式を選びましょう
実装例

💻 実践的なRAG実装例

# Python - ハイブリッドRAG実装の完全な例

import openai
from typing import List, Dict, Any
import json

openai.api_key = "YOUR_API_KEY"

class HybridRAGSystem:
    def __init__(self, vector_store_id: str = None):
        self.vector_store_id = vector_store_id
        
    def create_vector_store(self, name: str):
        """ベクターストアを作成"""
        vector_store = openai.VectorStore.create(name=name)
        self.vector_store_id = vector_store.id
        return vector_store.id
        
    def add_documents(self, documents: List[str], metadata: List[Dict] = None):
        """ドキュメントをベクターストアに追加"""
        if not self.vector_store_id:
            raise ValueError("Vector store ID not set. Create a vector store first.")
            
        inputs = []
        for i, doc in enumerate(documents):
            input_item = {"text": doc}
            if metadata and i < len(metadata):
                input_item["metadata"] = metadata[i]
            inputs.append(input_item)
            
        batch = openai.VectorStore.Batch.create(
            vector_store_id=self.vector_store_id,
            inputs=inputs
        )
        return batch
        
    def preprocess_query(self, user_query: str) -> str:
        """クエリを前処理して検索効率を向上"""
        response = openai.Response.create(
            model="gpt-4o-mini",  # 軽量モデルを使用
            instructions="ユーザーの質問を検索クエリに最適化してください。重要なキーワードを抽出し、同義語や関連語も含めて、検索に適した形に変換してください。",
            input=f"元の質問: {user_query}",
            temperature=0.3,
            max_output_tokens=100
        )
        return response.output_text
        
    def answer_with_rag(self, user_query: str, use_web_search: bool = True) -> str:
        """ハイブリッドRAGを使用して回答を生成"""
        # 1. クエリを前処理
        optimized_query = self.preprocess_query(user_query)
        
        # 2. ツールの設定
        tools = []
        
        # ベクターストア検索を追加(社内知識)
        if self.vector_store_id:
            tools.append({
                "type": "vector_store",
                "vector_store_ids": [self.vector_store_id]
            })
            
        # Web検索を追加(外部知識)
        if use_web_search:
            tools.append({
                "type": "web_search",
                "parameters": {
                    "max_results": 5  # 結果数を制限してコスト削減
                }
            })
            
        # 3. 最終回答を生成
        instructions = """
        あなたは正確な情報提供を行うアシスタントです。以下のガイドラインに従ってください:
        
        1. 提供された社内知識ベース(vector_store)を優先的に参照してください
        2. 社内知識に情報がない場合のみウェブ検索結果を使用してください
        3. 各情報の出典を明記し、社内情報と外部情報を区別してください
        4. 情報の信頼性や鮮度を考慮して回答を構成してください
        5. 確信が持てない場合は、その不確実性を伝えてください
        """
        
        response = openai.Response.create(
            model="gpt-4.1",  # 高性能モデルで回答生成
            instructions=instructions,
            input=optimized_query,
            tools=tools,
            temperature=0.5
        )
        
        return response.output_text

# 使用例
rag_system = HybridRAGSystem()
vector_store_id = rag_system.create_vector_store("company_knowledge")

# 社内ドキュメントを追加
documents = [
    "当社の2025年第1四半期の売上は前年比115%の2億3000万円でした。",
    "新製品「AIアシスタントPro」は2025年6月15日に発売予定です。価格は月額9,800円からとなります。"
]
metadata = [
    {"category": "finance", "date": "2025-04-01"},
    {"category": "product", "date": "2025-05-10"}
]
rag_system.add_documents(documents, metadata)

# 質問に回答
answer = rag_system.answer_with_rag("2025年の新製品情報と売上予測を教えてください")
print(answer)
「実用的なRAGシステムでは、クエリ処理、情報検索、コンテキスト構築、回答生成という一連のパイプラインを最適化することが重要です。データの特性や要件に合わせて各ステップをカスタマイズし、継続的に改善していくことで、より質の高い情報提供が可能になります」