gemini_thinkrag / app.py
fudii0921's picture
Update app.py
4814999 verified
#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")