S.A.C.H.I.N · architecture

A portfolio you can interview.

The assistant behind this portfolio is a small retrieval-augmented generation system: it turns static portfolio data into grounded, conversational answers.

Request pipeline

  1. 01

    Ingest

    portfolio_data.json is split into one self-contained document per project, role, achievement, skill set and profile.

    Python

  2. 02

    Index

    Each document is indexed twice: BM25 for exact terms and names, and dense bge-small embeddings for meaning.

    rank-bm25 · fastembed (ONNX)

  3. 03

    Retrieve

    Both rankings are fused with Reciprocal Rank Fusion. Follow-ups are expanded with the previous question so “it” resolves.

    Hybrid RRF · top-6

  4. 04

    Generate

    The LLM answers from that context plus recent chat history, and returns strict JSON: answer, cards and sources.

    Groq · GPT-OSS 120B

  5. 05

    Render

    The answer renders as Markdown; requested cards are resolved server-side from the real data, never from the LLM.

    Next.js · React

browser → Next.js route /api/chat → FastAPI /api/chat → retriever → LLM → Markdown + structured cards

Design choices

Grounded, with sources

The model may only state facts found in retrieved context, and every answer lists the documents it relied on.

No keyword routing

The model itself decides when cards help (and which ones, e.g. only the RAG projects) via a schema-enforced reply.

Measured, not guessed

A labelled eval set compares retrievers: hybrid RRF puts the right document in the top 6 for 40/40 questions, vs 34/40 for the old TF-IDF.

Cheap to run

No GPU, no vector database: a 33M-parameter ONNX embedder and an in-memory index over a single JSON file.

Stack

Frontend

Next.js 16React 19TypeScriptTailwind CSS 4

Backend

FastAPIPython 3.11UvicornPydantic

AI / Retrieval

Groq APIGPT-OSS 120BBM25bge-small-en-v1.5RRFStructured outputs