Быстрый и понятный способ создать векторную базу из русского текста, построить поиск по сходству и получить ответы как в системе Q&A.
В репозитории находится один скрипт oblomov_vector_search.py, который:
- Загружает файл с текстом «Обломов»
- Делит его на части
- Создаёт эмбеддинги с помощью модели
ai-forever/FRIDA - Строит индекс FAISS и сохраняет его локально
- Выполняет примерные поиски по запросам
Кратко – запустите скрипт, получите готовую к использованию векторную базу и можете задать любые вопросы.
- Обзор проекта
- Требования
- Установка
- Настройка
- Запуск скрипта
- Тестовые запросы
- Расширение и кастомизация
- FAQ
- Содействие
- Лицензия
Проект демонстрирует, как с помощью 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 – просто поправьте пути к файлам.
-
Клонируйте репозиторий
git clone https://github.com/<ваш-username>/oblomov-vector-search.git cd oblomov-vector-search
-
Создайте виртуальное окружение
python -m venv venv # Windows venv\Scripts\activate # macOS / Linux source venv/bin/activate
-
Установите зависимости
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} и искать по ним. |
| Вопрос | Ответ |
|---|---|
| Текст в кириллице, нужна особая кодировка? | Да – при создании 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.
Удачного поиска! 🚀