Skip to content

sysneld1/oblomov-vector-search

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📚 Создание и поиск векторных эмбеддингов на примере романа «Обломов» с LangChain & FAISS

Быстрый и понятный способ создать векторную базу из русского текста, построить поиск по сходству и получить ответы как в системе Q&A.

В репозитории находится один скрипт oblomov_vector_search.py, который:

  1. Загружает файл с текстом «Обломов»
  2. Делит его на части
  3. Создаёт эмбеддинги с помощью модели ai-forever/FRIDA
  4. Строит индекс FAISS и сохраняет его локально
  5. Выполняет примерные поиски по запросам

Кратко – запустите скрипт, получите готовую к использованию векторную базу и можете задать любые вопросы.


📖 Содержание


🚀 Обзор проекта

Проект демонстрирует, как с помощью LangChain построить поиск по сходству для крупного русского текста. Ключевые моменты:

Компонент Что делает
TextLoader Загружает обычный текстовый файл (Oblomov.txt). По умолчанию путь F:\vadim\my_projects\Oblomov.txt.
RecursiveCharacterTextSplitter Разделяет текст на куски около 1000 символов, сохраняя границы абзацев.
HuggingFaceEmbeddings Создаёт эмбеддинги через модель ai-forever/FRIDA (русская BERT‑подобная модель).
FAISS Быстрый векторный поиск на CPU. Можно заменить на Chroma – код для этого уже закомментирован.
similarity_search() Возвращает топ‑k наиболее похожих фрагментов для любого запроса.

⚙️ Требования

Инструмент Минимальная версия
Python 3.10+ (работает на 3.10, 3.11, 3.12)
pip Самая свежая
Git Самая свежая

Скрипт написан под Windows, но работает и на Linux/macOS – просто поправьте пути к файлам.


🛠️ Установка

  1. Клонируйте репозиторий

    git clone https://github.com/<ваш-username>/oblomov-vector-search.git
    cd oblomov-vector-search
  2. Создайте виртуальное окружение

    python -m venv venv
    # Windows
    venv\Scripts\activate
    # macOS / Linux
    source venv/bin/activate
  3. Установите зависимости

    pip install --upgrade pip
    pip install -r requirements.txt

Если хотите обновить пакеты, можно сгенерировать новый requirements.txt:

pip freeze > requirements.txt

⚙️ Настройка

Параметр Зачем нужен Значение по умолчанию
file_path Путь к текстовому файлу F:\\vadim\\my_projects\\Oblomov.txt
model_name Модель для эмбеддингов ai-forever/FRIDA
model_kwargs Параметры модели (например, устройство) {'device': 'cpu'}
encode_kwargs Параметры кодирования {'normalize_embeddings': True}
vector_store_path Где сохраняется индекс FAISS f:\\vadim\\my_projects\\Oblomov_frida
query Пользовательский запрос – (примерные запросы закодированы в скрипте)

Токен HuggingFace
Если модель требует авторизации, задайте переменную окружения HF_TOKEN или передайте token="ваш-токен" в HuggingFaceEmbeddings.


▶️ Запуск скрипта

python oblomov_vector_search.py

Вы увидите лог, например:

Создаю вектора ...
Сохраняю векторную базу ...
Векторная база сохранена!

Тестовый поиск

Кто такой Обломов?
[<Document ...> ...]
...
Тестовый поиск завершен!

Индекс будет сохранён по пути vector_store_path. При последующих запусках скрипт пересоберёт его, если каталог будет удалён.


🔍 Тестовые запросы

В скрипте прописаны четыре примера:

query1 = 'Кто такой Обломов?'
query2 = 'Во что был одет Обломов?'
query3 = 'Почему Обломов не уехал в Обломовку?'
query4 = 'Что такое Обломовщина?'

Каждый запрос возвращает список объектов Document (текст фрагмента + метаданные).
Можно заменить их на собственные вопросы.

Если хотите интерактивно вводить запросы, добавьте в конец скрипта:

while True:
    q = input("\nВведите запрос (или 'exit' для выхода): ")
    if q.lower() == 'exit':
        break
    results = vector_store.similarity_search(q, k=3)
    for r in results:
        print(r.page_content[:400])  # предварительный просмотр

🔧 Расширение и кастомизация

Возможность Как включить
Замена FAISS на Chroma Раскомментируйте блок Chroma внизу скрипта и закомментируйте FAISS‑часть.
Изменение размера чанка Поменяйте chunk_size и chunk_overlap в RecursiveCharacterTextSplitter.
Использование GPU Установите model_kwargs={'device': 'cuda'} и добавьте PyTorch с поддержкой CUDA.
Дополнительные метаданные При создании Document можно добавлять metadata={'chapter': 1} и искать по ним.

❓ FAQ

Вопрос Ответ
Текст в кириллице, нужна особая кодировка? Да – при создании TextLoader укажите encoding='utf-8' (или cp1251, если нужен старый формат).
Индекс слишком большой, как ускорить? FAISS уже очень быстрый. Для больших корпусов можно использовать GPU или индекс HNSW (faiss.IndexHNSWFlat).
Как добавить новые документы позже? Загрузите существующий индекс (FAISS.load_local(...)), вызовите vector_store.add_documents(new_docs) и сохраните его снова.
Нужно развернуть как API? Да. Оберните вызов vector_store.similarity_search() в эндпоинт FastAPI/Flask.

Вопросы можно задать в telegram https://t.me/Vad_neld

🤝 Содействие

PR‑ы приветствуются!
Если хотите улучшить модель, добавить новые функции, написать тесты – просто откройте issue или сделайте pull request.


📜 Лицензия

MIT © 2025 Vad_Bel
Смотрите файл LICENSE.


Удачного поиска! 🚀

About

Book Embedding & Retrieval with LangChain & FAISS

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages