Luiss.edu
Rebuilding the Luiss public website and the AI search platform behind it: the site cut from 66,000 pages to what people actually read, Google custom search replaced with an engine the university owns and can tune, and a conversational assistant on top that answers with citations back to the source page.
Project
The old university website had crossed 66,000 pages. Very little of that was intentional. Fifteen years of departmental autonomy had produced duplicated Italian and English versions of the same page, orphaned drafts nobody could trace back to an owner, expired calls for applications still sitting at live URLs, and long tails of news posts attached to course pages. Roughly nine out of ten substantive answers, the ones about admission deadlines, fees, scholarship rules, lived inside attached PDFs rather than in HTML.
Search made the problem visible to every visitor. The site used a Google custom search integration, so results reflected whatever Google had crawled and however Google chose to rank it. A prospective student typing “master in management in English” got a four year old press release before the programme page. Nobody at the university could tune that, or even see why a result ranked where it did. The search box was the most used element on the site and the one part of it we did not control.
I worked on this as the internal owner on the Luiss side, alongside a design partner and an engineering vendor, covering the AI components, the technical review of the search engine, and the compliance track that ran in parallel. The goal was not a visual refresh. We had to shrink the content estate to what people actually read, replace Google with a search engine the university owns and can tune, and put a conversational assistant on top of it that answers in full sentences with citations back to the source page. All of it had to ship on one date, because a partial migration would have left two sites and two search behaviours running at once.
The content work came first and was the least glamorous part. Every page was classified as keep, merge, archive, or redirect, with the offices that owned the content doing the classification rather than a central team guessing. Anything cut stayed retrievable rather than deleted, which mattered for the internal politics as much as for the link equity.
On the platform side, a crawler indexes site content, FAQ pages, and orientation material, and the index feeds hybrid search that combines keyword matching with vector similarity, so a query phrased the way a seventeen year old phrases it still reaches a page written in institutional Italian. We started on Typesense as the vector store, chosen deliberately to avoid provider lock in, and moved to Firestore before launch when the operational picture changed. The generation layer sits behind an LLM proxy so the provider stays switchable, and today runs on Claude Sonnet on Vertex AI in europe-west1, with the RAG index and conversation history in europe-west8 in Milan, which kept the data residency conversation short.
The conversational layer is an agentic RAG loop rather than a single retrieval pass. The agent first decides whether a message needs retrieval at all, since “hello” does not. If the question retrieves poorly it rewrites the query and tries again, and after several failed cycles it falls back to the user’s original wording rather than inventing an answer. Session context carries forward, so “and for France?” after a question about double degrees resolves correctly. One behavioural rule cost more discussion than any of the infrastructure. When a question is generic and the retrieved context spans undergraduate, graduate, and PhD pages, the assistant must not silently pick one. It answers generally and links all of the relevant official pages, clearly separated.
Ranking took three levers to become usable: weighting by content type, removing the recency bias that kept surfacing news over evergreen pages, and indexing the URI itself, which turned out to carry a lot of signal in a taxonomy as structured as a university’s.
The compliance track ran alongside and gated the launch. A vulnerability assessment by an external firm closed with no findings, static analysis output was required from the vendor, and the AI Act impact and risk assessment classified the module as limited risk with transparency obligations, which is what a search assistant over public content should be. Conversational data masking was not ready, so we went live explicitly without it, restricted access to session context and to records carrying explicit user feedback, and reduced retention as an interim measure rather than pretending the control existed.
The new site went live on 23 June 2026 with the search engine and the assistant integrated natively. Content dropped from more than 66,000 pages to around 23,000. Search is now ours, tunable in a working day rather than through a black box, and inference costs run at roughly twenty euro per day at current traffic. The change that will outlast the technology is governance. Every office is now accountable for its own pages, publication is centralised through one editorial team, and technical reports route through a ticketing queue instead of arriving as direct emails to whoever was in the last meeting.