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:
- Ask one
Noulquestion 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. - Ask again about the eighty films with the highest probabilities, this time with six hundred words of plot.
- Put the top twenty in one
Choicequestion. Its top probability tells you whether to show one film or a short list.
find() function that takes a request and returns the films ranked by
probability, in three rounds of parallel calls.
Setup
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 isfilms.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.Step 3: decide with one Choice question
Put the top twenty in oneChoice 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.
FILMS, proposition() and decision_question(). Nothing else mentions films.
Measure what each step is worth
Theembeddings 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.
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.


