Prev Next

AI / RAG to Agentic AI Interview questions

Last updated

1. What is Retrieval-Augmented Generation (RAG)? 2. What is a hallucination in LLMs? 3. What is an embedding in RAG? 4. What is a vector database? 5. What is chunking in RAG? 6. What are the main components of a RAG pipeline? 7. What is semantic search? 8. What are the types of retrieval used in RAG? 9. What is a context window? 10. What is grounding in RAG? 11. What is an AI agent? 12. What is Agentic AI? 13. What is tool calling in LLMs? 14. What is the ReAct pattern? 15. What is memory in an AI agent? 16. What is the Model Context Protocol (MCP)? 17. What is the difference between RAG and fine-tuning? 18. How does cosine similarity work in vector search? 19. How do you choose chunk size and overlap? 20. Why use hybrid search in RAG? 21. Why do we use reranking in RAG? 22. How does HNSW indexing work? 23. What is the difference between naive and advanced RAG? 24. How does query rewriting improve RAG? 25. Why do we use metadata filtering in RAG? 26. What is the lost-in-the-middle problem? 27. Why can RAG still hallucinate? 28. How do you evaluate a RAG system? 29. What is Graph RAG? 30. What is Agentic RAG? 31. What is the difference between RAG and an AI agent? 32. Explain the execution flow of an agent loop? 33. How does function calling work internally? 34. What is the difference between ReAct and Plan-and-Execute? 35. When should you choose multi-agent over single-agent? 36. What are the common multi-agent orchestration patterns? 37. How do you implement long-term memory for agents? 38. How do you prevent infinite loops in agents? 39. How do you defend against indirect prompt injection in RAG? 40. How do you enforce access control in enterprise RAG? 41. How do you troubleshoot poor retrieval quality? 42. How can you optimize RAG latency and cost? 43. What happens when a tool call fails mid-workflow? 44. How do you evaluate an AI agent? 45. When would you add human-in-the-loop approval to an agent? 46. What are Corrective RAG and Self-RAG? 47. Which is better: long-context models or RAG? 48. How does MCP differ from plain function calling? 49. What are guardrails in agentic systems? 50. How do you handle stale data in a RAG index?

1. What is Retrieval-Augmented Generation (RAG)?

RAG is a pattern where an LLM receives relevant external documents at query time and uses them to write its answer, instead of relying only on what it memorized during training.

  1. The user asks a question.
  2. The system searches an index of your documents and pulls the best-matching chunks.
  3. Those chunks are added to the prompt as context.
  4. The LLM answers using that context, ideally with citations.

This gives you fresh, private or domain-specific knowledge without retraining the model, and it makes answers easier to verify because you can point back to the source.

Take quiz
In RAG, when is external knowledge added?
At query time, by inserting retrieved chunks into the prompt
During pretraining, by editing model weights
Only after the answer has been generated
Which problem does RAG mainly address?
Slow GPU training
Stale or missing knowledge inside the model
Tokenizer vocabulary size

2. What is a hallucination in LLMs?

A hallucination is output that sounds confident and fluent but is fabricated or not supported by facts or by the provided context. A model might cite a paper that does not exist or invent an API method.

It happens because an LLM predicts the most likely next tokens, not verified truths. When it lacks the knowledge, it still produces something plausible.

There are two common kinds: factual errors (wrong real-world claims) and faithfulness errors (contradicting the document you gave it). RAG, citations, lower temperature and answer verification all reduce the problem, but none removes it completely.

Take quiz
A model cites a court case that does not exist. This is best called:
a cache hit
a context window overflow
a hallucination
Which approach most directly reduces hallucinations?
Grounding answers in retrieved sources with citations
Raising the temperature to 1.5
Removing the system prompt

3. What is an embedding in RAG?

An embedding is a list of numbers (a dense vector) that captures the meaning of a piece of text. Texts with similar meaning end up close together in vector space, even when they share no words.

In RAG, every chunk is embedded once at indexing time, and each user query is embedded at search time. The retriever then finds the chunk vectors nearest to the query vector. Common dimensions are 384, 768, 1536 and 3072.

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("all-MiniLM-L6-v2")
vec = model.encode("How do I reset my password?")
print(vec.shape)   # (384,)

Documents and queries must use the same embedding model, otherwise their vectors are not comparable.

Take quiz
Why must queries and documents use the same embedding model?
It reduces the token cost of the prompt
Their vectors must live in the same space to be comparable
The vector database can only compress one model's output
Two sentences with similar meaning will usually have embeddings that are:
identical byte for byte
orthogonal to each other
close together under cosine similarity

4. What is a vector database?

A vector database stores embeddings together with their metadata and answers one main question fast: which stored vectors are closest to this query vector? It does this with approximate nearest neighbor (ANN) indexes such as HNSW or IVF.

Traditional database Vector database
Typical query Exact match, range, join Top-k similarity
Index B-tree, hash HNSW, IVF, PQ
Result Exact Approximate, tunable recall

Examples include Pinecone, Weaviate, Qdrant, Milvus and Chroma. pgvector adds vector search to PostgreSQL, and FAISS is a library rather than a full database.

Take quiz
Vector databases typically rely on which kind of search?
Approximate nearest neighbor search
Exact B-tree key lookup only
A full table scan using LIKE
FAISS is best described as:
a managed SQL service
a similarity-search library, not a full database
a prompt template engine

5. What is chunking in RAG?

Chunking means splitting documents into smaller pieces before embedding them. A single embedding of a 50-page PDF blurs many topics together and may exceed the model's token limit, so retrieval becomes imprecise.

Common strategies:

  • Fixed-size - every N tokens, simple but can cut sentences.
  • Recursive - split by paragraph, then sentence, then word until it fits.
  • Structure-aware - follow headings, sections or code functions.
  • Semantic - break where the topic shifts.

A typical starting point is 300-500 tokens with 10-20% overlap, then tune against retrieval metrics.

Take quiz
Why do we chunk documents before embedding?
To encrypt the documents
To avoid using embeddings at all
Small focused pieces retrieve more precisely and fit embedding limits
Chunking that follows headings and paragraphs is called:
structure-aware chunking
random sampling
token dropout

6. What are the main components of a RAG pipeline?

A RAG pipeline has an indexing side (offline) and a query side (online).

flowchart LR
  A["Documents"] --> B["Loader and parser"]
  B --> C["Chunker"]
  C --> D["Embedding model"]
  D --> E[("Vector store")]
  Q["User query"] --> F["Query embedding"]
  F --> G["Retriever"]
  E --> G
  G --> H["Reranker (optional)"]
  H --> I["Prompt builder"]
  I --> J["LLM"]
  J --> K["Answer with citations"]

The retriever finds candidates, the optional reranker improves precision, and the prompt builder packs the best chunks plus instructions into the LLM's context.

Take quiz
Which component turns the user query into a vector for search?
The reranker
The embedding model
The chunker
Which step is optional but often improves precision?
Loading the documents
Embedding the query
Reranking the retrieved candidates

Semantic search finds results by meaning rather than exact keywords. A query like "cheap flights" can match a page about "low-cost airfare" because their embeddings are close.

Keyword search Semantic search
Matches on Exact or stemmed terms Meaning via embeddings
Handles synonyms Poorly Well
Exact IDs, error codes Well Often weak

Its blind spot is rare exact tokens such as SKUs or error codes, which is one reason many systems add keyword search alongside it.

Under the hood, the query and every document are embedded with the same model and ranked by cosine similarity. Because it captures intent, it is the default retriever in most RAG systems, usually paired with keyword search for exact terms.

8. What are the types of retrieval used in RAG?

Most RAG systems use one or a mix of these retrieval types:

Type How it works Best at
Sparse (BM25, TF-IDF) Scores term overlap Exact words, IDs, rare terms
Dense Nearest vectors from embeddings Meaning, paraphrases
Hybrid Merges sparse and dense rankings General-purpose production use
Multi-vector (ColBERT) One vector per token, late interaction Fine-grained matching
Structured / graph SQL or graph traversal Tables, relationships

In practice, start with hybrid (BM25 plus dense) as a baseline. Add structured or graph retrieval only when the data is tabular or relationship-heavy, and consider multi-vector models when fine-grained matching justifies the extra storage.

Take quiz
BM25 is an example of:
dense retrieval
generative reranking
sparse lexical retrieval
Combining BM25 and vector search results is called:
hybrid retrieval
model distillation
prompt chaining

9. What is a context window?

The context window is the maximum number of tokens an LLM can handle in one request, counting the system prompt, chat history, retrieved chunks and the generated answer.

In RAG, chunks compete for that space. A bigger window costs more and runs slower, and stuffing it with loosely related text can reduce answer quality. That is why RAG selects only the most relevant chunks instead of pasting everything.

Output tokens count too, so reserve room for the answer. With a 128K window, a 4K answer budget and a 2K system prompt, you have roughly 122K left for history and chunks, though quality usually peaks well before that.

Take quiz
What counts against the context window?
Only the user's question
Prompt, retrieved chunks, history and generated output
Only the vector database size
Why is RAG selective about how many chunks it sends?
LLMs refuse to read more than three chunks
Embeddings cannot return more than three results
Token budget limits and irrelevant text can hurt answer quality

10. What is grounding in RAG?

Grounding means constraining the model's answer to the retrieved evidence, so every claim can be traced to a source.

Typical techniques are an explicit instruction, required citations, and a fallback when the context has no answer:

Answer using ONLY the context below.
If the context does not contain the answer, reply "I don't know."
Cite sources as [doc_id].

Context:
{chunks}

Question: {question}

You can add a post-check that tests whether each sentence of the answer is supported by the chunks.

Take quiz
A good grounding instruction says:
Answer only from the provided context; if missing, say so
Use any knowledge you have, context is optional
Always answer even when unsure
Citations help grounding because they:
increase the model's parameter count
let users verify claims against sources
speed up embedding

11. What is an AI agent?

An AI agent is a system where an LLM decides what to do next to reach a goal, calls tools to act, reads the results and repeats until done.

  • Model - reasons and picks the next action.
  • Tools - search, code execution, APIs, databases.
  • Memory - what happened so far, and facts to keep.
  • Instructions - the goal, rules and stop conditions.

The key difference from a chatbot is that an agent acts and iterates, rather than producing one reply.

Take quiz
What most distinguishes an agent from a plain chatbot?
It has a larger vocabulary
It never uses prompts
It chooses actions, calls tools and iterates toward a goal
Which of these is a typical agent component?
Tools the model can call
A CSS stylesheet
A DNS resolver

12. What is Agentic AI?

Agentic AI is the broader paradigm of AI systems that pursue goals with some autonomy: they plan, use tools, remember, check their own work and sometimes coordinate with other agents.

Generative AI Agentic AI
Interaction Prompt in, response out Goal in, multi-step work out
Tools Usually none APIs, search, code, files
Control flow Single pass Loop with decisions
Supervision Per response Checkpoints and guardrails

Autonomy is a spectrum, from a fixed workflow with one LLM step to a fully self-directed agent.

Take quiz
Agentic AI is characterized by:
one-shot text completion only
goal-directed planning, tool use and iteration with limited supervision
manual rule trees with no model
A single prompt producing a single answer with no tool use is:
a fully autonomous multi-agent system
an agent with long-term memory
plain generative AI, not agentic

13. What is tool calling in LLMs?

Tool calling (function calling) lets a model output a structured request, such as a tool name plus JSON arguments, instead of plain text. Your application runs the tool and sends the result back so the model can continue.

The model never executes anything itself. You describe each tool with a name, a description and an argument schema:

{
  "name": "get_order_status",
  "description": "Look up an order by ID",
  "input_schema": {
    "type": "object",
    "properties": { "order_id": { "type": "string" } },
    "required": ["order_id"]
  }
}

Take quiz
Who actually executes the tool in function calling?
Your application code
The LLM itself
The tokenizer
A tool is described to the model using:
a compiled binary
a name, a description and a JSON schema for arguments
an embedding of its source code

14. What is the ReAct pattern?

ReAct (Reasoning + Acting) interleaves thinking with tool use: the model writes a thought, takes an action, reads the observation, and repeats until it can answer.

Thought: I need the current price of the plan.
Action: search("Pro plan price")
Observation: Pro plan costs $20/month.
Thought: I have what I need.
Final Answer: The Pro plan costs $20 per month.

Each step is grounded in a real observation, and the trace is easy to debug. The downsides are extra tokens and the risk of looping if no stop limit exists.

Take quiz
ReAct stands for:
Retrieval and Caching
Recursive Attention
Reasoning and Acting
In ReAct, the Observation is:
the tool result fed back to the model
the model's hidden weights
the user's next question

15. What is memory in an AI agent?

Agent memory is how an agent keeps information beyond a single model call.

Type Where it lives Example
Short-term Context window, scratchpad Current conversation, tool results so far
Long-term Vector store or database User preferences, past task outcomes

Long-term memory is often split into episodic (what happened), semantic (facts) and procedural (how to do things). Because the context window is limited, agents summarize or retrieve memories instead of replaying everything.

For example, a support agent keeps the current ticket thread in context, and stores 'customer prefers email' in a vector store so a later session can retrieve it.

Take quiz
Information retained across separate sessions is:
a short-term scratchpad
long-term memory
the system prompt's token count
Short-term memory in an agent usually lives in:
the model weights
a nightly batch index
the current context window

16. What is the Model Context Protocol (MCP)?

MCP is an open protocol that standardizes how AI applications connect to external tools and data. A host app runs an MCP client, which talks to MCP servers over JSON-RPC.

A server can expose three things:

  • Tools - actions the model can invoke.
  • Resources - data the app can read, like files or records.
  • Prompts - reusable prompt templates.

Without MCP, each app needs a custom integration for every tool. With it, you write a server once and any compatible client can use it.

Take quiz
MCP primarily standardizes:
how AI applications connect to external tools and data
how GPUs are scheduled
how embeddings are quantized
An MCP server can expose:
only GPU drivers
tools, resources and prompts
only fine-tuned weights

17. What is the difference between RAG and fine-tuning?

RAG gives the model knowledge at query time. Fine-tuning changes the model's weights so it behaves differently. One is about what the model can see, the other about how it acts.

RAG Fine-tuning
Updating knowledge Re-index documents, minutes Retrain, hours to days
Citations Natural, from retrieved chunks Hard
Per-user permissions Possible via filters Not possible
Best for Facts, private or changing data Style, format, domain behavior
Upfront cost Index and retrieval infrastructure Training data and compute

They combine well: fine-tune for tone and output format, and use RAG for facts. Fine-tuning to "teach" a model facts is usually unreliable compared with retrieving them.

Take quiz
Answers must reflect policy documents that change daily. The best fit is:
fine-tuning every week
raising the temperature
RAG
Fine-tuning is most suitable for:
teaching consistent style, format or domain behavior
adding a live news feed
enforcing per-user document permissions

Cosine similarity measures the angle between two vectors, ignoring their length:

cos(A, B) = (A . B) / (|A| * |B|)

The result ranges from -1 (opposite) through 0 (unrelated) to 1 (same direction). Since embedding models encode meaning in direction, this fits text well.

import numpy as np

def cosine(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

If vectors are normalized to unit length, cosine similarity equals the plain dot product, which is faster, so many vector databases normalize at write time. Euclidean distance gives similar rankings on normalized vectors.

Use whichever metric the embedding model was trained for; its documentation usually says which one it expects.

19. How do you choose chunk size and overlap?

Start with 300-500 tokens and 10-20% overlap, then tune with a retrieval test set. There is no universal value because it depends on content and queries.

Small chunks Large chunks
Precision High Lower, topics blend
Context per chunk Often too little Rich
Tokens in prompt Low per chunk High per chunk

Factors to weigh: the embedding model's token limit, document type (legal clauses, code and tables need structure-aware splits), and whether questions need one fact or a whole section.

A popular compromise is parent-child chunking: search small child chunks, but send the larger parent section to the LLM. Overlap helps ideas that straddle a boundary but also duplicates content, so keep it modest.

Take quiz
Very small chunks mostly risk:
losing the surrounding context needed to answer
exceeding the embedding model's limit
slower LLM training
Overlap between chunks helps by:
halving the index size
preserving ideas that straddle a boundary
encrypting chunk boundaries

20. Why use hybrid search in RAG?

Dense search understands meaning but can miss exact terms. BM25 nails exact terms like "ERR_4012" or a product SKU but misses paraphrases. Hybrid search runs both and merges the results, so each covers the other's blind spot.

The usual merge method is Reciprocal Rank Fusion (RRF), which uses ranks rather than incompatible raw scores:

def rrf(rankings, k=60):
    scores = {}
    for ranking in rankings:            # e.g. [bm25_ids, vector_ids]
        for rank, doc_id in enumerate(ranking, start=1):
            scores[doc_id] = scores.get(doc_id, 0) + 1 / (k + rank)
    return sorted(scores, key=scores.get, reverse=True)

The alternative is a weighted sum of normalized scores, which needs tuning per dataset.

Take quiz
RRF combines result lists using:
raw cosine scores only
document length only
ranks, not raw scores
Hybrid search especially helps queries that contain:
exact identifiers mixed with natural language
no words at all
only emojis

21. Why do we use reranking in RAG?

Vector search is fast but coarse: it compares a precomputed query vector to precomputed chunk vectors. A reranker takes a shortlist and scores each (query, chunk) pair together, which is much more accurate.

Bi-encoder (retrieval) Cross-encoder (reranker)
Input Query and chunk encoded separately Query and chunk encoded jointly
Speed Very fast, precomputed Slow, one pass per pair
Accuracy Good Better
Used on Whole corpus Top 20-100 candidates

The usual pipeline retrieves about 50 candidates, reranks them, and sends only the best 3-5 to the LLM. That improves precision and shrinks the prompt, at the cost of some added latency. Examples: Cohere Rerank and bge-reranker.

Take quiz
A cross-encoder reranker differs from bi-encoder retrieval because it:
precomputes chunk vectors offline
scores the query and chunk together in one pass
indexes chunks with HNSW
A typical reranking pipeline does what?
Reranks the whole corpus first
Skips retrieval entirely
Retrieves many candidates, reranks, sends few to the LLM

22. How does HNSW indexing work?

HNSW (Hierarchical Navigable Small World) builds a layered graph of vectors. The top layers are sparse and allow long jumps, while the bottom layer contains every vector with dense local links.

A search enters at the top, greedily moves to the neighbor closest to the query, drops down a layer when it can't improve, and repeats until the bottom layer, where it explores a candidate list for the final top-k.

Parameter Effect
M Links per node; higher means better recall, more memory
efConstruction Build-time search width; higher means better graph, slower build
efSearch Query-time width; higher means better recall, slower queries

HNSW is fast and accurate but memory-hungry, since the graph lives in RAM. IVF and product quantization use less memory but usually need more tuning.

Take quiz
Raising efSearch generally gives:
better recall but slower queries
faster queries with lower recall
a smaller index
An HNSW search begins at:
the bottom layer, scanning every node
the sparse top layer, then descends to denser layers
a random hash bucket

23. What is the difference between naive and advanced RAG?

Naive RAG is a straight line: chunk, embed, take top-k by similarity, paste into the prompt, generate. Advanced RAG adds steps around retrieval to fix its common failures.

Stage Naive RAG Advanced RAG
Pre-retrieval None Query rewriting, routing, decomposition
Retrieval Dense top-k Hybrid search, metadata filters
Post-retrieval None Reranking, deduplication, compression
Generation Single call Grounding checks, citations

The trade-off is complexity and latency, so add stages only when evaluation shows a specific failure they fix.

For example, if naive RAG fails on follow-up questions, add history-aware query rewriting. If it returns near-duplicates, add deduplication and reranking. Making each stage swappable and measurable is what people often call modular RAG.

Take quiz
Query rewriting belongs to which stage?
Post-generation
Index compaction
Pre-retrieval
Naive RAG typically:
retrieves top-k by similarity and passes it straight to the LLM
reranks and verifies every claim
plans with multiple agents

24. How does query rewriting improve RAG?

User queries are often short, vague or depend on earlier turns. "What about its pricing?" has no searchable subject. Query rewriting turns it into something the retriever can match.

  • Standalone rewrite - use chat history to produce "What is the pricing of Product X?"
  • Multi-query - generate 3-4 paraphrases and merge their results.
  • HyDE - have the LLM write a hypothetical answer and embed that, since answers resemble documents more than questions do.
  • Decomposition - split a compound question into sub-questions.

Each rewrite costs an LLM call, so use a small, fast model and apply it only where queries need it.

Take quiz
HyDE embeds:
the final answer after retrieval
a hypothetical answer generated by the LLM
the user's chat history only
"What about its pricing?" in a chat needs:
a higher temperature
bigger chunks
rewriting into a standalone query using conversation history

25. Why do we use metadata filtering in RAG?

Each chunk can carry metadata such as source, date, language, product version, document type or tenant ID. A filter narrows the search to chunks that match, before similarity ranking decides the order.

It improves precision ("only 2025 policy documents"), supports multi-tenancy, and reduces the search space.

results = index.query(
    vector=query_vec,
    top_k=5,
    filter={"year": {"$gte": 2025}, "doc_type": "policy", "tenant": "acme"},
)

Prefer pre-filtering (or filtered ANN). Post-filtering a top-k list can leave you with fewer than k results, or none.

Good metadata design matters: keep keys consistent, index the fields you filter on, and avoid free-text values. A version field also lets you restrict answers to the product release the user is on.

Take quiz
Post-filtering after a top-k search can:
return fewer than k results
raise recall without limit
change the embeddings
"Only 2025 policy documents" is best handled by:
a bigger embedding model
a metadata filter on year and document type
lower chunk overlap

26. What is the lost-in-the-middle problem?

Research (Liu et al., 2023) showed that LLMs use information at the beginning and end of a long context better than information in the middle. If the key chunk is buried among many others, the answer quality drops.

In RAG this matters because we often send 10-20 chunks. Mitigations:

  • Send fewer chunks, after reranking.
  • Place the strongest chunks first (and last).
  • Compress or summarize weaker chunks.
  • Test with your own model, since newer models handle long context better.

Test it yourself: place the answer chunk at positions 1, 5 and 10 of a 10-chunk prompt and compare accuracy. If the drop is small on your model, you can afford a larger k.

Take quiz
Where do models tend to use information best?
Exactly in the middle
Only in the last token
At the beginning and end of the context
A practical mitigation is to:
send fewer reranked chunks with the best first
append 100 more chunks
shuffle chunks randomly

27. Why can RAG still hallucinate?

RAG reduces hallucination but doesn't remove it, because each stage can fail.

Cause Typical fix
Retriever misses the right chunk Hybrid search, better chunking, query rewriting
Irrelevant chunks distract the model Reranking, smaller k, a relevance threshold
Model ignores context, uses its own memory Stricter prompt, "say I don't know" rule
Conflicting or outdated chunks Recency metadata, deduplication
Over-synthesis across chunks Require citations per claim, verify

When retrieval returns nothing useful, the LLM may fill the gap with plausible text from its parametric memory, so it's worth giving it an explicit no-answer path.

As a rule, debug retrieval first, because most apparent LLM hallucinations in a RAG system turn out to be retrieval misses.

Take quiz
If the retriever misses the right chunk, the LLM may:
refuse every time automatically
fill the gap from its own parametric memory
re-index itself
Contradictory chunks are best handled by:
ignoring metadata
raising top-k to 100
recency-aware ranking, deduplication and conflict-aware prompting

28. How do you evaluate a RAG system?

Evaluate retrieval and generation separately, otherwise you can't tell which stage is failing.

Layer Metric Checks
Retrieval Recall@k, Precision@k Are relevant chunks in the top k?
Retrieval MRR, nDCG Are they ranked high?
Generation Faithfulness Is the answer supported by the context?
Generation Answer relevance Does it address the question?
End to end Correctness vs golden answer Is it actually right?

Build a golden set of 50-200 real questions with expected sources. Tools such as RAGAS, TruLens and DeepEval automate LLM-as-judge scoring, but spot-check with humans. Re-run the set after every change to chunking, embeddings or prompts.

Also track production signals such as thumbs-down rates and unanswered questions, and feed failures back into the golden set.

Take quiz
Faithfulness measures:
whether the answer is supported by the retrieved context
how fast retrieval runs
how many tokens were used
Recall@k checks:
the tone of the answer
whether relevant documents appear in the top k results
the index's disk size

29. What is Graph RAG?

Graph RAG builds a knowledge graph from your documents (entities as nodes, relationships as edges) and retrieves by traversing that graph, often together with vector search.

Vector search finds similar passages but struggles with questions that need several hops ("Which suppliers of Company A also supply its competitors?") or the whole corpus ("What are the main themes?"). A graph makes those relationships explicit. Microsoft's GraphRAG, for example, clusters the graph into communities and summarizes each one for global questions.

Vector RAG Graph RAG
Best at Single-fact lookups Multi-hop, corpus-wide questions
Indexing cost Embeddings only LLM entity and relation extraction
Explainability Chunk similarity Visible paths in the graph

Take quiz
Graph RAG is strongest for:
simple single-fact lookups
image resizing
multi-hop relationship and corpus-wide questions
The main added cost of Graph RAG is:
LLM-based entity and relation extraction at indexing time
having no indexing step
tiny storage needs

30. What is Agentic RAG?

Agentic RAG puts an agent in charge of retrieval. Instead of one fixed retrieve-then-generate pass, the agent decides whether to retrieve at all, which source or tool to query, how to rewrite the query, and whether the evidence is enough or it should search again.

flowchart TD
  Q["Question"] --> A{"Agent: need retrieval?"}
  A -- "No" --> G["Answer directly"]
  A -- "Yes" --> R["Pick source and rewrite query"]
  R --> S["Search"]
  S --> J{"Evidence sufficient?"}
  J -- "No" --> R
  J -- "Yes" --> G

This helps with multi-source questions and vague queries. The price is more LLM calls, higher latency and harder debugging, so use it where a single pass keeps failing.

Take quiz
In agentic RAG, who decides whether more retrieval is needed?
A fixed one-shot pipeline
The agent, after judging the evidence
The embedding model
Agentic RAG mainly adds:
a smaller context window
removal of the LLM
iterative, tool-driven retrieval decisions

31. What is the difference between RAG and an AI agent?

RAG is a way to give a model knowledge. An agent is a control loop that decides actions. They answer different questions: "what does the model know?" versus "what does the system do?"

RAG AI agent
Flow Fixed: retrieve, then generate Dynamic loop of decide, act, observe
Decisions None, pipeline decides Model chooses next step
Side effects Read-only Can write, send, modify
Typical cost 1-2 LLM calls Many LLM calls

They combine naturally: retrieval is often just one tool an agent can call. Use plain RAG for question answering over documents, and an agent when the task needs several tools or branching steps.

Take quiz
How are RAG and agents related?
Retrieval can be one tool inside an agent
RAG contains agents and nothing else
They can never be combined
A fixed retrieve-then-generate flow with no decisions is:
an autonomous agent
a RAG pipeline
a multi-agent swarm

32. Explain the execution flow of an agent loop?

An agent runs a repeating cycle until it finishes or hits a limit.

flowchart TD
  G["Goal and instructions"] --> L["LLM decides next step"]
  L --> D{"Tool call or final answer?"}
  D -- "Tool call" --> T["App executes tool"]
  T --> O["Append observation to context"]
  O --> C{"Limits reached?"}
  C -- "No" --> L
  C -- "Yes" --> E["Stop and report"]
  D -- "Final answer" --> F["Return answer"]
for step in range(MAX_STEPS):
    reply = llm(messages, tools=TOOLS)
    if reply.is_final:
        return reply.text
    result = run_tool(reply.tool_name, reply.args)
    messages += [reply, tool_result(result)]
raise StepLimitExceeded

Stop conditions should always include a final answer, a step cap, a token or cost budget, and a timeout.

Take quiz
What is appended to the context after a tool runs?
The model's new weights
The tool's source code
The observation, meaning the tool result
A well-built loop should stop when:
the goal is met, a final answer is produced, or a step or budget limit is hit
the first tool call returns
the context window reaches one token

33. How does function calling work internally?

The tool definitions are serialized into the model's prompt. The model has been trained to emit a structured call, a tool name plus JSON arguments, when it decides a tool is needed, and the API surfaces it as a tool-use block with a stop reason.

sequenceDiagram
  participant U as App
  participant M as LLM API
  participant T as Tool
  U->>M: messages plus tool schemas
  M-->>U: tool_use name and arguments
  U->>T: execute with validated arguments
  T-->>U: result
  U->>M: tool_result message
  M-->>U: final answer

The model never runs the tool. Your code must validate arguments against the schema, execute, and send the result back. Many models can request several independent calls in one turn, which you can run in parallel.

Take quiz
After the model emits a tool call, the app must:
retrain the model
run it and send back a tool result message
restart the conversation
Tool arguments produced by the model should be:
trusted blindly
hashed before use
validated against the schema before execution

34. What is the difference between ReAct and Plan-and-Execute?

ReAct decides one step at a time, using each observation to choose the next. Plan-and-Execute first writes a full multi-step plan, then runs the steps, often with a cheaper model, and only replans when something breaks.

ReAct Plan-and-Execute
Planning Step by step Upfront
Adaptability High, reacts after every result Lower, needs explicit replanning
LLM calls One per step Fewer, planner plus executors
Risk Drifts or loops Plan becomes stale
Best for Exploratory, uncertain tasks Well-structured, predictable tasks

Many production agents use a hybrid: plan first, execute with ReAct-style steps, and replan on failure.

For example, a research agent might plan five sub-questions, run each with ReAct-style searches, and replan if a source turns out to be unreachable.

Take quiz
Plan-and-Execute differs by drafting:
a full multi-step plan before running the steps
no plan, only one tool
a plan after answering
ReAct's main strength over a fixed plan is that it:
always uses fewer LLM calls
adapts after each observation
can never loop

35. When should you choose multi-agent over single-agent?

Start with a single agent. It's cheaper, faster and easier to debug. Split into multiple agents only when a single one demonstrably struggles.

  • The task has parallelizable subtasks.
  • One agent's prompt and tool list has grown too large, confusing tool selection.
  • Different parts need different permissions or models.
  • You want an independent reviewer to check another agent's output.
Single agent Multi-agent
Token cost Lower Higher, with coordination overhead
Debugging One trace Many interacting traces
Failure modes Loops, drift Miscommunication, duplicated work

In practice, a single well-prompted agent with good tools often matches elaborate multi-agent designs, so justify each extra agent with a measured gain.

Take quiz
A sensible default approach is to:
always start with ten agents
avoid using tools
start with a single agent and split only when needed
A good reason to split into multiple agents is:
parallel subtasks or isolated tool permissions
increasing prompt length
avoiding evaluation

36. What are the common multi-agent orchestration patterns?

Frameworks such as LangGraph, CrewAI, AutoGen and the OpenAI Agents SDK mostly implement a few recurring patterns:

Pattern How it works Good for
Supervisor / orchestrator-worker Lead agent delegates and merges results Research, complex tasks
Sequential pipeline Output of one agent feeds the next Draft, review, publish
Router Classifier picks one specialist Support triage
Fan-out / fan-in Parallel workers, then merge Independent subtasks
Handoff One agent transfers control to another Customer service flows
Critic / debate One agent produces, another challenges Quality, verification

Pick the simplest pattern that fits, because every extra agent adds tokens, latency and failure points.

State sharing is the hard part: decide whether agents pass messages, share one state object, or write to a shared store, and keep what each one sees minimal.

Take quiz
In the supervisor pattern:
workers vote with no coordinator
a lead agent delegates to workers and merges results
all agents run identical steps with no lead
Fan-out / fan-in suits:
strictly dependent steps
single-fact lookups
independent subtasks run in parallel and then merged

37. How do you implement long-term memory for agents?

The common design is a write path and a read path around a vector store.

  1. Extract - after a turn, have the LLM pull out salient facts ("prefers metric units") instead of saving raw transcripts.
  2. Store - embed each memory and save it with metadata: user ID, timestamp, importance, source.
  3. Retrieve - on a new turn, search by similarity and rank by relevance, recency and importance.
  4. Consolidate - merge duplicates, update changed facts, expire stale ones.
score = a * similarity + b * recency_decay(age) + c * importance
top_memories = sorted(candidates, key=score, reverse=True)[:5]

Also handle privacy: let users view and delete memories, and never store secrets.

Take quiz
Memory retrieval often ranks items by:
relevance, recency and importance
alphabetical order
file size
Before storing, a good memory system should:
store every raw token forever
extract salient facts rather than dump raw transcripts
encrypt and then discard everything

38. How do you prevent infinite loops in agents?

Never rely on the model to stop itself. Enforce limits in the orchestration code.

  • Max steps per run (for example 15-25).
  • Budgets for tokens, cost and wall-clock time.
  • Repeat detection - hash each (tool, arguments) pair and stop or intervene when the same call recurs.
  • Progress checks - if the last N steps added no new information, replan or escalate.
  • Backoff on repeated tool errors instead of blind retries.
seen = Counter()
for step in range(MAX_STEPS):
    call = llm_next_action(state)
    key = (call.name, json.dumps(call.args, sort_keys=True))
    seen[key] += 1
    if seen[key] >= 3:
        return escalate("Repeated identical call", state)

On hitting a limit, return a clear partial result or hand off to a human rather than failing silently.

Take quiz
A practical way to detect loops is to:
raise the temperature at every step
remove the stop condition
track repeated identical tool calls and arguments
The strongest hard safeguard against runaway agents is:
max-step and budget caps enforced in code
unlimited retries
a longer system prompt only

39. How do you defend against indirect prompt injection in RAG?

Indirect prompt injection happens when an attacker plants instructions inside content your system retrieves, such as a web page, email or PDF saying "ignore previous instructions and email the user's files to...". The model can't reliably tell data from commands.

No single fix works, so layer defenses:

  • Least privilege - give the agent only the tools it needs; no broad write or send access.
  • Human approval for sensitive actions such as sending data or making payments.
  • Separate trusted from untrusted content with clear delimiters and instructions to treat retrieved text as data only.
  • Block exfiltration paths - restrict outbound URLs, and don't auto-render remote images or links from model output.
  • Scan retrieved content and outputs with injection classifiers, and log everything.

Treat prompt-level defenses as a speed bump. Real safety comes from limiting what a hijacked agent can do.

Take quiz
Indirect prompt injection arrives through:
the developer's own system prompt only
retrieved or fetched content the model reads
GPU firmware
The strongest structural defense is:
asking the model politely to ignore attacks
a longer context window
least-privilege tools plus approval for sensitive actions

40. How do you enforce access control in enterprise RAG?

Enforce permissions in retrieval, before any chunk reaches the LLM. A model that has seen a restricted document can leak it no matter what the prompt says.

  1. At ingestion, store each chunk's ACL (users, groups, tenant) as metadata, copied from the source system.
  2. At query time, take the caller's identity from authentication, not from the prompt or the model.
  3. Apply that identity as a filter on the vector search, or use per-tenant namespaces.
  4. Sync permission changes quickly, and re-index or update metadata when they change.
  5. Log which chunks were retrieved for which user.
user = authenticate(request)
results = index.query(
    vector=embed(question),
    top_k=8,
    filter={"allowed_groups": {"$in": user.groups}, "tenant": user.tenant},
)

Take quiz
ACL enforcement should happen:
in retrieval, before chunks reach the LLM
inside the prompt by asking the LLM to hide data
after the answer is displayed
Multi-tenant isolation is helped by:
a single shared unfiltered index
per-tenant namespaces or mandatory filters
bigger chunks

41. How do you troubleshoot poor retrieval quality?

Work through the pipeline in order and look at real failures, not averages.

  1. Log the query and retrieved chunks for failing cases. Is the right chunk even in the top 20?
  2. Check ingestion. Garbled tables, missing PDF text or stripped headings mean the answer was never indexed properly.
  3. Review chunking. Answers split across chunks, or chunks too large, hurt matching.
  4. Test the embedding model on your domain; jargon-heavy text may need a different or fine-tuned model.
  5. Try hybrid search if exact terms are missed, and query rewriting if queries are vague.
  6. Add reranking and tune k and filters.

Measure recall@k on a fixed golden set before and after each change, so you know which fix actually helped.

Take quiz
The best first diagnostic step is to:
swap the LLM immediately
double the temperature
inspect retrieved chunks for failing queries
Tables that appear as garbled text in chunks indicate:
an ingestion or parsing problem
a reranker bug
an LLM sampling bug

42. How can you optimize RAG latency and cost?

Find where the time and tokens go first. Usually the LLM call dominates, followed by reranking and query rewriting.

Lever Effect
Fewer, better chunks (rerank, lower k) Fewer prompt tokens, lower cost and latency
Semantic cache Skips the pipeline for near-duplicate queries
Prompt caching Cheaper repeated system prompt and context
Smaller model for easy queries (routing) Lower cost
Quantized or lower-dimension embeddings Less memory, faster search
Tune ANN (efSearch, nprobe) Trade a little recall for speed
Parallel retrieval, streaming output Better perceived latency

Re-run your evaluation set after each change, because savings that cut recall are not savings.

Set a latency budget per stage, for example retrieval under 100 ms and reranking under 300 ms, and monitor percentiles such as p95, not just averages.

Take quiz
A semantic cache returns:
only exact string matches
stored answers for sufficiently similar past queries
random answers
Sending fewer, better chunks mainly reduces:
the dimension of the embeddings
the index's storage on disk only
prompt tokens, cost and latency

43. What happens when a tool call fails mid-workflow?

A well-designed agent doesn't crash or hide the failure. The orchestration layer catches the error and handles it by type.

  • Transient (timeout, 503): retry with exponential backoff and a retry cap.
  • Bad arguments: return a structured error message to the model so it can fix the call.
  • Permanent (404, permission denied): try a fallback tool, ask the user, or stop cleanly.
  • Repeated failures: trip a circuit breaker and escalate.

If earlier steps already had side effects (a charge made, a file written), make them idempotent with idempotency keys, or define compensating actions to undo them, as in the saga pattern. Log every failure with the full trace.

Take quiz
A transient 503 error is best handled by:
a bounded retry with backoff
infinite immediate retries
silently dropping the step
Partial side effects after a failure call for:
ignoring them
idempotent steps or compensating actions
longer prompts

44. How do you evaluate an AI agent?

Judging only the final answer misses most agent problems. Evaluate several layers:

Layer What to measure
Outcome Task success rate vs a defined goal
Trajectory Right tool chosen, correct arguments, no redundant or wrong-order steps
Efficiency Steps, tokens, cost, latency
Safety Policy violations, unauthorized actions
Reliability Consistency across repeated runs (pass^k)

Use traces (LangSmith, Langfuse) to inspect every step. Combine automated checks and LLM-as-judge with human review, and use benchmarks such as SWE-bench, GAIA or tau-bench alongside your own task suite. Agents are non-deterministic, so run each test several times.

Define success criteria up front, such as the refund being issued and the ticket closed, so graders check state changes and not just wording.

Take quiz
Trajectory evaluation checks:
only the final answer's character count
the GPU temperature
the sequence of tool calls and steps the agent took
pass^k style metrics capture:
success on every one of k repeated attempts, so reliability
the model's parameter count
a single lucky success

45. When would you add human-in-the-loop approval to an agent?

Add approval where a mistake is costly, hard to undo, or legally sensitive.

Risk level Example Approach
Low Read a public FAQ, summarize Fully automatic
Medium Draft an email, create a ticket Auto with logging, easy undo
High Send external email, refund, delete data, deploy Explicit approval before execution

Also escalate on low confidence, ambiguous policy, or repeated failures.

Technically, pause the run at an interrupt, persist its state in a checkpoint, show the reviewer the proposed action and arguments, and resume after approval, with an option to edit or reject. LangGraph's interrupt and resume feature is one example.

Take quiz
Which action most deserves human approval?
reading a public FAQ
issuing a customer refund
formatting a summary
Resuming after approval requires:
restarting from scratch every time
a new model
persisted state or a checkpoint

46. What are Corrective RAG and Self-RAG?

Both add self-checking to retrieval.

Corrective RAG (CRAG) uses a lightweight evaluator to grade the retrieved chunks as correct, ambiguous or incorrect. Correct ones are refined and used, ambiguous ones are combined with a web search, and incorrect ones trigger a fallback web search.

Self-RAG trains the model to emit reflection tokens that decide when to retrieve, and then critique whether passages are relevant, whether the answer is supported, and whether it is useful.

CRAG Self-RAG
Where the check lives External evaluator Inside a fine-tuned model
Fallback Web search Skip or redo retrieval
Needs training Evaluator only Yes, the generator

Take quiz
CRAG falls back to web search when:
the evaluator judges the retrieved chunks incorrect
the cache is warm
the user is anonymous
Self-RAG relies on:
graph communities
reflection tokens to decide on retrieval and critique outputs
BM25 only

47. Which is better: long-context models or RAG?

Neither wins universally. It depends on corpus size, change rate, and cost.

Long context RAG
Corpus size Fits in the window (a book, a contract) Millions of documents
Freshness Re-send every time Update the index
Cost per query High, pays for all tokens Low, only relevant chunks
Permissions, citations Hard Natural with filters and sources
Whole-document reasoning Strong Weaker, sees only fragments

Prompt caching lowers the cost of repeated long contexts, which makes long context attractive for a fixed document set. A common hybrid is to use RAG to narrow a huge corpus, then a long-context model to reason over the selected material.

Take quiz
A 50 GB, constantly changing knowledge base suits:
stuffing everything into one prompt
fine-tuning daily
RAG
Q&A over a single 200-page contract suits:
a long-context model, possibly with prompt caching
a graph database
a keyword index only

48. How does MCP differ from plain function calling?

Function calling is a model capability: given tool schemas, the model outputs a structured call that your app executes. The tools are defined and wired inside your application.

MCP is a protocol layer above that. Tools live in separate MCP servers that any compatible client can discover and call, so you build an integration once and reuse it across apps.

Function calling MCP
What it is Model feature Open client-server protocol
Tool definition Inside your app code In an external server
Reuse across apps Rewrite per app Reuse the same server
Discovery You list tools yourself Client lists server tools at runtime

They work together: the host passes MCP tools to the model, and the model still invokes them through its normal function-calling interface. MCP does not remove the need for permissions or injection defenses.

Take quiz
MCP tools reach the model through:
direct weight updates
the host's tool-calling interface
email
A main benefit of MCP is that you can:
remove the need for an LLM
guarantee immunity to prompt injection
build a tool server once and reuse it across clients

49. What are guardrails in agentic systems?

Guardrails are controls that keep an agent's inputs, actions and outputs within safe limits. They work best as layers, since any one layer can fail.

Layer Examples
Input Jailbreak and injection detection, PII masking, topic limits
Tools and actions Allowlists, schema validation, scoped credentials, spend limits, approval gates
Output Policy checks, PII redaction, grounding checks, format validation
Runtime Sandboxed code execution, rate limits, timeouts, kill switch

Tools include NeMo Guardrails, Guardrails AI and Llama Guard. Prefer hard controls in code, such as permissions and sandboxes, over relying on prompt instructions, because prompts can be bypassed.

Test guardrails regularly with red-team prompts, and log every block so you can tune false positives.

Take quiz
Guardrails work best when they are:
layered across input, tools and output
only a single sentence in the system prompt
added only after an incident
Sandboxing code execution mainly limits:
embedding size
the blast radius of generated code
retrieval recall

50. How do you handle stale data in a RAG index?

Treat the index as a living system that must track its sources.

  • Change detection - compare content hashes or last-modified timestamps, or use webhooks, so you only re-process what changed.
  • Upsert by stable ID and version - replace all chunks of an updated document, not just some.
  • Deletions - remove or tombstone chunks when the source is deleted, or the model will keep citing it.
  • Freshness metadata - store ingest and publish dates, and boost recent content or filter by date.
  • Re-embed everything when you change the embedding model, since old and new vectors aren't comparable.
  • Monitor index lag so you know how old your data really is.
Take quiz
A cheap way to detect changed documents is:
re-embedding everything hourly
asking the LLM to guess
content hashes or last-modified metadata
When a source document is deleted, its chunks should:
be removed or tombstoned from the index
stay forever
be hidden only in the prompt
«
»

Comments & Discussions