概要

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

主要機能

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

認証

このツールは、ナレッジベースにアクセスするためにJinba APIトークンが必要です。 必要な設定:
  • token: Jinba APIトークン(シークレットとして保存)

入力パラメータ

  • query (必須): 意味検索のための検索クエリ
  • knowledgeBaseId (必須): 検索するナレッジベースのID
  • topK (任意): 返すトップ結果の数(1-50、デフォルト: 3)
  • threshold (任意): 結果をフィルタリングする類似度の閾値(0-1、デフォルト: 0.3)

出力構造

以下の情報を含む検索結果の配列を返します:
  • chunk: ID、ファイルID、コンテンツ、メタデータを含むコンテンツチャンク
  • score: 類似度スコア(0-1、高いほど類似)
  • file: ファイル名とコンテンツタイプを含むファイル情報
  • query: 元の検索クエリ
  • totalResults: 見つかった結果の総数

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

- 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}}
        
        上記の検索結果に基づいて包括的な回答を提供してください。

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

- 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. さらなる研究への提案

例: コンテンツ推薦

- 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自動化: 一般的な質問に自動回答
  • ドキュメント分析: 大きなドキュメントセットから特定情報を検索
  • ナレッジマネジメント: 組織知識への迅速なアクセス
  • 法的研究: 契約書や法的文書の検索
  • 製品情報: 技術仕様やマニュアルの検索