File size: 11,659 Bytes
babb248
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4814999
babb248
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
#pip3 install googletrans==4.0.0-rc1
import gradio as gr
from google import genai
from google.genai import types
import os
from dotenv import load_dotenv
from googletrans import Translator
from pgvector.psycopg import register_vector, Bit
import psycopg2
#import cohere
#import numpy as np

load_dotenv(verbose=True) 
#co = cohere.ClientV2(api_key=os.environ.get("COHERE_API_KEY"))
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])

# Embedding function
#def embed(input, input_type):
    #response = co.embed(texts=input, model='embed-multilingual-v3.0', input_type=input_type, embedding_types=['ubinary'])
    #return [np.unpackbits(np.array(embedding, dtype=np.uint8)) for embedding in response.embeddings.ubinary]

# 埋め込み生成関数
def generate_embeddings(texts):
    # 改行または句点で分割(任意で調整可能)
    if isinstance(texts, str):
        inputs = [t.strip() for t in texts.split("\n") if t.strip()]
    else:
        inputs = texts

    result = client.models.embed_content(
        model="gemini-embedding-001",
        contents=inputs,
        config=types.EmbedContentConfig(output_dimensionality=1024)
    )

    # 結果を整形して表示
    formatted = ""
    for i, embedding in enumerate(result.embeddings):
        formatted += f"{embedding.values}"
    return formatted

async def generate_content(prompt):
    conn = psycopg2.connect(
            dbname="smair",
            user="smairuser",
            password="smairuser",
            host="www.ryhintl.com",
            port=10629
        )

    cur = conn.cursor()
    # Embed the query
    #query_embedding = embed([prompt], 'search_query')[0]
    query_embedding = generate_embeddings(prompt)

    # Convert numpy array to a Python list or tuple
    #query_embedding = query_embedding.tolist()  # Convert to list
        
    cur.execute(
        'SELECT content, 1 - (embedding <=> %s::vector) AS similarity FROM thinking_rag where (1 - (embedding <=> %s::vector)) <> 0 ORDER BY similarity ASC',
        (query_embedding,query_embedding)
    )

    results = cur.fetchall()
    vector_resp = [row[0] for row in results]
    
    final_prompt = f'''
    {vector_resp}に基づいて{prompt}に対する答えを正確に出力してください。
    '''

    #client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
    config = {'thinking_config': {'include_thoughts': True}}
    response = client.models.generate_content(
        model="gemini-2.5-flash",
        #model='gemini-2.0-flash-thinking-exp',
        contents=final_prompt,
        config=config
    )

    summary_thought = ""
    summary_answer = ''

    translator = Translator()
    summary_thought = ""
    summary_answer = ""

    for part in response.candidates[0].content.parts:
        if not part.text:
            continue
        translated_text = await translator.translate(part.text, src='en', dest='ja')
        if part.thought:
            summary_thought += translated_text.text
        else:
            summary_answer += translated_text.text

        summaries = summary_thought + '\n' + summary_answer
    
    return summary_thought,summary_answer

# Gradio Blocksの設定
with gr.Blocks(title="gemini thinking RAG",css="footer {visibility: hidden;} #header {display: flex; justify-content: space-between; align-items: center; font-size: 24px; font-weight: bold;} #logo {width: 50px; height: 50px;} .logout-btn { background-color: #3498db; border-radius: 10px; color: white; padding: 10px 20px; border: none; cursor: pointer; transparent-bg {background-color: transparent; color: black; padding: 10px; border: none;}") as gemini:
    gr.HTML('<div id="header"><span>🛡️ GEMINI THINKING RAG</span><img id="logo" src="https://www.ryhintl.com/images/ryhlogo/ryhlogo.png" width="64" height="64" alt="Logo"></div>')
    gr.Markdown("### gemini thinking RAG - プロンプトで依頼した内容の回答をRAGやWEBを利用して生成します。")

    with gr.Sidebar(open=False,width=450):
        gr.HTML('''
        <!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Geminiの思考プロセス</title>
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;700&display=swap');

        :root {
            --primary-color: #4285F4; /* Googleのブランドカラー */
            --secondary-color: #34A853;
            --background-color: #f8f9fa;
            --card-background: #ffffff;
            --text-color: #333;
            --heading-color: #202124;
            --border-color: #e0e0e0;
        }

        body {
            font-family: 'Noto Sans JP', sans-serif;
            background-color: var(--background-color);
            color: var(--text-color);
            line-height: 1.8;
            margin: 0;
            padding: 20px;
        }

        .container {
            max-width: 900px;
            margin: 40px auto;
            padding: 40px;
            background-color: var(--card-background);
            box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);
            border-radius: 12px;
            border-top: 5px solid var(--primary-color);
        }

        h1 {
            text-align: center;
            color: var(--heading-color);
            font-weight: 700;
            font-size: 2.2em;
            margin-bottom: 30px;
        }

        h2 {
            color: var(--primary-color);
            font-weight: 700;
            font-size: 1.5em;
            border-left: 4px solid var(--primary-color);
            padding-left: 15px;
            margin-top: 40px;
            margin-bottom: 20px;
        }

        p {
            font-size: 1em;
            margin-bottom: 20px;
        }

        ul {
            list-style: none;
            padding-left: 0;
        }

        li {
            margin-bottom: 15px;
            position: relative;
            /*padding-left: 30px;*/
            padding-left: 10px;
        }
        
        li::before {
            content: '';
            position: absolute;
            left: 0;
            top: 5px;
            width: 10px;
            height: 10px;
            /*background-color: var(--primary-color);*/
            background-color: transparent;
            border-radius: 50%;
        }

        .section-title {
            font-weight: 700;
            color: var(--heading-color);
            display: block;
            margin-bottom: 5px;
        }

        strong {
            color: var(--heading-color);
        }

        .summary {
            margin-top: 40px;
            padding: 20px;
            background-color: #e8f0fe;
            border-left: 5px solid var(--primary-color);
            border-radius: 8px;
        }
    </style>
</head>
<body>

<div class="container">
    <h1>Geminiの思考プロセス</h1>
    <p>Geminiは、Googleが開発した大規模言語モデルであり、その思考プロセスは、単一のAIモデルではなく、複数の「エージェント」が連携して複雑なタスクを解決する**「Multi-Agent Reasoning」**という手法をコアとしています。</p>

    <h2>Geminiの思考プロセス:Multi-Agent Reasoning</h2>
    <p>このプロセスは、複雑な問題を解くために、複数の専門家が協力する人間のチームに似ています。具体的には、Geminiの思考は以下のステップで構成されています。</p>
    <ul>
        <li>
            <strong>問題の分解(Decomposition):</strong>
            最初に、与えられたタスクを、よりシンプルで管理しやすい小さなサブタスクに分解します。
        </li>
        <li>
            <strong>専門エージェントの割り当て(Agent Assignment):</strong>
            分解された各サブタスクに最適なAIエージェントが割り当てられます。たとえば、データ分析が必要なサブタスクには「データ分析エージェント」、クリエイティブな文章生成が必要なサブタスクには「ライティングエージェント」といった具合です。
        </li>
        <li>
            <strong>並行処理(Parallel Processing):</strong>
            各エージェントは、それぞれのサブタスクを並行して実行します。この並行処理により、タスク全体の完了時間が大幅に短縮されます。
        </li>
        <li>
            <strong>統合と調整(Integration and Refinement):</strong>
            各エージェントが生成した結果は、最後に統合エージェントによって集約されます。この統合エージェントは、結果の矛盾をチェックし、全体として一貫性のある最終的な回答を生成します。
        </li>
    </ul>

    <h2>「Gemini thinking」のメリット</h2>
    <p>このMulti-Agent Reasoningの手法は、従来のAIモデルにはない以下のようなメリットをもたらします。</p>
    <ul>
        <li>
            <strong>複雑な問題解決能力の向上:</strong>
            複数のエージェントが連携することで、高度な論理的思考やクリエイティブなタスクをより正確にこなすことができます。
        </li>
        <li>
            <strong>推論の透明性の向上:</strong>
            各エージェントの思考プロセスを追跡できるため、従来のブラックボックス問題の一部を解消し、なぜそのような結論に至ったのかをある程度理解しやすくなります。
        </li>
        <li>
            <strong>効率性の向上:</strong>
            サブタスクを並行処理することで、大規模なタスクでも迅速に完了することが可能です。
        </li>
    </ul>

    <div class="summary">
        <p><strong>まとめ:</strong><br>
        Geminiの「思考」は、単一の巨大なモデルが一気に答えを出すのではなく、複数の専門AIエージェントが協力して問題を解決する、高度に構造化されたプロセスであると理解できます。これにより、より複雑で精度の高いアウトプットが可能になります。</p>
    </div>
</div>

</body>
</html>
        ''')
    
    with gr.Row():
        prompt_input = gr.Textbox(label="プロンプトを入力してください", info="例: すき家は色々な問題がりました。結果、客数も減り、経営上、大きな問題が浮上しました。これらを改善し、経営を正常化するにはどんな打ち手があるか教えてください。 最近、AIは破竹の勢いで成長しています。一方でAIが社会に齎す問題点も多くあると思います。AIが抱える問題点をリストアップして、その解決策を教えてください。もし、答えが見つからない場合は、ウェブから検索して答えてください。 地球温暖化がもたらす未来について説明してください。")
        output_text = gr.Textbox(label="生成されたThought", info="gemini thinkで生成されたthoghtが表示されます。", show_copy_button=True)
        summary_text = gr.Textbox(label="結果", info="gemini thinkで生成された結果が表示されます。", show_copy_button=True)

    with gr.Row():
        generate_button = gr.Button("生成")

    # ボタン動作
    generate_button.click(generate_content, inputs=prompt_input, outputs=[output_text,summary_text])

gemini.launch(favicon_path="favicon.ico")