Search Infrastructure Open Source

Perplexity-Free

Опенсорсный AI-поиск с генерацией поисковой стратегии, агрегацией источников и финальными ответами со ссылками.

🔍 Perplexity-Free

AI-powered search & answer system — распределенная система поиска и генерации ответов на базе LLM, использующая SearXNG для агрегации результатов из множества источников.

Что это?

Perplexity-Free — это опенсорсная альтернатива Perplexity.ai, которая:

  1. Умно формирует поисковые запросы — использует LLM для генерации оптимальных запросов под разные поисковые движки
  2. Ищет в специализированных источниках — GitHub, arXiv, PubMed, StackOverflow, Wikipedia и 40+ других движков
  3. Скрапит и анализирует контент — собирает полный текст страниц для глубокого анализа
  4. Генерирует развернутые ответы — создает подробные ответы с reasoning и ссылками на источники
  5. Сохраняет отчеты — все результаты автоматически сохраняются в 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