This note covers end-to-end cost modeling for production RAG workloads on AWS Bedrock as of June 2026. It covers embedding model pricing, vector store selection, ingestion pipeline mechanics, chunking strategy cost impact, CUR attribution, and total pipeline TCO. The June 16, 2026 S3 Vectors query pricing reduction (up to 80% for large indexes) reshapes the vector store decision significantly.
Titan Embeddings v2
Amazon Titan Text Embeddings V2 (amazon.titan-embed-text-v2:0) is the default model for Bedrock Knowledge Bases and the lowest-cost option for English workloads.
| Dimension | Price (per 1M input tokens) | Notes |
|---|---|---|
| 256 | $0.020 | 4× storage reduction vs 1024 |
| 512 | $0.020 | Balanced cost/recall |
| 1024 | $0.020 | Default; best recall |
Key facts:
- Flat per-token price regardless of output dimension ($0.020/1M input tokens = $0.00002/1K tokens)
- 8,192-token context window
- No output token charge (embedding models only bill input)
- English-first; multilingual quality degrades past 50-token chunks in non-Latin scripts
- No batch discount via on-demand API; batch inference (async) uses standard rates
Cohere Embed v3 / v4
Cohere Embed v3 (English/multilingual, 1024-dim) is available on Bedrock at $0.10/1M tokens — 5× more expensive than Titan v2 for English text.
Cohere Embed v4 (cohere.embed-v4:0) launched on Bedrock in 2026 and is now the primary Cohere option:
| Model | Modality | Dimensions | Price (1M tokens) |
|---|---|---|---|
| Embed v3 | Text only | 1024 | $0.10 |
| Embed v4 | Text | 1536 | $0.12 |
| Embed v4 | Image | 1536 | $0.47/1M images |
When Cohere wins over Titan:
- Multilingual corpora with non-Latin scripts (Titan v2 degrades; Cohere v3/v4 maintains quality)
- Multimodal pipelines where image embeddings are required (Embed v4 only)
- Workloads requiring 1536-dim vectors for fine-grained recall at very large corpora
When Titan wins:
- English-only enterprise document corpora
- Cost-sensitivity: Titan is 5× cheaper than Cohere v3 and 6× cheaper than Cohere v4
- Knowledge Base default integration (no additional configuration)
Batch vs Real-Time Embedding
Bedrock does not offer a separate discounted batch embedding tier for Titan or Cohere via the standard on-demand API. Batch inference (InvokeModelWithResponseStream) uses the same token rate. True batch throughput optimization comes from:
- Concurrent invocations: Use Bedrock’s provisioned throughput (PT) for sustained high-volume ingestion — locks in capacity at a flat hourly rate, useful when ingesting >500GB in a single window
- Async ingestion jobs: Bedrock Knowledge Bases’ StartIngestionJob API handles batching internally; you pay per embedding call but don’t manage concurrency
- Self-managed Lambda + SQS fan-out: For custom pipelines, fan out embedding calls across Lambda functions with SQS batching; costs are identical per token but throughput scales
2. S3 Vectors: General Availability Pricing (June 16, 2026)
S3 Vectors GA launched December 2025 and expanded to 31 AWS Regions by March 2026. On June 16, 2026, AWS cut query processing charges for large indexes (>10M vectors) by up to 80%, applied automatically with no application changes required.
Pricing Components (us-east-1, June 2026)
| Component | Price | Trigger |
|---|---|---|
| PUT / upload | $0.20–0.22 / GB logical | Per ingest |
| Storage (TimedStorage) | $0.06–0.07 / GB-month | Monthly |
| Query — data processed (≤100K vectors) | $0.004 / TB processed | Per query |
| Query — data processed (100K–10M vectors) | $0.002 / TB | Per query (tiered) |
| Query — data processed (>10M vectors) | ~$0.0008 / TB (post-June 16 cut) | Per query |
| Data returned | Free below 500 KB/query | Per query |
Vector size math: A 1024-dim vector = 4 bytes × 1024 = 4.096 KB logical data, plus key and metadata overhead (~1 KB typical), so ~5.1 KB effective size per vector.
Worked example — 1M vector index, 10K queries/day:
- Storage: 1M × 5.1 KB = 5.1 GB × $0.067 = $0.34/month
- Query data processed: 1M vectors × 5.1 KB = 5.1 GB = 0.0051 TB; 10K queries × 0.0051 TB × $0.002/TB = $0.10/day = $3.10/month
- PUT (one-time): 5.1 GB × $0.21 = $1.07 one-time
- Total monthly (steady state): ~$3.44/month
Worked example — 50M vector index, 100K queries/day:
- Storage: 50M × 5.1 KB = 255 GB × $0.067 = $17.09/month
- Query (post-June 16, >10M tier): 255 GB = 0.255 TB; 100K queries × 0.255 TB × $0.0008 = $20.40/day = $612/month (large-scale query volume dominates)
- Total monthly: ~$629/month
S3 Vectors Limits (GA)
- Max vectors per index: 10B (40× increase from preview)
- Max indexes per bucket: 10,000
- Max metadata per vector: 4 KB
- Supported distance metrics: cosine, euclidean, dot-product
- No HNSW parameter tuning exposed; AWS manages index structure
What S3 Vectors Does Not Support (June 2026)
- No BM25 / keyword search (pure vector only)
- No real-time metadata filtering during approximate nearest neighbor (ANN) search — filtering happens post-retrieval
- No direct integration with Bedrock Knowledge Bases as a vector store (as of June 2026; re:Post thread confirms integration is on the roadmap, not yet GA)
3. Vector Store Cost Comparison at Scale
Three primary options for Bedrock RAG workloads: S3 Vectors, OpenSearch Serverless (AOSS), and pgvector on RDS PostgreSQL.
Cost Comparison Table
| Workload Scale | S3 Vectors | AOSS (NextGen, scale-to-zero) | pgvector on RDS |
|---|---|---|---|
| 100K vectors, 1K queries/day | ~$0.15/mo | ~$0 (scale-to-zero idle) + per-query compute | ~$50–80/mo (db.t4g.medium) |
| 1M vectors, 10K queries/day | ~$3.44/mo | ~$175/mo (1 OCU) | ~$100–150/mo (db.r7g.large) |
| 10M vectors, 100K queries/day | ~$45/mo | ~$350/mo (2 OCU, HA) | ~$300–500/mo (db.r7g.4xlarge) |
| 50M vectors, 100K queries/day | ~$629/mo | ~$700+/mo (3-4 OCU) | ~$600–900/mo (db.r7g.8xlarge) |
Notes on each:
S3 Vectors:
- Near-zero idle cost; cost scales with query × index size
- Best for: bursty workloads, development, cost-sensitive deployments, very large indexes with moderate query rates
- Worst for: high-frequency queries against large indexes (query cost compounds)
- No HA configuration needed (S3 durability: 11 nines)
AOSS NextGen (scale-to-zero, 2026):
- Previous criticism (“$700/month minimum regardless of use”) resolved with NextGen scale-to-zero launch
- OCU pricing: ~$0.24/OCU-hour (us-east-1); each OCU = 6 GB RAM + 120 GiB ephemeral storage
- Production HA requires 2 OCUs minimum (~$350/month); disable redundancy for dev/test (~$175/month)
- Supports hybrid search (BM25 + vector) natively — significant capability advantage over S3 Vectors
- Best for: always-on production workloads with consistent query volume, hybrid search requirements, OpenSearch feature set (filters, facets, aggregations)
pgvector on RDS PostgreSQL:
- No vector-specific surcharge; cost is the RDS instance required to hold the HNSW index in memory
- HNSW index memory rule of thumb: ~1.3–1.5× raw vector data size; 1M × 1024-dim vectors ≈ 6.2 GB HNSW index
- Cost cliff at ~5–10M vectors when you must move to memory-optimized instances (db.r7g class)
- Advantage: existing PostgreSQL workloads can add vectors without a new service; familiar ops model
- Disadvantage: CPU-bound vector search doesn’t parallelize well past ~8 vCPUs on standard RDS; Aurora pgvector with dedicated vector index on io2 improves this
Crossover Analysis
S3 Vectors beats AOSS cost below approximately 20M vectors at steady-state query volumes under 50K/day. Above that, AOSS NextGen with shared OCUs across collections becomes competitive. For very large corpora (100M+ vectors) with complex filtering, OpenSearch with GPU-accelerated vector search (2026 GA feature) substantially reduces per-query latency and cost.
4. Knowledge Base Ingestion Pipeline Cost
The Bedrock Knowledge Bases managed ingestion pipeline (StartIngestionJob) covers: S3 read → document parsing → chunking → embedding → vector store write.
Component Cost Breakdown (per GB of source documents)
Assumptions: average document = PDF, ~300 words/page, ~400 tokens/page, ~50 pages; 1 GB ≈ ~66 documents ≈ 3,300 pages ≈ 1.32M tokens (pre-chunking).
| Pipeline Component | Service | Unit | Rate | Cost per GB source |
|---|---|---|---|---|
| S3 GET (source bucket) | S3 | per 1K GET | $0.0004 | ~$0.03 |
| Parsing (Bedrock Data Automation, standard) | BDA | per page | $0.010 | $33.00 |
| Parsing (default text extraction, no BDA) | Free | — | $0.000 | $0.00 |
| Chunking (managed, built-in) | Free | — | $0.000 | $0.00 |
| Embedding (Titan v2, 1024-dim, ~512-token chunks) | Bedrock | per 1M tokens | $0.020 | ~$0.03 |
| Vector store write — S3 Vectors PUT | S3 | per GB | $0.21 | ~$0.05 |
| Vector store write — AOSS | AOSS | OCU-hour | $0.24 | ~$0.10 (amortized) |
Key insight on parsing cost: Bedrock Data Automation (BDA) standard output at $0.010/page is the dominant cost when enabled. A 1,000-page document costs $10.00 to parse regardless of its size in bytes. For a 1 GB corpus of scanned PDFs requiring OCR/layout extraction, BDA parsing will cost $33, while the embedding step costs only $0.03. For plain-text or pre-extracted documents, skip BDA entirely — the default text extraction is free.
Embedding cost is not the bottleneck. A 1 GB text corpus ≈ 1.32M tokens → $0.026 in Titan v2 embeddings. Even at Cohere Embed v3 rates ($0.10/1M), the same corpus costs $0.13. The parsing layer (BDA) is 100–1,000× the embedding cost for document-heavy workloads.
Total Ingestion Cost per GB (No BDA parser)
| Corpus Type | Titan v2 (1024-dim) | Cohere v3 (1024-dim) |
|---|---|---|
| Plain text / pre-extracted | ~$0.06 | ~$0.20 |
| With S3 Vectors write | ~$0.11 | ~$0.25 |
| With AOSS write (amortized) | ~$0.16 | ~$0.30 |
Total Ingestion Cost per GB (With BDA Standard Parser)
| Corpus Type | Titan v2 | Cohere v3 |
|---|---|---|
| Scanned PDFs, 300-word pages | ~$33.06 | ~$33.20 |
| Dense technical docs, 600-word pages | ~$16.53 | ~$16.67 |
5. Re-Ingestion Cost Modeling
Not all document updates require full re-embedding. The cost decision depends on change scope and chunking strategy.
Re-Ingestion Triggers and Scope
| Change Type | Recommended Action | Re-embedding Scope |
|---|---|---|
| New document added | Full document ingest | 100% of new doc chunks |
| Entire document replaced | Delete old vectors + full re-embed | 100% of doc chunks |
| Single section updated (fixed-size chunking) | Identify affected chunks by byte offset | 1–5 chunks typically |
| Single section updated (semantic chunking) | Section boundaries shift; re-embed adjacent chunks | 3–10 chunks typically |
| Metadata-only update (title, date, author) | Vector store metadata update; no re-embedding | 0% |
| Structural reformat (same content) | Skip re-embed if content hash unchanged | 0% |
Content-Hashing Strategy to Avoid Redundant Re-Embedding
Store SHA-256 hash of each chunk’s text alongside the vector. On update, hash new chunks before embedding; skip API call if hash matches. For a corpus where 10% of documents update monthly and 20% of chunks per document change:
Monthly re-embedding cost = corpus_tokens × 0.10 (docs updated) × 0.20 (chunks changed) × embedding_rate
Example: 500M token corpus, Titan v2
= 500M × 0.10 × 0.20 × $0.020/1M
= 10M tokens × $0.020/1M
= $0.20/month re-embedding cost
Full re-ingestion of a 500M-token corpus (e.g., quarterly refresh): $10.00 at Titan v2 rates.
Incremental Sync Architecture
Bedrock Knowledge Bases supports incremental sync via the INCREMENTAL_SYNC ingestion mode (added 2025). It reads S3 object last-modified timestamps, re-processes only changed objects, and handles deletions. This eliminates the need to custom-build change detection for most workloads. Cost impact: typically 80–95% reduction in monthly embedding spend vs. full re-ingestion.
6. Embedding Dimensionality: Cost vs Recall Tradeoffs
Titan v2 supports three output dimensions: 256, 512, and 1024. The per-token price is identical ($0.020/1M) regardless of dimension, but the downstream costs differ.
Storage and Query Cost Impact
| Dimension | Vector size (bytes) | Storage cost per 1M vectors | Query data processed per 1M vectors |
|---|---|---|---|
| 256 | 1,024 B (1 KB) | 1 GB → $0.067/month | 1 GB / query |
| 512 | 2,048 B (2 KB) | 2 GB → $0.134/month | 2 GB / query |
| 1024 | 4,096 B (4 KB) | 4 GB → $0.268/month | 4 GB / query |
Dimension choice has zero impact on embedding API cost but 4× impact on vector store storage and query costs.
Recall Quality Benchmarks
Published benchmarks for Titan v2 on MTEB (as of 2026):
| Dimension | NDCG@10 (avg) | vs 1024 recall loss |
|---|---|---|
| 1024 | ~0.545 | Baseline |
| 512 | ~0.538 | -1.3% |
| 256 | ~0.521 | -4.4% |
These are average figures. Domain-specific corpora (legal, clinical, code) show larger recall degradation at 256 dimensions. English enterprise document corpora (policies, contracts, procedures) typically fall within 2% of baseline at 512 dimensions.
Decision Framework
- Use 256 dimensions when: storage cost is a primary constraint, corpus is >100M vectors, recall degradation is acceptable (general FAQ / tier-1 support)
- Use 512 dimensions when: balanced cost/quality for English enterprise corpora; 2× cheaper queries than 1024 with <2% recall loss
- Use 1024 dimensions when: highest recall required; multilingual or technical corpora; cost is not the binding constraint
At 1M vectors, the monthly query cost difference between 256-dim and 1024-dim is ~$0.20/day at 10K queries/day — a real but not decisive factor for most production workloads.
7. CUR Line Items for Bedrock Embedding vs Inference
CUR 2.0 Structure for Bedrock
Bedrock costs appear in Cost and Usage Reports (CUR 2.0) under the AmazonBedrock service. The key columns for separating embedding from inference:
| CUR Column | Embedding Value | Inference (LLM) Value |
|---|---|---|
line_item_operation |
InvokeModel |
InvokeModel |
line_item_usage_type |
USE1-InputTokens:amazon.titan-embed-text-v2:0 |
USE1-InputTokens:anthropic.claude-3-5-sonnet-20241022-v2:0 |
product_model_name |
amazon.titan-embed-text-v2:0 |
model ID |
line_item_resource_id |
bedrock:amazon.titan-embed-text-v2:0 |
model ARN |
CUR 2.0 aggregates by usage type per hour, not per request. You cannot get per-call cost without application-side logging, but you can separate embedding from generation spend by filtering on product_model_name.
Athena Query: Separate Embedding vs LLM Generation Cost
SELECT
line_item_usage_start_date AS usage_date,
product_model_name,
CASE
WHEN product_model_name LIKE '%embed%' THEN 'embedding'
WHEN product_model_name LIKE '%rerank%' THEN 'reranking'
ELSE 'generation'
END AS usage_category,
SUM(line_item_usage_amount) AS total_tokens,
SUM(line_item_unblended_cost) AS total_cost_usd
FROM cur_database.cur_table
WHERE
line_item_product_code = 'AmazonBedrock'
AND line_item_usage_start_date >= DATE('2026-06-01')
AND line_item_line_item_type = 'Usage'
GROUP BY 1, 2, 3
ORDER BY 1, 5 DESC;
Application Inference Profiles for Tag-Based Attribution
For workloads where embedding calls come from multiple services (Knowledge Bases ingestion, custom Lambda embedding, Bedrock Agents), use Application Inference Profiles (AIP) to attach cost allocation tags:
# Create AIP with cost tag
bedrock.create_inference_profile(
inferenceProfileName="rag-embedding-prod",
modelSource={"copyFrom": "arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v2:0"},
tags=[{"key": "cost-category", "value": "rag-embedding"}]
)
The cost-category tag propagates to CUR and Cost Explorer, enabling clean separation between RAG ingestion embedding, RAG query embedding, and LLM generation costs.
IAM Principal Attribution (April 2026)
As of April 2026, Bedrock supports IAM principal-based cost allocation. The line_item_iam_principal column in CUR 2.0 contains the full ARN of the role or user making each Bedrock call. For teams separating Knowledge Bases ingestion (runs as a Bedrock service role) from application-layer embedding calls (runs as an application role), this enables attribution without AIP setup.
8. Chunking Strategy Impact on Cost
Chunking strategy affects embedding cost primarily through chunk count — more, smaller chunks mean more embedding API calls for the same source document.
Chunk Count by Strategy (1,000-token source document)
| Strategy | Typical chunks | Overhead factor | Embedding tokens billed |
|---|---|---|---|
| Fixed-size, 512 tokens, 10% overlap | 2.2 | 1.1× | 1,100 tokens |
| Fixed-size, 256 tokens, 10% overlap | 4.5 | 1.1× | 1,100 tokens |
| Recursive character split, 512 tokens | 2.2 | 1.05× | 1,050 tokens |
| Semantic chunking (sentence-based) | 3–8 | 1.5–4× | 1,500–4,000 tokens |
| Hierarchical / parent-child (2 passes) | 4.4 | 2.2× | 2,200 tokens |
Semantic chunking’s hidden cost: Semantic chunking computes cosine similarity between adjacent sentence embeddings to place boundaries. This requires embedding every sentence independently during preprocessing, then discarding most embeddings (only the final chunks are stored). For a 1M-token corpus:
- Fixed-size: ~1.05M tokens billed to embed
- Semantic: ~2M–4M tokens billed (sentence-level embeddings + chunk embeddings)
- Cost delta at Titan v2 rates: $0.021 vs $0.040–$0.080 per 1M source tokens
Semantic Chunking Cost Justification
The 2–4× embedding cost premium for semantic chunking is justified when:
- Domain involves dense technical, legal, or clinical text where sentence boundaries rarely align with topic boundaries
- Retrieval recall improvements at k=5 exceed ~5% vs fixed-size (measured on your eval set)
- Source documents have irregular structure (mixed tables, figures, prose)
Published benchmarks show fixed-size chunking at 512 tokens outperforms semantic chunking for generic document retrieval (69% vs 54% accuracy). For structured enterprise content (contracts, policies), semantic chunking recovers the gap.
Chunk Size and Vector Store Query Cost
Chunk count also affects vector store query processing. S3 Vectors charges by data processed per query (proportional to index size in bytes). Smaller chunks = more vectors = more data scanned per query:
| Chunk size | Chunks per 100K-token corpus | S3 Vectors query cost (10K q/day) |
|---|---|---|
| 256 tokens | ~400 chunks (256-dim vectors) | ~$0.003/day |
| 512 tokens | ~200 chunks (512-dim vectors) | ~$0.003/day |
| 1024 tokens | ~100 chunks (1024-dim vectors) | ~$0.003/day |
At small corpus size, chunk count has negligible impact on S3 Vectors query cost. At 100M vector scale, the dimension × chunk count interaction matters: a 256-dim, 256-token chunking strategy yields 4× more vectors than a 1024-dim, 1024-token strategy for the same corpus, with 4× higher query data processed cost.
9. Hybrid Search Cost: Vector + BM25
Hybrid search combines dense vector search with keyword (BM25) retrieval, then fuses the ranked lists (typically via Reciprocal Rank Fusion or normalized score fusion).
Infrastructure Cost Delta
| Store | Pure Vector | Hybrid (Vector + BM25) | Marginal Cost |
|---|---|---|---|
| AOSS NextGen | 1 OCU | Same OCU (BM25 index co-located) | $0 marginal |
| pgvector + pg_trgm | RDS instance cost | +5–15% CPU overhead | Minor |
| S3 Vectors | Not supported natively | Requires separate BM25 store | Added cost of secondary store |
S3 Vectors + Hybrid Search Architecture
S3 Vectors does not support keyword search. To achieve hybrid retrieval with S3 Vectors:
Option A — OpenSearch for BM25, S3 Vectors for dense search:
- Run both retrievers in parallel; fuse results client-side
- Cost: OpenSearch OCU cost ($175–350/month) + S3 Vectors query cost
- This eliminates S3 Vectors’ cost advantage for hybrid use cases
Option B — Bedrock Knowledge Bases hybrid retrieval:
- Bedrock KBs natively supports hybrid search when backed by AOSS
- The
hybridSearchConfigurationparameter in RetrieveAndGenerate handles the fusion automatically - Not available with S3 Vectors-backed knowledge bases
Option C — DynamoDB for BM25 keyword index:
- Store inverted index in DynamoDB; query in parallel with S3 Vectors
- DynamoDB read cost: ~$0.25/1M read units; BM25 keyword scan at k=100 ≈ ~10 read units per query ≈ $0.0000025/query
- Effective marginal hybrid cost: <$0.01/day at 10K queries/day
Query Latency Overhead
Running vector and BM25 in parallel adds zero latency vs the slower of the two (parallel fan-out). Fusion (RRF or score normalization) adds <5ms client-side. The practical overhead is the additional network round-trip if BM25 is in a separate service.
10. Reranker Cost: Bedrock Rerank API
Pricing
| Model | Price | Query definition |
|---|---|---|
| Amazon Rerank 1.0 | $1.00 / 1,000 queries | 1 query = up to 100 document chunks |
| Cohere Rerank 3.5 (on Bedrock) | $2.00 / 1,000 queries | Same definition |
If a request contains more than 100 document chunks, it counts as multiple queries (ceiling division):
- 100 chunks → 1 query ($0.001 or $0.002)
- 101–200 chunks → 2 queries ($0.002 or $0.004)
- 350 chunks → 4 queries ($0.004 or $0.008)
When Reranking Saves Net Cost
The reranker’s cost-saving case rests on reducing the token count passed to the LLM for generation. The math:
Savings from reranking = (k_without_rerank - k_with_rerank) × avg_chunk_tokens × LLM_input_rate
Net savings = Savings from reranking - Reranker cost
Break-even condition:
(k_without - k_with) × avg_chunk_tokens × LLM_rate > Reranker_rate_per_query
Worked example — Claude Sonnet 3.7 at $3.00/1M input tokens:
Without reranker: k=10 retrieval, 10 chunks × 512 tokens = 5,120 tokens per query With reranker: retrieve k=50, rerank to k=3, 3 × 512 = 1,536 tokens per query
LLM input saved per query = (5,120 - 1,536) tokens = 3,584 tokens
LLM cost saved = 3,584 / 1M × $3.00 = $0.0000108 / query
Reranker cost (Amazon Rerank 1.0, 50 chunks = 1 query) = $0.001 / query
Net cost of reranking = $0.001 - $0.0000108 = +$0.000989 / query (LOSS)
At Claude Sonnet rates, the LLM savings from reducing context by 3,584 tokens ($0.0000108) are dwarfed by the $0.001 reranker cost. Reranking adds net cost at standard retrieval scales with cheaper LLMs.
When reranking breaks even or saves money:
-
Very long context windows in use: If k=10 retrieval passes 20,000 tokens per query (long chunks, many docs) to a premium LLM:
LLM saved = (20,000 - 2,000) × $3.00/1M = $0.054 saved vs $0.001 reranker = net $0.053 savings -
Expensive LLMs (Claude Opus, GPT-4 class at $15/1M+): LLM cost dominates; reranker pays for itself if it reduces context by >70 tokens
-
Quality-driven cost reduction: Reranking reduces hallucination-correction loops in agentic pipelines — if a bad RAG retrieval forces a retry (full query + generation), the avoidance cost exceeds the reranker cost easily
-
High-k initial retrieval (k=50-100) to handle sparse corpora: Reranker converts expensive k=100 LLM context to k=5 — breakeven at ~$0.10/1M LLM input
Practical Reranker Decision Rule
| Scenario | Recommendation |
|---|---|
| LLM input cost < $3/1M, k ≤ 10 | Skip reranker; use smaller k |
| LLM input cost > $10/1M, k ≥ 10 | Reranker likely saves net cost |
| Agentic pipeline with retry risk | Reranker pays for itself in retry avoidance |
| BM25 + vector hybrid, need final ranking | Reranker adds quality; cost is marginal relative to hybrid infra |
| Bulk document processing (not interactive) | Skip reranker; latency not a constraint, use larger k |
11. Total RAG Pipeline TCO: Full Model
This section builds a complete TCO model for a production RAG workload: 10M-token corpus (English enterprise docs), 50K queries/day, Titan v2 embeddings, S3 Vectors storage, Bedrock Knowledge Bases for ingestion, Claude Sonnet 3.7 for generation.
Assumptions
| Parameter | Value |
|---|---|
| Corpus size | 10M tokens source text |
| Average chunk size | 512 tokens |
| Overlap | 10% (effective 460 tokens/chunk) |
| Total chunks | ~21,750 chunks |
| Embedding dimensions | 512 |
| Query volume | 50,000 queries/day |
| Chunks retrieved per query | k=5 |
| Tokens per chunk | 512 |
| Reranker | No (see §10) |
| LLM | Claude Sonnet 3.7 ($3/1M input, $15/1M output) |
| LLM input per query | k=5 × 512 tokens + 200-token system prompt = 2,760 tokens |
| LLM output per query | 300 tokens avg |
| Monthly re-ingestion | 10% corpus monthly (incremental sync) |
Monthly Cost Breakdown
One-time ingestion cost (amortized over 12 months):
| Item | Calculation | Cost |
|---|---|---|
| Embedding (Titan v2) | 10M tokens × $0.020/1M | $0.20 |
| S3 Vectors PUT | 21,750 chunks × 2 KB (512-dim) = 43.5 MB × $0.21/GB | $0.009 |
| BDA parsing (optional, plain text = $0) | $0.00 (skipped for pre-extracted text) | $0.00 |
| Total one-time | $0.21 | |
| Amortized monthly (12 months) | $0.02 |
Monthly re-ingestion cost (10% corpus, incremental):
| Item | Calculation | Cost/month |
|---|---|---|
| Re-embedding 1M tokens | 1M × $0.020/1M | $0.02 |
| S3 Vectors delta PUT | ~2,175 chunks × 2 KB = 4.35 MB | $0.001 |
| Re-ingestion total | $0.02 |
Monthly storage cost:
| Item | Calculation | Cost/month |
|---|---|---|
| S3 Vectors (512-dim, 21,750 vectors) | 21,750 × 2 KB = 43.5 MB → 0.0435 GB × $0.067 | $0.003 |
Monthly query cost:
| Item | Calculation | Cost/month |
|---|---|---|
| Query embedding (Titan v2) | 50K queries/day × 30 × 30 tokens/query = 45M tokens × $0.020/1M | $0.90 |
| S3 Vectors query (21,750 vectors × 2 KB = 43.5 MB = 0.0000435 TB/query) | 50K × 30 × 0.0000435 TB × $0.002/TB | $0.13 |
| LLM generation — input | 50K × 30 × 2,760 tokens = 4.14B tokens × $3/1M | $12,420 |
| LLM generation — output | 50K × 30 × 300 tokens = 450M tokens × $15/1M | $6,750 |
| Query total | $19,171/month |
TCO Summary (50K queries/day production workload)
| Category | Monthly Cost | % of Total |
|---|---|---|
| LLM generation (input + output) | $19,170 | 99.5% |
| Query embedding | $0.90 | 0.005% |
| Vector store (query + storage) | $0.13 | <0.001% |
| Re-ingestion (embedding) | $0.02 | <0.001% |
| Total | $19,171 | 100% |
The dominant insight: LLM generation cost is 99.5%+ of total RAG pipeline TCO. Embedding costs, vector store costs, and ingestion costs are noise relative to generation. Optimization effort should be directed at:
- Reducing generation tokens — smaller k, tighter chunks, query compression
- LLM model selection — Haiku vs Sonnet vs Opus changes monthly bill by 10× at identical volume
- Caching repeated queries — Bedrock prompt caching at 90% discount for cache hits directly on the dominant cost line
The 80% S3 Vectors query pricing reduction, while meaningful in isolation, moves the needle by <0.001% of TCO for standard interactive RAG.
TCO Sensitivity Table (monthly, same query volume)
| LLM Model | Input rate | Output rate | Monthly generation cost |
|---|---|---|---|
| Claude Haiku 3.5 | $0.80/1M | $4/1M | $3,330 |
| Claude Sonnet 3.7 | $3/1M | $15/1M | $19,170 |
| Claude Sonnet 4.5 (est.) | $3/1M | $15/1M | $19,170 |
| Claude Opus 4 | $15/1M | $75/1M | $95,850 |
Prompt Caching Impact on TCO
If 40% of queries share a common system prompt + context (typical for enterprise FAQ RAG), Bedrock prompt caching reduces input token cost on cache hits by 90%:
Uncached queries (60%): 30K/day × 2,760 tokens × $3/1M = $7,452/month
Cached queries (40%): 20K/day × 200 tokens (cache miss portion) × $3/1M = $360/month
Cache write (amortized): negligible for static system prompts
Total with caching: $7,812/month vs $12,420 uncached = 37% savings
Prompt caching delivers far more TCO impact than any vector store optimization.
Key Findings Summary
-
S3 Vectors June 2026 price cut (80% reduction for >10M vector indexes) meaningfully reduces query costs at scale but does not change the fundamental TCO picture — LLM generation dominates at 99.5%+ of total spend.
-
Titan v2 is 5× cheaper than Cohere Embed v3 for English text; choose Cohere only for multilingual workloads or when multimodal embeddings (Embed v4) are required.
-
BDA parsing is the ingestion cost driver, not embedding. At $0.010/page, a 1,000-page PDF corpus costs $10 to parse and $0.03 to embed. Skip BDA for pre-extracted plain text.
-
512-dimension vectors hit 98.7% of 1024-dim recall at half the vector storage and query cost; the correct default for English enterprise RAG.
-
Reranking adds net cost at standard LLM rates (Claude Sonnet and below) when k ≤ 10. Reranking saves money only with expensive LLMs (>$10/1M input) or large initial retrieval sets (k ≥ 50).
-
Semantic chunking costs 2–4× more to embed than fixed-size chunking due to sentence-level similarity computation during boundary detection. The quality premium is only justified for structured technical/legal text.
-
CUR attribution: Use Application Inference Profiles with cost allocation tags to cleanly separate embedding, reranking, and generation in Cost Explorer.
product_model_namein CUR 2.0 enables Athena-level separation without AIP setup. -
Prompt caching is the highest-leverage TCO lever: 37%+ reduction in generation cost when 40% of queries share common context — dwarfs any vector store or embedding optimization.
Sources
- Amazon Bedrock Pricing — AWS
- S3 Vectors Query Cost Reduction June 16, 2026 — DevelopersIO
- AWS S3 Vectors 80% Cost Reduction — VentureBeat
- S3 Vectors Pricing Deep Dive vs Pinecone
- Benchmarking S3 Vectors vs OpenSearch Serverless at Scale — AWS Builder Center
- Vector Storage Costs: S3, OpenSearch, pgvector, Pinecone
- Bedrock Rerank Pricing — AWS Docs
- Understanding Bedrock CUR Data — AWS Docs
- Building Cost-Effective RAG with Bedrock Knowledge Bases and S3 Vectors — AWS Blog
- Semantic Chunking Worth the Cost? — Vectara
- Hybrid Search BM25 + Vector RAG 2026 — AppScale Blog
- Bedrock Data Automation Cheat Sheet — Tutorials Dojo
- IAM Principal Cost Allocation for Bedrock — AWS
- OpenSearch Serverless Pricing — AWS
- S3 Pricing (Vectors tab) — AWS