- Added `status` query parameter to `list_sessions_api` for filtering sessions by their status (active/closed). - Introduced `close_all_sessions_api` endpoint to allow users to close all active sessions for the current actor. - Updated `SessionRepository` to support status filtering in session listing and implemented logic for closing active sessions. - Improved Redis connection settings for better performance and reliability. This update enhances the chat functionality by providing more control over session management, improving user experience and system efficiency.
112 lines
6.1 KiB
HTML
112 lines
6.1 KiB
HTML
<section class="module" id="module-5">
|
||
<div class="module-inner">
|
||
<p class="eyebrow animate-in">模块 5 · D-06</p>
|
||
<h1 class="module-title animate-in">模板填参 + 结果缓存<br>写侧 bump 失效</h1>
|
||
<p class="module-lead animate-in">
|
||
问数两层「快路径」:① <strong>同形态问题</strong>命中 published 模板,跳过 LLM 写 SQL(<code>template_service.py</code>)
|
||
② 执行结果进 Redis,键里带<strong>表世代</strong>——交易/预警/L3 写后 bump,不等 TTL 过期。
|
||
</p>
|
||
|
||
<div class="screen animate-in">
|
||
<h2>两层 D-06 各管什么</h2>
|
||
<table style="width:100%; border-collapse:collapse; margin:1.5rem 0; font-size:0.95rem;">
|
||
<thead>
|
||
<tr><th style="text-align:left;padding:0.5rem;">层</th><th style="text-align:left;padding:0.5rem;">入口</th><th style="text-align:left;padding:0.5rem;">答辩句</th></tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td style="padding:0.5rem;">模板缓存</td>
|
||
<td style="padding:0.5rem;"><code>match_template</code> → 填 <code>:days</code> 等</td>
|
||
<td style="padding:0.5rem;">「客户+总数」→ <code>template_hit: true</code>,省 LLM 写 SQL</td>
|
||
</tr>
|
||
<tr>
|
||
<td style="padding:0.5rem;">结果缓存</td>
|
||
<td style="padding:0.5rem;"><code>cache_service.py</code> 权限指纹 + SQL hash + 世代</td>
|
||
<td style="padding:0.5rem;">「同 SQL 同权限」秒回;写侧 bump 后旧键自然 miss</td>
|
||
</tr>
|
||
<tr>
|
||
<td style="padding:0.5rem;">写侧失效</td>
|
||
<td style="padding:0.5rem;"><code>analyst_cache_invalidate</code> 交易/预警/L3 后</td>
|
||
<td style="padding:0.5rem;">「演示里刚模拟交易,问数不会还显示旧汇总」</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<div class="callout callout-accent">
|
||
前端问数页会展示 <strong>模板命中</strong> / <strong>结果缓存</strong> 标签(读 <code>meta.template_hit</code> · <code>cache_hit</code>)。
|
||
</div>
|
||
</div>
|
||
|
||
<div class="screen animate-in">
|
||
<div class="translation-block">
|
||
<div class="translation-code">
|
||
<span class="translation-label">analyst_agent 决策顺序(简化)</span>
|
||
<pre><code><span class="code-line">clarify? → return suggestions</span>
|
||
<span class="code-line">template match? → fill SQL → validate → execute</span>
|
||
<span class="code-line">else LLM generate_sql → validate → execute (cache?)</span>
|
||
<span class="code-line">guardrail → persist analytics_query_log</span></code></pre>
|
||
</div>
|
||
<div class="translation-english">
|
||
<span class="translation-label">白话</span>
|
||
<div class="translation-lines">
|
||
<p class="tl">像<strong>预制菜 + 冰箱贴保质期</strong>:常问题型直接拿模板填天数;跑完的结果贴冰箱,但 Core 有新交易就撕掉旧标签(bump)。</p>
|
||
<p class="tl">种子:<code>scripts/agent/seed-analyst-query-templates.sql</code> · 一键演示:<code>prepare_all.ps1</code>。</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="screen animate-in">
|
||
<h2>群聊:模板 vs LLM vs 缓存</h2>
|
||
<div class="chat-window" id="chat-analyst-m5">
|
||
<div class="chat-messages">
|
||
<div class="chat-message" data-msg="0" data-sender="page" style="display:none">
|
||
<div class="chat-avatar" style="background:#2A7B9B">问数页</div>
|
||
<div class="chat-bubble">
|
||
<span class="chat-sender" style="color:#2A7B9B">AnalystQueryPage</span>
|
||
<p>POST「近7天申购金额」</p>
|
||
</div>
|
||
</div>
|
||
<div class="chat-message" data-msg="1" data-sender="tpl" style="display:none">
|
||
<div class="chat-avatar" style="background:#6B5B95">template</div>
|
||
<div class="chat-bubble">
|
||
<span class="chat-sender" style="color:#6B5B95">template_service</span>
|
||
<p>关键词 + schema 命中 → 填 <code>:days=7</code> → 跳过 LLM</p>
|
||
</div>
|
||
</div>
|
||
<div class="chat-message" data-msg="2" data-sender="cache" style="display:none">
|
||
<div class="chat-avatar" style="background:#5A9DB8">cache</div>
|
||
<div class="chat-bubble">
|
||
<span class="chat-sender" style="color:#5A9DB8">cache_service</span>
|
||
<p>世代未变 → <code>cache_hit</code>;刚 bump → 重算再写 Redis</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<button class="btn chat-play-btn" data-chat="chat-analyst-m5">播放对话</button>
|
||
</div>
|
||
|
||
<div class="quiz-container" id="quiz-analyst-m5">
|
||
<div class="quiz-question-block"
|
||
data-correct="option-c"
|
||
data-explanation-right="对。模板是「同形态填参」省 LLM;结果缓存是「同 SQL 同权限」省 DB。两层独立,meta 可同时看 template_hit 与 cache_hit。"
|
||
data-explanation-wrong="D-06 是两层:不要混成「只有 Redis 缓存」。">
|
||
<h3 class="quiz-question">AI 说「问数缓存就是 Redis TTL 10 分钟」,你怎么纠正?</h3>
|
||
<div class="quiz-options">
|
||
<button class="quiz-option" data-value="option-a" onclick="selectOption(this)">
|
||
<div class="quiz-option-radio"></div><span>对,只靠 TTL</span>
|
||
</button>
|
||
<button class="quiz-option" data-value="option-b" onclick="selectOption(this)">
|
||
<div class="quiz-option-radio"></div><span>模板和缓存是一回事</span>
|
||
</button>
|
||
<button class="quiz-option" data-value="option-c" onclick="selectOption(this)">
|
||
<div class="quiz-option-radio"></div><span>还有表世代 bump + 模板填参两层</span>
|
||
</button>
|
||
</div>
|
||
<div class="quiz-feedback"></div>
|
||
</div>
|
||
<button class="quiz-check-btn" onclick="checkQuiz('quiz-analyst-m5')">检查答案</button>
|
||
<button class="quiz-reset-btn" onclick="resetQuiz('quiz-analyst-m5')">重做</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|