<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Sipplay Engineering]]></title><description><![CDATA[Sipplay Engineering]]></description><link>https://sipplay.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Wed, 04 Nov 2026 02:16:00 GMT</lastBuildDate><atom:link href="https://sipplay.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[When Should an AI Character Search Its Memory? Lessons from Sipplay's Evaluation]]></title><description><![CDATA[Inside Sipplay’s AI memory evaluation: when to search, when to use context, and what 60 English probes revealed about retrieval decisions.]]></description><link>https://sipplay.hashnode.dev/when-should-an-ai-character-search-its-memory-lessons-from-sipplay-s-evaluation</link><guid isPermaLink="true">https://sipplay.hashnode.dev/when-should-an-ai-character-search-its-memory-lessons-from-sipplay-s-evaluation</guid><category><![CDATA[Artificial Intelligence]]></category><category><![CDATA[LLM Memory]]></category><category><![CDATA[LLM-Retrieval ]]></category><dc:creator><![CDATA[owenlsatwinner]]></dc:creator><pubDate>Tue, 27 Oct 2026 07:11:11 GMT</pubDate><content:encoded><![CDATA[<p>A user asks, “Can you help me choose dinner?”</p>
<p>That sounds like a simple request. For an AI application with memory, it contains a routing decision. Should the system answer from the current conversation, use a summary, or search older records for dietary preferences?</p>
<p>Now add one detail: the user mentioned a food restriction a few messages ago. Searching long-term memory may be unnecessary. Put the same detail outside the current context, and skipping retrieval may lose the information the answer needs.</p>
<p>The wording of the request has not changed. The available context has.</p>
<p>This is the problem behind one part of our memory evaluation at <a href="https://sipplay.ai/">Sipplay</a>, where we build AI character chat and interactive stories. I am part of the team. The examples above are illustrations; the measurements below come from our internal development tests.</p>
<h2>The decision before vector search</h2>
<p>It is tempting to begin memory engineering by choosing an embedding model and a vector database. There is a decision upstream of both: whether to search at all.</p>
<p>Search on every turn and the system spends time retrieving things it already knows. It may also introduce an older record into a conversation with a newer answer. Search too conservatively and a perfectly capable retriever never gets called.</p>
<p>We tested this decision separately from embedding quality. The model receives the current message, recent conversation, and a medium-term summary. Its job is to produce a retrieval plan.</p>
<p>That plan needs more detail than a yes/no flag. Which person is involved? Does “last time” mean the most recent event? Is the user asking for a preference, a relationship event, or a current plan?</p>
<p>Here is an illustrative output shape, translated and simplified from the evaluation design:</p>
<pre><code class="language-json">{
  "need_retrieval": true,
  "memory_types": ["relationship_event"],
  "entities": ["user", "Lin"],
  "time_scope": "most_recent",
  "search_query": "reason and outcome of the user's most recent argument with Lin",
  "confidence": 0.93
}
</code></pre>
<p>Valid JSON is only the first check. A confidently structured query can still name the wrong person or silently drop a time condition. The confidence value above is an example, not a calibrated probability.</p>
<h2>Give the model reasons not to search</h2>
<p>Our English intent test contained ten scenarios. Each supplied 20 recent messages, a medium-term summary, and six independent probe messages. That produced 60 probes: 30 requiring long-term retrieval and 30 that should not trigger it.</p>
<p>The negative examples were important. Some were ordinary conversation. Others had an answer already available in the recent messages or summary.</p>
<p>Without those cases, an eager model can look good simply by searching for everything.</p>
<p>The four candidates received the same English system prompt and inputs, and each completed two runs. We scored both sides of the decision rather than relying only on overall accuracy.</p>
<p>In that development set, Claude Haiku 4.5 triggered retrieval on 96.7% of the positive probes and correctly avoided it on all negative probes in both runs. That corresponds to 29 of 30 positive cases and 30 of 30 negative cases.</p>
<p>Gemini 3.5 Flash Lite also triggered on 29 of 30 positive probes, but it searched unnecessarily on three of the 30 negative probes in each run. Two of those false triggers concerned answers already present in the medium-term summary.</p>
<p>The differences were small in absolute numbers. They still revealed a useful failure pattern: the model recognized a memory-related question without consistently recognizing that the relevant memory was already in front of it.</p>
<h2>“Never searches unnecessarily” can hide a different problem</h2>
<p>GPT-5.4 mini correctly avoided retrieval on all negative probes, but missed two or three of the 30 positive probes, depending on the run. GPT-5 nano also avoided false triggers, while missing roughly 11 or 12 positive probes.</p>
<p>Those results describe this prompt and this small dataset. They do not establish a general ranking of the models.</p>
<p>They do show why a single cost or accuracy number is a poor basis for routing decisions. A system can look restrained because it has become reluctant to act.</p>
<p>The report's proposed gate requires at least 95% on both positive triggering and correct non-triggering. Only Haiku passed both in this round. An independent English holdout set is still required before treating that as a release decision.</p>
<h2>Keep three forms of context distinct</h2>
<p>The evaluation design uses recent messages, a medium-term summary, and longer-lived memory cards. Each has a different job.</p>
<p>Recent messages preserve the immediate exchange. The summary carries forward the broader situation. Long-term cards hold selected facts, preferences, events, and plans that may be useful after the current window is gone.</p>
<p>That separation creates a practical policy: check what is already available before asking the retrieval system for more.</p>
<p>It also creates a maintenance problem. A plan can appear in a summary but disappear when that summary is replaced. In a separate memory-extraction test, the report notes that ongoing travel and flight plans were sometimes preserved in summaries but omitted from long-term cards.</p>
<p>The proposed fix is specific: unfinished plans that remain useful across windows should become cards, with completion or expiration handled later. That change needs another test; writing the instruction is not proof that the failure is gone.</p>
<h2>Test the handoff between components</h2>
<p>Once the intent model produces a plan, feed that actual plan into retrieval. A human-written reference query is useful for isolating the embedding model, but it cannot reveal the mistakes introduced by the query-writing step.</p>
<p>For each failure, ask:</p>
<ol>
<li>Did the system trigger retrieval when needed?</li>
<li>Did it preserve the correct person and time range?</li>
<li>Did the search query preserve the user's meaning?</li>
<li>Did the correct card enter the result set?</li>
<li>Did an outdated or wrong-person card outrank it?</li>
</ol>
<p>In this English round, the auxiliary retrieval check used an existing Chinese card corpus. That is a useful cross-language observation, but it cannot validate the whole English memory experience. The next dataset needs to match the intended language and conversational conditions.</p>
<h2>What this means for AI character chat</h2>
<p>For a player, all these decisions collapse into one impression: does this character seem to remember what matters?</p>
<p>A forgotten preference can make a conversation feel generic. An unnecessary reference to an old event can make it feel out of step. Searching more often does not automatically improve either experience.</p>
<p>For our work on Sipplay, the useful lesson is to make the retrieval decision visible and testable. Give the model context, make it state what it needs, and inspect both the searches it starts and the searches it skips.</p>
<p>Before buying a faster vector database, it is worth checking whether the right question is reaching it.</p>
<p><em>Method note: all named model results are reported from Sipplay's internal evaluation, not independently rerun for this article. The 60 probes form a development set, with two runs per model. This is an account of an evaluation process, not a production performance guarantee. The raw prompts and fixtures are not published with this article.</em></p>
]]></content:encoded></item></channel></rss>