InterviewsVector
AdvancedAI & ML Systems· 40 min read

Design an AI Code Assistant (Copilot)

Low-latency, context-aware code completions streamed into the editor with tight privacy.

Asked atGitHubMicrosoftGoogleCursor

Overview

An AI code assistant provides inline completions as developers type. It differs from a chat product in its brutal latency budget (a suggestion is worthless if it arrives after you've typed the line) and its reliance on assembling the right code context from the editor.

Requirements

Functional

  • Inline code completions from surrounding code and cursor position.
  • Multi-language, IDE-integrated (VS Code, JetBrains).
  • Use repository context (open files, imports, related symbols).
  • Respect privacy — code is sensitive.

Non-functional

  • Extremely low latency (completions in < 200–500 ms).
  • High acceptance rate; avoid distracting wrong suggestions.
  • Scale to millions of developers; control per-completion cost.

Back-of-the-envelope

The numbers that justify the architecture.

Developers1M+
Completion requests / sechigh
Latency budget< 500 ms
Acceptance rate~20–30%

Reference architecture

The IDE plugin assembles local context and calls a low-latency completion service that retrieves repo context, prompts a code model, and streams a suggestion, with heavy caching and debouncing.

Editor
IDE Plugin
context + debounce
Edge
Completion Gateway
auth + rate limit
Completion Cache
Serving
Context Builder
prompt assembly
Repo Retrieval
related snippets
Code Model (GPU)
FIM inference
Post-filter
dedup / safety / license
Data
Code Embeddings / Index
ClientEdge / GatewayServiceCacheDatastoreQueue / StreamML / GPUExternal

Deep dives

Latency is the whole game

A completion that arrives after the developer has typed the line is worthless, so the end-to-end budget is a few hundred milliseconds — most of it model inference. Techniques: debounce keystrokes (don't fire mid-token), cancel in-flight requests when the user keeps typing, use a smaller, faster code-specialized model rather than a giant general one, and cache completions for identical contexts. Speculative/early-exit decoding and short max-token limits keep generation snappy.

Context assembly (fill-in-the-middle)

Quality depends on giving the model the right context. Code completion uses fill-in-the-middle (FIM): the prompt includes code before and after the cursor, not just a left prefix. Beyond the current file, retrieve relevant context — imported symbols, sibling files, similar snippets — via an embedding index of the repo. The context builder must fit all this in a small token budget quickly; there's a latency-vs-context trade-off on every request.

Privacy and trust

Source code is highly sensitive. Offer clear data policies: don't retain/train on private code without consent, support enterprise/on-prem or VPC deployments, and filter suggestions that regurgitate memorized public code with restrictive licenses (a license/dedup post-filter). Trust is a product requirement, not an afterthought.

Cost and quality control

Every keystroke can't hit a GPU. Debouncing, caching, and a right-sized model keep per-completion cost viable. Measure acceptance rate as the north-star quality metric and suppress low-confidence suggestions — a wrong completion is worse than none because it erodes trust and wastes GPU.

Key trade-offs

For each decision: the two options, and when to pick which.

Model size
Option A
Large general model
Option B
Small code-specialized model
VerdictSmall specialized model — latency and cost dominate; a tuned code model beats a giant one for inline completion.
Context source
Option A
Current file only
Option B
Repo-wide retrieval
VerdictAdd retrieval for quality, but bound it by the latency budget — more context isn't free.

Bottlenecks & follow-ups

Where it breaks under load — and what an interviewer will probe.

  • Inference latency → smaller model, debounce, cancel, cache.
  • GPU cost per keystroke → caching + right-sized model + suppression.
  • Context assembly time → precomputed embeddings, bounded retrieval.

What a strong answer sounds like

  • Anchor every decision to the sub-500ms budget — it's what distinguishes this from chat.
  • Bring up fill-in-the-middle context; it shows you know code models specifically.
  • Raise privacy proactively — enterprise adoption hinges on it.