Rewrite extraction prompt and system prompt

Extraction: system+user split with explicit SAVE/DON'T SAVE rules,
few-shot examples, stricter JSON-only format. Min fact length 15 chars.

System prompt: model now knows about its 3-level memory, how to use
recalled facts, and that user can control memory via chat commands.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
jze9
2026-05-28 20:48:04 +05:00
parent 9974ce8dd9
commit fa66a8098c
2 changed files with 48 additions and 12 deletions

View File

@@ -134,24 +134,51 @@ async def get_summary(session_id: str) -> str | None:
# ── extract & store facts after each turn ────────────────────────────────────
EXTRACT_PROMPT = """Extract important facts, preferences, or technical details from this message.
Return a JSON array of strings (facts). Max 5 items. If nothing important, return [].
Only technical or personal facts worth remembering long-term.
Message: {msg}"""
EXTRACT_SYSTEM = """Ты — система извлечения фактов из переписки. Твоя задача: найти факты о ПОЛЬЗОВАТЕЛЕ, достойные долгосрочного хранения.
СОХРАНЯЙ:
- Имя, роль, профессия пользователя ("я разработчик", "меня зовут Иван")
- Язык программирования, фреймворк, стек ("пишу на Go", "использую FastAPI")
- ОС, редактор, инструменты ("сижу на Arch", "использую Neovim")
- Характеристики проекта ("проект на Django", "БД PostgreSQL", "деплой на Proxmox")
- Явные предпочтения ("предпочитаю tabs", "не люблю TypeScript")
- Технические ограничения ("сервер 4GB RAM", "Python 3.11")
- Личные факты которые пользователь сообщил о себе
НЕ СОХРАНЯЙ:
- Вопросы (строки со знаком ?)
- Приветствия ("привет", "hello", "окей")
- Одиночные слова или короткие реплики без факта
- То что сказал ассистент — только слова пользователя
- Запросы без фактов ("помоги мне", "объясни как")
- Мусор, шутки, эмоции без информации
ФОРМАТ ОТВЕТА: только JSON массив строк, без пояснений, без markdown.
Правильно: ["пользователь пишет на Python 3.12", "использует Neovim"]
Неправильно: ```json\n["факт"]\n``` или "Вот факты: [...]"
Если фактов нет — верни пустой массив: []"""
EXTRACT_PROMPT = """Извлеки факты из сообщения пользователя. Максимум 5 фактов.
Сообщение пользователя:
{msg}
JSON массив:"""
async def extract_and_store(content: str, user_id: str = "default"):
try:
raw = await chat([
{"role": "user", "content": EXTRACT_PROMPT.format(msg=content[:1500])}
{"role": "system", "content": EXTRACT_SYSTEM},
{"role": "user", "content": EXTRACT_PROMPT.format(msg=content[:1500])}
])
# find JSON array in response
start = raw.find("[")
end = raw.rfind("]") + 1
if start == -1 or end == 0:
return
facts = json.loads(raw[start:end])
for fact in facts[:5]:
if isinstance(fact, str) and len(fact) > 10:
if isinstance(fact, str) and len(fact) > 15:
await store_memory(fact, user_id=user_id, memory_type="fact")
except Exception:
pass # never crash the main flow