Spaces:
Sleeping
Sleeping
Update pipeline.py
Browse files- pipeline.py +34 -14
pipeline.py
CHANGED
|
@@ -225,20 +225,36 @@ def check_completeness(state: GraphState):
|
|
| 225 |
with log_step("check_completeness"):
|
| 226 |
state["iteration"] += 1
|
| 227 |
|
| 228 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 229 |
|
| 230 |
prompt = f"""
|
| 231 |
-
|
|
|
|
| 232 |
|
| 233 |
-
|
| 234 |
|
| 235 |
-
Проанализируй, достаточно ли материала
|
| 236 |
|
| 237 |
-
|
| 238 |
{{
|
| 239 |
-
"enough": true
|
| 240 |
-
"
|
|
|
|
|
|
|
|
|
|
| 241 |
}}
|
|
|
|
|
|
|
| 242 |
"""
|
| 243 |
|
| 244 |
raw = llm_analyze(prompt)
|
|
@@ -248,23 +264,27 @@ def check_completeness(state: GraphState):
|
|
| 248 |
data = json.loads(match.group(0)) if match else json.loads(raw)
|
| 249 |
|
| 250 |
enough = data.get("enough", False)
|
| 251 |
-
next_query = data.get("next_query"
|
|
|
|
| 252 |
|
| 253 |
-
print(f"Enough: {enough}")
|
| 254 |
-
if next_query:
|
| 255 |
-
print(f"→ New query: {next_query}")
|
| 256 |
|
| 257 |
-
if not enough and next_query and state["iteration"] <
|
|
|
|
| 258 |
return {
|
| 259 |
"retrieval_queries": state["retrieval_queries"] + [next_query],
|
| 260 |
"recurse": True
|
| 261 |
}
|
| 262 |
else:
|
|
|
|
| 263 |
return {"recurse": False}
|
| 264 |
|
| 265 |
except Exception as e:
|
| 266 |
-
print(f"Parse error
|
| 267 |
-
|
|
|
|
|
|
|
|
|
|
| 268 |
|
| 269 |
|
| 270 |
def generate_weekly_plan(state: GraphState):
|
|
|
|
| 225 |
with log_step("check_completeness"):
|
| 226 |
state["iteration"] += 1
|
| 227 |
|
| 228 |
+
total_chars = sum(len(doc.page_content) for doc in state["contexts"])
|
| 229 |
+
num_docs = len(state["contexts"])
|
| 230 |
+
|
| 231 |
+
print(f"Iteration {state['iteration']} | Documents: {num_docs} | Chars: ~{total_chars//1000}k")
|
| 232 |
+
|
| 233 |
+
# Жёсткий лимит по размеру контекста
|
| 234 |
+
if total_chars > 25000 or state["iteration"] >= 8:
|
| 235 |
+
print("✅ Достаточно контекста по объёму → завершаем сбор")
|
| 236 |
+
return {"recurse": False}
|
| 237 |
+
|
| 238 |
+
context_preview = "\n\n".join([doc.page_content[:400] for doc in state["contexts"][-8:]])
|
| 239 |
|
| 240 |
prompt = f"""
|
| 241 |
+
Текущий запрос пользователя:
|
| 242 |
+
{state['query']}
|
| 243 |
|
| 244 |
+
Уже собрано {num_docs} документов (~{total_chars//1000}k символов).
|
| 245 |
|
| 246 |
+
Проанализируй, достаточно ли материала, чтобы создать **качественный интенсивный курс**.
|
| 247 |
|
| 248 |
+
Ответь строго JSON:
|
| 249 |
{{
|
| 250 |
+
"enough": true/false,
|
| 251 |
+
"reason": "короткое объяснение почему enough или нет",
|
| 252 |
+
"next_query": "если enough=false — один **конкретный** поисковый запрос для RAG.
|
| 253 |
+
Должен быть тематическим, а не 'составь план'.
|
| 254 |
+
Пример: 'аффинные алгебраические многообразия определение свойства примеры'"
|
| 255 |
}}
|
| 256 |
+
|
| 257 |
+
Будь строгим. Если контекста уже много и основные темы покрыты — ставь enough: true.
|
| 258 |
"""
|
| 259 |
|
| 260 |
raw = llm_analyze(prompt)
|
|
|
|
| 264 |
data = json.loads(match.group(0)) if match else json.loads(raw)
|
| 265 |
|
| 266 |
enough = data.get("enough", False)
|
| 267 |
+
next_query = (data.get("next_query") or "").strip()
|
| 268 |
+
reason = data.get("reason", "")
|
| 269 |
|
| 270 |
+
print(f"Enough: {enough} | Reason: {reason[:100]}...")
|
|
|
|
|
|
|
| 271 |
|
| 272 |
+
if not enough and next_query and state["iteration"] < 8:
|
| 273 |
+
print(f"→ New query: {next_query}")
|
| 274 |
return {
|
| 275 |
"retrieval_queries": state["retrieval_queries"] + [next_query],
|
| 276 |
"recurse": True
|
| 277 |
}
|
| 278 |
else:
|
| 279 |
+
print("✅ Завершаем итерации, переходим к генерации плана")
|
| 280 |
return {"recurse": False}
|
| 281 |
|
| 282 |
except Exception as e:
|
| 283 |
+
print(f"Parse error: {e}")
|
| 284 |
+
# Если модель совсем не дала JSON — выходим после 6 итераций
|
| 285 |
+
if state["iteration"] >= 6:
|
| 286 |
+
return {"recurse": False}
|
| 287 |
+
return {"recurse": True} # попробуем ещё раз
|
| 288 |
|
| 289 |
|
| 290 |
def generate_weekly_plan(state: GraphState):
|