File size: 2,262 Bytes
b8989d2 9e684ce bb410e4 9e684ce bb410e4 9e684ce |
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 |
# agents/tools/memory_utils.py
from datetime import datetime, timedelta, UTC
from difflib import SequenceMatcher
from typing import Optional, List, Dict
STAGNATION_WINDOW = 5 # сколько последних записей сравнивать
STAGNATION_THRESHOLD = 0.95 # схожесть выше этого — считается стагнацией
def get_last_responses(db, limit=STAGNATION_WINDOW) -> List[str]:
records = db.get_llm_recent_responses(limit=limit)
return [r["content"] if isinstance(r, dict) else r for r in records]
def is_stagnant(responses: List[str]) -> bool:
if len(responses) < 2:
return False
similarities = []
for i in range(len(responses) - 1):
sim = string_similarity(responses[i], responses[i + 1])
similarities.append(sim)
avg_sim = sum(similarities) / len(similarities)
return avg_sim >= STAGNATION_THRESHOLD
def string_similarity(a: str, b: str) -> float:
return SequenceMatcher(None, a.strip(), b.strip()).ratio()
def get_last_stagnation_info(db) -> Optional[Dict]:
responses = get_last_responses(db)
if is_stagnant(responses):
return {
"detected": True,
"average_similarity": round(sum(
string_similarity(responses[i], responses[i+1])
for i in range(len(responses)-1)
) / (len(responses)-1), 4),
"last_messages": responses
}
return {"detected": False}
def add_to_llm_memory(db, title: str, content: str, tags: str = "meta"):
db.insert("llm_memory", {
"title": title,
"content": content,
"tags": tags,
"created_at": datetime.now(UTC).isoformat(),
"updated_at": datetime.now(UTC).isoformat()
})
def record_reflection_if_stagnant(db):
stagnation = get_last_stagnation_info(db)
if stagnation.get("detected"):
content = f"Обнаружена стагнация размышлений. Последние сообщения были очень похожи.\n\n"
content += "---\n" + "\n---\n".join(stagnation["last_messages"])
add_to_llm_memory(db, "Стагнация размышлений", content, tags="meta,warning")
return True
return False
|