なぜ私が検索に月額20ドル払うのをやめたのか
この1年で、私はPerplexity Proのサブスクリプションに240ドル以上を費やしてきました。ツール自体は素晴らしいものですが、機密性の高いプロジェクトのアイデアや独自のコードスニペットを含む検索履歴のすべてがサードパーティのサーバーに保存されることに、次第に不安を感じるようになりました。プライバシーを犠牲にすることなく、検索拡張生成(RAG)のパワーを手に入れたい。その答えがPerplexicaでした。
Perplexicaは、Perplexityのワークフローを再現した強力なオープンソースの代替ツールです。SearXNGを使用してライブウェブをクロールし、そのデータをClaude 3.5 SonnetやローカルのLlama 3インスタンスなどのLLMに渡して、引用付きの回答を生成します。この構成により、静的なLLMとリアルタイムのインターネットデータとのギャップを埋めつつ、データのフットプリントを完全にコントロールすることが可能になります。
クイックスタート:5分以内に立ち上げる
DockerとDocker Composeが準備できていれば、すぐに機能的なインスタンスをデプロイできます。まずはデフォルト設定から始めることをお勧めします。これにより、ローカルLLMの統合を試す前に、ネットワークが検索プロバイダーに到達できることを確認できます。
1. リポジトリのクローン
git clone https://github.com/ItS0hyam/perplexica.git
cd perplexica
2. 環境設定
Perplexicaのバックエンドロジックはsample.config.tomlファイルに依存しています。これをコピーして、アクティブな設定ファイルを作成します:
cp sample.config.toml config.toml
まだ大幅な編集を行う必要はありません。ただし、デフォルトのPORTとSEARCH_ENGINEの設定が環境と一致しているか、軽く確認しておくと良いでしょう。
3. Docker Composeで起動
以下のコマンドを実行して、必要なイメージをプルし、コンテナを起動します:
docker compose up -d
プロセスが完了すると、UIはhttp://localhost:3000でアクセス可能になり、バックエンドはhttp://localhost:3001でリクエストを処理します。検索バーが表示されれば、準備完了です。
仕組みを理解する:アーキテクチャ
Perplexicaを特定のワークフローに合わせて最適化するには、Next.jsフロントエンド、Node.jsバックエンド、そしてSearXNGエンジンの3つの柱からなる構造を理解する必要があります。
SearXNGの役割
SearXNGは、プライバシーに配慮したメタ検索エンジンとして機能します。Googleを直接クエリする代わりに、PerplexicaはSearXNGにリクエストを送信し、SearXNGがGoogle、Bing、DuckDuckGoの結果を集約します。検索結果が空で返ってくる場合、主な原因はポートの競合か、SearXNGコンテナ内でのIPブロックです。
LLMプロバイダーの選択
config.tomlはシステムの「脳」として機能します。検索データの処理には、主に2つのパスがあります:
- クラウドAPI: 1秒未満のレスポンスを求めるならGroq、高度な推論タスクにはAnthropicのClaude 3.5 Sonnetを使用します。
- ローカルホスティング: データの主権を100%維持することを優先する場合は、Ollamaが最適です。
圧倒的な速度と寛大な無料枠があるGroqを選択する場合(私のおすすめです)、設定は以下のようになります:
[API_KEYS]
GROQ = "ここにGroqのAPIキーを入力"
[GENERAL]
LLM_PROVIDER = "groq"
DYNAMIC_LLM_MODEL = "llama3-70b-8192"
ローカル環境の構築:Ollamaとの接続
セルフホストの真の醍醐味は、スタック全体を自前のハードウェア上で動かすことにあります。ホストマシンでOllamaを実行している場合、Dockerコンテナがそれと通信できるように設定する必要があります。ここで多くのユーザーが壁にぶつかります。
ステップ1:ネットワークバインディング
Ollamaはデフォルトで127.0.0.1に設定されていることが多く、これはDockerコンテナからは見えません。WindowsまたはMacの場合は、環境変数OLLAMA_HOST=0.0.0.0を設定してください。Linuxユーザーは、インターフェースをまたいだ通信を許可するためにsystemdサービスファイルを編集する必要があります。
ステップ2:config.tomlの更新
APIのURLを、localhostではなくマシンのDockerブリッジIPに向けるように設定します:
[GENERAL]
LLM_PROVIDER = "ollama"
OLLAMA_BASE_URL = "http://host.docker.internal:11434"
DYNAMIC_LLM_MODEL = "llama3"
注意:host.docker.internalはDocker Desktop用のショートカットです。ネイティブのLinuxサーバーを使用している場合は、通常172.17.0.1であるdocker0インターフェースのIPを使用してください。
ステップ3:検索フォーカスの調整
Perplexicaには、ソース資料を絞り込むための「フォーカスモード」があります。「Academic(学術)」モードに切り替えると、技術ドキュメントの調査時にS/N比(情報の精度)が大幅に向上します。SEO対策済みのブログをバイパスし、ホワイトペーパーや公式マニュアルを優先して検索します。
パフォーマンスとトラブルシューティング
このスタックを自宅のラボで数ヶ月運用してみて、最適化のための重要なポイントがいくつか見つかりました。
ポート競合の管理
スタックはデフォルトでポート3000と3001を使用します。PortainerのダッシュボードやNextcloudインスタンスをすでに実行している場合、Perplexicaは起動時にクラッシュします。その場合は、docker-compose.yamlでポートをマッピングし直すだけです:
services:
perplexica-frontend:
ports:
- "8080:3000" # ローカルのポート8080をコンテナにマッピング
ハードウェア要件
ローカルの8Bパラメータモデルとフルスタックを並行して実行し、快適な体験を得るには、少なくとも16GBのRAMが必要です。8GBしかない場合は、UIとSearXNGはローカルでホストし、LLMの処理はGroqやOpenAIのAPIにオフロードすることをお勧めします。
エンジンを最新の状態に保つ
Perplexicaの開発スピードは非常に速いです。環境を壊さずに最新の状態を保つには、以下の手順を実行してください:
git pull
docker compose build
docker compose up -d
検索エンジンのセルフホストは、単なるプライバシーへのこだわりではありません。サブスクリプションの階層による制限や、企業のフィルターによる調整を受けないツールを構築することなのです。一度プライベートで引用付きの検索を体験してしまうと、標準的な商用オプションに戻るのは非常に難しくなるでしょう。

