← Back to home

AWS Managed RAG vs. Custom RAG

What Bedrock Knowledge Bases decide for you by default — and when the convenience of managed RAG is a trade you actually want to make.

ragawsbedrockgenaisystem-designarchitectureagentic-aitech3 min read

Managed RAG pipeline versus a layered custom RAG architecture

Last month I was evaluating AWS Bedrock Knowledge Bases for a document chat use case, and honestly, it's impressive how much it takes off your plate.

Point it at an S3 bucket. It parses your documents, chunks them, generates embeddings, pushes them into a vector store of your choice (OpenSearch, Aurora, Pinecone), and gives you a retrieve-and-generate API on top. No ingestion worker to maintain. No embedding model version mismatch to debug at midnight because someone swapped a model six months ago and nobody updated the re-indexing job.

For a lot of use cases, that's exactly the right trade. Ship fast, worry about scale later.

But I kept coming back to one question while going through the docs: what is it actually deciding for me?

Because once I started listing it out, it was a longer list than I expected:

  • Chunking strategy and overlap
  • Whether a reranker sits between retrieval and generation, and which one
  • Where guardrails actually live — because "input and output filtering" sounds fine until you realize the query itself can carry injected instructions before it ever reaches the model
  • Whether PII gets scrubbed before it lands in your vector index or after, which matters a lot more than it sounds like it should
  • What happens when retrieval comes back empty or low confidence — does it hallucinate a confident-sounding answer, or does it know when to say "I don't have enough information for that"?

None of these are dealbreakers. But they're decisions, and a managed service is making them for you by default — sometimes without saying so out loud.

I spent the last few months building out a document-based AI chat architecture where I wanted control over exactly these things. Three layers: Admin (document upload, processing status), Processing (async ingestion, chunking, embedding), and End User (the actual chat experience). Guardrails aren't just bolted onto the input and output — they sit at every layer, because that's where the actual failure modes show up in production, not in the demo.

I also ended up using LangGraph instead of a simple linear chain for the chat pipeline. The reason was boring but important: real conversations don't follow a straight line. You need to short-circuit when retrieval comes back empty, branch when confidence is low, and route out-of-scope questions somewhere sane instead of forcing the model to answer anyway. A graph handles that naturally. A chain fights you the whole way.

I wrote up the full architecture, including why the vector DB and metadata store are kept separate (a decision that trips people up more than it should).

If you're currently deciding between a managed option like Bedrock Knowledge Bases and rolling your own, this isn't an argument against managed RAG. It's a checklist. Know what you're trading away for the convenience, and make sure it's actually a trade you want to make — not one you didn't know you were making.

References