File size: 10,134 Bytes
141099e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2be0909
141099e
6dc67ab
141099e
 
2be0909
141099e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ed6a54d
141099e
 
 
 
 
 
 
 
 
 
59dd79c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
import os
import cohere
import gradio as gr
from dotenv import load_dotenv

# 環境変数の読み込み
load_dotenv(verbose=True)

# APIキーを環境変数から取得
cohere_api_key = os.getenv("COHERE_API_KEY")

# Cohereクライアントの初期化
try:
    cohere_client = cohere.Client(cohere_api_key)
except Exception as e:
    print(f"Cohereクライアントの初期化に失敗しました: {e}")
    cohere_client = None

def process_query(query, arrayData):
    """
    ユーザーのクエリを処理し、再ランキングと回答生成を行う関数。
    Gradioのイベントハンドラーとして使用される。
    """
    if not cohere_client:
        return "エラー: Cohere APIキーが正しく設定されていません。", "", ""

    # 1. 再ランキング(Reranking)
    try:
        cleaned_text = arrayData.replace('\n', '').replace(' ', '')
        documents_to_rerank = eval(cleaned_text)
        rerank_response = cohere_client.rerank(
            query=query,
            documents=documents_to_rerank,
            top_n=3,
            model="rerank-multilingual-v3.0"
        )
    except Exception as e:
        return f"Rerank API call failed: {e}", "", ""

    rerank_output = "--- 再ランキングの結果(上位3件) ---\n"
    context_for_chat = []
    
    for i, result in enumerate(rerank_response.results):
        document_index = result.index
        relevance_score = result.relevance_score
        reranked_document = documents_to_rerank[document_index]
        
        rerank_output += f"順位: {i+1}, スコア: {relevance_score:.4f}, ドキュメント: {reranked_document}\n"
        context_for_chat.append(reranked_document)

    # 2. 回答生成(Generation)
    tmp = '\n'.join([f"- {doc}" for doc in context_for_chat])
    prompt = f"""
    以下の情報に基づいて、{query }について具体的に説明してください。

    情報:
    {tmp}

    回答:
    """

    try:
        response = cohere_client.chat(
            model="command-r-plus",
            message=prompt
        )
        chat_output = response.text
    except Exception as e:
        chat_output = f"Chat API call failed: {e}"

    return rerank_output, chat_output

# Gradio BlocksのUIを定義
with gr.Blocks() as demo:
    gr.Markdown("# Cohere Rerank と Chat を使った検索強化デモ")
    gr.Markdown("Rerankで関連ドキュメントを絞り込み、Chatで回答を生成します。")

    with gr.Sidebar(open=False, width=400):
        gr.HTML('''
        <!DOCTYPE html>
<html lang="ja">
   <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Cohere Rerank: 検索精度を高める強力なツール</title>
      <style>
         h3, h4 {
         color: #2c3e50;
         border-bottom: 2px solid #3498db;
         padding-bottom: 5px;
         }
         h3 {
         font-size: 2.5em;
         text-align: center;
         margin-bottom: 20px;
         }
         h4 {
         font-size: 1.8em;
         margin-top: 30px;
         }
         p {
         margin-bottom: 15px;
         }
         ul {
         list-style-type: none;
         padding: 0;
         }
         li {
         background: #ecf0f1;
         padding: 10px 15px;
         margin-bottom: 10px;
         border-radius: 5px;
         box-shadow: 0 2px 4px rgba(0,0,0,0.1);
         }
         li strong {
         color: #2980b9;
         }
         .icon {
         font-size: 1.2em;
         margin-right: 10px;
         }
         .highlight {
         font-weight: bold;
         color: #e74c3c;
         }
      </style>
   </head>
   <body>
      <h3>Cohere Rerank: 検索結果の精度と関連性を高めるモデル</h3>
      <p>Cohere Rerankは、検索結果の精度と関連性を大幅に向上させるためのモデルです。特に、<span class="highlight">Retrieval Augmented Generation (RAG)</span> システムにおいて、その真価を発揮します。</p>
      <p>RAGシステムとは、大規模言語モデル(LLM)が外部の知識ベースやドキュメントを参照して回答を生成する仕組みです。しかし、初期の検索段階で取得された情報が必ずしもユーザーの意図に合致するとは限りません。ここでCohere Rerankが活躍します。</p>
      <h4><span class="icon">✨</span> Cohere Rerankの主な役割とメリット</h4>
      <ul>
         <li>
            <strong>1. 検索結果の再ランク付け <span class="icon">🎯</span></strong>
            <p><strong>初期検索の補完:</strong> キーワード検索やベクトル検索で得られた候補の中から、ユーザーのクエリに対する意味的な関連性を深く理解し、最も適切な情報を優先的に並べ替えます。</p>
            <p><strong>ユーザー意図への適合:</strong> 単にキーワードが含まれているだけでなく、ユーザーの本当の目的や背景に合った情報を提供することで、検索体験を向上させます。</p>
         </li>
         <li>
            <strong>2. RAGシステムの性能向上 <span class="icon">🚀</span></strong>
            <p><strong>回答の質向上:</strong> LLMに提供する情報源の質が高まるため、生成される回答の精度と信頼性が向上します。</p>
            <p><strong>ハルシネーション(幻覚)の抑制:</strong> 不正確な情報や関連性の低い情報がLLMに渡されるのを防ぎ、事実に基づいた回答を生成しやすくします。</p>
            <p><strong>応答性の向上とコスト削減:</strong> LLMが処理する情報量が絞り込まれるため、応答速度が向上し、利用コストの削減にも繋がります。</p>
         </li>
         <li>
            <strong>3. 多様なデータ形式と多言語対応 <span class="icon">🌍</span></strong>
            <p><strong>幅広いデータ:</strong> テキストだけでなく、メール、レポート、JSON、プログラムコード、表形式のデータなど、多様なデータ形式に対応しています。</p>
            <p><strong>多言語サポート:</strong> 100以上の言語をサポートしており、グローバルな検索システムにも適しています。</p>
         </li>
      </ul>
      <h4><span class="icon">🛠️</span> 活用例</h4>
      <ul>
         <li><strong>チャットボット:</strong> 曖昧な質問に対しても、ユーザーが求める適切な回答を提供し、顧客満足度を向上させます。</li>
         <li><strong>社内ナレッジ検索:</strong> 従業員が探している情報を迅速かつ正確に見つけられるようにし、業務効率を向上させます。</li>
         <li><strong>ECサイト:</strong> ユーザーの閲覧履歴や購入履歴に基づき、関連性の高い商品を優先表示します。</li>
         <li><strong>広告マーケティング:</strong> 検索ワードに最適な広告を、最適な順序で表示します。</li>
      </ul>
      <p>Cohere Rerankは、既存の検索システムに比較的容易に統合でき、検索品質を大幅に改善できる強力なツールです。</p>
   </body>
</html>    
        ''')
        #aryData = gr.Textbox(label="データ", value='["AIは、顧客行動の予測やパーソナライズされた広告配信に利用できます。","マーケティングオートメーションツールは、AIの力を借りて顧客エンゲージメントを向上させます。","AIを導入することで、マーケティングキャンペーンの効果をリアルタイムで分析できます。","最新のAI技術により、よりパーソナライズされた顧客体験を提供できます。","AIがもたらすマーケティングの進化は、企業の競争力を高める鍵となります。","ウェブサイトのデザインには、ユーザーインターフェース(UI)とユーザーエクスペリエンス(UX)の最適化が重要です。","SEO対策は、検索エンジンからのオーガニックトラフィックを増やすために不可欠です。"]')
        aryData = gr.Textbox(label="データ", value='''
        [
            "AIは、顧客行動の予測やパーソナライズされた広告配信に利用できます。",
            "マーケティングオートメーションツールは、AIの力を借りて顧客エンゲージメントを向上させます。",
            "AIを導入することで、マーケティングキャンペーンの効果をリアルタイムで分析できます。",
            "最新のAI技術により、よりパーソナライズされた顧客体験を提供できます。",
            "AIがもたらすマーケティングの進化は、企業の競争力を高める鍵となります。",
            "ウェブサイトのデザインには、ユーザーインターフェース(UI)とユーザーエクスペリエンス(UX)の最適化が重要です。",
            "SEO対策は、検索エンジンからのオーガニックトラフィックを増やすために不可欠です。",
        ]                     
        ''')

    
    
    with gr.Row():
        query_input = gr.Textbox(label="クエリを入力", lines=2, info="例: AIを活用したマーケティング戦略について教えてください")
        
    run_button = gr.Button("実行")
    
    with gr.Row():
        rerank_output = gr.Textbox(label="再ランキング結果", lines=5, interactive=False)
        
    with gr.Row():
        chat_output = gr.Textbox(label="AIによる回答", lines=10, interactive=False, show_copy_button=True)
        
    # ボタンクリック時のアクションを定義
    run_button.click(
        fn=process_query,
        inputs=[query_input, aryData],
        outputs=[rerank_output, chat_output]
    )

# アプリケーションを起動
if __name__ == "__main__":
    demo.launch()