Реалізація RAG AI Bot (Retrieval-Augmented Generation)
RAG поєднує зовнішній пошук знань з мовними моделями. Бот отримує релевантні документи/дані, потім генерує відповіді на основі цього контексту. Краща точність ніж чистий LLM для специфічних Q&A.
Архітектура RAG
Запитання користувача → Векторний пошук → Отриманий контекст → LLM → Відповідь
Реалізація
import OpenAI from 'openai';
import { QdrantClient } from '@qdrant/js-client-rest';
const openai = new OpenAI();
const qdrant = new QdrantClient({ url: 'http://localhost:6333' });
async function ragQuery(userQuestion) {
// 1. Векторизуй запитання
const questionEmbedding = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: userQuestion,
});
// 2. Отримай контекст
const searchResults = await qdrant.search('knowledge-base', {
vector: questionEmbedding.data[0].embedding,
limit: 5,
score_threshold: 0.7,
});
const context = searchResults.points
.map(p => p.payload.text)
.join('\n\n');
// 3. Згенеруй відповідь
const response = await openai.chat.completions.create({
model: 'gpt-4o-mini',
messages: [
{
role: 'system',
content: `Відповідай на основі наданого контексту. Якщо відповіді немає в контексті, скажи про це.
Контекст:
${context}`,
},
{ role: 'user', content: userQuestion },
],
max_tokens: 500,
});
return {
answer: response.choices[0].message.content,
sources: searchResults.points.map(p => p.payload.source),
};
}
Налаштування бази знань
// Індексуй документи
async function indexDocument(doc) {
const chunks = chunkText(doc.content, { size: 500, overlap: 100 });
const embeddings = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: chunks,
});
const points = chunks.map((text, i) => ({
id: generateId(),
vector: embeddings.data[i].embedding,
payload: {
text,
source: doc.source,
docId: doc.id,
},
}));
await qdrant.upsert('knowledge-base', { points });
}
Терміни
- Налаштування Qdrant + embeddings — 1–2 дні
- Індексація бази знань — 1 день
- Реалізація RAG — 2 дні
- UI + стримінг — 2–3 дні
- Гарантія якості — 2–3 дні







