Spaces:
Sleeping
Sleeping
Upload folder using huggingface_hub
Browse files
app.py
CHANGED
|
@@ -161,7 +161,7 @@ def extract_text_from_pdf(pdf_file_path):
|
|
| 161 |
def get_llm_response(selected_llm, query, context, source_code_to_check):
|
| 162 |
"""選択されたLLMを使用して質問に回答する"""
|
| 163 |
system_prompt = "あなたは提供されたコンテキスト(ソースコードチェックリスト)とレビュー対象のソースコードに基づいて、ソースコードをチェックし、その結果を返す有益なアシスタントです。チェックリストの項目ごとにソースコードを評価し、具体的な指摘と改善案を提示してください。コンテキストに情報がない場合は、「提供された情報からは回答できません。」と答えてください。"
|
| 164 |
-
user_content = f"ソースコードチェックリスト:\n{context}\n\nレビュー対象のソースコード:\n```\n{source_code_to_check}\n```\n\n
|
| 165 |
|
| 166 |
try:
|
| 167 |
if selected_llm == "Ollama":
|
|
@@ -176,7 +176,7 @@ def get_llm_response(selected_llm, query, context, source_code_to_check):
|
|
| 176 |
model=OLLAMA_MODEL_NAME,
|
| 177 |
messages=messages,
|
| 178 |
options={
|
| 179 |
-
"temperature": 0.
|
| 180 |
"num_predict": 2000
|
| 181 |
}
|
| 182 |
)
|
|
@@ -222,19 +222,51 @@ def get_llm_response(selected_llm, query, context, source_code_to_check):
|
|
| 222 |
return "Google APIキーが設定されていないため、Geminiモデルは利用できません。"
|
| 223 |
# Geminiのsystem instructionはまだベータ版で、messagesと併用できない場合があるため、
|
| 224 |
# system_promptをuser_contentの先頭に結合する形式にする。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 225 |
full_user_content = f"{system_prompt}\n\n{user_content}"
|
| 226 |
messages = [
|
| 227 |
{"role": "user", "parts": [full_user_content]}
|
| 228 |
]
|
| 229 |
print(f"Google Geminiモデル '{GOOGLE_MODEL_NAME}' にリクエストを送信中...")
|
| 230 |
-
|
| 231 |
-
|
| 232 |
-
|
| 233 |
-
|
| 234 |
-
|
|
|
|
|
|
|
| 235 |
)
|
| 236 |
-
|
| 237 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 238 |
|
| 239 |
else:
|
| 240 |
return "無効なLLMが選択されました。"
|
|
|
|
| 161 |
def get_llm_response(selected_llm, query, context, source_code_to_check):
|
| 162 |
"""選択されたLLMを使用して質問に回答する"""
|
| 163 |
system_prompt = "あなたは提供されたコンテキスト(ソースコードチェックリスト)とレビュー対象のソースコードに基づいて、ソースコードをチェックし、その結果を返す有益なアシスタントです。チェックリストの項目ごとにソースコードを評価し、具体的な指摘と改善案を提示してください。コンテキストに情報がない場合は、「提供された情報からは回答できません。」と答えてください。"
|
| 164 |
+
user_content = f"ソースコードチェックリスト:\n{context}\n\nレビュー対象のソースコード:\n```\n{source_code_to_check}\n```\n\nレビュー指示: {query}\n\nチェック結果:"
|
| 165 |
|
| 166 |
try:
|
| 167 |
if selected_llm == "Ollama":
|
|
|
|
| 176 |
model=OLLAMA_MODEL_NAME,
|
| 177 |
messages=messages,
|
| 178 |
options={
|
| 179 |
+
"temperature": 0.7,
|
| 180 |
"num_predict": 2000
|
| 181 |
}
|
| 182 |
)
|
|
|
|
| 222 |
return "Google APIキーが設定されていないため、Geminiモデルは利用できません。"
|
| 223 |
# Geminiのsystem instructionはまだベータ版で、messagesと併用できない場合があるため、
|
| 224 |
# system_promptをuser_contentの先頭に結合する形式にする。
|
| 225 |
+
# --- システムプロンプトの調整 (後述の2.プロンプト調整も参照) ---
|
| 226 |
+
system_prompt = "あなたは提供されたコンテキスト(ソースコードチェックリスト)とレビュー対象のソースコードに基づいて、ソースコードのレビューを行うアシスタントです。チェックリストの項目ごとにソースコードを評価し、潜在的な問題点や改善の機会を提案してください。コンテキストに情報がない場合は、「提供された情報からは回答できません。」と答えてください。"
|
| 227 |
+
# --- ユーザープロンプトの調整 (後述の2.プロンプト調整も参照) ---
|
| 228 |
+
user_content = f"ソースコードチェックリスト:\n{context}\n\nレビュー対象のソースコード:\n```\n{source_code_to_check}\n```\n\nレビュー指示: {query}\n\nチェック結果:"
|
| 229 |
+
|
| 230 |
full_user_content = f"{system_prompt}\n\n{user_content}"
|
| 231 |
messages = [
|
| 232 |
{"role": "user", "parts": [full_user_content]}
|
| 233 |
]
|
| 234 |
print(f"Google Geminiモデル '{GOOGLE_MODEL_NAME}' にリクエストを送信中...")
|
| 235 |
+
try:
|
| 236 |
+
response = client_gemini.generate_content(
|
| 237 |
+
messages,
|
| 238 |
+
generation_config=genai.types.GenerationConfig(
|
| 239 |
+
temperature=0.5, # まずは0.5で試す。必要なら0.7などに上げる
|
| 240 |
+
max_output_tokens=2000
|
| 241 |
+
)
|
| 242 |
)
|
| 243 |
+
|
| 244 |
+
# --- エラーハンドリングの強化 ---
|
| 245 |
+
# response.text を呼び出す前に、応答の候補と終了理由を確認
|
| 246 |
+
if response.candidates:
|
| 247 |
+
candidate = response.candidates[0]
|
| 248 |
+
# finish_reason が SAFETY (genai.types.HarmCategory.SAFETY) の場合、安全ポリシーによりブロックされた可能性が高い
|
| 249 |
+
if candidate.finish_reason == genai.types.HarmCategory.SAFETY:
|
| 250 |
+
safety_ratings = candidate.safety_ratings
|
| 251 |
+
safety_details = ", ".join([f"{sr.category.name}: {sr.probability.name}" for sr in safety_ratings])
|
| 252 |
+
print(f"Gemini response blocked due to safety policy. Details: {safety_details}")
|
| 253 |
+
return f"Google Geminiからの応答が安全ポリシーによりブロックされました。詳細: {safety_details}"
|
| 254 |
+
# 正常なコンテンツがあるか確認
|
| 255 |
+
elif candidate.content and candidate.content.parts:
|
| 256 |
+
return response.text.strip()
|
| 257 |
+
else:
|
| 258 |
+
# コンテンツがないが、finish_reasonがSAFETY以外の場合
|
| 259 |
+
print(f"Gemini response has no content parts. Finish reason: {candidate.finish_reason.name}")
|
| 260 |
+
return f"Google Geminiからの応答にコンテンツが含まれていません。終了理由: {candidate.finish_reason.name}"
|
| 261 |
+
else:
|
| 262 |
+
# 候補自体がない場合
|
| 263 |
+
print(f"Gemini response has no candidates. Raw response: {response}")
|
| 264 |
+
return f"Google Geminiからの応答に候補がありませんでした。生の応答: {response}"
|
| 265 |
+
|
| 266 |
+
except Exception as e:
|
| 267 |
+
# generate_content 自体でエラーが発生した場合
|
| 268 |
+
print(f"Google Gemini API呼び出し中にエラーが発生しました: {e}")
|
| 269 |
+
return f"Google Gemini API呼び出し中にエラーが発生しました: {e}"
|
| 270 |
|
| 271 |
else:
|
| 272 |
return "無効なLLMが選択されました。"
|