Введение: загадка быстрого взаимодействия с искусственным интеллектом

В современную цифровую эпоху базы данных являются краеугольным камнем практически каждого приложения, от почтовых клиентов до сложных систем планирования ресурсов предприятия (ERP). Традиционные архитектуры баз данных, такие как базы данных SQL, NoSQL и Graph, имеют свои преимущества, но как насчет приложений, которым необходимо имитировать человеческое мышление и реагировать в реальном времени? Именно здесь в игру вступают векторные базы данных, воспроизводящие скорость и интуицию, с которой люди отвечают на вопросы.

Человеческое прикосновение: как мы отвечаем на вопросы

Когда кто-то задает нам вопрос, например «Что такое AWS?», наш мозг не использует определение из учебника. Вместо этого он выполняет быстрое сканирование мысленной «базы данных» опыта, воспоминаний и приобретенных знаний. После этого сканирования мы формулируем индивидуальный ответ, который, по нашему мнению, наиболее соответствует вопросу. Короче говоря, наш мозг «запрашивает», «извлекает» и «генерирует» индивидуальный ответ почти мгновенно.

Векторные базы данных: имитация человеческого разума

Векторные базы данных работают по аналогичному принципу. Они хранят информацию в виде математических векторов, отражающих суть данных. Эта векторизованная информация затем сохраняется в постоянном слое. Когда запрос отправляется в систему, он также преобразуется в векторную форму, которая затем сопоставляется с существующей базой данных. Ближайшее совпадение, измеряемое такими показателями, как косинусное сходство, затем определяется как наиболее подходящий ответ.

За кулисами: симбиоз данных и скорости

1. Фаза инициализации

Первоначально база данных заполняется набором векторов. Эти векторы генерируются с использованием алгоритмов машинного обучения, которые анализируют большие наборы данных для выявления закономерностей и взаимосвязей.

2. Адаптация и эволюция

По мере сбора большего количества данных или смещения фокуса запросов алгоритмы машинного обучения настраиваются сами. Следовательно, векторы в базе данных обновляются, чтобы отразить это новое обучение.

Практическая реализация: упрощенный пример JavaScript

Чтобы обеспечить конкретное понимание, давайте углубимся в простой пример JavaScript.

База данных

Здесь класс MyKnowledgeBase действует как наша база данных, в которой векторы сохраняются для будущего использования.

// Class for our "Knowledge Base"
class MyKnowledgeBase {
  // ... (same as VectorDatabase)
}

Конвейер машинного обучения

Мы используем класс MyLearningProcess для токенизации предложений, преобразования их в частотные векторы и последующего сохранения в нашей базе знаний.

// Class for ML Pipeline with method chaining
class MyLearningProcess {
  constructor(vectorDB) {
    this.vectorDB = vectorDB;
    this.currentTokens = [];
    this.currentVector = [];
    this.currentSentence = '';
  }

  // Real-world equivalent: Tokenization
  understandSentence(sentence) {
    this.currentSentence = sentence;
    this.currentTokens = sentence.toLowerCase().split(' ');
    return this;
  }

  // Real-world equivalent: Vectorization
  rememberImportantWords() {
    // FrequencyVector
    const frequencyMap = {};
    for (let token of this.currentTokens) {
      frequencyMap[token] = (frequencyMap[token] || 0) + 1;
    }
    this.currentVector = Object.values(frequencyMap);
    return this;
  }

 // Real-world equivalent: Storing to database
  saveToKnowledgeBase() {
    this.vectorDB.addVector(this.currentSentence, this.currentVector);
    return this;
  }
}
const myLearningProcess = new MyLearningProcess(vectorDB);


myLearningProcess.understandSentence("AWS is a cloud computing service.") //tokenize
          .rememberImportantWords() //createVector
          .saveToKnowledgeBase(); //addToVectorDatabse

myLearningProcess.understandSentence("Cloud computing is the delivery of services over the internet.")//tokenize
          .rememberImportantWords()//createVector
          .saveToKnowledgeBase(); //addToVectorDatabse

Приложение семантического поиска:

Класс MyAnswerFinder отвечает за обработку запроса, поиск наилучшего соответствия и его извлечение.

// Class for "Finding Answers"
class MyAnswerFinder {
  // SemanticSearchApp
 constructor(vectorDB) {
    this.vectorDB = vectorDB;
    this.currentQuery = '';
    this.bestMatch = '';
  }
  
  // Real-world equivalent: Query Setting
  askQuestion(query) {
    this.currentQuery = query;
    return this;
  }

  // Real-world equivalent: Similarity Search
  lookForBestAnswer() {
    const vectors = this.knowledgeBase.getVectors();
    const sentences = this.knowledgeBase.getSentences();
    let maxSimilarity = -1;
    let bestMatchIndex = -1;

    // Tokenizing the query 
    const queryTokens = this.currentQuestion.toLowerCase().split(' ');
    // vectorizing the query 
    const queryVector = Object.values(queryTokens.reduce((acc, token) => {
      acc[token] = (acc[token] || 0) + 1;
      return acc;
    }, {}));

    // Under the hood: Starting the loop to find the best match
    for (let i = 0; i < vectors.length; i++) {
      // Calculating similarity for each sentence in the database
      const similarity = this.calculateSimilarity(queryVector, vectors[i]);

      // Under the hood: Checking if this is the best match so far
      if (similarity > maxSimilarity) {
        maxSimilarity = similarity;
        bestMatchIndex = i;
      }
    }

    this.bestAnswer = sentences[bestMatchIndex];
    return this;
  }
  
  // Real-world equivalent: Cosine Similarity
  calculateSimilarity(vecA, vecB) {
    // ... (same as calculateCosineSimilarity)
    let dotProduct = 0;
    let magnitudeA = 0;
    let magnitudeB = 0;
    for (let i = 0; i < vecA.length; i++) {
      dotProduct += (vecA[i] * vecB[i]);
      magnitudeA += Math.pow(vecA[i], 2);
      magnitudeB += Math.pow(vecB[i], 2);
    }
    magnitudeA = Math.sqrt(magnitudeA);
    magnitudeB = Math.sqrt(magnitudeB);
    return dotProduct / (magnitudeA * magnitudeB);
  }
  
  // Real-world equivalent: Retrieving Best Match
  getBestAnswer() {
    return this.bestAnswer;
  }
}

Пошаговый пример: понимание AWS

Приступим к примеру для построения ментальной модели. Узнав об AWS из нескольких предложений, мы сохраняем их в нашей векторной базе данных.

const myLearningProcess = new MyLearningProcess(vectorDB);


myLearningProcess.understandSentence("AWS provides cloud computing services.") //tokenize
          .rememberImportantWords() //createVector
          .saveToKnowledgeBase(); //addToVectorDatabse

myLearningProcess.understandSentence("Cloud computing is the core of AWS.")//tokenize
          .rememberImportantWords()//createVector
          .saveToKnowledgeBase(); //addToVectorDatabse

myLearningProcess.understandSentence("AWS has many services, including computing.")//tokenize
          .rememberImportantWords()//createVector
          .saveToKnowledgeBase(); //addToVectorDatabse

Чтобы полностью понять, как наш процесс обучения усваивает информацию, давайте углубимся в мельчайшие детали того, что происходит за кулисами.

"AWS provides cloud computing services."
Tokenized: ["AWS", "provides", "cloud", "computing", "services"]
Frequency Vector: { "AWS": 1, "provides": 1, "cloud": 1, "computing": 1, "services": 1 }
Numerical Vector: [1, 1, 1, 1, 1]

"Cloud computing is the core of AWS."
Tokenized: ["cloud", "computing", "is", "the", "core", "of", "AWS"]
Frequency Vector: { "cloud": 1, "computing": 1, "is": 1, "the": 1, "core": 1, "of": 1, "AWS": 1 }
Numerical Vector: [1, 1, 1, 1, 1, 1, 1]

"AWS has many services, including computing."
Tokenized: ["AWS", "has", "many", "services", "including", "computing"]
Frequency Vector: { "AWS": 1, "has": 1, "many": 1, "services": 1, "including": 1, "computing": 1 }
Numerical Vector: [1, 1, 1, 1, 1, 1]

Примечание. Они очень упрощены и не нормализованы. Обычно для создания этих векторов мы используем более сложные алгоритмы, такие как TF-IDF, Word2Vec и т. д. Но это должно дать вам общее представление о нашем объяснении.

Затем мы моделируем ситуацию, когда друг спрашивает нас: «Расскажите мне об облачных вычислениях AWS».

const myAnswerFinder = new MyAnswerFinder(kb)
myAnswerFinder.askQuestion("Tell me about AWS cloud computing")
        .lookForBestAnswer()
        .getBestAnswer()

Под капотом моего мозга: внутренняя работа

Когда приходит запрос «Расскажите мне об облачных вычислениях AWS», мой мозг сначала проходит следующие этапы:

Предварительная обработка запроса

  1. Токенизация:предложение разбивается на отдельные слова: ['Расскажи', 'мне', 'о', 'AWS', 'облако', 'вычисления']
  2. Генерация вектора частоты. Выполняется подсчет частоты для каждого термина в токенизированном запросе: {'Tell': 1, 'me': 1, 'about': 1, 'AWS': 1, ' облако»: 1, «вычисления»: 1}
  3. Создание числового вектора.Числовое представление создается на основе вектора частоты: [1, 1, 1, 1, 1, 1]

Поиск и оценка

Query: "Tell me about AWS cloud computing"
Tokenized: ["Tell", "me", "about", "AWS", "cloud", "computing"]
Frequency Vector: { "Tell": 1, "me": 1, "about": 1, "AWS": 1, "cloud": 1, "computing": 1 }
Numerical Vector: [1, 1, 1, 1, 1, 1]

Step-by-step Calculation of Similarity:

Sentence 1: "AWS provides cloud computing services."
Cosine Similarity: (3 common words "AWS", "cloud", "computing") / sqrt(6 * 5) = 3 / sqrt(30) = 0.5477

Sentence 2: "Cloud computing is the core of AWS."
Cosine Similarity: (3 common words "AWS", "cloud", "computing") / sqrt(6 * 7) = 3 / sqrt(42) = 0.4629

Sentence 3: "AWS has many services, including computing."
Cosine Similarity: (3 common words "AWS", "computing") / sqrt(6 * 6) = 2 / sqrt(36) = 0.3333

Принятие решений

Основываясь на косинусных показателях сходства, мой мозг определяет, что предложение «AWS предоставляет услуги облачных вычислений» имеет наивысший балл сходства с запросом «Расскажите мне об облачных вычислениях AWS». Таким образом, это становится наиболее подходящим ответом.

Краткое содержание:

Векторные базы данных, как показано в нашем примере с JavaScript, — это больше, чем просто теоретическая концепция; они являются двигателем многих реальных приложений генеративного искусственного интеллекта. Подобно тому, как наш код токенизирует и векторизует предложения, чтобы найти наиболее релевантный ответ, так и генеративный ИИ использует аналогичные принципы, но в гораздо большем масштабе.

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

Заключительные слова: мой путь в искусственный интеллект в качестве фронтенд-разработчика

Я начал изучать искусственный интеллект и такие вещи, как векторные базы данных и ChatGPT, что сильно отличается от моей обычной работы над интерфейсом. Я делюсь тем, что узнал, чтобы помочь себе и вам разобраться в этой захватывающей области. Имейте в виду, что мы все учимся вместе, и эта область постоянно меняется.

Мои идеи — это лишь отправная точка и далека от полной картины. Итак, если это вызывает у вас интерес, я предлагаю вам провести небольшое исследование самостоятельно. Я буду продолжать делиться, когда узнаю больше, и надеюсь, что вы присоединитесь ко мне в этом путешествии.