kofdai commited on
Commit
e6508d2
·
1 Parent(s): 338225f

Fix: Make Phase 3 memory consolidation more robust

Browse files
Files changed (1) hide show
  1. athens_main.py +74 -20
athens_main.py CHANGED
@@ -2,6 +2,7 @@ import requests
2
  import json
3
  import ast
4
  import argparse
 
5
  from lps import LatentPatternStore
6
 
7
  # --- 設定 ---
@@ -74,7 +75,38 @@ def _phase2_feasibility_search(raw_idea: str, ollama_model: str) -> str:
74
  return f"エラー:フェーズ2で予期せぬエラーが発生しました。"
75
 
76
  # --- フェーズ3:記憶の定着 ---
77
- def _phase3_memory_consolidation(raw_idea: str, implementation_plan: str, ollama_model: str) -> list[str]:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  """生成されたアイデアとプランから、記憶すべき核心的なコンセプトを抽出する。"""
79
  print("\n--- フェーズ3:記憶の定着を開始 ---")
80
  content_to_analyze = f"""### 生のアイデア
@@ -83,30 +115,52 @@ def _phase3_memory_consolidation(raw_idea: str, implementation_plan: str, ollama
83
  ### 実行計画
84
  {implementation_plan}"""
85
 
86
- prompt = f"""あなたは優秀な情報分析官です。以下のテキストから、今後のために記憶しておくべき最も重要なキーワードやコンセプトを5つだけ抽出し、Pythonのリスト形式(例: ["コンセプト1", "コンセプト2"])で出力してください。解説や他のテキストは一切不要です。"""
87
-
88
- print(f"フェーズ3のプロンプトをOllama ({ollama_model}) に送信中...")
89
- try:
90
- payload = {"model": ollama_model, "prompt": prompt, "stream": False}
91
- response = requests.post(OLLAMA_API_URL, json=payload, timeout=300)
92
- response.raise_for_status()
93
- response_text = response.json().get('response', '[]').strip()
94
-
95
- new_memories = ast.literal_eval(response_text)
96
- if isinstance(new_memories, list):
97
- print(f"Ollamaにより抽出された新記憶: {new_memories}")
98
- return new_memories
99
- else:
100
- print(f"[警告] Ollamaがリス形式で応答しませんでした: {response_text}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  return []
102
- except Exception as e:
103
- print(f"[エラー] フェーズ3で予期せぬエラー: {e}")
104
- return []
 
 
 
105
 
106
  # --- メイン処理 ---
107
  if __name__ == '__main__':
108
  parser = argparse.ArgumentParser(description='「アテネ」アーキテクチャ:二相推論AI')
109
- parser.add_argument('--model', type=str, default='llama3', help='使用するOllamaモデル名 (例: llama3, gemma2:9b)')
110
  args = parser.parse_args()
111
 
112
  print(f"--- 「アテネ」アーキテクチャ起動 (使用モデル: {args.model}) ---")
 
2
  import json
3
  import ast
4
  import argparse
5
+ import re
6
  from lps import LatentPatternStore
7
 
8
  # --- 設定 ---
 
75
  return f"エラー:フェーズ2で予期せぬエラーが発生しました。"
76
 
77
  # --- フェーズ3:記憶の定着 ---
78
+ def _extract_python_list(response_text: str) -> list[str] | None:
79
+ """LLMの応答からPythonのリスト形式の文字列を抽出してパースする。"""
80
+ # ```python ... ``` ブロックを探す
81
+ match = re.search(r"```python\s*([\s\S]*?)```", response_text)
82
+ if match:
83
+ code = match.group(1).strip()
84
+ try:
85
+ # `ast.literal_eval`で安全に評価
86
+ evaluated = ast.literal_eval(code)
87
+ if isinstance(evaluated, list):
88
+ return evaluated
89
+ except (ValueError, SyntaxError):
90
+ # 評価に失敗した場合は、次の抽出方法へ
91
+ pass
92
+
93
+ # `[` と `]` で囲まれた部分を探す
94
+ match = re.search(r"(\[[\s\S]*?\])", response_text)
95
+ if not match:
96
+ return None
97
+
98
+ list_str = match.group(1)
99
+ try:
100
+ # `ast.literal_eval`で安全に評価
101
+ new_memories = ast.literal_eval(list_str)
102
+ if isinstance(new_memories, list):
103
+ return new_memories
104
+ else:
105
+ return None
106
+ except (ValueError, SyntaxError):
107
+ return None
108
+
109
+ def _phase3_memory_consolidation(raw_idea: str, implementation_plan: str, ollama_model: str, max_retries: int = 3) -> list[str]:
110
  """生成されたアイデアとプランから、記憶すべき核心的なコンセプトを抽出する。"""
111
  print("\n--- フェーズ3:記憶の定着を開始 ---")
112
  content_to_analyze = f"""### 生のアイデア
 
115
  ### 実行計画
116
  {implementation_plan}"""
117
 
118
+ prompt = f"""あなたは優秀な情報分析官です。以下のテキストから、今後のために記憶しておくべき最も重要なキーワードやコンセプトを5つだけ抽出し、Pythonのリスト形式で出力してください。
119
+
120
+ **重要:**
121
+ - 必ず `["コンセプト1", "コンセプト2", "コンセプト3", "コンセプト4", "コンセプト5"]` のような、ダブルクォートで囲まれた文字列のリストを返してください。
122
+ - リスト以外のテキスト(解説、前置き、後書きなど)は絶対に含めないでください。
123
+ - 出力は必ず `[` で始まり、 `]` で終わる必要があります。
124
+
125
+ 例:
126
+ ```python
127
+ ["コンセプト1", "コンセプト2", "コンセプト3", "コンセプト4", "コンセプト5"]
128
+ ```
129
+ """
130
+
131
+ for attempt in range(max_retries):
132
+ print(f"\nフェーズ3のプロンプをOllama ({ollama_model}) に送信中... (試行 {attempt + 1}/{max_retries})")
133
+ try:
134
+ payload = {"model": ollama_model, "prompt": prompt, "stream": False}
135
+ response = requests.post(OLLAMA_API_URL, json=payload, timeout=300)
136
+ response.raise_for_status()
137
+ response_text = response.json().get('response', '[]').strip()
138
+
139
+ print(f"Ollamaからの生応答: {response_text}")
140
+
141
+ new_memories = _extract_python_list(response_text)
142
+
143
+ if new_memories is not None:
144
+ print(f"Ollamaにより抽出された新記憶: {new_memories}")
145
+ return new_memories
146
+ else:
147
+ print(f"[警告] Ollamaの応答から有効なリストを抽出できませんでした。")
148
+
149
+ except requests.exceptions.RequestException as e:
150
+ print(f"[エラー] Ollamaサーバーへの接続に失敗しました: {e}")
151
+ # サーバ���エラーの場合はリトライせずに終了
152
  return []
153
+ except Exception as e:
154
+ print(f"[エラー] フェーズ3で予期せぬエラーが発生しました: {e}")
155
+ # その他の予期せぬエラーでもリトライを続ける
156
+
157
+ print(f"[エラー] {max_retries}回の試行後も、フェーズ3で有効な記憶を抽出できませんでした。")
158
+ return []
159
 
160
  # --- メイン処理 ---
161
  if __name__ == '__main__':
162
  parser = argparse.ArgumentParser(description='「アテネ」アーキテクチャ:二相推論AI')
163
+ parser.add_argument('--model', type=str, default='gemma3:27b', help='使用するOllamaモデル名 (例: llama3, gemma2:9b)')
164
  args = parser.parse_args()
165
 
166
  print(f"--- 「アテネ」アーキテクチャ起動 (使用モデル: {args.model}) ---")