Программирование

JavaScript: RAG, ответ из документа

Найди абзац под вопрос и заставь ИИ отвечать только из него.

Все уроки · Уроки JavaScript: учимся с нуля

Что такое RAG

ИИ знает общую тему, не твой PDF. Целую книгу в один запрос не положишь: лимит кончится. Где текста нет, он выдумывает. RAG сначала находит абзац под вопрос, потом говорит ИИ: отвечай только из этого текста. Если ответа нет, напиши «Этой информации в документе нет».

Четыре шага и код

Документ режется на короткие абзацы. Каждый абзац становится числами, вектором, чтобы смысл совпал. Когда приходит вопрос, находится самый близкий абзац. Этот абзац и вопрос уходят вместе. Тысячи кусков в обычный массив не лезут. В Supabase их хранят через pgvector, и SQL находит ближайший кусок. Если поиск выбрал не тот абзац, ответ тоже будет неверным.

const apiKey = process.env.GEMINI_API_KEY;
const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=${apiKey}`;

async function seneddenCavabAl(istifadeciSuali, senedinParaqrafi) {
  const sorguMelumati = {
    systemInstruction: {
      parts: [{
        text: "Sən sənəd köməkçisisən. Yalnız verilən mətndən cavab ver. Mətndə yoxdursa yaz: Bu məlumat sənəddə yoxdur. Uydurma."
      }]
    },
    contents: [{
      parts: [{
        text: `Kontekst:\n${senedinParaqrafi}\n\nSual: ${istifadeciSuali}`
      }]
    }]
  };
  const cavab = await fetch(url, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(sorguMelumati)
  });
  const melumat = await cavab.json();
  console.log(melumat.candidates[0].content.parts[0].text);
}

const pdfdenTapilanHisse = "Nibras PDF aləti brauzerdə açılır. Fayl serverə yüklənmir.";
seneddenCavabAl("PDF aləti harada açılır?", pdfdenTapilanHisse);

Вопросы

Можно ли положить 100 страниц в один contents? Нет. Лимит токенов кончится. Документ режется на короткие абзацы.

Почему выдумывает? В инструкции нет запрета. Фраза «Отвечай только из этого текста, если нет — так и напиши» должна стоять в systemInstruction.

Почему ответ из не того абзаца? Поиск не выбрал подходящий кусок. ИИ видит только то, что ему дали.

Что такое RAG в двух словах? Найди и пиши только из найденного. Своего не добавляй.

Автор: Nibras Code