Skip to main content
Someone remembers a film but not its title, and describes it instead: “a man and a boy running from these sharp metal eyeball things with blades on the side”. They saw it in the 90s. The film is one of 5,000 in a catalog, and its plot summary tells the same story in different words. One Choice question can pick the film from a list, but it takes at most 255 options, and only about forty when each option is a long plot summary. So the search runs in three steps, and each step reads more about fewer films:
  1. Ask one Noul question per film, “is this the film they mean?”, with the first hundred words of its plot. The questions go out in chunks, all at once, so the wait stays about the same as the catalog grows, as long as your rate limit allows that many calls at a time.
  2. Ask again about the eighty films with the highest probabilities, this time with six hundred words of plot.
  3. Put the top twenty in one Choice question. Its top probability tells you whether to show one film or a short list.
The 100 requests here come from a forum where people ask for help naming a film, each answered by someone who recognised it. When embedding search picks the twenty films for step 3 instead, the right film comes first for 33% of them. With all three steps, it comes first for 78%. Each of the 48 times the Choice question gave its top film 0.8 or more, that film was right. The result is a find() function that takes a request and returns the films ranked by probability, in three rounds of parallel calls.

Setup

then set TYPESAFE_API_KEY, and OPENAI_API_KEY for the embedding search the results are measured against. The code downloads the published answers into infinite_cardinality_choice_cache.json, so the run makes no requests; to run live, set DOWNLOAD_CACHE = False and delete that file. Numbers below came from jev-1.14.0, run in November 2026.

Load the catalog and the requests

The catalog is films.jsonl: each film’s title, year, and two versions of the plot section of its Wikipedia article, fetched 2026-11-07. The short one, plot, is the first hundred or so words, and step 1 reads it. The long one, long_plot, is the first six hundred or so, and steps 2 and 3 read it. The catalog holds the film behind every request. The other films, the ones a search has to rule out, are those whose Wikipedia articles exist in the most languages. The 100 requests in requests.jsonl come from Microsoft’s tip-of-the-tongue dataset, collected from the forum iRememberThisMovie.com, and each comes with the film that answered it. They are a random sample of the 709 whose film has a plot section on Wikipedia.

Step 1: filter with one Noul question per film

Each Noul question names one film as the answer and includes its plot, so Jev compares the request with the plot instead of recalling the film from its title. A call holds at most 64k tokens, so split the catalog into chunks that fit. No chunk depends on another, so send them all at once.

Step 2: read the top eighty again, with the long plot

For this request, the filter ranks Ghostbusters: Afterlife first at 0.64. It matches on a mother, two kids, a haunted house and money trouble. The Diabolical is sixth. The request’s most specific detail is that the ghosts “turn out to be time travelers”. In the plot of The Diabolical, that twist comes after the first hundred words, so the filter never sees it. People remember scenes from anywhere in a film. So ask again about the filter’s top eighty, with six hundred words of each plot. Longer questions mean fewer films per chunk, and the chunks still go out together. The filter’s top eighty hold the right film for 93 of the 100 requests, and this step has to move it into the top twenty.
The long plot includes the twist: the apparition is the son, come back from the future. The Diabolical moves to first at 0.60. Across all requests, the top twenty now hold the right film for 88, against 82 for the filter’s top twenty alone.

Step 3: decide with one Choice question

Put the top twenty in one Choice question, with their long plots as the options. Each Noul question judges its film alone, so two films that both fit the request can both get 0.4 or more, here 0.60 and 0.40, and the top five alone add up to more than 1. A Choice question weighs the twenty films against each other, so its top probability says how far ahead of the rest the top film is.
The Choice question puts 1.00 on The Diabolical. To search your own catalog, give each item a short and a long description and rewrite FILMS, proposition() and decision_question(). Nothing else mentions films.

Measure what each step is worth

The embeddings column uses embedding search, the standard first try for matching text that says the same thing in other words. It embeds each film’s short plot and the request with OpenAI’s text-embedding-3-small, and the twenty closest films go to the same Choice question. The no re-read column sends the filter’s top twenty straight to the Choice question, skipping step 2.
Embedding search holds the right film in its top twenty for 35% of requests, and the Choice question puts it first for 33%: the Choice question can only rank the films it is given. Reading short plots against the request gets the film into the top twenty for 82% of requests, and re-reading the top eighty with long plots raises that to 88%. The right film comes first for 73% without step 2 and 78% with it.

Decide when to show one film

To decide between showing one film and showing a short list, you need a probability you can set a threshold on. Both the re-read and the Choice question give their top film a probability, and the table counts how often that film was right at each level.
output output The Choice question’s top answer is at 0.8 or more for 48 requests, and right for all 48. Under 0.5, it is right 9 times in 30. The re-read’s probability can’t sort requests into sure and unsure: none of its answers reaches 0.95, only 11 reach 0.8, and its answers under 0.5 are still right 30 times in 49. So decide with the Choice question’s top probability. At 0.8 or more, show the one film. Below 0.8, show the top three, which hold the right film for 34 of the other 52 requests.

Open it in the playground

The playground can’t comfortably show thousands of questions, so this link holds step 3 only: the request, and the Choice question over the twenty films the re-read kept.
Open in the playground →