Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Быстрый старт: векторный поиск за 15 минут
intro

Быстрый старт: векторный поиск за 15 минут

Пишем первый рабочий пример векторного поиска сразу — без глубокой теории. Вы увидите результат за 15 минут и поймёте, зачем всё это нужно.

Быстрый старт: векторный поиск за 15 минут

Пишем первый рабочий векторный поиск сразу — без глубокой теории. Вы увидите результат за 15 минут.

#Что вы сделаете в этой теме

За следующие 15 минут вы:

  1. Установите необходимые библиотеки
  2. Создадите эмбеддинги для нескольких документов
  3. Построите простой индекс
  4. Выполните поиск по смыслу (не по ключевым словам!)

#Шаг 1: Установка зависимостей

Откройте терминал и установите две библиотеки:

pip install sentence-transformers faiss-cpu
  • sentence-transformers — создаёт эмбеддинги (векторные представления текста)
  • faiss-cpu — библиотека для быстрого векторного поиска от Meta

#Шаг 2: Первый код — поиск за 5 строк

Создайте файл search.py и вставьте код:

from sentence_transformers import SentenceTransformer import faiss import numpy as np # 1. Документы для поиска documents = [ "Python — язык программирования общего назначения", "Питон — это змея из семейства удавов", "Django — веб-фреймворк на Python для быстрой разработки", "Flask — микрофреймворк для создания веб-приложений", "FastAPI — современный фреймворк для создания API" ] # 2. Загружаем модель для эмбеддингов model = SentenceTransformer('all-MiniLM-L6-v2') # 3. Создаём эмбеддинги для документов embeddings = model.encode(documents) print(f"Форма эмбеддингов: {embeddings.shape}") # (5, 384) # 4. Создаём индекс FAISS (косинусное сходство) dimension = embeddings.shape[1] index = faiss.IndexFlatIP(dimension) # Inner Product faiss.normalize_L2(embeddings) # Нормализуем для косинусного сходства index.add(embeddings) # 5. Поиск по запросу query = "веб-разработка на Python" query_embedding = model.encode([query]) faiss.normalize_L2(query_embedding) distances, indices = index.search(query_embedding, k=2) print(f"\nЗапрос: {query}") print(f"Найдено документов: {indices[0]}") print(f"Сходство: {distances[0]}") print("\nРезультаты:") for idx, score in zip(indices[0], distances[0]): print(f" [{score:.3f}] {documents[idx]}")

Запустите:

python search.py

Ожидаемый вывод:

Форма эмбеддингов: (5, 384)

Запрос: веб-разработка на Python
Найдено документов: [2 4]
Сходство: [0.823 0.756]

Результаты:
  [0.823] Django — веб-фреймворк на Python для быстрой разработки
  [0.756] FastAPI — современный фреймворк для создания API

#Что произошло?

┌─────────────┐     ┌──────────────┐     ┌─────────────┐     ┌──────────────┐
│  Документы  │ ──→ │   Модель     │ ──→ │    FAISS    │ ──→ │  Результаты  │
│   (текст)   │     │  Embedding   │     │   (индекс)  │     │   поиска     │
└─────────────┘     └──────────────┘     └─────────────┘     └──────────────┘
  1. Документы → 5 текстов для поиска
  2. Модель → превратила тексты в векторы (384 числа каждый)
  3. FAISS → сохранил векторы в индекс для быстрого поиска
  4. Результаты → нашёл 2 наиболее похожих документа

#Ключевая идея: семантический поиск

Обратите внимание: в запросе "веб-разработка на Python" нет слова "Django", но система нашла его!

Почему? Потому что модель понимает смысл:

  • "веб-разработка" ≈ "веб-фреймворк"
  • "Python" упоминается в обоих документах

Традиционный поиск (по ключевым словам) не нашёл бы Django — там нет слова "веб-разработка". Векторный поиск находит документы по смыслу.

#Шаг 3: Добавим вывод исходного запроса

Модифицируем код, чтобы видеть, что именно ищем:

# Добавьте после строки с query: print(f"Исходный запрос: {query}") print(f"Эмбеддинг (первые 10 чисел): {query_embedding[0][:10]}")

Вы увидите, что запрос тоже превратился в вектор чисел.

#Шаг 4: Поиграйте с запросами

Попробуйте разные запросы в коде:

# Попробуйте эти запросы: test_queries = [ "змея удав", # Найдёт питона "фреймворк для API", # Найдёт FastAPI "быстрая веб-разработка", # Найдёт Django "маленький фреймворк", # Найдёт Flask ] for query in test_queries: query_embedding = model.encode([query]) faiss.normalize_L2(query_embedding) distances, indices = index.search(query_embedding, k=1) print(f"\nЗапрос: {query}") print(f"→ {documents[indices[0][0]]}")

#Шаг 5: Добавим больше документов

Чем больше документов, тем интереснее поиск. Расширьте список:

documents = [ "Python — язык программирования общего назначения", "Питон — это змея из семейства удавов", "Django — веб-фреймворк на Python для быстрой разработки", "Flask — микрофреймворк для создания веб-приложений", "FastAPI — современный фреймворк для создания API", "NumPy — библиотека для научных вычислений", "Pandas — инструмент для анализа данных", "Matplotlib — библиотека для визуализации данных", "Scikit-learn — машинное обучение на Python", "TensorFlow — фреймворк для глубокого обучения" ] # Пересоздайте эмбеддинги и индекс с новыми документами embeddings = model.encode(documents) # ... остальной код

Теперь попробуйте запросы:

  • "анализ данных" → найдёт Pandas
  • "графики и диаграммы" → найдёт Matplotlib
  • "нейронные сети" → найдёт TensorFlow

#Что если поиск не работает?

#Ошибка: ModuleNotFoundError: No module named 'sentence_transformers'

Решение:

pip install sentence-transformers

#Ошибка: ModuleNotFoundError: No module named 'faiss'

Решение:

pip install faiss-cpu

#Ошибка: модель долго загружается

Нормально. При первой загрузке модель скачивается (~100 МБ). Последующие запуски будут быстрыми.

#Результаты кажутся странными

Возможные причины:

  1. Мало документов — добавьте ещё
  2. Модель не понимает контекст — попробуйте другой запрос
  3. Низкое сходство (< 0.5) — документы действительно не похожи

#Эксперимент: сравним с keyword-поиском

Давайте напишем простой поиск по ключевым словам и сравним:

def keyword_search(query, documents, k=2): """Поиск по вхождению слов.""" query_words = set(query.lower().split()) scores = [] for i, doc in enumerate(documents): doc_words = set(doc.lower().split()) # Количество общих слов overlap = len(query_words & doc_words) scores.append((i, overlap)) # Сортировка по убыванию scores.sort(key=lambda x: x[1], reverse=True) return scores[:k] # Сравнение query = "веб-фреймворк Python" print("Keyword поиск:") for idx, score in keyword_search(query, documents): print(f" [{score}] {documents[idx]}") print("\nВекторный поиск:") query_embedding = model.encode([query]) faiss.normalize_L2(query_embedding) distances, indices = index.search(query_embedding, k=2) for idx, score in zip(indices[0], distances[0]): print(f" [{score:.3f}] {documents[idx]}")

Вы увидите разницу:

  • Keyword найдёт только документы со словами "веб", "фреймворк", "Python"
  • Векторный найдёт документы по смыслу, даже если слов нет

#Чеклист: вы поняли основы

  • Вы установили sentence-transformers и faiss-cpu
  • Вы запустили код и увидели результаты поиска
  • Вы попробовали разные запросы
  • Вы добавили больше документов
  • Вы сравнили с keyword-поиском

#Типичные ошибки новичков

#1. Сравнение эмбеддингов от разных моделей

# ❌ НЕЛЬЗЯ model1 = SentenceTransformer('all-MiniLM-L6-v2') model2 = SentenceTransformer('all-mpnet-base-v2') emb1 = model1.encode("текст") emb2 = model2.encode("текст") # Эти векторы несовместимы!

Правило: Используйте одну модель для всех эмбеддингов в проекте.

#2. Забывают нормализовать для косинусного сходства

# ❌ Без нормализации index = faiss.IndexFlatIP(dimension) index.add(embeddings) # Неправильные результаты! # ✅ С нормализацией faiss.normalize_L2(embeddings) index.add(embeddings)

#3. Поиск без нормализации запроса

# ❌ query_embedding = model.encode([query]) distances, indices = index.search(query_embedding, k=2) # ✅ query_embedding = model.encode([query]) faiss.normalize_L2(query_embedding) # Важно! distances, indices = index.search(query_embedding, k=2)

#Домашнее задание

  1. Создайте файл my_search.py с 10+ документами на вашу тему (работа, хобби, учёба)
  2. Попробуйте 5+ разных запросов
  3. Запишите, какие результаты вас удивили
  4. Поделитесь с коллегой — объясните, как это работает

Готовы к следующей теме? Открывайте first_embeddings — узнаете, как работают эмбеддинги изнутри!

Далее: Первые эмбеддинги: практика генерации