flammenai/Phoenix-SFT-v1
Phoenix v1 — Memory Extraction Dataset Synthetic SFT training data for Phoenix, a small (Qwen2.5-class) model that reads a window of chat messages between a user and an AI character ("Flame") and emits a structured JSON list of memorable facts the Flame should remember about the user going forward. This is the v1 dataset shipped by flammen.ai for the memory layer that drives long-term continuity in async character conversations. Released as part of flammen.ai's open-source data… See the full description on the dataset page: https://huggingface.co/datasets/flammenai/Phoenix-SFT-v1.
Phoenix v1 — Memory Extraction Dataset
Synthetic SFT training data for Phoenix, a small (Qwen2.5-class) model that reads a window of chat messages between a user and an AI character ("Flame") and emits a structured JSON list of memorable facts the Flame should remember about the user going forward.
This is the v1 dataset shipped by flammen.ai for the memory layer that drives long-term continuity in async character conversations. Released as part of flammen.ai's open-source data strategy.
Task
Input: a conversation transcript like
User: Nina
Flame: Marisol
Conversation:
Nina: hey. been a rough week
Marisol: what happened?
Nina: my grandma passed last month and ive been like... kind of fine? and then today i found one of her recipe cards in a drawer and lost it
Marisol: oh nina. i'm so sorry.
Nina: yeah. she taught me to bake. her oatmeal cookies are like the only thing i can make from memoryOutput: a JSON object with structured memories:
{
"memories": [
{"content": "Grandmother recently passed away", "category": "event"},
{"content": "Was taught to bake by her grandmother", "category": "relation"},
{"content": "Can make her grandmother's oatmeal cookies from memory", "category": "factual"},
{"content": "Working through grief over her grandmother's death", "category": "emotion"}
]
}Schema
Categories (closed enum):
factual— concrete data (job, location, family structure, possessions)preference— likes/dislikes/values/habitsrelation— other named people in the user's lifeevent— things that happened to the user (recent or ongoing)emotion— emotional state, current preoccupation
Each content is a third-person sentence, 3-30 words, with the user as implicit subject. Empty memories array is a valid output meaning "nothing notable in this window" — explicit training signal so the model learns when to stay silent rather than invent memories from chitchat.
Format
Each row is a chat-completion example in the OpenAI / HuggingFace messages convention:
{
"seed_id": "...",
"stratum": {
"length": "medium", "density": "mixed", "register": "casual",
"phase": "getting_to_know", "topic_mix": "scattered", "language": "en"
},
"messages": [
{"role": "system", "content": "You are a memory-extraction model..."},
{"role": "user", "content": "User: Nina\nFlame: Marisol\n\nConversation:..."},
{"role": "assistant", "content": "{\"memories\":[...]}"}
]
}Splits
train.jsonl— 1728 exampleseval.jsonl— 170 examples (~10%)
Stratified split bucketed on (density, language, phase) so the eval distribution mirrors train.
Density mix
The 13% null share is deliberately above target (10%) — Phoenix needs strong "empty array" training to avoid inventing memories from pure banter.
Language mix
Heavily English (≥85%), with smaller stratified shares of Spanish, French, Japanese, and Chinese. Cross-lingual robustness, not full multilingual coverage. Phoenix outputs are always English regardless of input language.
Generation pipeline
Three stages, all reproducible from flammenai/Phoenix (in-house):
- Seeds (Claude Haiku 4.5): synthetic conversations matching a stratum sampled from the axes above. ~2500 conversations generated.
- Chosen extractions (Claude Sonnet 4.6): tool-forced JSON extraction with a 9-rule system prompt + 3 in-context examples covering null window, vulnerable-with-time-stripped, and ephemeral-filtered cases.
- Quality judge (local Qwen3.5-27B + JSON-schema constraint): per- extraction verdict on an 11-mode failure taxonomy. Only extractions passing all 11 modes survive into this dataset.
Failure-mode taxonomy
The judge filters against these — every kept extraction passed all of them:
gold_anchors.json includes 10 hand-crafted reference examples with both chosen and rejected variants demonstrating these modes — useful for qualitative inspection.
Limitations
- SFT only. v1 is supervised fine-tuning. The DPO infrastructure (rejected-sample generator, per-mode contrast pairs) exists in the pipeline repo but stage 2b was not run at scale due to budget. v2 intends to add DPO refinement using real-world failure data collected from production extractions.
- Synthetic only. All conversations are Haiku-generated. Real-user conversation distributions will differ; production deployment should add real-data evals.
- Date awareness. Phoenix has no concept of "today" — relative time qualifiers are stripped on purpose. Memories like "Grandmother recently passed away" stay accurate even after months pass; "passed away last month" wouldn't.
- English-output bias. Memory content is always English even when the input conversation is in another language. By design — the consumer (FlameWorker prompt-builder) is English.
- Judge isn't perfect. The Qwen 27B judge reliably catches structural failure modes (vaguefiller, wronglanguage, hallucinated date, relativetimequalifier) but is weaker on subtler semantic modes (inventedfromnull, ephemeraldetail). Some chosens with subtle issues may have slipped through.
Contact
Schneewolf Labs LLC — flammen.ai
