> ## 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.

# ベクトル検索

> ベクトル埋め込みを使用したナレッジベースの意味検索

## 概要

Jinbaベクトル検索は、ベクトル埋め込みを使用してナレッジベースの意味検索機能を提供します。このツールはOpenAIのtext-embedding-3-largeを使用してクエリをベクトル化し、類似度スコアに基づいてナレッジベースから関連データを取得し、強力なRAG（Retrieval-Augmented Generation）機能を提供します。

## 主要機能

* **意味検索**: 完全一致だけでなく、概念的に類似したコンテンツを検索
* **ナレッジベース統合**: アップロードされたドキュメントとファイル全体を検索
* **類似度スコア**: 類似度の閾値によって結果をフィルタリング
* **設定可能な結果**: 返される結果の数を制御
* **RAGサポート**: 質問応答と情報取得ワークフローの構築に最適

## 認証

このツールは、ナレッジベースにアクセスするためにJinba APIトークンが必要です。

**必要な設定:**

* `token` (string): Jinba APIトークン（シークレットとして保存）

## 入力パラメータ

| パラメータ             | 型      | 必須  | デフォルト | 説明                      |
| ----------------- | ------ | --- | ----- | ----------------------- |
| `query`           | string | はい  | -     | 意味検索のための検索クエリ           |
| `knowledgeBaseId` | string | はい  | -     | 検索するナレッジベースのID          |
| `topK`            | number | いいえ | 3     | 返すトップ結果の数（1-50）         |
| `threshold`       | number | いいえ | 0.3   | 結果をフィルタリングする類似度の閾値（0-1） |

## 出力構造

以下の情報を含む検索結果の配列を返します:

| フィールド          | 型      | 説明                                |
| -------------- | ------ | --------------------------------- |
| `chunk`        | object | ID、ファイルID、コンテンツ、メタデータを含むコンテンツチャンク |
| `score`        | number | 類似度スコア（0-1、高いほど類似）                |
| `file`         | object | ファイル名とコンテンツタイプを含むファイル情報           |
| `query`        | string | 元の検索クエリ                           |
| `totalResults` | number | 見つかった結果の総数                        |

## 例: ドキュメント Q\&A システム

```yaml theme={null}
- id: search_knowledge_base
  name: search_knowledge_base
  tool: JINBA_VECTOR_SEARCH
  config:
    - name: token
      value: "{{secrets.JINBA_API_TOKEN}}"
  input:
    - name: query
      value: "当社の返品ポリシーは何ですか？"
    - name: knowledgeBaseId
      value: "{{secrets.KNOWLEDGE_BASE_ID}}"
    - name: topK
      value: 5
    - name: threshold
      value: 0.4

- id: generate_answer
  name: generate_answer
  tool: OPENAI_INVOKE
  config:
    - name: version
      value: gpt-4
  input:
    - name: prompt
      value: |
        ナレッジベースからの以下の検索結果に基づいて、返品ポリシーに関するユーザーの質問に答えてください。
        
        検索結果:
        {{#each steps.search_knowledge_base.results}}
        **ソース: {{file.filename}}**
        内容: {{chunk.content}}
        類似度: {{score}}
        
        {{/each}}
        
        質問: {{steps.search_knowledge_base.query}}
        
        上記の検索結果に基づいて包括的な回答を提供してください。
```

## 例: リサーチアシスタント

```yaml theme={null}
- id: research_query
  name: research_query
  tool: INPUT_TEXT
  input:
    - name: description
      value: "研究質問を入力してください"

- id: search_research_base
  name: search_research_base
  tool: JINBA_VECTOR_SEARCH
  config:
    - name: token
      value: "{{secrets.JINBA_API_TOKEN}}"
  input:
    - name: query
      value: "{{steps.research_query.result}}"
    - name: knowledgeBaseId
      value: "{{secrets.RESEARCH_KB_ID}}"
    - name: topK
      value: 10
    - name: threshold
      value: 0.3

- id: analyze_findings
  name: analyze_findings
  tool: PYTHON_SANDBOX_RUN
  input:
    - name: code
      value: |
        import json
        
        results = {{steps.search_research_base.results}}
        
        print("=== 研究結果 ===")
        print(f"クエリ: {results['query']}")
        print(f"合計結果: {results['totalResults']}")
        print()
        
        # ソースファイルごとに結果をグループ化
        sources = {}
        for result in results['results']:
            filename = result['file']['filename']
            if filename not in sources:
                sources[filename] = []
            sources[filename].append({
                'content': result['chunk']['content'][:200] + "...",
                'score': result['score']
            })
        
        print("=== 見つかったソース ===")
        for filename, chunks in sources.items():
            print(f"\n📄 {filename}")
            for i, chunk in enumerate(chunks[:3]):  # ファイルごとに上位3つのチャンク
                print(f"  {i+1}. スコア: {chunk['score']:.3f}")
                print(f"     {chunk['content']}")
        
        # 平均類似度を計算
        avg_score = sum(r['score'] for r in results['results']) / len(results['results'])
        print(f"\n📊 平均類似度: {avg_score:.3f}")

- id: synthesize_response
  name: synthesize_response
  tool: ANTHROPIC_INVOKE
  config:
    - name: token
      value: "{{secrets.ANTHROPIC_API_KEY}}"
  input:
    - name: prompt
      value: |
        あなたは研究アシスタントです。以下の検索結果を包括的な回答に統合してください。
        
        元のクエリ: {{steps.search_research_base.query}}
        
        検索結果:
        {{#each steps.search_research_base.results}}
        
        **ソース: {{file.filename}}** (類似度: {{score}})
        {{chunk.content}}
        
        ---
        {{/each}}
        
        以下を提供してください:
        1. 質問への直接的な回答
        2. 複数のソースからの重要な洞察
        3. 見つかった矛盾する情報
        4. さらなる研究への提案
```

## 例: コンテンツ推薦

```yaml theme={null}
- id: get_user_interests
  name: get_user_interests
  tool: INPUT_TEXT
  input:
    - name: description
      value: "興味のあるトピックやコンテンツを説明してください"

- id: find_related_content
  name: find_related_content
  tool: JINBA_VECTOR_SEARCH
  config:
    - name: token
      value: "{{secrets.JINBA_API_TOKEN}}"
  input:
    - name: query
      value: "{{steps.get_user_interests.result}}"
    - name: knowledgeBaseId
      value: "{{secrets.CONTENT_KB_ID}}"
    - name: topK
      value: 8
    - name: threshold
      value: 0.25

- id: format_recommendations
  name: format_recommendations
  tool: PYTHON_SANDBOX_RUN
  input:
    - name: code
      value: |
        results = {{steps.find_related_content.results}}
        
        print("🔍 **コンテンツ推薦**")
        print(f"基準: *{results['query']}*\n")
        
        recommendations = []
        for i, result in enumerate(results['results'][:5], 1):
            chunk = result['chunk']
            file_info = result['file']
            score = result['score']
            
            # 最初の文または100文字を抽出
            content_preview = chunk['content'][:100].split('.')[0] + "..."
            
            recommendations.append({
                'rank': i,
                'title': file_info['filename'],
                'preview': content_preview,
                'relevance': f"{score:.1%}",
                'content_type': file_info['contentType']
            })
        
        for rec in recommendations:
            print(f"**{rec['rank']}. {rec['title']}**")
            print(f"   📋 {rec['preview']}")
            print(f"   🎯 関連度: {rec['relevance']}")
            print(f"   📄 タイプ: {rec['content_type']}")
            print()
        
        if len(results['results']) == 0:
            print("関連するコンテンツが見つかりませんでした。検索語を調整するか、閾値を下げてみてください。")
```

## ベストプラクティス

### クエリ最適化

* **自然言語を使用**: 人間に尋ねるような自然な文でクエリを作成
* **具体的に**: より具体的なクエリの方が良い結果が得られることが多い
* **コンテキストを含める**: 関連するキーワードとコンテキスト語を追加

### 閾値の選択

* **0.7-1.0**: 非常に高い類似度、完全または準完全一致
* **0.4-0.7**: 高い類似度、密接に関連するコンテンツ
* **0.2-0.4**: 中程度の類似度、潜在的に関連するコンテンツ
* **0.0-0.2**: 低い類似度、間接的に関連するコンテンツを含む可能性

### パフォーマンスのコツ

* **topKを制限**: 必要以上に多くの結果を取得しない
* **閾値を調整**: 高い閾値 = より少ない、より関連性の高い結果
* **メタデータを活用**: 追加のフィルタリングにチャンクメタデータを活用

## ナレッジベースの設定

ベクトル検索を使用する前に、ナレッジベースに関連ドキュメントが含まれていることを確認してください:

1. **ドキュメントのアップロード**: PDF、テキストファイル、その他のサポートされる形式を追加
2. **処理**: ドキュメントのチャンク化とベクトル化の時間を確保
3. **クエリのテスト**: データを理解するためにシンプルなクエリから開始
4. **反復**: 結果に基づいてクエリと閾値を調整

## 使用事例

* **カスタマーサポート**: ユーザーの質問に関連する文書を検索
* **研究アシスタント**: 関連する研究論文や文書を発見
* **コンテンツ発見**: 類似の記事やリソースを推薦
* **FAQ自動化**: 一般的な質問に自動回答
* **ドキュメント分析**: 大きなドキュメントセットから特定情報を検索
* **ナレッジマネジメント**: 組織知識への迅速なアクセス
* **法的研究**: 契約書や法的文書の検索
* **製品情報**: 技術仕様やマニュアルの検索
