Published 2026-04-20

How I Turned a Video Archive Into a Recommendation Chatbot

How I turned YouTube videos into a catalog with transcripts, summaries, and a chatbot that recommends specific content.

I built a recommendation system over an archive of YouTube videos. The user doesn’t have to guess the right keyword. They simply describe their problem in their own words and the chatbot picks videos that make sense for it.

But it’s not a free-roaming advisory chatbot. That was an important constraint from the start. The system isn’t meant to give general advice beyond the sources it knows. Its job is to find the best content in the given catalog, explain the choice, and say plainly when it has nothing suitable.

First, the videos needed to be put in order

The chatbot itself is only the last layer. First I had to turn the video archive into data I could work with:

  • a list of videos,
  • metadata from YouTube,
  • transcripts,
  • information about source quality,
  • structured summaries,
  • a compact catalog for selecting recommendations.

Everything is held together by video_id. Thanks to this, a video, transcript, summary, metadata, and later links to a specific timestamp can be safely connected.

Transcripts as the foundation of the whole system

Without text there’s nothing to recommend from. For all videos I produced a transcript using the local large-v3 model. The advantage is that the transcription can run on a graphics card, and there’s no need to send every video to an external service.

For this task I didn’t need a transcript accurate down to the last word. I needed to reliably recognize the topic, the problem, the body part, the context, and the recommendation. The external Whisper API makes more sense as a fallback where the local transcript comes out badly, which never happened. The local model worked perfectly.

Summaries that genuinely help the model

For each video I produced a structured summary: topics, typical user problems, body parts, recommendations, quotes, and a flag for whether the video is even suitable to recommend.

This matters because the video title often isn’t enough. A video can have a generic title but address a very specific situation inside. Or, conversely, it can look relevant by its title but not be suitable for the given query.

A simpler solution won over a complex RAG

Originally I tried classic search via embeddings, BM25, merging results, and reranking candidates. It worked, but for a catalog of around 300 videos it was needlessly complex.

A better result ultimately came from a simpler solution: send the model the entire condensed catalog and let it choose only from a fixed list. The catalog fits in the context, and thanks to reusing the same part of the request, the costs stay reasonable.

What the chatbot does on a query

On each query, the model gets three things: the current question, a short conversation history, and the catalog of recommendable videos.

The output isn’t free text according to the model’s mood. The model must determine the quality of the match: strong, partial, none, or a need to ask a follow-up. Along with that it selects up to five videos and explains in Czech why exactly those.

If the user follows up with a question like “something shorter” or “a different video, please,” the system uses the conversation history. The timestamp link is looked up only after the videos are selected, so the card can lead directly to the relevant part of the YouTube video.

Why I like this approach

The whole solution is deliberately constrained. The chatbot isn’t meant to invent advice beyond the catalog. It’s meant to understand the query well, find the closest content, explain the choice, and admit uncertainty.

For recommendation systems, such a constraint is often an advantage. Less room for hallucinations, better control, and clearer accountability for the result.