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

> BoxコンテンツをPineconeに接続してRAGパイプラインを構築し、ベクトル検索と質問への回答を実行できるようにします。

# BoxとPinecone

export const RelatedLinks = ({title, items = []}) => {
  const getBadgeClass = badge => {
    if (!badge) return "badge-default";
    const badgeType = badge.toLowerCase().replace(/\s+/g, "-");
    return `badge-${badge === "ガイド" ? "guide" : badgeType}`;
  };
  if (!items || items.length === 0) {
    return null;
  }
  return <div className="my-8">
      {}
      <h3 className="text-sm font-bold uppercase tracking-wider mb-4">{title}</h3>

      {}
      <div className="flex flex-col gap-3">
        {items.map((item, index) => <a key={index} href={item.href} className="py-2 px-3 rounded related_link hover:bg-[#f2f2f2] dark:hover:bg-[#111827] flex items-center gap-3 group no-underline hover:no-underline border-b-0">
            {}
            <span className={`px-2 py-1 rounded-full text-xs font-semibold uppercase tracking-wide flex-shrink-0 ${getBadgeClass(item.badge)}`}>
              {item.badge}
            </span>

            {}
            <span className="text-base">{item.label}</span>
          </a>)}
      </div>
    </div>;
};

export const SignupCTA = ({children}) => {
  return <div className="flex flex-wrap items-center gap-4 p-5 rounded-lg border border-gray-200 dark:border-gray-700 my-6" style={{
    background: "linear-gradient(135deg, rgba(0, 97, 213, 0.06), rgba(0, 97, 213, 0.02))"
  }}>
      <div className="flex-1 text-sm leading-relaxed text-gray-700 dark:text-gray-300" style={{
    minWidth: "280px"
  }}>
        {children}
      </div>
      <div className="flex flex-col items-center gap-2">
        <a href="https://account.box.com/signup/developer#ty9l3" className="signup-cta-button inline-flex items-center whitespace-nowrap px-5 py-2 text-sm font-semibold text-white no-underline">
          {translate("Get started for free")}
        </a>
        <a href="https://account.box.com/developers/console" className="signup-cta-login text-xs text-gray-500 dark:text-gray-400 no-underline whitespace-nowrap">
          {translate("Already have an account? Log in")}
        </a>
      </div>
    </div>;
};

export const Link = ({href, children, className, ...props}) => {
  const localizedHref = localizeLink(href);
  return <a href={localizedHref} className={className} {...props}>
      {children}
    </a>;
};

このチュートリアルでは、[Pinecone](https://www.pinecone.io/)をベクトルデータベースとして使用して検索拡張生成 (RAG) パイプラインを構築する方法について説明します。Boxに保存されたファイルからベクトル埋め込みを作成してPineconeに保存し、それらのベクトル埋め込みに対して大規模言語モデル (LLM) によるクエリを実行することで、コンテンツに関する質問に回答します。

<SignupCTA>
  無料のDeveloperアカウントを作成すると、PineconeでAIを活用したワークフローを構築するために必要なすべての機能とBox APIにアクセスできます。
</SignupCTA>

## RAGのコンセプトの概要

### ベクトルデータベースとは

Pineconeはクラウドネイティブなマネージド[ベクトルデータベース](https://www.pinecone.io/learn/vector-database/)です。ベクトルデータベースでは、埋め込みと呼ばれるデータのレプリゼンテーションを保存して取得するため、文字どおりに同一の結果ではなく、意味的に類似している結果を検出できます。これはセマンティック検索の基礎となります。

### 埋め込みとは

埋め込みとは、コンテンツの意味を数学的に表現したものです。埋め込みを生成するには、入力データを取得し、それを分割 (またはチャンク分割) したうえで、埋め込みモデルを使用して一連の浮動小数点値 (`[0.3, 0.4, 0.1, 1.8, 1.1, ...]`など) を作成します。

これらの値は、概念を高次元空間のポイントにマッピングしたものと考えることができます。互いに類似する概念は集合をなし、たとえば「猫」と「子猫」は近くなりますが、「バナナ」と「犬」は遠く離れます。異なる埋め込みモデルは、それぞれ異なるデータでトレーニングされ、特定のユースケース向けに特化している場合があります。

### RAGがBoxおよびPineconeと連携する仕組み

通常のRAGワークフローには、以下のステップが含まれます。

* **インデックス作成**: Boxフォルダのコンテンツが抽出、チャンク分割され、埋め込みモデルを使用して埋め込みに変換されます。これらの埋め込みは、ファイル名やBox内のソースファイルへの参照など、メタデータとともにPineconeに保存されます。

* **取得**: ユーザーが質問を行うと、その質問は同じモデルを使用して埋め込みに変換されます。Pineconeのクエリ機能が、質問との関連性が最も高いコンテンツチャンクを取得します。

* **生成**: 元の質問と取得されたコンテンツチャンクが組み合わされ、プロンプトとしてLLMに送信されます。そして、LLMがBoxコンテンツに基づいて回答を生成します。

LLMはBoxファイルに直接アクセスできません。RAGが関連するコンテキストを提供することで、このギャップが埋められるため、モデルはデータに基づいて正確な回答を生成できます。

## 前提条件

始める前に、以下が揃っていることを確認してください。

* クエリの実行対象となるファイルが含まれた**Boxフォルダ**。フォルダには、Boxアプリケーションを作成するユーザーアカウントでアクセスできる必要があります。URLバーのフォルダIDをメモしてください。後で必要になります。
* **Pineconeアカウント**。[無料のStarterプランにサインアップ](https://docs.pinecone.io/guides/get-started/quickstart)して、APIキーを生成します。
* このチュートリアルの目的で使用する**OpenAIアカウント**。これは他の任意のLLMに置き換えることができます。[OpenAIにサインアップ](https://platform.openai.com/docs/quickstart)して、APIキーを生成します。請求情報の入力が必要になる場合があります。
* マシンにインストールされた[Python](https://www.python.org/downloads/)。

## Boxカスタムアプリケーションの作成

[Box開発者コンソール](https://cloud.app.box.com/developers/console)で、OAuthアプリケーションを作成します。

1. 右上隅にある \[**新規アプリ**] をクリックします。
2. アプリ名を入力し、認証方法として \[**OAuth 2.0**] を選択します。
3. \[**アプリの作成**] を選択します。
4. \[**リダイレクトURI**] まで下にスクロールして、`http://127.0.0.1:5000/callback`を追加します。
5. \[**アプリケーションスコープ**] ですべてのチェックボックスをオンにします。
6. \[**変更を保存**] をクリックします。

**クライアントID**と**クライアントシークレット**をメモします。これらは構成ファイルに必要になります。

## Pineconeインデックスの作成

1. [Pineconeコンソール](https://app.pinecone.io/)にログインします。
2. \[**Create Index (インデックスの作成)**] をクリックします。
3. インデックスに名前を付けます (例: `pinecone-demo`)。
4. \[**Dimensions (次元)**] フィールドを`1024`に設定します。
5. 他の設定はすべてデフォルトのままにして、\[**Create Index (インデックスの作成)**] をクリックします。

<Frame caption="Create a Pinecone index with 1024 dimensions">
  <img src="https://mintcdn.com/box/nQi7jppEz_5O1YgH/images/ai/vector-databases/pinecone-create-index.png?fit=max&auto=format&n=nQi7jppEz_5O1YgH&q=85&s=5e480208c5cb72805b40b3f6da2b2216" alt="Pineconeインデックスの作成" width="1100" height="610" data-path="images/ai/vector-databases/pinecone-create-index.png" />
</Frame>

インデックス名をメモします。これは構成ファイルに追加します。

<Frame caption="The Pinecone index overview after creation">
  <img src="https://mintcdn.com/box/nQi7jppEz_5O1YgH/images/ai/vector-databases/pinecone-index-screen.png?fit=max&auto=format&n=nQi7jppEz_5O1YgH&q=85&s=310c12351e1e646555e3a8ea03312c15" alt="Pineconeインデックスの画面" width="1100" height="612" data-path="images/ai/vector-databases/pinecone-index-screen.png" />
</Frame>

<Tip>
  [Pinecone API](https://docs.pinecone.io/reference/api/latest/control-plane/create_index)を使用してプログラムでインデックスを作成することもできます。
</Tip>

## コードリポジトリの初期化

[サンプルコード](https://github.com/box-community/box-pinecone-sample)をローカルマシンに複製します。

```bash theme={null}
git clone https://github.com/box-community/box-pinecone-sample.git
cd box-pinecone-sample
```

仮想環境を作成してアクティブ化します。

```bash theme={null}
python3 -m venv venv
source venv/bin/activate
```

依存関係をインストールします。

```bash theme={null}
pip install -r requirements.txt
```

サンプル構成ファイルをコピーして、自分の資格情報で更新します。

```bash theme={null}
cp sample_config.py config.py
```

エディタで`config.py`を開いて以下を入力します。

* Boxの**クライアントID**と**クライアントシークレット**
* **BoxフォルダID**
* **Pinecone APIキー**と**インデックス名**
* **OpenAI APIキー**

<Frame caption="Fill in your credentials and folder ID in config.py">
  <img src="https://mintcdn.com/box/nQi7jppEz_5O1YgH/images/ai/vector-databases/pinecone-config.png?fit=max&auto=format&n=nQi7jppEz_5O1YgH&q=85&s=5cd537b2285acdd7af035184674bb9b6" alt="構成ファイル" width="1100" height="689" data-path="images/ai/vector-databases/pinecone-config.png" />
</Frame>

<Warning>
  フォルダIDを`0`に設定**しないでください**。Boxアカウント全体のインデックス作成が試行されるため、この設定は推奨されません。レート制限が超過し、大量のリソースが消費され、インデックス作成はたいてい完了せずに失敗します。
</Warning>

## 埋め込みの作成と保存

構成が完了したところで、メインスクリプトを実行して、Boxコンテンツから埋め込みを作成します。

```bash theme={null}
python main.py
```

アプリケーションを初めて実行するとき、ブラウザウィンドウが開かれて、アクセス権限の付与を求められます。これはOAuth 2.0の標準的な承認フローです。\[**Boxへのアクセスを許可**] をクリックします。

<Note>
  OAuthトークンは、プロジェクトディレクトリの`.oauth.json`ファイルに保存されます。更新トークンは、最後の使用から60日間有効な状態が持続します。
</Note>

スクリプトを実行すると、指定したBoxフォルダに含まれている各ファイルが処理され、<Link href="/guides/representations/text">テキストレプリゼンテーション</Link>が抽出されてチャンク分割されます。さらに、[Pinecone推論API](https://docs.pinecone.io/reference/api/latest/inference/generate-embeddings)を使用して埋め込みが生成され、それらがPineconeに保存されます。各ベクトルには、Boxのソースファイルへの参照など、メタデータが付加されます。

完了すると、Pineconeコンソールで埋め込みと関連するメタデータ (ファイル名やチャンクのプレーンテキストなど) を確認できます。このメタデータは、レスポンスのフィルタ処理やドキュメントのバージョン管理に役立ちます。

<Frame caption="Embeddings with metadata in the Pinecone Console">
  <img src="https://mintcdn.com/box/nQi7jppEz_5O1YgH/images/ai/vector-databases/pinecone-embeddings-console.png?fit=max&auto=format&n=nQi7jppEz_5O1YgH&q=85&s=a28c58eda0c0732d4a62d0dd0c44dfa3" alt="Pineconeコンソールの埋め込み" width="1100" height="612" data-path="images/ai/vector-databases/pinecone-embeddings-console.png" />
</Frame>

## LLMのクエリ

埋め込みが保存されると、Boxコンテンツについて質問できます。プロジェクトのこの部分では、OpenAIをLLMプロバイダとして使用します。

クエリスクリプトを実行します。

```bash theme={null}
python query.py
```

プロンプトに質問を入力します。スクリプトによって、質問が埋め込みに変換され、Pineconeから関連性が最も高いコンテンツチャンクが取得されます。それらのコンテンツチャンクが質問とともにOpenAIに送信され、回答が生成されます。

<Frame caption="The query service returns an answer based on your Box content">
  <img src="https://mintcdn.com/box/nQi7jppEz_5O1YgH/images/ai/vector-databases/pinecone-query-answer.png?fit=max&auto=format&n=nQi7jppEz_5O1YgH&q=85&s=481a0971063e9f9128e406b0cbc4448a" alt="サービスからのクエリ回答" width="1100" height="108" data-path="images/ai/vector-databases/pinecone-query-answer.png" />
</Frame>

## 機能強化のアイデア

<AccordionGroup>
  <Accordion title="イベントによるインデックス作成の自動化">
    サンプルでは、インデックス作成をオンデマンドで実行しています。Boxフォルダ内のファイルが変更されたときにトリガーされる<Link href="/guides/events">Boxイベント</Link>を使用することで、スケジュール設定されたタスクやイベント駆動型のサービスを作成できます。スクリプトでアップサートを使用するため、再実行すると既存のレコードが更新されます。
  </Accordion>

  <Accordion title="ユーザーインターフェースの追加">
    このクエリスクリプトはコマンドラインから実行されています。Q\&Aのユーザーエクスペリエンスを向上させるために、ウェブUIを作成できます。
  </Accordion>

  <Accordion title="さまざまな認証方法の使用">
    デモではOAuth 2.0を使用しています。サーバー間のユースケースでは、<Link href="/guides/authentication/jwt">JWT</Link>認証や<Link href="/guides/authentication/client-credentials">クライアント資格情報許可</Link>認証を統合できます。
  </Accordion>

  <Accordion title="モデルまたは構成の交換">
    ここでは、埋め込みでPinecone推論API、クエリスクリプトでOpenAIを使用しています。埋め込みモデル、LLMプロバイダ、ベクトルの次元、距離指標、チャンクサイズは、ユースケースに応じて別のものに置き換えることができます。
  </Accordion>

  <Accordion title="ファイルタイプのサポートの拡張">
    本チュートリアルのスクリプトは、Boxに<Link href="/guides/representations/text">テキストレプリゼンテーション</Link> (500 MB未満のサポート対象のファイルタイプで自動的に作成されます) があるファイルを処理します。その他のコンテンツタイプやより大きいファイルを処理できるように、サードパーティ製ライブラリを追加できます。
  </Accordion>
</AccordionGroup>

## リソース

<CardGroup cols={2}>
  <Card title="サンプルコード" href="https://github.com/box-community/box-pinecone-sample" icon="github">
    GitHubにあるBoxとPineconeの統合サンプルリポジトリを複製します。
  </Card>

  <Card title="Pineconeのドキュメント" href="https://www.pinecone.io/learn/vector-database/" icon="database">
    ベクトルデータベースとPineconeの仕組みについて詳しく確認します。
  </Card>
</CardGroup>

<RelatedLinks
  title="関連するリソース"
  items={[
{ label: translate("AI integrations"), href: "/ai/integrations", badge: "GUIDE" },
{ label: translate("Box and Weaviate"), href: "/ai/vector-databases/weaviate", badge: "GUIDE" },
{ label: translate("Get started with Box AI"), href: "/guides/box-ai/ai-tutorials/prerequisites", badge: "GUIDE" }
]}
/>
