RAG (Retrieval-Augmented Generation) searches through help docs before generating responses, grounding answers in your actual documentation.
Knowledge Base Setup
// data/help-docs.json
[
{
"id": "refund-policy",
"title": "Refund Policy",
"content": "We offer full refunds within 30 days of purchase. No questions asked.",
"category": "billing",
"embedding": [0.123, -0.456, ...] // pre-computed OpenAI embedding
},
{
"id": "shipping-times",
"title": "Shipping Times",
"content": "Standard shipping: 5-7 business days. Express: 2-3 business days.",
"category": "shipping"
}
]
RAG Search Implementation
// agent/ragSearch.js
const OpenAI = require('openai');
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
const helpDocs = require('../data/help-docs.json');
// Compute cosine similarity
function cosineSimilarity(a, b) {
const dotProduct = a.reduce((sum, val, i) => sum + val * b[i], 0);
const magnitudeA = Math.sqrt(a.reduce((sum, val) => sum + val * val, 0));
const magnitudeB = Math.sqrt(b.reduce((sum, val) => sum + val * val, 0));
return dotProduct / (magnitudeA * magnitudeB);
}
// Search help docs using embeddings
async function searchDocs(query, topK = 3) {
// Get query embedding
const response = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: query
});
const queryEmbedding = response.data[0].embedding;
// Compute similarities
const scored = helpDocs.map(doc => ({
...doc,
score: cosineSimilarity(queryEmbedding, doc.embedding)
}));
// Return top K results
return scored
.sort((a, b) => b.score - a.score)
.slice(0, topK)
.map(doc => ({
title: doc.title,
content: doc.content,
category: doc.category,
score: doc.score
}));
}
module.exports = { searchDocs };
Precompute Embeddings (One-Time)
// scripts/embedDocs.js
const OpenAI = require('openai');
const fs = require('fs');
const openai = new OpenAI();
const docs = require('../data/help-docs.json');
async function embedAllDocs() {
for (const doc of docs) {
const response = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: doc.content
});
doc.embedding = response.data[0].embedding;
}
fs.writeFileSync('data/help-docs.json', JSON.stringify(docs, null, 2));
console.log('Embeddings computed and saved!');
}
embedAllDocs();