- Diagrams carry a print style block, so they print as ink on white rather than as dark panels; the client wall and the chips go white with a hairline. - docs/phase-7-notes.md records what batch 1 shipped, how to add a mark or an image, and the Lighthouse measurements taken after the batch (100/100/100/100, CLS 0, mobile and desktop). (cherry picked from commit ae9282e5f62b8c7ee149ebf96f8d3f00067a49e2)
120 lines
6.5 KiB
XML
120 lines
6.5 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" width="1120" height="580" viewBox="0 0 1120 580" role="img" aria-labelledby="ragTitle ragDesc" font-family="ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif">
|
|
<title id="ragTitle">Retrieval pipeline: ingest on top, four-node query path below</title>
|
|
<desc id="ragDesc">Ingest reads content and estate notes, excludes secrets, chunks and tags each block, embeds through the model gateway and upserts into two Qdrant collections on loopback. The query path classifies the question, routes it to an area, retrieves with a payload filter, composes an answer from the retrieved context only, and verifies that every citation resolves to a page.</desc>
|
|
|
|
<style>
|
|
/* On paper the diagram is ink on white, not a dark panel. Presentation
|
|
attributes are the weakest source, so these rules win without editing
|
|
the drawing. */
|
|
@media print {
|
|
rect { fill: #fff; }
|
|
text { fill: #111; }
|
|
text[fill="#6ee7c6"] { fill: #0b5c48; }
|
|
text[fill="#8b98a8"] { fill: #444; }
|
|
line, path { stroke: #555; }
|
|
marker path { fill: #555; }
|
|
}
|
|
</style>
|
|
<defs>
|
|
<marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
<path d="M0 0 10 5 0 10z" fill="#6ee7c6"/>
|
|
</marker>
|
|
<marker id="arrowDim" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
<path d="M0 0 10 5 0 10z" fill="#8b98a8"/>
|
|
</marker>
|
|
</defs>
|
|
|
|
<!-- ingest lane -->
|
|
<text x="30" y="42" font-size="14" font-weight="600" fill="#e6edf3">Ingest — one source of truth, one index</text>
|
|
|
|
<g fill="#12161b" stroke="#33404d" stroke-width="1.4">
|
|
<rect x="30" y="60" width="244" height="92" rx="9"/>
|
|
<rect x="302" y="60" width="244" height="92" rx="9"/>
|
|
<rect x="574" y="60" width="244" height="92" rx="9"/>
|
|
<rect x="846" y="60" width="244" height="92" rx="9"/>
|
|
</g>
|
|
<g fill="#e6edf3" font-size="13.5" font-weight="600">
|
|
<text x="48" y="86">Sources</text>
|
|
<text x="320" y="86">Normalise</text>
|
|
<text x="592" y="86">Chunk and tag</text>
|
|
<text x="864" y="86">Embed and upsert</text>
|
|
</g>
|
|
<g fill="#b3bcc8" font-size="12">
|
|
<text x="48" y="110">content/ Markdown</text>
|
|
<text x="48" y="129">estate notes</text>
|
|
<text x="48" y="148">platform guides</text>
|
|
<text x="320" y="110">front-matter parsed</text>
|
|
<text x="320" y="129">secrets and drafts</text>
|
|
<text x="320" y="148">excluded by rule</text>
|
|
<text x="592" y="110">blocks, not lines</text>
|
|
<text x="592" y="129">area · level · source</text>
|
|
<text x="592" y="148">title · tags</text>
|
|
<text x="864" y="110">model gateway only</text>
|
|
<text x="864" y="129">deterministic ids</text>
|
|
<text x="864" y="148">batched, resumable</text>
|
|
</g>
|
|
<g stroke="#6ee7c6" stroke-width="1.5" marker-end="url(#arrow)">
|
|
<line x1="277" y1="106" x2="298" y2="106"/>
|
|
<line x1="549" y1="106" x2="570" y2="106"/>
|
|
<line x1="821" y1="106" x2="842" y2="106"/>
|
|
</g>
|
|
|
|
<line x1="968" y1="152" x2="968" y2="184" stroke="#6ee7c6" stroke-width="1.5" marker-end="url(#arrow)"/>
|
|
|
|
<rect x="30" y="186" width="1060" height="62" rx="9" fill="#12161b" stroke="#6ee7c6" stroke-width="1.2" stroke-dasharray="5 4"/>
|
|
<text x="50" y="210" font-size="13" font-weight="600" fill="#e6edf3">Qdrant on 127.0.0.1</text>
|
|
<text x="50" y="231" font-size="12" fill="#b3bcc8">resume_corpus · one point per chunk resume_graph · one point per node and edge HNSW and payloads on disk · within a 400 MiB cap</text>
|
|
<text x="50" y="272" font-size="11.5" fill="#8b98a8">A sync run re-embeds only the documents whose content, model or chunker version changed.</text>
|
|
|
|
<!-- query lane -->
|
|
<text x="30" y="316" font-size="14" font-weight="600" fill="#e6edf3">Query</text>
|
|
<text x="108" y="316" font-size="12" fill="#8b98a8">— four graph nodes. It grows past four only with a written reason.</text>
|
|
|
|
<line x1="776" y1="248" x2="776" y2="352" stroke="#8b98a8" stroke-width="1.3" stroke-dasharray="4 4" marker-end="url(#arrowDim)"/>
|
|
<text x="788" y="330" font-size="11" fill="#8b98a8">payload-filtered search</text>
|
|
|
|
<g fill="#12161b" stroke="#33404d" stroke-width="1.4">
|
|
<rect x="30" y="360" width="196" height="112" rx="9"/>
|
|
<rect x="246" y="360" width="196" height="112" rx="9"/>
|
|
<rect x="462" y="360" width="196" height="112" rx="9"/>
|
|
<rect x="678" y="360" width="196" height="112" rx="9"/>
|
|
<rect x="894" y="360" width="196" height="112" rx="9"/>
|
|
</g>
|
|
<g font-size="10.5" fill="#6ee7c6" font-family="ui-monospace, SFMono-Regular, Menlo, monospace">
|
|
<text x="46" y="382">CLASSIFY</text>
|
|
<text x="262" y="382">ROUTE</text>
|
|
<text x="478" y="382">RETRIEVE</text>
|
|
<text x="694" y="382">COMPOSE</text>
|
|
<text x="910" y="382">VERIFY</text>
|
|
</g>
|
|
<g fill="#e6edf3" font-size="13" font-weight="600">
|
|
<text x="46" y="406">Read the question</text>
|
|
<text x="262" y="406">Pick the areas</text>
|
|
<text x="478" y="406">Find the evidence</text>
|
|
<text x="694" y="406">Answer from it</text>
|
|
<text x="910" y="406">Check citations</text>
|
|
</g>
|
|
<g fill="#b3bcc8" font-size="11.5">
|
|
<text x="46" y="430">intent · injection</text>
|
|
<text x="46" y="448">off-topic · PII</text>
|
|
<text x="262" y="430">which pages can</text>
|
|
<text x="262" y="448">answer this</text>
|
|
<text x="478" y="430">vector + keyword</text>
|
|
<text x="478" y="448">ranked, top five</text>
|
|
<text x="694" y="430">context only</text>
|
|
<text x="694" y="448">no outside claims</text>
|
|
<text x="910" y="430">every claim maps</text>
|
|
<text x="910" y="448">to a real page</text>
|
|
</g>
|
|
<g stroke="#6ee7c6" stroke-width="1.5" marker-end="url(#arrow)">
|
|
<line x1="227" y1="416" x2="242" y2="416"/>
|
|
<line x1="443" y1="416" x2="458" y2="416"/>
|
|
<line x1="659" y1="416" x2="674" y2="416"/>
|
|
<line x1="875" y1="416" x2="890" y2="416"/>
|
|
</g>
|
|
|
|
<text x="30" y="500" font-size="12" fill="#b3bcc8">A refusal is a real outcome: an off-topic question, an injection attempt or a request over the cost cap stops at the first node with zero model spend.</text>
|
|
<text x="30" y="526" font-size="11.5" fill="#8b98a8">Ingest runs today. The query path is the Phase 5 design; until it ships, every page is pre-rendered and needs no model.</text>
|
|
<text x="30" y="550" font-size="11.5" fill="#8b98a8">The public AI has no tools, no filesystem, no network fetch and no memory between visitors — architectural, not a prompt instruction.</text>
|
|
</svg>
|