Tutorial — Authored Answers for Top Questions

Augmented Traveler local tutorial. Back to AI Mind — Tutorials · overview: Tutorial — How the Mind Works · animation: Tutorial — Sequencer for Monologues · in Unreal: Tutorial — Authoring a Q&A Experience with Ambient Idle

Most visitors ask the same questions. For those we write, record and animate an authored answer and play it instead of generating one. This page covers choosing the questions, making the answers, the matching rules, answer IDs, fallbacks, and updating from logs.

Draft. Written from AI Mind — Process, the Sentence Transformers docs and the Unreal tutorials. The threshold numbers are starting points to tune, not published values. Conversation designer + AI conversation engineer; historian approves every script.

1. Why authored first

2. Choosing the top questions

Before opening:

  1. Take the golden set (Tutorial — Evaluating Answers).
  2. Rank by how often staff and school groups expect each question.
  3. Pick 30–60 for the first release. Include the "hello", "who are you" and "goodbye" beats.

After opening:

  1. Weekly, group logged questions by the matched answer or by nearest neighbour.
  2. Any generated-answer cluster above ~1% of questions is a candidate.
  3. Any cluster with poor blind-review scores is a priority, even if small.
Mitchell candidates Why
"How did you find the comet?" Most asked; hero moment
"What was the gold medal?" Common, factual, easy to get wrong
"Were women allowed to be astronomers?" Common; needs careful, cited framing
"Why do you dress like that?" / "Are you Quaker?" Common; plain dress and faith
"Is this real?" / "Are you a robot?" Must say what it is (Ground Rules)

3. Writing the answer

4. Recording and animating

  1. Record with the contracted actor under the voice director (Voice — Process). Log the take and voice version.
  2. Capture body and face performance, or keyframe gesture beats (Mocap — Process).
  3. Assemble a Level Sequence per answer in Sequencer (Tutorial — Sequencer for Monologues). Name it LS_AA_MM_0012.
  4. Captions from the approved script, timed to the take (Tutorial — Captions UI).
  5. Check blend in and out of the idle loop (Tutorial — Authoring a Q&A Experience with Ambient Idle).

5. Answer IDs

AA-<figure>-<nnnn>[-v<variant>], e.g. AA-MM-0012-v2.

Each ID has a record:

id: AA-MM-0012
intent: comet_discovery
program: [comet-1847]
paraphrases:
  - How did you find the comet?
  - Tell me about discovering the comet
  - What did you see on the roof that night?
script_ids: [MM-A-1847-10-01-a]
sequence: LS_AA_MM_0012
audio_take: MM_VO_0012_t3
historian_status: approved
version: 3

The service sends this ID in answer_meta with authored: true (Tutorial — Conversation Client Plugin).

6. Matching rules

A question plays an authored answer only when all of these pass:

  1. Intent match. The intent classifier's label equals the answer's intent.
  2. Similarity. Cosine similarity between the question and the best paraphrase is ≥ 0.80 (start value; tune on the golden set).
  3. Margin. Best score minus the second-best other answer is ≥ 0.05, so near-ties go to retrieval.
  4. Program. The answer is valid for the current program and cutoff.
  5. Policy. Input rails passed. A policy topic always goes to a canned reply, never an authored answer.

Model choice. This is symmetric matching (short question vs short paraphrase). Sentence Transformers' docs say to pick a model suited to the task; test the same embedding model as retrieval first.

Skeleton — test before use:

import numpy as np

SIM_MIN = 0.80
MARGIN_MIN = 0.05


def match(q_vec, intent, program, answers):
    """answers: list of dicts with id, intent, program, para_vecs (n x d, normalised)."""
    q = q_vec / np.linalg.norm(q_vec)
    scored = []
    for a in answers:
        if program not in a["program"]:
            continue
        scored.append((float(np.max(a["para_vecs"] @ q)), a))
    if not scored:
        return None
    scored.sort(key=lambda s: s[0], reverse=True)
    best_score, best = scored[0]
    second = scored[1][0] if len(scored) > 1 else 0.0
    if best["intent"] != intent:
        return None
    if best_score < SIM_MIN or best_score - second < MARGIN_MIN:
        return None
    return best["id"]

7. Fallbacks

Situation What plays
No authored match Retrieval + generation inside the fence (or retrieval + canned bridge for Boston-class figures)
Match, but the sequence fails to load The same answer's audio with the generic talk gesture; log an error
Network down Authored answers still play; unmatched questions get "Let me think on that another time"
Visitor repeats the question Play the next variant, or offer the hook question

8. Updating after logs

9. Practice exercise

  1. Write the ID record for "What was the gold medal?" with eight paraphrases.
  2. Write five near-miss questions (e.g. "Did you win any prizes?", "Who gave you money?").
  3. Run the matcher. Adjust paraphrases until the near-misses route correctly.

10. Check before a venue build

Sources