ЁЯПл The SchoolтА║ЁЯЧ║я╕П Vector DatabasesтА║ЁЯУЦ рдзрдбрд╛ 07 тАФ RAG рдЪреА рдЬреЛрдбрдгреА: рдкреБрд╕реНрддрдХ рдЙрдШрдбреВрди рдкрд░реАрдХреНрд╖рд╛, рдЖрдкрд▓реНрдпрд╛ page-finder рд╕рд╣
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯУЦ рдзрдбрд╛ 07 тАФ RAG рдЪреА рдЬреЛрдбрдгреА: рдкреБрд╕реНрддрдХ рдЙрдШрдбреВрди рдкрд░реАрдХреНрд╖рд╛, рдЖрдкрд▓реНрдпрд╛ page-finder рд╕рд╣

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 8 рдкреИрдХреА рдзрдбрд╛ 07 ┬╖ рдорд╛рдЧреЗ: lesson-06-chunking-metadata ┬╖ рдкреБрдвреЗ: lesson-08-landscape


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбреЗ 01тАУ06, рдЖрдгрд┐ рдореЛрдмрджрд▓рд╛: vector DB рд▓рд╛ RAG pipeline рдордзреНрдпреЗ рдЬреЛрдбрдгреЗ (AI рд╢рд╛рд│рд╛ L10 рдЪреА open-book рдкрд░реАрдХреНрд╖рд╛) тАФ рдЬрд┐рдереЗ рдЖрддрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЯрдкреНрдкрд╛ рддреБрдореНрд╣реА рдмрдирд╡рд▓реЗрд▓реА рдХрд┐рдВрд╡рд╛ рд╡рд╛рдЪреВ рд╢рдХрдгрд╛рд░реА рдЧреЛрд╖реНрдЯ рдЖрд╣реЗ.

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

AI рд╢рд╛рд│реЗрдЪреА open-book рдкрд░реАрдХреНрд╖рд╛ рдЖрдард╡рд╛ ЁЯУЦ: рдпреЛрдЧреНрдп рдкрд╛рдиреЗ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреАрдЪреНрдпрд╛ рдмрд╛рдХрд╛рд╡рд░ рдареЗрд╡рд╛ рдЖрдгрд┐ рдЙрддреНрддрд░реЗ grounded рдЖрдгрд┐ рдкреБрд░рд╛рд╡реНрдпрд╛рд╕рд╣ рд╕рд╛рдВрдЧрддрд╛ рдпреЗрдгреНрдпрд╛рдЬреЛрдЧреА рд╣реЛрддрд╛рдд. рдХрдореА рдкрдбрдгрд╛рд░реА рдпрдВрддреНрд░рдгрд╛ рд╣реЛрддреА page-finder тАФ рдЖрдгрд┐ рдЖрддрд╛ рддреЛ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЖрд╣реЗ:

Index рдЪреНрдпрд╛ рд╡реЗрд│реА (рдПрдХрджрд╛, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ doc рдмрджрд▓рд▓реНрдпрд╛рд╡рд░):

  1. тЬВя╕П handbook рдЪреЗ cards рдордзреНрдпреЗ рддреБрдХрдбреЗ рдХрд░рд╛ (рдзрдбрд╛ 06),
  2. ЁЯФв рдкреНрд░рддреНрдпреЗрдХ card рд▓рд╛ рдЬрд╛рдЧрд╛ рджреНрдпрд╛ (embed тАФ рдзрдбрд╛ 02; рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд: рдПрдХ model),
  3. ЁЯЧДя╕П рдЬрд╛рдЧрд╛ + text + stickers рд╕рд╛рдард╡рд╛ (db.add тАФ рдзрдбрд╛ 05).

рдкреНрд░рд╢реНрдирд╛рдЪреНрдпрд╛ рд╡реЗрд│реА (рдкреНрд░рддреНрдпреЗрдХ query рд▓рд╛): 4. ЁЯФв рдкреНрд░рд╢реНрдирд╛рд▓рд╛ рддреНрдпрд╛рдЪ embedder рдиреЗ рдЬрд╛рдЧрд╛ рджреНрдпрд╛ (рддреНрдпрд╛рдЪ model рдЪрд╛ рдирд┐рдпрдо!), 5. ЁЯПГ рд╕рд░реНрд╡рд╛рдд рдЬрд╡рд│рдЪреА cards (db.search, рдХрджрд╛рдЪрд┐рдд room="3A" рдиреЗ filter рдХреЗрд▓реЗрд▓реА тАФ рдзрдбреЗ 03/04/06), 6. ЁЯкС рд╕рд░реНрд╡реЛрддреНрддрдо cards model рдЪреНрдпрд╛ рдмрд╛рдХрд╛рд╡рд░ рдареЗрд╡рд╛, рд╕реВрдЪрдиреЗрд╕рд╣ "рдлрдХреНрдд рдпрд╛рдВрд╡рд░реВрдирдЪ рдЙрддреНрддрд░ рджреНрдпрд╛, card ids рд╕рд╛рдВрдЧрд╛" (AI L08), 7. тЬЕ grounded рдЙрддреНрддрд░, source stickers рдордзреВрди рдорд┐рд│рд╛рд▓реЗрд▓реНрдпрд╛ рдкрд╛рд╡рддреНрдпрд╛рдВрд╕рд╣. ЁЯз╛

рддреНрдпрд╛ рдЖрдХреГрддреАрддрд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдг рдЖрддрд╛ рддреБрдореНрд╣реА рд╡рд╛рдЪрд▓реЗрд▓реА code рдЪреА рдУрд│ рдЖрд╣реЗ. "рдЬрд╛рджреБрдИ AI search product" рдореНрд╣рдгрдЬреЗ рд╕рд╛рдд рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдкрд╛рдпрд▒реНрдпрд╛.

рдирд╛рд╡рд╛рдиреЗ рдорд╛рд╣реАрдд рдЕрд╕рд╛рд╡реНрдпрд╛рдд рдЕрд╢рд╛ рджреЛрди рдкреНрд░реМрдв рд╕реБрдзрд╛рд░рдгрд╛: reranking (рд╕реНрд╡рд╕реНрддрд╛рдд top-50 retrieve рдХрд░рд╛, рдордЧ рдПрдХ рд╣реБрд╢рд╛рд░ model рдкреБрдиреНрд╣рд╛ рдЧреБрдг рджреЗрдКрди рдиреЗрдордХреЗ top-5 рдмрдирд╡рддреЗ тАФ рджреБрд╕рд░реА, рдЬрд╛рд╕реНрдд рдЪреЛрдЦрдВрджрд│ рдЧреНрд░рдВрдердкрд╛рд▓) рдЖрдгрд┐ long-context рдЪрд╛ рдкреНрд░рд╢реНрди ("1M-token рдЪреЗ рдмрд╛рдХ рдЕрд╕рддрд╛рдирд╛ retrieve рддрд░реА рдХрд╢рд╛рд▓рд╛?" тАФ рдЦрд░реНрдЪ, latency, рдЖрдгрд┐ lost-in-the-middle рд╕рд╛рдВрдЧрддрд╛рдд: retrieval рдЯрд┐рдХрддреЗ; рдмрд╛рдХ рдореЛрдард╛ рдЭрд╛рд▓рд╛, рдЕрдорд░реНрдпрд╛рдж рдирд╛рд╣реА).

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart LR
    subgraph idx["ЁЯЧВя╕П index time - once"]
        d["ЁЯУЪ docs"] --> cut["тЬВя╕П chunk"] --> em1["ЁЯФв embed"] --> store["ЁЯЧДя╕П MiniVectorDB.add<br/>+ stickers ЁЯП╖я╕П"]
    end
    subgraph qt["тЭУ question time - every query"]
        q["question"] --> em2["ЁЯФв embed - SAME model"] --> s["ЁЯПГ db.search k=4<br/>(+ filters)"]
        s --> desk["ЁЯкС desk: cards + 'answer ONLY<br/>from these, cite ids'"]
        desk --> a["тЬЕ grounded answer ЁЯз╛"]
    end
    store -.-> s
    rr["ЁЯзР optional: rerank top-50 тЖТ top-5"] -.-> s

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

RAG рд╣реА industry рдордзреНрдпреЗ рд╕рд░реНрд╡рд╛рдд рдЬрд╛рд╕реНрдд рдмрдирд╡рд▓реА рдЬрд╛рдгрд╛рд░реА AI system рдЖрд╣реЗ, рдЖрдгрд┐ рдпрд╛ рдзрдбреНрдпрд╛рдд рддреА blog рд╡рд░рдЪреА рдЖрдХреГрддреА рд░рд╛рд╣рдд рдирд╛рд╣реА: рдкреНрд░рддреНрдпреЗрдХ box рдпрд╛ repo рдордзрд▓рд╛ code рдЖрд╣реЗ. рдХрд╛рдорд╛рд╡рд░ рддреБрдордЪреА RAG рдЪреБрдХреАрдЪреЗ рд╡рд╛рдЧрд▓реА рддрд░ рддреБрдореНрд╣реА рддреА рдЯрдкреНрдкреНрдпрд╛рдЯрдкреНрдкреНрдпрд╛рдиреЗ debug рдХрд░рд╛рд▓ тАФ cards тЖТ рдмрд╛рдХ тЖТ рдЙрддреНрддрд░ тАФ рдкреБрдиреНрд╣рд╛ рдкреБрдиреНрд╣рд╛ prompt рдХрд░реВрди рдкреНрд░рд╛рд░реНрдердирд╛ рдХрд░рдгреНрдпрд╛рдРрд╡рдЬреА. ЁЯЩП

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ тАФ рд╕рдВрдкреВрд░реНрдг pipeline рдПрдХрд╛ file рдордзреНрдпреЗ

python3 - <<'EOF'
import sys; sys.path.insert(0,'vectordb')
from vectordb import MiniVectorDB
db = MiniVectorDB()
for i,(t,meta) in enumerate([
  ("Library books must be returned within two weeks.", {"source":"handbook-p4"}),
  ("The picnic requires one pizza per three students, round up.", {"source":"handbook-p9"}),
  ("Class 3A has twelve students.", {"source":"roster-3A"}),
  ("Class 3B has eleven students.", {"source":"roster-3B"})]):
    db.add(f"card-{i}", t, **meta)

q = "how many pizzas do we need for 3A and 3B together?"
cards = db.search(q, k=3)
print("ЁЯкС THE DESK (what you'd paste to the model):\n")
print(f"Answer ONLY from these cards, cite sources:\n")
for s,i,t,m in cards:
    print(f"  [{m['source']}] {t}")
print(f"\nQuestion: {q}")
print("\nтЖТ paste that block into ANY chatbot: grounded answer, real citations ЁЯз╛")
EOF

тПня╕П рдкреБрдвреЗ

рд╢реЗрд╡рдЯрдЪрд╛ рднрд╛рдЧ: рдкреНрд░рддреНрдпрдХреНрд╖ products тАФ pgvector, Pinecone, Chroma, FAISS рдЖрдгрд┐ рдордВрдбрд│реА тАФ рдЖрдгрд┐ bake-off рд╢рд┐рд╡рд╛рдп рдирд┐рд╡рдб рдХрд╢реА рдХрд░рд╛рдпрдЪреА: landscape.

git checkout lesson-08-landscape

ЁЯУЦ Lesson 07 тАФ RAG wiring: the open-book exam, with OUR page-finder

ЁЯУН You are here: Lesson 07 of 8 ┬╖ Previous: lesson-06-chunking-metadata ┬╖ Next: lesson-08-landscape


ЁЯУж What's in this branch

Lessons 01тАУ06, plus the payoff: wiring the vector DB into the RAG pipeline (AI school L10's open-book exam) тАФ with every stage now a thing you've built or can read.

ЁЯзТ Explain like I'm 5

Remember the AI school's open-book exam ЁЯУЦ: put the right pages on the student's desk and answers become grounded and citable. The missing machinery was the page-finder тАФ and you now own one:

Index time (once, and on every doc change):

  1. тЬВя╕П cut the handbook into cards (lesson 06),
  2. ЁЯФв seat each card (embed тАФ lesson 02; real life: a model),
  3. ЁЯЧДя╕П store seat + text + stickers (db.add тАФ lesson 05).

Question time (every query): 4. ЁЯФв seat the QUESTION with the same embedder (the same-model rule!), 5. ЁЯПГ nearest cards (db.search, maybe filtered room="3A" тАФ lessons 03/04/06), 6. ЁЯкС paste the top cards onto the model's desk with the instruction "answer ONLY from these, cite the card ids" (AI L08), 7. тЬЕ grounded answer, with receipts from the source stickers. ЁЯз╛

Every arrow in that diagram is now a line of code you've read. The "magical AI search product" is seven honest steps.

Two grown-up refinements worth knowing by name: reranking (retrieve top-50 cheaply, then a smarter model re-scores to a sharp top-5 тАФ a second, pickier librarian) and the long-context question ("with 1M-token desks, why retrieve at all?" тАФ cost, latency, and lost-in-the-middle say: retrieval survives; the desk got bigger, not infinite).

ЁЯЧ║я╕П Diagram

flowchart LR
    subgraph idx["ЁЯЧВя╕П index time - once"]
        d["ЁЯУЪ docs"] --> cut["тЬВя╕П chunk"] --> em1["ЁЯФв embed"] --> store["ЁЯЧДя╕П MiniVectorDB.add<br/>+ stickers ЁЯП╖я╕П"]
    end
    subgraph qt["тЭУ question time - every query"]
        q["question"] --> em2["ЁЯФв embed - SAME model"] --> s["ЁЯПГ db.search k=4<br/>(+ filters)"]
        s --> desk["ЁЯкС desk: cards + 'answer ONLY<br/>from these, cite ids'"]
        desk --> a["тЬЕ grounded answer ЁЯз╛"]
    end
    store -.-> s
    rr["ЁЯзР optional: rerank top-50 тЖТ top-5"] -.-> s

тЭУ What

ЁЯдФ Why

RAG is the most-built AI system in industry, and this lesson is the moment it stops being a diagram from a blog: every box is code in THIS repo. When yours misbehaves at work, you'll debug it by stage тАФ cards тЖТ desk тЖТ answer тАФ instead of re-prompting and praying. ЁЯЩП

ЁЯзк Try it тАФ the whole pipeline in one file

python3 - <<'EOF'
import sys; sys.path.insert(0,'vectordb')
from vectordb import MiniVectorDB
db = MiniVectorDB()
for i,(t,meta) in enumerate([
  ("Library books must be returned within two weeks.", {"source":"handbook-p4"}),
  ("The picnic requires one pizza per three students, round up.", {"source":"handbook-p9"}),
  ("Class 3A has twelve students.", {"source":"roster-3A"}),
  ("Class 3B has eleven students.", {"source":"roster-3B"})]):
    db.add(f"card-{i}", t, **meta)

q = "how many pizzas do we need for 3A and 3B together?"
cards = db.search(q, k=3)
print("ЁЯкС THE DESK (what you'd paste to the model):\n")
print(f"Answer ONLY from these cards, cite sources:\n")
for s,i,t,m in cards:
    print(f"  [{m['source']}] {t}")
print(f"\nQuestion: {q}")
print("\nтЖТ paste that block into ANY chatbot: grounded answer, real citations ЁЯз╛")
EOF

тПня╕П Next

The finale: the actual products тАФ pgvector, Pinecone, Chroma, FAISS & friends тАФ and how to pick without a bake-off: the landscape.

git checkout lesson-08-landscape
тЖР Previouschunking metadataNext тЖТlandscape

This page is the lesson's README from the lesson-07-rag-wiring branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.