03 / 05 · cluster k=2
Built from scratch in 8 days: a banking assistant with 5 specialist agents, RAG and safety enforced in code.
A banking assistant has to understand natural language, yet moving money leaves no room for error. LLMs are flexible but inconsistent; banking demands certainty. During my internship I built an architecture around that tension: from scratch, in 8 days, layer by layer.
A temperature-0 router, measured against a test set, sends each message to one of 5 specialist agents (Account, Transfer, General/RAG, Loan, FX), and each agent sees only its own tools. The logged-in customer's identity is injected by code at the tool layer; the LLM never touches it. I split decisions deliberately: in a workflow the code decides, in an agent the LLM does. IBAN validation, two-sided transfers in a single transaction, the loan score and annuity instalments are all deterministic Python.
Users log in with their national ID and password, then ask for balances, send money to an IBAN, check loan eligibility, query bank documents and pull live FX rates, all in plain Turkish. RAG runs semantic search with nomic-embed-text and grounds each answer in the documents; the FX service is wrapped in timeouts, error handling and a cache. Three guardrails sit on top: claimed-action verification (it catches the model saying it did something it didn't), a language-drift (CJK) detector and a format-leak filter. Small talk takes a fast path and never reaches the LLM.
Login (national ID + password)
Fast path or router (T=0)
5 specialist agents, each with its own tools
Deterministic core: transfers, loans
RAG + live FX API
Guardrails → reply
Python · Ollama · qwen2.5:7b · nomic-embed-text · SQLite · Streamlit · Faker
It's an internship prototype: customers are synthetic (Faker), storage is SQLite, and the model is a local 7B LLM. I haven't yet reported end-to-end quality as a single number. Next I'd build an evaluation set from real scenarios and compare the results against a larger model.