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
- 01
Ingest
portfolio_data.json is split into one self-contained document per project, role, achievement, skill set and profile.
Python
- 02
Index
Each document is indexed twice: BM25 for exact terms and names, and dense bge-small embeddings for meaning.
rank-bm25 · fastembed (ONNX)
- 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
- 04
Generate
The LLM answers from that context plus recent chat history, and returns strict JSON: answer, cards and sources.
Groq · GPT-OSS 120B
- 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.