← All Posts

Building RAG on Panorama: A Vision for Intelligent Search with Astra DB Vector

2026-05-20
RAGVector DBAstra DBAILLMArchitectureRoadmap

Building RAG on Panorama: A Vision for Intelligent Search with Astra DB Vector

After successfully migrating from DSE to Astra DB, we find ourselves sitting on an untapped capability: Astra DB Vector. With vector search already enabled on our cluster, the natural next question as a Principal Engineer is: how do we evolve this data platform into an intelligent platform?

This post outlines my technical vision and roadmap for integrating Retrieval-Augmented Generation into the Panorama platform - the use cases that justify it, the architecture that enables it, and the path to get there.

Why RAG on an Enterprise Data Platform?

Traditional search on data platforms relies on exact keyword matching - querying table names, column names, or pre-defined tags. This breaks down when:

  • Engineers ask questions in natural language: "Which tables feed the daily risk report?"
  • Incident responders need context: "Have we seen this timeout pattern before?"
  • New team members need onboarding: "How does the settlement flow work?"

RAG bridges this gap by combining semantic search (finding relevant context via vector similarity) with LLM generation (synthesising a coherent answer from retrieved documents). As the platform matures, this is the logical next evolution.

RAG Architecture on Panorama

The Key Advantage: Zero New Infrastructure

Unlike many RAG implementations that require standing up a separate vector database (Pinecone, Weaviate, Milvus), this architecture would leverage what we already have:

ComponentAlready In PlaceRole in RAG
Astra DB✅ Post-migrationVector store + metadata store
Databricks/Spark✅ Data processingEmbedding generation pipeline
Splunk✅ ObservabilitySource documents (incidents, logs)
Azure Private Link✅ SecuritySecure LLM API connectivity
This means zero additional infrastructure cost - we'd be activating a capability that already exists in our stack.

Proposed Architecture

RAG Pipeline Flow

Ingestion Pipeline

The proposed Spark-based ingestion pipeline would handle document processing:

Source Documents → Chunking → Embedding → Astra DB Vector Table

Sources to ingest:

  • Platform runbooks and operational documentation (Confluence export)
  • Incident history and post-mortems (Splunk + ServiceNow)
  • Data catalog metadata (table schemas, column descriptions, lineage)
  • Migration documentation and architecture decision records

Chunking strategy:

  • Structured data (schemas, configs): preserve as atomic units
  • Long-form docs: recursive splitting at 512 tokens with 50-token overlap
  • Incident reports: split by section (summary, timeline, root cause, remediation)

Embedding Model

The plan is to use a self-hosted embedding model within our Azure tenant to meet security requirements:

  • Model: text-embedding-3-small (OpenAI via Azure OpenAI Service)
  • Dimensions: 1536
  • Connectivity: Azure Private Link (no public internet exposure)
  • Batch processing: Spark UDF for bulk embedding generation

Astra DB Vector Table Schema

The proposed schema leverages SAI for vector indexing: CREATE TABLE panorama_rag.knowledge_base ( doc_id UUID, chunk_id INT, content TEXT, embedding VECTOR, source_type TEXT, -- 'runbook', 'incident', 'schema', 'adr' source_ref TEXT, -- original document URL/ID updated_at TIMESTAMP, metadata MAP, PRIMARY KEY (doc_id, chunk_id) );

CREATE CUSTOM INDEX ON panorama_rag.knowledge_base(embedding) USING 'StorageAttachedIndex';


The Storage Attached Index (SAI) on the vector column would enable ANN (Approximate Nearest Neighbour) search directly within Astra DB - no external index required.

Retrieval & Generation

RAG Query Flow

python

Simplified retrieval flow

query_embedding = embed(user_question)

Vector search in Astra DB

results = session.execute(""" SELECT content, source_type, source_ref, similarity_cosine(embedding, ?) AS score FROM panorama_rag.knowledge_base ORDER BY embedding ANN OF ? LIMIT 5 """, [query_embedding, query_embedding])

Construct prompt with retrieved context

context = "\n---\n".join([r.content for r in results]) prompt = f"""Based on the following context, answer the question. Context: {context} Question: {user_question}"""

answer = llm.generate(prompt)


Envisioned Use Cases

1. Platform Operations Assistant

Problem: Engineers spend 15-30 minutes searching runbooks and Slack history during incidents.

Proposed solution: A chat interface that retrieves relevant runbook sections and past incident resolutions.

Engineer: "Astra DB latency spike on settlement cluster" Assistant: "Based on 3 similar incidents (INC-4521, INC-4892, INC-5103):
  • Most common cause: compaction backlog after batch migration job
  • Immediate action: Check pending compactions via nodetool
  • Resolution: Throttle migration Spark job during peak hours
  • Runbook: [Settlement Cluster Operations §4.2]"

2. Semantic Data Discovery

Problem: Finding relevant tables requires knowing exact names or navigating a complex catalog UI.

Proposed solution: Natural language search over schema metadata and column descriptions.

Analyst: "tables related to customer risk scoring" Results:
  • risk_engine.customer_scores (similarity: 0.92)
  • settlement.risk_parameters (similarity: 0.87)
  • reporting.daily_risk_aggregates (similarity: 0.84)
```

3. Onboarding Accelerator

Problem: New engineers take 4-6 weeks to understand platform architecture and data flows.

Proposed solution: RAG over architecture decision records, design docs, and migration history.

4. Alert Context Enrichment

Problem: Splunk alerts fire with technical metrics but lack business context.

Proposed solution: When an alert triggers, automatically retrieve related incidents and runbook sections, attaching context to the alert notification.

Keeping Vectors Fresh

Stale embeddings would degrade RAG quality. The proposed refresh strategy:

SourceRefresh FrequencyTrigger
Schema metadataDailySpark scheduled job
RunbooksOn changeConfluence webhook → Spark job
IncidentsReal-timeSplunk event → streaming ingest
ADRsOn mergeGit webhook → Spark job
The Spark pipeline would handle both bulk re-embedding (nightly) and incremental updates (event-driven).

Security & Governance

Enterprise RAG demands strict controls. The design must address:

  • Data classification: Only embed documents classified as Internal or below - no Restricted/Confidential content enters the vector store
  • Access control: Astra DB role-based access limits which teams can query which source types
  • PII filtering: Pre-processing pipeline strips PII before embedding (regex + NER model)
  • Audit trail: All queries logged with user identity, retrieved chunks, and generated responses
  • Network isolation: LLM API accessed via Azure Private Link - no data leaves the private network

Expected Outcomes & Roadmap

Based on industry benchmarks and our platform's characteristics, the projected impact:

  • 70% reduction in mean time to find relevant runbook content during incidents
  • 3x faster onboarding for new engineers on platform operations
  • Zero additional infrastructure cost - all running on existing Astra DB + Databricks

Roadmap:

PhaseTimelineScope
Phase 1Q3 2026Proof of concept - Ops Assistant with runbook ingestion
Phase 2Q4 2026Data catalog semantic search + incident history
Phase 3Q1 2027Alert enrichment + onboarding assistant
Phase 4Q2 2027Agentic patterns - LLM executes read-only platform queries

Key Takeaways

  • Activate what you have - if your database supports vectors, you don't need a separate vector DB
  • Start with internal ops - lower risk, immediate value, builds confidence
  • Chunking matters more than model choice - garbage in, garbage out
  • Security first - enterprise RAG without access control is a data leak waiting to happen
  • Keep vectors fresh - stale context is worse than no context

The migration to Astra DB wasn't just about cost reduction - it positioned us to build intelligent capabilities on top of our data platform without adding complexity. RAG is the first step in a vision to make Panorama a truly intelligent platform.