🔍 Perplexity-Free
AI-powered search & answer system — распределенная система поиска и генерации ответов на базе LLM, использующая SearXNG для агрегации результатов из множества источников.
Что это?
Perplexity-Free — это опенсорсная альтернатива Perplexity.ai, которая:
- Умно формирует поисковые запросы — использует LLM для генерации оптимальных запросов под разные поисковые движки
- Ищет в специализированных источниках — GitHub, arXiv, PubMed, StackOverflow, Wikipedia и 40+ других движков
- Скрапит и анализирует контент — собирает полный текст страниц для глубокого анализа
- Генерирует развернутые ответы — создает подробные ответы с reasoning и ссылками на источники
- Сохраняет отчеты — все результаты автоматически сохраняются в markdown
Архитектура
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ User │─────▶│ LLM Query │─────▶│ SearXNG │
│ Query │ │ Generator │ │ Search │
└─────────────┘ └──────────────┘ └─────────────┘
│
▼
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ Markdown │◀─────│ LLM │◀─────│ Content │
│ Report │ │ Answerer │ │ Scraper │
└─────────────┘ └──────────────┘ └─────────────┘
Компоненты
main.py — основная логика приложения:
- Генерация поисковых запросов через LLM
- Координация поиска и скрапинга
- Генерация ответов с reasoning
- Форматирование и сохранение отчетов
searxng_client/ — клиент для работы с SearXNG:
- client.py — асинхронный клиент с поддержкой скрапинга
- engines.py — 40+ поисковых движков (GitHub, arXiv, StackOverflow, etc.)
- models.py — Pydantic модели для типизации
Ключевые возможности
Умная генерация запросов
LLM анализирует пользовательский запрос и генерирует оптимальные поисковые запросы для разных движков:
# Пример: запрос "Rust async runtime performance"
# LLM сгенерирует:
[
{query: "async runtime benchmark rust tokio", engines: [github, stackoverflow]},
{query: "rust async performance", engines: [arxiv, reddit]},
{query: "tokio vs async-std", engines: [google, duckduckgo]}
]
Специализированные движки
Используйте узкоспециализированные источники для точных результатов:
- Код: GitHub, GitLab, Codeberg, Bitbucket
- Наука: arXiv, PubMed, Google Scholar, Semantic Scholar
- Q&A: StackOverflow, AskUbuntu, SuperUser
- Packages: PyPI, npm, crates.io, RubyGems
- Общий поиск: Google, DuckDuckGo, Brave, Qwant
- Wiki: Wikipedia, Arch Wiki, Gentoo Wiki
Скрапинг контента
Автоматически извлекает и очищает текст со страниц:
# Настраиваемая длина контента
await client.search(
query="machine learning",
include_raw_content=True,
scraper_max_length=2500 # первые 2500 символов
)
Reasoning + Answer
LLM сначала рассуждает о найденной информации (reasoning), затем генерирует финальный ответ с автоматическими ссылками:
💭 REASONING:
На основе найденных источников видно, что Tokio — это...
📄 ANSWER:
Tokio является самым популярным async runtime для Rust [1](https://github.com/tokio-rs/tokio)...
Автоматические отчеты
Все результаты сохраняются в reports/ с полной статистикой:
# AI Search Report
**Generated:** 02.10.2025 14:23:45
**Query:** machine learning basics
## Search Strategy
1. "ML fundamentals tutorial" → [wikipedia, youtube]
2. "machine learning introduction" → [arxiv, google scholar]
## Sources Found (15)
[REF1] Introduction to Machine Learning
URL: https://...
Score: 0.95
## Answer
Machine learning is... [1], [2]
## Statistics
- Total time: 8.45s
- Sources: 15
- Token usage: 12,456
Установка
Требования
- Python 3.13+
- SearXNG instance (локальный или удаленный)
- OpenAI-compatible API (OpenAI, OpenRouter, Together AI, etc.)
Quick Start
# 1. Установка зависимостей (uv рекомендуется)
uv sync
# 2. Настройка .env
cp .env.example .env
# Отредактируйте .env:
# OPENAI_API_KEY=your_key
# OPENAI_BASE_URL=https://api.openai.com/v1
# OPENAI_MODEL=gpt-4o-mini
# 3. Запуск SearXNG (Docker)
docker run -d -p 8999:8080 searxng/searxng:latest
# 4. Запуск
uv run main.py
Настройка SearXNG
По умолчанию клиент подключается к http://0.0.0.0:8999. Можно изменить:
client = SearXNGClient(searxng_url="http://your-searxng-instance:8080")
Настройка LLM
Поддерживает любой OpenAI-compatible API:
# OpenAI
OPENAI_API_KEY=sk-...
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4o-mini
# OpenRouter
OPENAI_API_KEY=sk-or-...
OPENAI_BASE_URL=https://openrouter.ai/api/v1
OPENAI_MODEL=deepseek/deepseek-chat
# Together AI
OPENAI_API_KEY=...
OPENAI_BASE_URL=https://api.together.xyz/v1
OPENAI_MODEL=meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo
Использование
CLI
uv run main.py
💬 Enter your query: How does Rust ownership work?
Программное использование
from main import main
import asyncio
# Запуск поиска
asyncio.run(main("quantum computing basics"))
Кастомный поиск
from searxng_client import SearXNGClient, SearXNGEngine
client = SearXNGClient()
# Поиск в научных базах
response = await client.search(
query="CRISPR gene editing",
search_engines=[
SearXNGEngine.ARXIV,
SearXNGEngine.PUBMED,
SearXNGEngine.SEMANTIC_SCHOLAR
],
max_results=10,
include_raw_content=True,
time_range="year" # за последний год
)
# Поиск кода
response = await client.search(
query="rust async tokio examples",
search_engines=[
SearXNGEngine.GITHUB,
SearXNGEngine.STACKOVERFLOW
],
max_results=5
)
Engine Groups
Используйте предопределенные группы движков:
from searxng_client import EngineGroups
# Научный поиск
response = await client.search(
"machine learning theory",
search_engines=EngineGroups.ACADEMIC
)
# IT и репозитории кода
response = await client.search(
"python async best practices",
search_engines=EngineGroups.IT_SCIENCE
)
Примеры запросов
# Технические вопросы
"Explain Rust borrow checker with examples"
"Compare React vs Vue performance 2025"
# Научные темы
"Latest research on quantum computing algorithms"
"CRISPR applications in medicine"
# Обучение
"Best resources to learn machine learning"
"Rust async programming tutorial"
# Новости и события
"What happened with OpenAI this week"
"Latest developments in fusion energy"
Структура проекта
perplexity-free/
├── main.py # Основная логика
├── searxng_client/ # SearXNG клиент
│ ├── __init__.py
│ ├── client.py # Асинхронный клиент
│ ├── engines.py # Список движков
│ └── models.py # Pydantic модели
├── reports/ # Сгенерированные отчеты
├── pyproject.toml
└── README.md
Конфигурация
Переменные окружения
# LLM API
OPENAI_API_KEY=your_key
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4o-mini
# SearXNG (опционально, если не используете дефолтный)
SEARXNG_URL=http://localhost:8999
Параметры скрапера
В client.py:
DEFAULT_SCRAPER_MAX_LENGTH = 2500 # Длина скрапленного текста
DEFAULT_SCRAPER_TIMEOUT = 10 # Таймаут запроса
DEFAULT_SCRAPER_USER_AGENT = "..." # User-Agent
API Reference
SearXNGClient
client = SearXNGClient(
api_key="", # Не используется
searxng_url="http://0.0.0.0:8999" # URL SearXNG
)
response = await client.search(
query: str, # Поисковый запрос
max_results: int = 10, # Макс. результатов
include_raw_content: bool = False, # Скрапить страницы?
search_engines: list | None, # Список движков
time_range: str | None, # "day" | "month" | "year"
scraper_max_length: int | None # Длина скрапленного текста
)
SearXNGEngine
# Примеры движков
SearXNGEngine.GITHUB
SearXNGEngine.ARXIV
SearXNGEngine.STACKOVERFLOW
SearXNGEngine.GOOGLE_SCHOLAR
# ... и еще 40+ движков
SearchResponse
class SearchResponse(BaseModel):
query: str # Исходный запрос
results: list[SearchResult] # Результаты поиска
response_time: float # Время выполнения
request_id: str # ID запроса
SearchResult
class SearchResult(BaseModel):
url: str # URL страницы
title: str # Заголовок
content: str # Сниппет
score: float # Релевантность (0-1)
raw_content: str | None # Скрапленный текст
metadata: dict | None # Доп. метаданные
Производительность
Типичное время выполнения:
- Query generation: ~2s
- Search (3 queries, 5 results each): ~3-5s
- Content scraping: ~2-4s (parallel)
- Answer generation: ~5-10s (streaming)
Total: ~10-20s в зависимости от сложности запроса и количества источников.
Ограничения
- Требуется запущенный SearXNG instance
- LLM API usage (токены)
- Скрапинг может быть медленным для большого количества страниц
- Некоторые сайты блокируют scraping
Roadmap
- [ ] Web UI (FastAPI + React)
- [ ] Кеширование результатов
- [ ] RAG с векторной БД
- [ ] Мультимодальность (изображения)
- [ ] История запросов
- [ ] API endpoints
- [ ] Docker compose для full stack
Зависимости
aiohttp>=3.12.15 # Async HTTP
beautifulsoup4>=4.14.2 # HTML parsing
langchain>=0.3.27 # LLM framework
openai>=2.0.1 # OpenAI API
pydantic>=2.11.9 # Data validation
python-dotenv>=1.1.1 # Env vars
License
Apache 2.0
Developed with ❤️ by @ascorblack