RAG Sandbox

RAG sandbox — upload a doc, query it, see the chunks

Upload a PDF or text file, see it chunked and embedded, then query it. Watch the retrieval rank chunks in real time.

1. Upload or paste your document

2. Query the document

Try RAG in your stack

Embeddings + collections + queries in a single OpenAI-compatible API.

Start $5 trial → RAG API reference
(function(){ // Simple in-browser RAG demo: // 1. chunk the text // 2. score by simple word overlap (TF) -- good enough to demo // 3. return top-K chunks with relevance scores function chunk(text, size) { var chunks = []; var step = Math.floor(size * 0.5); for (var i = 0; i < text.length; i += step) { chunks.push({ start: i, end: Math.min(text.length, i + size), text: text.slice(i, Math.min(text.length, i + size)) }); } return chunks; } function tokenize(s) { return s.toLowerCase().replace(/[^a-z0-9\s]/g, ' ').split(/\s+/).filter(function(w){return w.length > 2;}); } function score(query, chunkText) { var qTokens = tokenize(query); var cTokens = tokenize(chunkText); if (qTokens.length === 0 || cTokens.length === 0) return 0; var freq = {}; for (var i = 0; i < cTokens.length; i++) freq[cTokens[i]] = (freq[cTokens[i]] || 0) + 1; var score = 0; for (var j = 0; j < qTokens.length; j++) score += freq[qTokens[j]] || 0; // normalize by chunk length return score / Math.sqrt(cTokens.length + 1); } document.getElementById('runBtn').onclick = function() { var text = document.getElementById('docText').value; var query = document.getElementById('query').value; var size = parseInt(document.getElementById('chunkSize').value); var topK = parseInt(document.getElementById('topK').value); var chunks = chunk(text, size); var scored = chunks.map(function(c) { c.score = score(query, c.text); return c; }); scored.sort(function(a,b){return b.score - a.score;}); var top = scored.slice(0, topK); var out = document.getElementById('result'); out.style.display = 'block'; var html = '
Index
\n' + chunks.length + ' chunks (' + size + ' chars, ' + Math.floor(size*0.5) + ' char overlap)\n\n'; html += '
Top ' + topK + ' matches for: "' + query + '"
\n'; top.forEach(function(c, i) { var pct = Math.min(100, Math.round((c.score / (top[0]?.score || 1)) * 100)); html += '
'; html += '
#' + (i+1) + ' · chars ' + c.start + '–' + c.end + 'relevance: ' + pct + '%
'; html += '
' + c.text + '
'; html += '
'; }); out.innerHTML = html; }; document.getElementById('runBtn').click(); })();