> ## Documentation Index
> Fetch the complete documentation index at: https://docs.jinba.io/llms.txt
> Use this file to discover all available pages before exploring further.

# RAG チャットシステムの構築

> Jinba Flow を使って、ナレッジベースのセットアップからチャットインターフェースのデプロイまで、RAG（検索拡張生成）チャットシステムを構築するステップバイステップチュートリアル

自社のドキュメントに基づいて質問に回答する AI チャットシステムを構築しましょう。このチュートリアルでは、ナレッジベースの作成、RAG ワークフローの構築、チャットインターフェースとしてのデプロイまで、すべてのステップを順を追って説明します。

## 構築するもの

以下の機能を持つチャットシステムを構築します：

1. ユーザーの質問を受け付ける（チャット、API、または AI アシスタント経由）
2. ナレッジベースから関連情報を検索する
3. AI モデルを使用して、ドキュメントに基づいた正確な回答を生成する
4. ソースの参照情報付きで回答を返す

```mermaid theme={null}
flowchart LR
    Q["💬 ユーザーの質問"] --> S["🔍 ベクトル検索<br/>ナレッジベース"]
    S --> C["📋 コンテキスト<br/>の組み立て"]
    C --> G["🤖 AI 生成<br/>コンテキスト付き"]
    G --> A["✅ 根拠に基づいた<br/>回答"]
```

## 前提条件

* Jinba Flow アカウント（[こちらからサインアップ](https://flow.jinba.io/)）
* アップロードするドキュメント — PDF、DOCX、またはテキストファイル
* [Jinba Flow の基本概念](/ja/pages/basics/core-concepts)（フロー、ステップ、ツール）の基本的な理解

<Note>
  コーディング経験は不要です。チャットパネルまたはグラフエディタを使用してシステム全体を構築できます。以下に示す YAML マニフェストは参考用であり、そのままコピーして使用できます。
</Note>

## アーキテクチャ概要

構築を始める前に、全体の仕組みを確認しましょう：

```mermaid theme={null}
flowchart TB
    subgraph input["チャット入力"]
        A1["Jinba App チャット"]
        A2["REST API"]
        A3["MCP / AI アシスタント"]
    end

    subgraph flow["Jinba Flow — RAG パイプライン"]
        B1["質問受信<br/>INPUT_TEXT"]
        B2["ナレッジベース検索<br/>JINBA_VECTOR_SEARCH"]
        B3["回答生成<br/>OPENAI_INVOKE or ANTHROPIC_INVOKE"]
    end

    subgraph kb["ナレッジバックエンド"]
        C1["Jinba ナレッジベース"]
        C2["Pinecone"]
        C3["Azure AI Search"]
    end

    A1 & A2 & A3 --> B1
    B1 --> B2
    B2 --> C1
    B2 -.-> C2
    B2 -.-> C3
    C1 & C2 & C3 --> B3
    B3 --> A1 & A2 & A3
```

<Tip>
  このチュートリアルでは **Jinba ナレッジベース** をメインのバックエンドとして使用します。他のバックエンドについては、末尾の[代替バックエンド](#代替バックエンド)をご覧ください。
</Tip>

***

## パート 1: ナレッジベースのセットアップ

### ステップ 1: ナレッジベースの作成

<Steps>
  <Step title="ストレージへ移動">
    ワークスペースのサイドバーで **ストレージ** をクリックし、**ナレッジベース** タブを選択します。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/create-kb-storage.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=db58cc0f028ca89c0b709f66102d060f" alt="ストレージ ナレッジベース画面" width="253" height="395" data-path="ja/pages/tutorials/images/create-kb-storage.png" />
  </Step>

  <Step title="新しいナレッジベースを作成">
    **ナレッジベースを作成** をクリックします。わかりやすい名前を入力してください（例：「製品ドキュメント」「社内FAQ」）。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/create-kb-button.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=309de8dd9e43492c3a8a1787b7bc05ac" alt="ナレッジベース作成ボタン" width="184" height="41" data-path="ja/pages/tutorials/images/create-kb-button.png" />
  </Step>

  <Step title="ナレッジベース ID をメモ">
    作成後、ナレッジベース ID をメモしておきます。フローを構築する際に必要です。ナレッジベースの設定画面や URL で確認できます。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/kb-created.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=ba2f5ade0377884351af1ab02595da3b" alt="ナレッジベース作成完了" width="398" height="286" data-path="ja/pages/tutorials/images/kb-created.png" />
  </Step>
</Steps>

### ステップ 2: ドキュメントのアップロード

<Steps>
  <Step title="ナレッジベースを開く">
    ストレージページから、作成したナレッジベースをクリックします。
  </Step>

  <Step title="ファイルをアップロード">
    **ファイルをアップロード** または **ファイルを追加** をクリックし、PDF、DOCX、またはテキストファイルを選択します。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/upload-files-kb.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=ee811ddfdb312fef6529319801e08a29" alt="ナレッジベースへのファイルアップロード" width="609" height="763" data-path="ja/pages/tutorials/images/upload-files-kb.png" />
  </Step>

  <Step title="処理完了を待つ">
    ファイルは以下のパイプラインで自動的に処理されます：

    | ステージ        | 処理内容                |
    | ----------- | ------------------- |
    | **パース**     | ドキュメントからテキストを抽出     |
    | **チャンキング**  | ドキュメントを検索可能なチャンクに分割 |
    | **エンベディング** | チャンクをベクトル埋め込みに変換    |
    | **インデキシング** | 高速類似検索のためにベクトルを保存   |

    すべてのファイルが **「完了」** ステータスを表示するまでお待ちください。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/file-processing-status.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=ac9d16d39b90c0b320703cc7bca3956f" alt="ファイル処理ステータス" width="1645" height="445" data-path="ja/pages/tutorials/images/file-processing-status.png" />
  </Step>
</Steps>

<Warning>
  ファイルサイズによっては、処理に数分かかる場合があります。ファイルの処理が完了するまで次のステップに進まないでください。
</Warning>

### ステップ 3: 認証情報の設定

フローを構築する前に、必要なシークレットをワークスペースに保存します。

<Steps>
  <Step title="認証情報ページへ移動">
    [ワークスペースの認証情報](/ja/pages/credentials/index)ページを開きます。
  </Step>

  <Step title="シークレットを追加">
    以下のシークレットを追加します：

    | シークレット名             | 値                       | 用途              |
    | ------------------- | ----------------------- | --------------- |
    | `JINBA_API_TOKEN`   | Jinba API トークン          | ベクトル検索の認証       |
    | `KNOWLEDGE_BASE_ID` | ステップ 1 のナレッジベース ID      | 検索対象のナレッジベースを指定 |
    | `ANTHROPIC_API_KEY` | Anthropic API キー *（任意）* | Claude ベースの生成用  |

    <Note>
      OpenAI API キーがなくても、`OPENAI_INVOKE` ツールは [Jinba API クレジット](/ja/pages/tools/ai/openai)で利用できます。
    </Note>
  </Step>
</Steps>

***

## パート 2: RAG フローの構築

チャットシステムを動かすワークフローを作成します。

### 完全なマニフェスト

以下を [YAML コーディングパネル](/ja/pages/basics/manifest)に直接貼り付けできます：

```yaml theme={null}
# ステップ 1: ユーザーの質問を受け取る
- id: user_question
  name: Receive Question
  tool: INPUT_TEXT
  input:
    - name: value
      value: ""

# ステップ 2: ナレッジベースから関連コンテンツを検索
- id: search_knowledge
  name: Search Knowledge Base
  tool: JINBA_VECTOR_SEARCH
  config:
    - name: token
      value: "{{secrets.JINBAFLOW_WS_API_KEY}}"
  input:
    - name: query
      value: "{{steps.user_question.result}}"
    - name: knowledgeBaseId
      value: YOUR_KB_ID_HERE
    - name: topK
      value: 5
    - name: threshold
      value: 0.3
  needs:
    - user_question

# ステップ 3: 取得したコンテキストを使って回答を生成
- id: generate_answer
  name: Generate Answer
  tool: OPENAI_INVOKE
  config:
    - name: version
      value: gpt-4o
  input:
    - name: prompt
      value: |
        ## 指示
        あなたは、提供されたドキュメントに基づいて質問に回答する親切なアシスタントです。
        コンテキストに回答がない場合は、「その質問に回答するための十分な情報がありません。」と述べてください。
        常にどの出典ドキュメントから回答しているかを引用してください。

        ## コンテキスト（ナレッジベースから）
        {{steps.search_knowledge.results | dump}}

        ## ユーザーの質問
        {{steps.user_question.result}}

        上記のコンテキストに基づいて、明確で簡潔な回答を提供してください。
  needs:
    - search_knowledge

# ステップ 4: 回答を出力
- id: output_answer
  name: Output Answer
  tool: OUTPUT_TEXT
  input:
    - name: value
      value: "{{steps.generate_answer.result.content}}"
  needs:
    - generate_answer
```

<Tip>
  最短ルートは上記の YAML マニフェストをそのまま貼り付ける方法です。ノードを視覚的に組み立てたい場合は、エディタ上で 4 つのノードを手動追加して設定することもできます。
</Tip>

### 代替手順: エディタでフローを手動構築する

YAML を貼り付ける代わりに、各ノードを手動で追加して構築したい場合は、以下の手順に従ってください。

<Steps>
  <Step title="Input Text ノードを追加する">
    ノードピッカーを開いて **Input Text** を検索し、グラフの最初のノードとして追加します。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/manual-add-input-text.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=ae4f71ae3fecc8f243a4eb0e9babd68f" alt="手動構築 - Input Text ノードを追加" width="916" height="632" data-path="ja/pages/tutorials/images/manual-add-input-text.png" />

    追加後、ノード名を **Receive Question** に変更して、チュートリアルのマニフェストと揃えます。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/manual-configure-input-text.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=bc6f9c67b92cf6c505e748d906336897" alt="手動構築 - Receive Question を設定" width="1875" height="942" data-path="ja/pages/tutorials/images/manual-configure-input-text.png" />
  </Step>

  <Step title="Vector Search ノードを追加して設定する">
    最初のノードの下にある **+** コネクタをクリックし、**Vector Search** を検索して `JINBA_VECTOR_SEARCH` ノードを追加します。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/manual-add-vector-search.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=9125318d3f142b8c5305ebe7fd00c501" alt="手動構築 - Vector Search ノードを追加" width="919" height="627" data-path="ja/pages/tutorials/images/manual-add-vector-search.png" />

    次のように設定します：

    * **Token**: `JINBAFLOW_WS_API_KEY` シークレット
    * **Query**: `{{steps.user_question.result}}`
    * **Knowledge Base ID**: あなたのナレッジベース ID
    * **Top K**: `5`
    * **Threshold**: `0.3`

          <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/manual-configure-vector-search.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=10ca4579704f0e80236c2ac8fe6680f8" alt="手動構築 - Vector Search ノードを設定" width="1898" height="971" data-path="ja/pages/tutorials/images/manual-configure-vector-search.png" />
  </Step>

  <Step title="OpenAI Invoke ノードを追加して設定する">
    **Invoke** ノードを追加し、`OPENAI_INVOKE` を選択します。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/manual-add-openai-invoke.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=59c585095a6d900880ea98bc5645c512" alt="手動構築 - OpenAI Invoke ノードを追加" width="908" height="607" data-path="ja/pages/tutorials/images/manual-add-openai-invoke.png" />

    モデルバージョンを `gpt-4o` に設定し、YAML 例にあるものと同じプロンプトを貼り付けて、取得したナレッジベースのコンテキストだけを使って回答するようにします。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/manual-configure-openai-invoke.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=dc3189553ca7257da1553e94c1975dc9" alt="手動構築 - OpenAI Invoke ノードを設定" width="1871" height="948" data-path="ja/pages/tutorials/images/manual-configure-openai-invoke.png" />
  </Step>

  <Step title="Output Text ノードを追加して設定する">
    最後に **Output Text** ノードを追加します。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/manual-add-output-text.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=014b24e47de59ca68df3eb63c02ba088" alt="手動構築 - Output Text ノードを追加" width="904" height="590" data-path="ja/pages/tutorials/images/manual-add-output-text.png" />

    ノード名を **Output Answer** に変更し、値に以下を設定します：

    ```text theme={null}
    {{steps.generate_answer.result.content}}
    ```

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/manual-configure-output-text.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=fe6abaa9871ebad3ea5f1ebc73472747" alt="手動構築 - Output Text ノードを設定" width="1870" height="938" data-path="ja/pages/tutorials/images/manual-configure-output-text.png" />
  </Step>
</Steps>

### ステップごとの解説

#### ステップ 1: 質問の受信（`INPUT_TEXT`）

```yaml theme={null}
- id: user_question
  name: Receive Question
  tool: INPUT_TEXT
  input:
    - name: value
      value: ""
```

`INPUT_TEXT` ツールはフローの入力パラメータを作成します。手動実行時にはテキストボックスが表示されます。API 経由で呼び出す場合は、リクエストボディのパラメータとなります。[入力ツール](/ja/pages/tools/files/input)の詳細を参照してください。

#### ステップ 2: ナレッジベースの検索（`JINBA_VECTOR_SEARCH`）

```yaml theme={null}
- id: search_knowledge
  name: Search Knowledge Base
  tool: JINBA_VECTOR_SEARCH
  config:
    - name: token
      value: "{{secrets.JINBAFLOW_WS_API_KEY}}"
  input:
    - name: query
      value: "{{steps.user_question.result}}"
    - name: knowledgeBaseId
      value: YOUR_KB_ID_HERE
    - name: topK
      value: 5
    - name: threshold
      value: 0.3
  needs:
    - user_question
```

このステップはセマンティック検索を実行します。キーワードの完全一致ではなく、意味に基づいてコンテンツを検索します。

| パラメータ       | 値   | 理由                   |
| ----------- | --- | -------------------- |
| `topK`      | 5   | 最も関連性の高い 5 つのチャンクを返す |
| `threshold` | 0.3 | 関連度の低い結果をフィルタリング     |

`needs: [user_question]` により、検索はユーザーの質問を受け取ってから実行されます。詳しくは[ステップモジュールオプション](/ja/pages/basics/step-options)をご覧ください。

<Tip>
  `topK: 5`、`threshold: 0.3` から始めましょう。回答にコンテキストが不足する場合は `topK` を増やし、関連性の低いコンテンツが含まれる場合は `threshold` を上げてください。詳しくは[ベクトル検索リファレンス](/ja/pages/tools/jinba/vector_search)をご覧ください。
</Tip>

#### ステップ 3: 回答の生成（LLM）

```yaml theme={null}
- id: generate_answer
  name: Generate Answer
  tool: OPENAI_INVOKE
  config:
    - name: version
      value: gpt-4o
  input:
    - name: prompt
      value: |
        コンテキストに基づいて回答してください...
        {{steps.search_knowledge.results | dump}}
        ...
  needs:
    - search_knowledge
```

`{{steps.search_knowledge.results | dump}}` テンプレートは検索結果をプロンプトに注入します。`gpt-4o` モデルにより、高品質な回答を生成します。[変数とテンプレート](/ja/pages/basics/variables)で詳しく学べます。

#### ステップ 4: 回答の出力（`OUTPUT_TEXT`）

```yaml theme={null}
- id: output_answer
  name: Output Answer
  tool: OUTPUT_TEXT
  input:
    - name: value
      value: "{{steps.generate_answer.result.content}}"
  needs:
    - generate_answer
```

`OUTPUT_TEXT` はフローの最終出力を定義します。チャットインターフェースでは、このステップの出力がユーザーに表示されます。

<AccordionGroup>
  <Accordion title="OpenAI の代わりに Anthropic Claude を使用する">
    生成ステップを以下に置き換えます：

    ```yaml theme={null}
    - id: generate_answer
      name: Generate Answer
      tool: ANTHROPIC_INVOKE
      config:
        - name: version
          value: claude-3-5-sonnet-20241022
        - name: token
          value: "{{secrets.ANTHROPIC_API_KEY}}"
      input:
        - name: prompt
          value: |
            ... （上記と同じプロンプト）
      needs:
        - search_knowledge
    ```

    詳しくは [Anthropic ツールリファレンス](/ja/pages/tools/ai/anthropic)をご覧ください。
  </Accordion>

  <Accordion title="OpenAI の代わりに Google Gemini を使用する">
    生成ステップを以下に置き換えます：

    ```yaml theme={null}
    - id: generate_answer
      name: Generate Answer
      tool: GEMINI_INVOKE
      config:
        - name: version
          value: gemini-1.5-flash
        - name: token
          value: "{{secrets.GEMINI_API_KEY}}"
      input:
        - name: prompt
          value: |
            ... （上記と同じプロンプト）
      needs:
        - search_knowledge
    ```

    詳しくは [Gemini ツールリファレンス](/ja/pages/tools/ai/gemini)をご覧ください。
  </Accordion>
</AccordionGroup>

### フローのテスト

<Steps>
  <Step title="フローを実行">
    フローエディタの右上にある **実行** ボタンをクリックします。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/flow-editor-rag.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=d15618fe80069dde029fd9b42684796e" alt="グラフエディタでの RAG フロー" width="1919" height="996" data-path="ja/pages/tutorials/images/flow-editor-rag.png" />
  </Step>

  <Step title="テスト質問を入力">
    プロンプトが表示されたら、アップロードしたドキュメントで回答可能な質問を入力します。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/flow-run-input.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=db74b7587714a62baaa355bbb3d059a9" alt="テスト質問の入力ダイアログ" width="809" height="351" data-path="ja/pages/tutorials/images/flow-run-input.png" />
  </Step>

  <Step title="結果を確認">
    実行結果を確認します。回答にはナレッジベースの情報が参照されているはずです。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/flow-execution-result.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=787e9dc1a01efbca66eb68ce2de3825a" alt="実行結果" width="621" height="359" data-path="ja/pages/tutorials/images/flow-execution-result.png" />
  </Step>
</Steps>

***

## パート 3: チャットインターフェースとしてデプロイ

RAG フローが動作確認できました。次はユーザーがアクセスできるようにします。

<CardGroup cols={3}>
  <Card title="Jinba App チャット" icon="comments">
    最適な用途：既製のチャット UI が必要なエンドユーザー向け
  </Card>

  <Card title="REST API" icon="code">
    最適な用途：カスタムアプリケーションや外部連携
  </Card>

  <Card title="MCP ツール" icon="robot">
    最適な用途：AI アシスタント連携
  </Card>
</CardGroup>

### オプション A: Jinba App チャット（推奨）

RAG フローを Jinba App のチャットコネクタとしてデプロイし、最もシンプルなエンドユーザー体験を提供します。

<Steps>
  <Step title="フローを公開">
    フローエディタで **公開** ボタンをクリックします。**「このワークフローを誰がトリガーしますか？」** というダイアログが表示されます：

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/publish-flow-button.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=4e085bbc6710eff6929376ab98baed16" alt="フローを公開" width="307" height="56" data-path="ja/pages/tutorials/images/publish-flow-button.png" />

    | オプション         | 説明                  | 選択するタイミング                    |
    | ------------- | ------------------- | ---------------------------- |
    | **My team**   | 誰でも使えるシンプルなインターフェース | ✅ チャット UI パス（オプション A）にはこれを選択 |
    | **Engineers** | コードから API 経由で呼び出す   | API パス（オプション B）にはこれを選択       |
    | **Automatic** | スケジュールまたはイベント発生時に実行 | スケジュール/イベント駆動フロー向け           |

    **My team** を選択し、**Continue →** をクリックします。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/publish-trigger-dialog.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=832d48c2c24208e3781de40df2ba3368" alt="トリガータイプの選択" width="539" height="431" data-path="ja/pages/tutorials/images/publish-trigger-dialog.png" />
  </Step>

  <Step title="Jinba Flow → Jinba App の関係を理解する">
    「My team」を選択すると、**Jinba Flow**（構築する場所）と **Jinba App**（チームが使用する場所）が別々の製品であることを説明する教育画面が表示されます：

    * **設計上の分離** — Jinba Flow はビルダー、Jinba App はチームが使うチャットインターフェース
    * **エンタープライズグレードのセキュリティ** — Jinba App は独自の認証とアクセス制御を持つ
    * **チームにとってシンプル** — コード不要、複雑さなし — 慣れ親しんだチャットインターフェース

    **Got it, continue** をクリックして MCP セットアップに進みます。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/flow-app-education.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=e4554ab58ae95ccc970639bca10898fb" alt="Flow と App の関係説明画面" width="532" height="696" data-path="ja/pages/tutorials/images/flow-app-education.png" />
  </Step>

  <Step title="MCP を有効化して Jinba App に接続">
    **Create an MCP** ダイアログが表示されます。フローがチャットツールとしてどのように表示されるかのプレビューが表示されます：

    * `@フロー名` と説明のチャットプレビュー
    * チャット体験を試せる **Demo** ボタン
    * **Enable MCP for this flow** トグル

          <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/create-mcp-dialog.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=0162e46cbd69e3adfd2df50136c1643b" alt="MCP 作成ダイアログ" width="527" height="376" data-path="ja/pages/tutorials/images/create-mcp-dialog.png" />

    <Warning>
      **Enable MCP for this flow** トグルを必ず**オン**にしてください。これが Jinba Flow と Jinba App の間の接続を作成します — 「Connect with Jinba App」ボタンは有効化後にのみ表示されます。
    </Warning>

    有効化すると、追加オプションが表示されます：

    * **Workspace Token** — 認証に使用
    * **Connection Snippet** — MCP クライアント（Claude Desktop、Cursor など）用の JSON 設定
    * **Connect with Jinba App** ボタン — クリックして Jinba App でコネクタを開きます

    <Tip>
      MCP を有効にすると、AI アシスタント（Claude、Cursor など）からもこのフローをツールとして呼び出せるようになります — Jinba App チャット**と** MCP ツールアクセスの両方を1つのトグルで取得できます。
    </Tip>

    詳しくは[公開](/ja/pages/basics/publish)をご覧ください。
  </Step>

  <Step title="MCP 接続設定の構成">
    MCP を有効にすると、**MCP → Connect** タブに移動します。このページにはいくつかの重要なセクションがあります：

    1. **Your Token** — ワークスペース認証トークン（秘密にしてください）
    2. **1-Click Connect** — **Connect** をクリックして、このフローを Jinba App に即座にリンク
    3. **Visibility** — デフォルトは「Unlisted」（アクセスルールのユーザーのみ使用可能）。全ワークスペースメンバーに表示したい場合は「Listed」に変更
    4. **Access Scope Settings** — JWT クレームを使用してアクセス権を設定（例：メールホワイトリスト）
    5. **MCP Configuration JSON Snippet** — 外部 MCP クライアント（Claude Desktop、Cursor など）で使用するためにコピー

           <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/mcp-connect-tab.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=07a8a8fd8f25618f878615b96496f67f" alt="MCP Connect タブ" width="1670" height="1053" data-path="ja/pages/tutorials/images/mcp-connect-tab.png" />

    <Warning>
      Jinba App でフローをツールとして利用するには、**1-Click Connect** ボタンを必ずクリックしてください。この手順を行わないと、MCP が有効でも Jinba App にツールが表示されません。
    </Warning>

    <Tip>
      チームメンバーのメールアドレスを **Access Scope Settings** に追加して、彼らもこのツールを使えるようにしましょう。**+ Add Rule** をクリックしてメールルールを追加できます。
    </Tip>
  </Step>

  <Step title="RAG システムとチャット">
    [Jinba App](https://app.jinba.io/) を開き、新しいチャットを開始します：

    1. **新しいチャット** をクリック
    2. チャット入力の下にある**コネクタ**アイコン（⚙️）をクリック
    3. 「Search agents and connectors...」ドロップダウンで、ワークスペースの **MCP コネクタ**（例：「Tutorial Demonstrations MCP ... 1 tool」）を見つける
    4. MCP コネクタをクリックして、**RAG Chat Demo** ツールが一覧に表示されることを確認
    5. ツールを選択 — チャット入力バーにタグとして表示されます
    6. 質問を入力して Enter を押す

           <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/jinba-app-connector-select.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=c886a1c5f279d66a6a24562a7895220f" alt="コネクタ選択" width="418" height="269" data-path="ja/pages/tutorials/images/jinba-app-connector-select.png" />

    ツールが自動的に実行されます — 展開可能なセクションに **Arguments**（`user_question`）と **Result**（RAG レスポンスのコンテンツ）が表示され、その後に AI のフォーマット済み回答が続きます。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/jinba-app-chat-rag.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=292cca750de41d839c444b67e3721488" alt="Jinba App での RAG チャット" width="793" height="922" data-path="ja/pages/tutorials/images/jinba-app-chat-rag.png" />

    <Tip>
      **Auto Select** モードも使用できます — Jinba App が質問に基づいて適切なツールを自動的に選択するため、毎回手動でコネクタを選択する必要がありません。
    </Tip>

    詳しくは [Jinba Flow コネクタ](/ja/pages/jinba_app/connectors/jinbaflow)をご覧ください。
  </Step>
</Steps>

<Tip>
  このコネクタにカスタム指示を組み合わせた [Jinba App エージェント](/ja/pages/jinba_app/agents/overview)を作成することもできます。
</Tip>

### オプション B: REST API

RAG フローを API エンドポイントとして公開し、カスタムアプリケーションで利用します。

<Steps>
  <Step title="フローを公開">
    上記と同じ公開手順に従いますが、「このワークフローを誰がトリガーしますか？」ダイアログで **Engineers** を選択します。これにより、API アクセスに最適化されます。
  </Step>

  <Step title="API キーを取得">
    公開後、フローの設定画面から自動生成された API キーを確認します。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/api-key-location.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=d59f425a3785904060f65f58b192aaa3" alt="API キーの場所" width="1914" height="951" data-path="ja/pages/tutorials/images/api-key-location.png" />
  </Step>

  <Step title="API を呼び出す">
    ```bash theme={null}
    curl -X POST https://api.jinba.dev/api/v2/external/flows/{flow-id}/published-run \
      -H "Authorization: Bearer YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "args": [
          {"name": "user_question", "value": "返品ポリシーについて教えてください"}
        ],
        "mode": "sync"
      }'
    ```

    **Python の例：**

    ```python theme={null}
    import requests

    response = requests.post(
        "https://api.jinba.dev/api/v2/external/flows/{flow-id}/published-run",
        headers={
            "Authorization": "Bearer YOUR_API_KEY",
            "Content-Type": "application/json"
        },
        json={
            "args": [
                {"name": "user_question", "value": "返品ポリシーについて教えてください"}
            ],
            "mode": "sync"
        }
    )
    answer = response.json()
    print(answer)
    ```

    非同期モードやエラーハンドリングの詳細は [API リファレンス](/ja/pages/basics/api)をご覧ください。
  </Step>
</Steps>

### オプション C: MCP ツール（AI アシスタント連携）

RAG フローを Claude Desktop などの AI アシスタントのツールとして利用可能にします。

<Steps>
  <Step title="MCP として公開">
    MCP を有効にしてフローを公開します。ワークスペース設定の **MCP** タブに移動します。

    <img src="https://mintcdn.com/jinba/7gYdJDDfMS9Bs1rw/ja/pages/tutorials/images/mcp-connect-tab.png?fit=max&auto=format&n=7gYdJDDfMS9Bs1rw&q=85&s=07a8a8fd8f25618f878615b96496f67f" alt="MCP 設定" width="1670" height="1053" data-path="ja/pages/tutorials/images/mcp-connect-tab.png" />
  </Step>

  <Step title="AI アシスタントを設定">
    AI アシスタントの設定に Jinba Flow MCP サーバーを追加します：

    ```json theme={null}
    {
      "mcpServers": {
        "jinbaflow": {
          "command": "npx",
          "args": [
            "-y",
            "supergateway",
            "--streamableHttp",
            "https://api.jinba.io/api/v2/workspaces/YOUR_WORKSPACE_ID/mcp",
            "--header",
            "Authorization: Bearer YOUR_TOKEN"
          ]
        }
      }
    }
    ```

    詳しくは [MCP ガイド](/ja/pages/basics/mcp)をご覧ください。
  </Step>

  <Step title="AI アシスタントから使用">
    RAG フローがツールとして表示されます。AI アシスタントがナレッジベースを使って質問に回答できるようになります。
  </Step>
</Steps>

***

## パート 4: 高度なパターン

### クエリ精緻化による複数ステップ RAG

複雑な質問の場合、検索結果を改善する精緻化ステップを追加します：

```yaml theme={null}
- id: user_question
  name: Receive Question
  tool: INPUT_TEXT
  input:
    - name: value
      value: ""

- id: initial_search
  name: Initial Search
  tool: JINBA_VECTOR_SEARCH
  config:
    - name: token
      value: "{{secrets.JINBAFLOW_WS_API_KEY}}"
  input:
    - name: query
      value: "{{steps.user_question.result}}"
    - name: knowledgeBaseId
      value: YOUR_KB_ID_HERE
    - name: topK
      value: 10
  needs:
    - user_question

- id: refine_query
  name: Refine Query
  tool: OPENAI_INVOKE
  config:
    - name: version
      value: gpt-4o
  input:
    - name: prompt
      value: |
        初回の検索結果に基づいて、より具体的な検索クエリを生成してください。

        元の質問: {{steps.user_question.result}}

        初回の検索結果:
        {{steps.initial_search.results | dump}}

        精緻化した検索クエリのみを出力してください。
  needs:
    - initial_search

- id: refined_search
  name: Refined Search
  tool: JINBA_VECTOR_SEARCH
  config:
    - name: token
      value: "{{secrets.JINBAFLOW_WS_API_KEY}}"
  input:
    - name: query
      value: "{{steps.refine_query.result.content}}"
    - name: knowledgeBaseId
      value: YOUR_KB_ID_HERE
    - name: topK
      value: 5
    - name: threshold
      value: 0.4
  needs:
    - refine_query

- id: final_answer
  name: Generate Answer
  tool: OPENAI_INVOKE
  config:
    - name: version
      value: gpt-4o
  input:
    - name: prompt
      value: |
        精緻化された検索結果を使って、ユーザーの質問に回答してください。

        質問: {{steps.user_question.result}}

        精緻化された検索結果:
        {{steps.refined_search.results | dump}}

        ソースの引用を含む、詳細で正確な回答を提供してください。
  needs:
    - refined_search

- id: output_answer
  name: Output Answer
  tool: OUTPUT_TEXT
  input:
    - name: value
      value: "{{steps.final_answer.result.content}}"
  needs:
    - final_answer
```

### 検索結果がない場合の処理

[条件付き実行](/ja/pages/basics/step-options)を使用して、ナレッジベースに関連コンテンツがない場合を適切に処理します：

```yaml theme={null}
- id: check_results
  name: Check Results
  tool: PYTHON_SANDBOX_RUN
  input:
    - name: code
      value: |
        results = {{steps.search_knowledge.result}}
        has_results = len(results.get('results', [])) > 0
        print(has_results)
    - name: data_type
      value: STRING
  needs:
    - search_knowledge

- id: generate_answer
  name: Generate Answer
  tool: OPENAI_INVOKE
  config:
    - name: version
      value: gpt-4o
  input:
    - name: prompt
      value: |
        ... コンテキスト付きの標準 RAG プロンプト ...
  needs:
    - check_results
  when: "'{{steps.check_results.result}}' == 'True'"

- id: no_results_response
  name: No Results Response
  tool: PYTHON_SANDBOX_RUN
  input:
    - name: code
      value: |
        result = "ナレッジベースに関連する情報が見つかりませんでした。質問を言い換えるか、サポートにお問い合わせください。"
    - name: data_type
      value: STRING
  needs:
    - check_results
  when: "'{{steps.check_results.result}}' == 'False'"
```

### ナレッジベースの自動更新

スケジュールされたフローを作成して、ナレッジベースを新しいドキュメントで自動更新します：

```yaml theme={null}
- id: fetch_new_docs
  name: Fetch New Docs
  tool: PYTHON_SANDBOX_RUN
  input:
    - name: code
      value: |
        new_docs = [
            "https://example.com/updated-faq.pdf",
            "https://example.com/new-product-guide.pdf"
        ]
        result = new_docs
    - name: data_type
      value: STRING

- id: add_to_kb
  name: Add to Knowledge Base
  tool: JINBA_KNOWLEDGE_BASE_FILE_ADD
  config:
    - name: token
      value: "{{secrets.JINBAFLOW_WS_API_KEY}}"
  input:
    - name: knowledgeBaseId
      value: YOUR_KB_ID_HERE
    - name: file
      value: "{{item}}"
    - name: executionMode
      value: "SYNCHRONOUS"
    - name: chunkerSettings
      value:
        chunkSize: 512
        chunkOverlap: 128
  needs:
    - fetch_new_docs
  forEach: "{{steps.fetch_new_docs.result}}"
```

このフローを[スケジュール](/ja/pages/basics/scheduling)して、毎日または毎週実行できます。

***

## 代替バックエンド

このチュートリアルでは Jinba ナレッジベースをメインで使用していますが、特定の要件を持つチーム向けに 2 つの追加バックエンドが利用可能です。

### バックエンドの選び方

```mermaid theme={null}
flowchart TD
    Start["どのバックエンドを<br/>使うべき？"] --> Q1{"Azure エコシステムを<br/>利用するエンタープライズ？"}
    Q1 -->|はい| Azure["☁️ Azure AI Search<br/>エンタープライズ"]
    Q1 -->|いいえ| Q2{"メタデータフィルタリング、<br/>名前空間、リランキング<br/>が必要？"}
    Q2 -->|はい| Pinecone["🌲 Pinecone"]
    Q2 -->|いいえ| Q3{"最もシンプルな<br/>セットアップを希望？"}
    Q3 -->|はい| Jinba["⚡ Jinba ナレッジベース"]
    Q3 -->|いいえ| Pinecone
```

| 機能                  | Jinba ナレッジベース      | Pinecone       | Azure AI Search          |
| ------------------- | ------------------ | -------------- | ------------------------ |
| **セットアップの複雑さ**      | ⭐ 最もシンプル           | ⭐⭐ 中程度         | ⭐⭐⭐ 高度                   |
| **外部依存**            | なし                 | Pinecone アカウント | Azure サブスクリプション          |
| **ドキュメントアップロード**    | UI + API           | API のみ         | Azure ポータル / ADLS        |
| **メタデータフィルタリング**    | ❌                  | ✅ リッチなフィルタ構文   | ✅ OData フィルタ             |
| **名前空間の分離**         | ❌                  | ✅              | ✅ インデックス                 |
| **リランキング**          | ❌                  | ✅ 内蔵モデル        | ✅ セマンティックランカー            |
| **インデクサー / パイプライン** | 自動                 | 手動             | ✅ 内蔵インデクサー               |
| **コスト**             | Jinba プランに含まれる     | 別途 Pinecone 課金 | Azure 課金                 |
| **最適な用途**           | 大半のユースケース、クイックスタート | 高度な検索要件        | エンタープライズ / Azure ネイティブ組織 |

### 代替 A: Pinecone

メタデータフィルタリング、名前空間の分離、リランキングが必要な場合は、[Pinecone](/ja/pages/tools/search/pinecone) をベクトルバックエンドとして使用します。

#### Pinecone RAG マニフェスト

検索ステップを Pinecone に置き換えます：

```yaml theme={null}
- id: search_pinecone
  name: Search Pinecone
  tool: PINECONE_QUERY
  config:
    - name: apiKey
      value: "{{secrets.PINECONE_API_KEY}}"
  input:
    - name: indexName
      value: my-knowledge-base
    - name: query
      value: "{{steps.user_question.result}}"
    - name: topK
      value: 5
    - name: includeMetadata
      value: true
    - name: rerankModel
      value: bge-reranker-v2-m3
    - name: rerankTopN
      value: 3
  needs:
    - user_question
```

次に、生成ステップを Pinecone の出力フォーマットに合わせます：

```yaml theme={null}
- id: generate_answer
  name: Generate Answer
  tool: OPENAI_INVOKE
  config:
    - name: version
      value: gpt-4o
  input:
    - name: prompt
      value: |
        あなたは親切なアシスタントです。提供されたコンテキストに基づいて回答してください。

        ## ユーザーの質問
        {{steps.user_question.result}}

        ## 関連ドキュメント
        {{steps.search_pinecone.results | dump}}

        上記のドキュメントに基づいて正確に回答してください。
  needs:
    - search_pinecone
```

詳しくは [Pinecone ツールリファレンス](/ja/pages/tools/search/pinecone)でインデックスの作成とドキュメントの upsert をご覧ください。

### 代替 B: Azure AI Search（エンタープライズ）

Azure エコシステムを既に利用しているエンタープライズ組織向けに、Jinba Flow は **Azure AI Search** を外部ナレッジベースバックエンドとしてサポートしています。高度なインデキシング、セマンティックランキング、Azure Data Lake Storage Gen2 との連携が可能です。

<Warning>
  Azure AI Search 連携は**エンタープライズ機能**です。ワークスペースで有効にするには、Jinba 管理者または Jinba 営業チームにお問い合わせください。
</Warning>

#### 仕組み

Azure AI Search 連携は、組み込みのナレッジベースとは異なる動作をします：

1. **ドキュメントは Azure に保存** — Azure Data Lake Storage Gen2 にアップロード
2. **インデキシングは Azure が処理** — Azure AI Search のインデクサーがドキュメントを処理・インデキシング
3. **検索クエリは Azure を経由** — 直接または Azure API Management (APIM) 経由
4. **結果は Jinba Flow に返される** — LLM が回答を生成

```mermaid theme={null}
flowchart LR
    Upload["📄 ドキュメント<br/>アップロード"] --> ADLS["Azure Data Lake<br/>Storage Gen2"]
    ADLS --> Indexer["Azure AI Search<br/>インデクサー"]
    Indexer --> Index["Azure AI Search<br/>インデックス"]
    Query["🔍 ユーザークエリ"] --> Index
    Index --> Results["📋 検索結果"]
    Results --> LLM["🤖 LLM 生成"]
```

#### セットアップ概要

<Steps>
  <Step title="Azure 接続の設定">
    ワークスペース設定で **外部ナレッジベース** の設定に移動します。2 つのモードで接続できます：

    | モード          | 使用するとき                            |
    | ------------ | --------------------------------- |
    | **APIM モード** | Azure API Management 経由 — 本番環境に推奨 |
    | **ダイレクトモード** | Azure AI Search に直接接続 — 開発用にシンプル  |
  </Step>

  <Step title="Azure リソースのセットアップ">
    以下が必要です：

    * インデックスが設定された Azure AI Search サービス
    * ドキュメント保存用の Azure Data Lake Storage Gen2
    * API キーまたは APIM サブスクリプションキー
    * アップロードされたドキュメントを処理するインデクサーの設定
  </Step>

  <Step title="ドキュメントのアップロード">
    Jinba ワークスペース UI からドキュメントをアップロードします。ファイルは自動的に Azure Data Lake Storage に送信され、設定されたインデクサーが検索インデックスに処理します。
  </Step>

  <Step title="フローでの検索">
    検索ステップは、ワークスペースの外部ナレッジベース設定を使用します。正確なツールとパラメータはエンタープライズデプロイメントに依存します。
  </Step>
</Steps>

#### 主要な設定項目

| 設定                | 説明                               |
| ----------------- | -------------------------------- |
| **エンドポイント URL**   | Azure AI Search または APIM エンドポイント |
| **API キー**        | 認証キー                             |
| **インデックス API パス** | インデックス操作用のパス                     |
| **検索 API パス**     | 検索クエリ用のパス                        |
| **ADLS API パス**   | ファイルストレージ操作用のパス                  |
| **インデクサー名**       | ファイルアップロード後にトリガーするインデクサー         |

<Note>
  接続設定はワークスペースごとに UI で設定でき、環境変数はフォールバックとして機能します。
</Note>

#### Azure AI Search の利点

* **セマンティックランキング**: Azure 内蔵のセマンティックランカーにより、結果の関連性が向上
* **ハイブリッド検索**: ベクトル検索とキーワード検索の組み合わせ
* **内蔵インデクサー**: 様々なファイル形式からコンテンツを自動抽出・インデキシング
* **エンタープライズコンプライアンス**: データは Azure テナント内に保持
* **Azure エコシステム連携**: Azure OpenAI などの他の Azure サービスとの連携

***

## チューニングとベストプラクティス

### チャンキング設定

ファイルを追加する際、コンテンツに合わせてチャンクパラメータを調整します：

| コンテンツタイプ   | チャンクサイズ   | オーバーラップ | 理由              |
| ---------- | --------- | ------- | --------------- |
| FAQ / 短い回答 | 256–512   | 64      | 精密で焦点を絞った検索     |
| 技術ドキュメント   | 512–1024  | 128     | 精密さとコンテキストのバランス |
| 長文コンテンツ    | 1024–2048 | 256     | 文脈の維持           |

### 類似度閾値ガイド

| 閾値      | 動作             | 使用するとき          |
| ------- | -------------- | --------------- |
| 0.7–1.0 | 非常に厳密、ほぼ完全一致のみ | 正確な事実検索         |
| 0.4–0.7 | 高い関連性、密接に関連    | 大半の Q\&A ユースケース |
| 0.2–0.4 | 中程度、周辺的な結果も含む  | 探索的または広範な質問     |
| 0.0–0.2 | 非常に広範、多くの結果    | 本番環境には非推奨       |

### プロンプトエンジニアリングのコツ

1. **グラウンディングを明示**: 提供されたコンテキストのみに基づいて回答するよう LLM に指示
2. **引用を要求**: ソースファイル名の参照を LLM に要求
3. **不確実性への対応**: コンテキストが不十分な場合に「わかりません」と回答するよう指示
4. **トーンの設定**: ユースケースに合わせたペルソナの指示を追加（フォーマル、カジュアル、技術的）

***

## 次のステップ

<CardGroup cols={2}>
  <Card title="ナレッジベースドキュメント" icon="database" href="/ja/pages/basics/knowledge">
    ナレッジベース管理、チャンキング、RAG パターンの詳細
  </Card>

  <Card title="ベクトル検索リファレンス" icon="magnifying-glass" href="/ja/pages/tools/jinba/vector_search">
    パラメータの完全なリファレンスと高度な検索例
  </Card>

  <Card title="Pinecone リファレンス" icon="database" href="/ja/pages/tools/search/pinecone">
    フィルタリングとリランキング対応の外部ベクトルデータベース
  </Card>

  <Card title="API リファレンス" icon="code" href="/ja/pages/basics/api">
    REST API 経由でのフロー呼び出しの完全ガイド
  </Card>

  <Card title="MCP 連携" icon="plug" href="/ja/pages/basics/mcp">
    MCP 経由で AI アシスタントにフローを接続
  </Card>

  <Card title="Jinba App エージェント" icon="robot" href="/ja/pages/jinba_app/agents/overview">
    RAG フローをエージェントにラップしてチャットを強化
  </Card>
</CardGroup>
