TopSyde
Get your free site auditStart Risk-Free

Connect Claude to Your Business Data: A RAG Guide

How to give Claude access to your docs, FAQs, and support tickets using RAG. Chunking, embeddings, vector stores, and a minimal working architecture.

Colton Joseph

Colton Joseph

Founder & Lead Developer

··13 min read

Last updated: July 24, 2026

Diagram showing business documents flowing through a RAG pipeline into Claude AI for accurate responses

Retrieval-augmented generation (RAG) lets Claude answer questions about your specific business — your docs, product catalog, support history — by fetching relevant content at query time and including it in the prompt. Claude never "learns" your data; it reads it fresh every time, which means your information stays current without retraining anything.

What Is RAG and Why Does Claude Need It?

Claude is a powerful reasoner, but its training data has a cutoff and it has no knowledge of your internal documents, your pricing, your support ticket history, or your product specs. RAG bridges that gap by retrieving relevant text snippets from your data sources and inserting them into the prompt before Claude generates a response. The model reasons over real content rather than hallucinating answers it doesn't know.

This is meaningfully different from fine-tuning. Fine-tuning bakes new behavior into model weights — it's expensive, slow, and doesn't help with factual recall as much as people expect. RAG keeps Claude's weights untouched and instead gives it fresh, scoped context at runtime. For most business use cases (support bots, internal knowledge assistants, product catalog search), RAG is the right tool.

According to Gartner, by 2026 more than 80% of enterprises using generative AI will have implemented some form of retrieval augmentation to ground model responses in proprietary data (Gartner, 2025). That number tracks with what we're seeing in client projects at TopSyde — nearly every Claude integration we build now has a retrieval layer.

When Should You Skip RAG Entirely?

RAG adds complexity. Before you build it, ask whether you actually need it.

Claude's context window (200K tokens for claude-3-5-sonnet and claude-opus-4) is enormous. If your entire knowledge base — every FAQ, every policy doc, every product description — fits comfortably in a single prompt, the simplest architecture is often the best one: just stuff it all in. We call this "context stuffing," and it's underrated.

Context stuffing is the right call when:

  • Your corpus is under ~100K tokens (roughly 75,000 words)
  • Your content changes frequently and you don't want to re-embed on every update
  • You need Claude to reason across multiple documents simultaneously (retrieval returns fragments; the full context lets Claude synthesize)
  • Latency matters less than simplicity and you can afford the token cost

RAG is the right call when:

  • Your corpus is too large to fit in a single prompt (large product catalogs, years of support tickets, legal document libraries)
  • You need precision — only surfacing the most relevant 2-3 paragraphs, not dumping 50 pages on Claude
  • You want to filter by metadata (e.g., only retrieve docs tagged for a specific product line or customer tier)
  • Token cost at scale is a constraint — passing 150K tokens every request is expensive

If you're building a customer-facing chatbot and want to understand the UI and API layer first, the complete guide to building a website chatbot with the Claude API covers that foundation. This post assumes you're past that and focused on the retrieval architecture itself.

How Chunking Works (and Why It Matters More Than You Think)

Chunking is the process of splitting your source documents into smaller pieces before embedding them. The chunk is what gets stored in your vector database and what gets retrieved at query time. Get this wrong, and your retrieval quality suffers no matter how good your embedding model is.

The core problem: Embeddings compress semantic meaning into a fixed-size vector. A 5,000-word document produces one vector that's an average of all ideas in that document. When a user asks a narrow question, that averaged vector may not match well. Smaller, focused chunks produce vectors that represent discrete concepts — and retrieve more precisely.

Chunking Strategies

StrategyHow It WorksBest For
Fixed-size (character/token)Split every N tokens with overlapSimple corpora, quick setup
Sentence-levelSplit on sentence boundariesFAQ answers, short-form content
Semantic chunkingUse an LLM or heuristics to split at topic changesLong-form docs, technical manuals
Document-structure-awareSplit on headings (H2, H3)Markdown docs, knowledge bases
Recursive character splitterTry large splits, recurse if too bigGeneral-purpose default

For most small business RAG systems, the recursive character splitter with a chunk size of 512-1024 tokens and a 10-20% overlap is a solid default. The overlap ensures that information at chunk boundaries doesn't get lost between two adjacent chunks.

Practical rule: If your source content is structured (docs with headings, FAQ lists, product pages), split on structure first, then fall back to token-based splitting for anything that exceeds your max chunk size. We've found this produces noticeably better retrieval results than purely token-based approaches.

Embeddings in Plain Terms

An embedding model converts a piece of text into a list of numbers (a vector) that captures its semantic meaning. Texts with similar meanings end up with vectors that are mathematically close together. At query time, your user's question is embedded using the same model, and the database finds the stored chunks whose vectors are closest to it.

You don't need to understand the math. You need to understand three things:

  1. Use the same model for embedding documents and queries. Mixing models breaks semantic alignment.
  2. Embedding model quality matters less than chunking quality for most use cases. OpenAI's text-embedding-3-small and Cohere's embed-v3 are both excellent and cheap. The choice between them rarely moves retrieval quality as much as fixing poor chunking.
  3. Embedding is a one-time cost per document. Re-embedding only happens when content changes, not at query time.

According to the MTEB (Massive Text Embedding Benchmark) leaderboard maintained by Hugging Face, the performance gap between top-tier embedding models on real-world retrieval tasks is often less than 3-5% — much smaller than the gains from improving chunking and metadata filtering (Hugging Face MTEB, 2025).

Hosted vs DIY Vector Stores

This is the infrastructure decision that determines your operational burden.

OptionExamplesProsCons
Hosted managedPinecone, Weaviate Cloud, ZillizZero ops, fast start, generous free tiersVendor lock-in, data leaves your infra
Postgres extensionSupabase pgvector, NeonFamiliar SQL, same DB as your appNeeds tuning at scale, not a specialist tool
Self-hostedQdrant, Weaviate, MilvusData residency, cost control at scaleYou manage infra, upgrades, backups
In-memory / file-basedFAISS, ChromaDB (local)Great for prototypingNot production-ready for multi-user systems

Our default recommendation for small business RAG: Start with Supabase pgvector if you're already running Postgres, or Pinecone's Starter tier if you want zero database ops. Both get you to a working system in an afternoon. If your corpus is under 100K chunks, neither will hit performance limits.

Move to a dedicated vector database (Qdrant or Weaviate self-hosted) when you're handling millions of vectors, need fine-grained access control at the namespace level, or your data residency requirements rule out SaaS vendors.

A Minimal Working RAG Architecture

Here's the architecture we use for small business implementations. It's intentionally boring — boring is maintainable.

[Data Sources]                [Ingestion Pipeline]           [Query Pipeline]
───────────────              ──────────────────────         ─────────────────────
Notion / Google Docs   →     1. Extract text                User question
Support ticket exports →     2. Clean + normalize      →    → Embed query
Product catalog CSVs   →     3. Chunk (512 tok, 10% overlap) → Vector search (top 5)
WordPress FAQ pages    →     4. Embed (text-embedding-3-small) → Filter by metadata
                             5. Upsert to vector DB          → Build prompt
                                                             → Claude API call
                                                             → Return answer

The prompt structure matters. When you pass retrieved chunks to Claude, be explicit:

System: You are a support assistant for Acme Corp. Answer only based on the 
provided context. If the context doesn't contain the answer, say so — 
do not guess.

Retrieved context:
---
[CHUNK 1]: {chunk_text} (source: {doc_title}, updated: {date})
[CHUNK 2]: {chunk_text} (source: {doc_title}, updated: {date})
[CHUNK 3]: {chunk_text} (source: {doc_title}, updated: {date})
---

User question: {user_question}

Including the source and date in each chunk serves two purposes: Claude can cite its sources in the answer, and it can apply temporal reasoning ("the pricing doc was updated 3 months ago, the support ticket is from 2 years ago — weight the pricing doc higher").

Metadata Filtering Is Underused

Most small RAG systems skip metadata filtering and just do pure semantic search across their entire corpus. This is a mistake. If a customer asks about a pricing question, you don't want chunks from support tickets about a different product line to pollute the results.

Store metadata alongside each chunk — product category, document type, last updated date, customer segment — and filter before or during vector search. Pinecone, pgvector, and Qdrant all support filtered search. It dramatically improves precision.

Handling Document Updates

RAG systems get stale if you don't handle updates. A changed price, a deprecated feature, an outdated policy — if the old chunk is still in your vector DB, Claude will surface wrong information with confidence.

Simple update strategy for small corpora:

  1. Assign a stable doc_id to each source document
  2. On update, delete all chunks with that doc_id from the vector DB, then re-chunk and re-embed the new version
  3. Store the source URL and last_modified timestamp with each chunk so Claude can flag potentially stale context

For WordPress-based knowledge bases specifically, this pairs well with a webhook that fires when a post or page is updated — triggering a re-ingestion of just that document rather than a full corpus rebuild.

Connecting the RAG Layer to Your Claude Integration

If you've already built a chatbot interface, the RAG layer slots in between user input and your Claude API call. It's a function call, not a redesign:

def answer_question(user_query: str) -> str:
    # 1. Embed the query
    query_vector = embed(user_query)
    
    # 2. Retrieve top-k relevant chunks
    chunks = vector_db.search(
        vector=query_vector,
        top_k=5,
        filter={"product": current_product_context}
    )
    
    # 3. Build the prompt
    context = "\n---\n".join([c.text for c in chunks])
    
    # 4. Call Claude
    response = claude.messages.create(
        model="claude-opus-4-5",
        system=SYSTEM_PROMPT,
        messages=[
            {"role": "user", "content": f"Context:\n{context}\n\nQuestion: {user_query}"}
        ]
    )
    
    return response.content[0].text

This is the skeleton. Production additions include streaming responses, conversation history management, citation formatting, and fallback handling when retrieval returns low-confidence results.

For teams looking to go further and connect Claude to live business systems — not just static docs — MCP (Model Context Protocol) opens up a different architecture where Claude can call tools and query live data sources rather than relying on pre-indexed snapshots. RAG and MCP are complementary: RAG for document retrieval, MCP for live system access.

Common RAG Failure Modes

Retrieval returns irrelevant chunks. Usually a chunking problem — chunks are too large and semantically diluted, or too small and lacking context. Also check that you're embedding queries and documents with the same model.

Claude ignores retrieved context and hallucinates anyway. Your system prompt isn't strong enough. Be explicit: "Answer ONLY from the provided context. Do not use prior knowledge." Claude follows instructions well — vague instructions produce vague compliance.

The system is slow. Embedding at query time is fast (<100ms for most models). If you're seeing latency, the bottleneck is usually the vector search on a cold database connection or an over-complex prompt assembly step. Profile before optimizing.

Content becomes stale. No ingestion pipeline for updates. Fix this before you go to production, not after a customer gets wrong pricing.

If you're thinking about where this fits in a broader AI strategy for a small business, the practical guide to AI agents for small businesses covers which use cases are actually worth building versus where off-the-shelf tools are sufficient.

And if you want Claude to have real-time access to your WordPress site — posts, pages, plugin status — rather than a static snapshot, the WordPress MCP server setup guide shows how to wire that up.


Frequently Asked Questions

Do I need to fine-tune Claude to use my business data?

No. Fine-tuning modifies model weights and is designed to change how a model behaves, not to inject factual knowledge. RAG is the correct approach for grounding Claude in your specific business content — it's cheaper, faster to update, and produces more accurate factual recall than fine-tuning for this use case.

How many documents can a RAG system handle?

There's no hard ceiling, but practical limits emerge. A small business knowledge base of a few hundred documents (product docs, FAQs, support history) is well within range for any vector database, including the free tier of hosted services. Systems with millions of documents exist in production — they just require more infrastructure attention around indexing speed, shard management, and query latency.

What's the difference between RAG and just using a big context window?

Context stuffing (putting all your docs in the prompt) is simpler and sometimes better — Claude can reason across the whole corpus simultaneously. RAG retrieves only the most relevant fragments, which reduces token cost and noise at the expense of global context. Use context stuffing when your corpus fits; use RAG when it doesn't, or when retrieval precision matters more than cross-document synthesis.

How do I keep the vector database current when my docs change?

Assign a stable ID to each source document, store it alongside the embedded chunks, and build a pipeline that deletes and re-embeds any document when it's updated. For WordPress sites, a post-update webhook can trigger re-ingestion automatically. Batch re-index your full corpus on a schedule (weekly or monthly) as a safety net for anything the incremental pipeline misses.

Is RAG secure for sensitive business data?

That depends on your infrastructure choices. With a self-hosted vector database (Qdrant, Weaviate on your own servers), data never leaves your environment. With hosted SaaS vector databases, you're subject to the vendor's data handling policies — review their SOC 2 and data processing agreements. Regardless of storage, the Claude API call sends retrieved chunks to Anthropic's servers; if your data is highly sensitive, evaluate

Colton Joseph
Colton Joseph

Founder & Lead Developer

20+ years full-stack development, WordPress, AI tools & agents

Colton is the founder of TopSyde with 20+ years of full-stack development experience spanning WordPress, cloud infrastructure, and AI-powered tooling. He specializes in performance optimization, server architecture, and building AI agents for automated site management.

Related Articles

View all →

Managed WordPress hosting

Stop managing WordPress yourself.

Hosting, updates, security, speed, and backups — handled by a senior developer, not a ticket queue. Flat $89/mo per site with free migration and a 30-day money-back guarantee.

Flat $89/mo per site · Free migration · 30-day money-back guarantee