Postojka — это FastAPI-сервис, который принимает текст поста и возвращает рекомендации на основе текстовой близости. Он может работать в двух режимах:
- 📄
file— использовать локальный JSON-файл (data/posts.json) с постами - 💢
database— подключаться к PostgreSQL и получать посты из таблицы
| Технология | Назначение |
|---|---|
| FastAPI | API-фреймворк для обработки запросов |
| Uvicorn | ASGI-сервер для запуска FastAPI |
| sentence-transformers | Для получения эмбеддингов постов |
| Faiss | Быстрый поиск ближайших векторов |
| psycopg2-binary | Подключение к PostgreSQL |
| pydantic-settings | Конфигурация через .env |
Faiss — это библиотека от Facebook для поиска ближайших векторов. Она позволяет быстро находить похожие посты на основе эмбеддингов. Вместо сравнения каждого с каждым (что медленно), Faiss строит индекс, который позволяет находить ближайшие тексты за миллисекунды.
git clone https://github.com/yourusername/postojka.git
cd postojkaСоздай .env по примеру .env.example
Настрой DATA_SOURCE=file или DATA_SOURCE=database
В файле .env можно указать параметры подключения к PostgreSQL и адаптировать структуру под любую таблицу с постами:
...
# Название таблицы и колонок (важно для работы с любой структурой)
POST_TABLE_NAME=posts_post
POST_ID_COLUMN=id
POST_CONTENT_COLUMN=content💡 Это позволяет использовать Postojka с любой таблицей, даже если в ней:
- ID называется
article_id - Текст поста —
body - А сама таблица —
news_article
Пример:
POST_TABLE_NAME=news_article
POST_ID_COLUMN=article_id
POST_CONTENT_COLUMN=bodydocker-compose up --buildСервис будет доступен на:
➡ http://localhost:8002/
Интерфейс документации доступен по адресу:
📚 http://localhost:8002/docs
- Протестировать ручку
/recommend - Ввести пример текста (на русском)
- Получить ID и оценки релевантных постов
- В Django-соцсети добавить вьюшку
RecommendedPostsView(например, черезListView). - При заходе пользователя отправлять его текст/интерес/ID лайкнутых постов в
http://postojka:8000/recommend(илиlocalhost:8002вне Docker). - Получить список
post_idи отфильтровать по нимPost.objects.filter(id__in=...). - Вывести результат на отдельной вкладке — "Рекомендованные".
Можно использовать Django-библиотеку requests или httpx.
POST /recommend
Content-Type: application/json
{
"text": "Мне понравился альбом Земфиры",
"top_k": 3
}Ответ:
{
"recommended": [
{"post_id": 4, "score": 0.78},
{"post_id": 1, "score": 0.65},
...
]
}