feat(rag): lite-generated KB overview in the system prompt — stored single row, regenerated on import, <knowledge_base> section in HIGH+LOW prompts
This commit is contained in:
@@ -15,6 +15,9 @@ Implements just enough of the aipi surface:
|
||||
tokens of the user message (the summarizer puts the capped document
|
||||
content there) — byte-stable for a given fixture (document summaries,
|
||||
phase 30)
|
||||
- ``KB_OVERVIEW_MODE`` -> the deterministic outline: the first 8 tokens
|
||||
of the user message (the generator puts the document list there) —
|
||||
byte-stable for a given KB (KB overview, phase 31)
|
||||
- ``DEFLECT_MODE`` -> honest "I haven't done anything like that" answer
|
||||
- otherwise -> upbeat answer quoting the provided document context
|
||||
- user message containing ``pretend to think slowly`` -> 3s warm-up delay
|
||||
@@ -30,6 +33,9 @@ Implements just enough of the aipi surface:
|
||||
- system prompt containing ``<tuning>`` (phase 15, steering notes) ->
|
||||
the composed answer ends with `` (tuning: <first note line>)`` —
|
||||
makes prompt injection observable in the UI deterministically.
|
||||
- system prompt containing ``<knowledge_base>`` (phase 31, KB overview)
|
||||
-> the composed answer ends with `` (kb: <first bullet line>)`` —
|
||||
the same echo convention for the overview's prompt injection.
|
||||
- user message containing ``show the end of your notes`` (phase 24,
|
||||
whole-document context) -> the answer quotes the **last 160 chars of
|
||||
the document context** — a tail echo, byte-stable across runs, so a
|
||||
@@ -155,6 +161,30 @@ def first_tuning_note(system: str) -> str | None:
|
||||
return None
|
||||
|
||||
|
||||
#: First ``-`` bullet line of a ``<knowledge_base>`` section (phase 31).
|
||||
_KB_BLOCK_RE = re.compile(r"<knowledge_base>\n(.*?)\n</knowledge_base>", re.S)
|
||||
_KB_BULLET_RE = re.compile(r"^-(?:\s+(.*))?$")
|
||||
|
||||
|
||||
def first_kb_bullet(system: str) -> str | None:
|
||||
"""The first outline bullet in the system prompt, or ``None``.
|
||||
|
||||
The stored outline (phase 31) is ``-`` bullet lines (see
|
||||
``app.rag.overview.OVERVIEW_INSTRUCTION``); the mock echoes the first
|
||||
one into its answer as `` (kb: <bullet>)`` — the exact
|
||||
:func:`first_tuning_note` convention, so prompt injection of the
|
||||
``<knowledge_base>`` section is observable in the UI.
|
||||
"""
|
||||
block = _KB_BLOCK_RE.search(system)
|
||||
if not block:
|
||||
return None
|
||||
for line in block.group(1).splitlines():
|
||||
m = _KB_BULLET_RE.match(line.strip())
|
||||
if m:
|
||||
return (m.group(1) or "").strip()
|
||||
return None
|
||||
|
||||
|
||||
def compose_answer(body: dict[str, Any]) -> str:
|
||||
system = _system(body)
|
||||
user = _user(body)
|
||||
@@ -172,6 +202,17 @@ def compose_answer(body: dict[str, Any]) -> str:
|
||||
f"This document covers "
|
||||
f"{' '.join(TOKEN_RE.findall(user.lower())[:24])}."
|
||||
)
|
||||
elif "KB_OVERVIEW_MODE" in system:
|
||||
# KB overview (phase 31): the ``lite`` stand-in returns the
|
||||
# deterministic outline — the first 8 tokens of the user message
|
||||
# (the generator puts the document list there). Byte-stable for a
|
||||
# given KB, so the stored row is a pure function of the fixture.
|
||||
# Checked BEFORE the DEFLECT_MODE branch, like SUMMARY_MODE, so a
|
||||
# prompt that ever carries both markers cannot shadow the
|
||||
# overview call.
|
||||
answer = "Knowledge base outline:\n- " + " ".join(
|
||||
TOKEN_RE.findall(user.lower())[:8]
|
||||
)
|
||||
elif "DEFLECT_MODE" in system:
|
||||
answer = (
|
||||
"Ah — I haven't done anything like that, so I don't want to make stuff up! "
|
||||
@@ -202,6 +243,13 @@ def compose_answer(body: dict[str, Any]) -> str:
|
||||
note = first_tuning_note(system)
|
||||
if note:
|
||||
answer = f"{answer} (tuning: {note})"
|
||||
# KB overview (phase 31): when the system prompt carries
|
||||
# <knowledge_base>, the answer ends with the first outline bullet —
|
||||
# mirrors the steering echo exactly (appended after it, so the kb
|
||||
# suffix is the last thing rendered).
|
||||
bullet = first_kb_bullet(system)
|
||||
if bullet:
|
||||
answer = f"{answer} (kb: {bullet})"
|
||||
return answer
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user