This appendix is not Part 12.

The main series already closed in Part 11. This piece has a different job: it is a tool index. When you actually move RAG toward production, which engineering steps appear? What problem does each step solve? Which tools are common? What would I start with? What tells you it is time to switch?

So this is not a ranking of the best RAG tools. Tool names change, APIs change, pricing changes, and community attention moves around. The more stable thing is the engineering problem:

  • How does the document enter the system?
  • How do permissions and metadata survive ingestion?
  • Is a retrieval miss caused by recall, precision, or context fragmentation?
  • How do you verify the answer?
  • How do you debug the system when it fails?
  • Which layer is responsible for cost or latency growth?

If the first 11 posts are the journey from naive RAG to a production backbone, this appendix is the lookup table for that journey.

Production RAG Tool Map


How to use this appendix: problem first, tool second

Versioning note for this table: use this appendix as a capability index, not a lockfile. For version-sensitive tools — LlamaIndex, LangChain, Qdrant, RAGAS, DeepEval, Langfuse, OpenAI models, Cloudflare, Docker, and hosted vector databases — keep a project-local compatibility note with: tested package/service version, current API shape, deprecated method names, migration link, and the smoke test that proves the row still works.

For each row, use the same order of questions:

  1. What problem does this step solve?
  2. What tools are commonly used?
  3. What would I start with today?
  4. What situation tells me to switch?
  5. What usually goes wrong?

That order matters. Many RAG projects get stuck not because tools are missing, but because the team has not named the layer that is actually failing.

RAG Tool Selection Ladder


A. Ingestion and indexing

This is the build side. It decides whether the knowledge base is clean, updateable, permission-aware, and rich enough for retrieval to work later.

StepProblem solvedCommon toolsMy starting choiceSwitch whenCommon trap
Data source connectorsPull data from Google Drive, Notion, Slack, GitHub, S3, databases, and websitesLlamaIndex Readers, LangChain document loaders, Airbyte, custom ETLFor a few sources, start with LlamaIndex Readers or custom connectorsMany sources, complex sync rules, or CDC requirementsPulling content without source id, updated_at, owner, or version
Parser / OCR / document conversionConvert PDF, Office, HTML, or scanned files into usable text and structureUnstructured, LlamaParse, Docling, Azure AI Document Intelligence, Google Document AI, TesseractFor technical PDFs, try LlamaParse or Docling; for scanned docs, evaluate cloud OCRTables, layouts, page numbers, or heading hierarchy are unreliableKeeping only plain text and losing pages, headings, and table semantics
Chunking / node creationTurn documents into retrievable unitsLlamaIndex NodeParser, LangChain text splitters, semantic chunking, custom splittersStart with markdown or heading-aware chunking plus parent idAnswers often need multiple paragraphs or sectionsChunks too small become fragments; chunks too large become noisy
Metadata extractionCreate source, title, section, page, time, entity, and doc type signalsLlamaIndex extractors, LLM-based extraction, spaCy, custom rulesStart with deterministic metadata, then add LLM extraction where neededClassification, entity extraction, or date inference becomes necessaryMetadata looks nice but cannot be filtered
ACL / permissionPrevent users from retrieving documents they should not seeSource ACL sync, app DB permission tables, row-level security, metadata filtersStore user, group, and tenant signals in metadata and app DBPermission inheritance or cross-system groups become complexBlocking access only in the UI while retrieval has no permission filter
Raw docstore / parent storePreserve original documents, parent sections, and source pathsPostgres, S3/R2, MongoDB, LlamaIndex docstoreStore raw files in object storage; store metadata and parent mapping in PostgresVersioning and audit requirements increaseStoring chunks only, so you cannot re-chunk, rebuild, or cite correctly
Dense embeddingTurn text into semantic vectorsOpenAI embeddings, Cohere Embed, Voyage AI, bge, e5, Jina embeddingsStart with a hosted embedding model; self-host after quality and cost are understoodDomain vocabulary, language quality, or cost becomes a blockerChanging embedding model versions without a rebuild plan
Dense vector DBRun approximate vector searchQdrant, Pinecone, Weaviate, Milvus, pgvector, Elasticsearch vector searchSmall to medium systems can start with pgvector or Qdrant; use Pinecone for managed needsData volume, filter latency, HA, or multi-tenant isolation becomes a bottleneckChoosing from benchmarks without testing your own filters and payloads
Sparse / BM25 / keyword indexCatch exact terms, product names, IDs, and keyword-heavy queriesElasticsearch, OpenSearch, Postgres full-text, Meilisearch, BM25 retrieverStart with Postgres FTS or Elasticsearch/OpenSearchSynonyms, weighting, or Chinese tokenization needs tuningAssuming dense vector search replaces keyword search
Metadata filter indexMake tenant, source type, date, doc id, and other filters fastDB indexes, Qdrant payload indexes, Elasticsearch filters, Postgres indexesIndex high-frequency filter fields earlyFilter latency dominates query timeWriting metadata but not indexing it

B. Query planning and retrieval

This is the query side. Naive RAG usually does only top-k vector search; production RAG first identifies query shape and then chooses the right retrieval path.

StepProblem solvedCommon toolsMy starting choiceSwitch whenCommon trap
Query classificationIdentify fact lookup, comparison, summary, troubleshooting, creative, or agentic queriessmall LLM classifier, rules, LlamaIndex router, custom intent classifierStart with rules plus a small LLMModes grow and misclassification becomes costlyMaking classes too granular to debug
Query rewriteTurn a conversational query into a retrieval-friendly queryLlamaIndex query transform, LangChain query rewriting, custom promptUse conservative rewrite and keep the original queryUsers rely on abbreviations, typos, or cross-lingual wordingRewriting so aggressively that user intent changes
Query decompositionSplit compound questions into sub-questionsLlamaIndex sub-question query engine, LangChain decomposition, custom plannerEnable only for comparison or multi-hop queriesSub-questions require different sources or retrieval modesDecomposing every query and exploding latency
RoutingChoose the index, tool, or mode for this queryLlamaIndex RouterQueryEngine, LangGraph, custom routerStart with a few fixed modes: fast, safe, deep_eval, creative, agenticMore sources, workflows, or tool calls are requiredRouter decisions are not traced, so failures are opaque
Hybrid searchCombine dense vector, BM25, and metadata filtersQdrant hybrid, Weaviate hybrid, Elasticsearch, LlamaIndex fusion retrieverStart with dense + BM25 + metadata filter, merged by RRFExact terms, product names, or IDs frequently missDense and sparse scores are not calibrated
RerankingReorder candidate chunks to improve precisionCohere Rerank, bge-reranker, Jina reranker, Voyage rerank, cross-encoderValidate with a hosted reranker before self-hostingResults exist but top-k ordering is noisyReranking too many candidates and inflating latency

C. Context and answer generation

This layer decides whether the model sees fragments, noise, or an answerable evidence pack.

StepProblem solvedCommon toolsMy starting choiceSwitch whenCommon trap
Parent-doc expansionPull back parent sections or documents when top chunks are too fragmentedLlamaIndex recursive retriever, parent-child mapping, custom docstoreStart with section-level parent expansionAnswers need surrounding context, clauses, flows, or adjacent sectionsLooking only at chunk scores and ignoring parent-level continuity
Context compressionRemove query-irrelevant text to reduce tokens and noiseLlamaIndex compressor, LangChain contextual compression, reranker-based filteringStart with reranker or sentence-level compressionParent expansion makes context too longCompression deletes text needed for citation
Citation assemblyBind answer claims to source, page, section, and chunk idLlamaIndex citation query engine, custom citation mapper, source span mappingI prefer a custom citation mapper with source paths preservedCompliance, internal review, or support workflows need claim-level reviewShowing a source list without claim-to-source mapping
Response synthesisTurn the evidence pack into a final answerLlamaIndex response synthesizer, LangChain chains, custom prompt, OpenAI structured outputsStart with a fixed answer contract: answer, sources, confidence, warningsDifferent tones, schemas, or multi-step answers are requiredAsking the model to answer from context without an output contract

D. Evaluation and observability

This is the boundary between demo RAG and production RAG. Without eval and tracing, you are tuning by taste.

StepProblem solvedCommon toolsMy starting choiceSwitch whenCommon trap
Faithfulness checkCheck whether the answer is supported by retrieved contextRAGAS, DeepEval, TruLens, LLM judge, custom rulesStart with lightweight app-layer checks, then add RAGAS / DeepEvalHigh-risk settings need multiple judges and human audit samplingJudging whether the answer sounds good, not whether it is grounded
Citation checkCheck whether citations actually support claimsDeepEval citation metric, RAGAS context metrics, custom citation verifierStart with a custom citation verifierCitation is part of the product or compliance promiseCitation format exists, but sources do not support the answer
Offline evalCompare changes against a fixed datasetRAGAS, DeepEval, promptfoo, OpenAI Evals, custom golden setStart with a 30-100 question golden setQuery types, versions, and regressions multiplyNo train / eval split; only testing favourite examples
Tracing / observabilitySee what each query did, what it cost, and where it failedLangfuse, LangSmith, Arize Phoenix, OpenTelemetry, HeliconeStart with Langfuse or Phoenix plus cost, latency, and mode tagsMultiple services, agents, or models enter the systemLogging only the final answer, not candidates or rerank scores

E. Application and infrastructure

This layer is rarely the focus of RAG tutorials, but it decides whether the system can be operated reliably.

StepProblem solvedCommon toolsMy starting choiceSwitch whenCommon trap
BackendProvide API, auth, rate limits, and request schemaFastAPI, Next.js API routes, NestJS, Express, DjangoFor a Python RAG stack, start with FastAPIA full-stack repo, edge functions, or enterprise framework constraints dominateThe notebook works but there is no stable API contract
App DBStore users, conversations, feedback, job status, and configPostgres, Supabase, Neon, PlanetScale, MongoDBStart with Postgres / SupabaseDocument-shaped state or existing database constraints dominatePutting application state into the vector DB
Raw storageStore original files, converted files, images, and OCR resultsS3, Cloudflare R2, GCS, Azure Blob, local diskStart with S3/R2-style object storageCompliance, region, or enterprise cloud constraints dominateStoring only parsed output and losing the source file
DeploymentShip the service with rollback and scalingDocker, Fly.io, Render, Railway, Vercel, Cloud Run, KubernetesStart with Docker plus a managed platform for small APIsGPU, self-hosted reranking, private networking, or HA is requiredIndexing jobs and query API share one fragile process
Workflow / batchRun ingestion, reindexing, eval, reports, and schedulesCelery, RQ, Temporal, Airflow, Dagster, GitHub Actions, cronStart with GitHub Actions, cron, or RQDependencies, retries, and audit requirements become seriousManual reindexing with no job id, retry, or failure log

My default starting stack

If I were starting from zero and wanted a production-capable small to medium RAG system, I would begin here:

LayerInitial choice
ParsingLlamaParse or Docling, depending on PDF complexity
ChunkingMarkdown / heading-aware chunking plus parent-child mapping
Metadata / ACLPostgres for permissions and parent mapping; sync required fields into retrieval metadata
EmbeddingHosted embedding first, then evaluate self-hosting after quality and cost are clear
Vector DBQdrant or pgvector
KeywordPostgres FTS or Elasticsearch / OpenSearch
RetrievalHybrid + metadata filter + RRF
RerankHosted reranker first to validate quality
ContextParent expansion + compression
CitationCustom citation mapper
EvalCustom lightweight checks + RAGAS / DeepEval offline eval
TracingLangfuse or Phoenix
BackendFastAPI
App DBPostgres / Supabase
StorageS3 / R2
WorkflowStart with cron / GitHub Actions / RQ; move to Temporal when workflows become complex

This is not the only correct stack, but it has one advantage: every layer can be replaced independently. The larger risk in Production RAG is not picking an unfashionable tool. It is coupling every layer so tightly that a single failure forces a broad rewrite.


When not to add another tool

If you do not yet have:

  • a fixed eval set
  • query traces
  • source id / parent id / chunk id
  • retrieval candidate logs
  • cost / latency dashboards
  • a before-and-after comparison method for every change

then do not rush into GraphRAG, agents, multi-vector retrieval, long-context, or knowledge graphs.

Not because those patterns are bad. Because without instrumentation, you cannot tell whether they improved anything. Tool upgrades without eval often make errors more expensive, slower, and harder to diagnose.


The real job of this tool index

The purpose of this appendix is not to memorise tool names. It is to turn RAG back into engineering problems.

When the answer is wrong, do not ask only whether you need a stronger model. Ask:

  • Did the data enter the system?
  • Did the parser break tables or sections?
  • Is chunking too fragmented?
  • Are metadata and ACL fields filterable?
  • Did dense search miss an exact term?
  • Did BM25 find the right thing but reranking bury it?
  • Is the context too long or too short?
  • Are citations bound to claims?
  • Does eval even measure this failure mode?

Once you can answer those questions, you are ready to talk about tool selection.

Production RAG is not one tool. It is an observable, replaceable, evaluable engineering chain.