Replies: 1 comment
|
Answering both this and #1290 here, since they are the same arc -- I will drop a pointer on that one. The split is right, and the reason it matters is narrower than "two origins are cleaner": today the rating endpoint blends the human opinion into the same field that retention reads, and the retention path is not built to receive an opinion. Retention should read With that in place:
The real sync constraint is next door and it is worth designing around now: Scope for a first PR, if you want to take it: the two origin fields plus the effective-value write, Question 2 stays open in the sense that I am not committing to a deletion rule for ratings at all yet -- that is deliberate. |
Uh oh!
There was an error while loading. Please reload this page.
Context. In our fork we've been mapping how
quality_scoreflows throughquality/. Today it's a single overloaded field: the AI scorer, implicit scorer, manual rating, and the decay association-boost all write to it, and ~10 consumers read it with no way to tell the origin. When a human rates a memory, the current0.6*user + 0.4*existingblend mixes the human opinion and the machine guess into one number — each can dilute or erase the other.Proposal (design only, not a PR yet). Keep two origin fields in
metadata(additive, no schema change):computed_quality(machine, keeps itsquality_provider/quality_components) anduser_rating(human, already exists). Materialize the effective value into the existingquality_scoreon write, so the ~7 rawmetadata.get('quality_score')consumers need zero changes. Composition: human rating wins when present, else computed, else 0.5. A single 👎 de-ranks in search but does not trigger forgetting; repeated 👎 (fromrating_history) do.Four questions where your input shapes the design (they touch retention/forgetting, which you own):
user_ratingis −1/0/+1. Current(rating+1)/2maps 👎 to exactly 0.0, which under "human wins" floors the memory. Prefer a floor above 0 for 👎, or a dedicated curve?forgetting.py?quality_scoreat write time because ~7 consumers read the raw field (two operate on plain dicts, noMemoryobject). Acceptable, or is there a reader you'd rather keep authoritative?user_ratingsync across hosts needs it as a new positional field in the CSV codec (metadata_codec.py), gated by a codec version bump. OK to coordinate a version for this?@doobidoo, happy to turn this into a small PR once the four points are settled. Full design write-up available if useful.
🇧🇷 Tradução PT-BR (para referência)
Contexto. No nosso fork mapeamos como o
quality_scoreflui peloquality/. Hoje é um campo único sobrecarregado: o scorer de IA, o scorer implícito, o rating manual e o association-boost do decay escrevem todos nele, e ~10 consumidores leem sem saber a origem. Quando um humano avalia uma memória, o blend atual0.6*user + 0.4*existingmistura a opinião humana e o palpite da máquina num só número — cada um pode diluir ou apagar o outro.Proposta (só design, ainda não é PR). Manter dois campos de origem no
metadata(aditivos, sem mudança de schema):computed_quality(máquina, mantémquality_provider/quality_components) euser_rating(humano, já existe). Materializar o valor efetivo noquality_scoreexistente na escrita, para que os ~7 consumidores que leem o campo cru não mudem nada. Composição: rating humano vence quando presente, senão o computado, senão 0.5. Um único 👎 rebaixa na busca mas não dispara forgetting; vários 👎 (dorating_history) sim.Quatro perguntas onde tua opinião molda o design (tocam retenção/forgetting, que é teu domínio):
user_ratingé −1/0/+1. O(rating+1)/2atual mapeia 👎 para exatamente 0.0, o que sob "humano vence" joga a memória no chão. Preferes um piso acima de 0 para 👎, ou uma curva dedicada?forgetting.py?quality_scorena escrita, porque ~7 consumidores leem o campo cru (dois operam em dicts puros, sem objetoMemory). Aceitável, ou há um leitor que preferes manter como autoritativo?user_ratingsincronizar entre hosts exige ele como novo campo posicional no codec CSV (metadata_codec.py), com bump de versão do codec. OK coordenar uma versão para isso?All reactions