Perplexica と Ollama で LLM を利用した検索エンジンを試す

# はじめに

Perplexica は、前回紹介した [Farfalle](https://github.com/rashadphz/farfalle) と同様に Perplexity の様なAI搭載の対話型検索エンジンです。LLMとして、ローカルの Ollama が利用できます。また、ローカルで動作するメタ検索エンジン [SearXNG](https://github.com/searxng/searxng) を使用しています。

https://github.com/ItzCrazyKns/Perplexica

# セットアップ

## インストール

公式リポジトリで紹介されている Docker Compose を使う方法でインストールします。

```sh
git clone https://github.com/ItzCrazyKns/Perplexica.git
cd Perplexica
cp sample.config.toml config.toml
```

ここで、 `config.toml` を編集します。Ollamaを使う場合、`OLLAMA` のみ設定すればOKです。

```toml
# ... (前略) ...
OLLAMA = "http://host.docker.internal:11434"
```

また、docker-compose.yaml に以下を追記して、Ollama が同時に起動する様にすると便利です。

```yaml
services:
# ... 中略 ...
  ollama:
    image: ollama/ollama
    container_name: ollama
    ports:
      - 11434:11434
    volumes:
      - $HOME/.ollama:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    networks:
      - perplexica-network
```

設定が済んだら、起動します。
...と行きたいところですが、2024/6/18時点ではコードにバグがあるため、ファイルの修正が必要です。具体的には、 `ui/components/EmptyChat.tsx` と `ui/components/Navbar.tsx` の
 `ThemeSwitcher` の次の `size={17}` を削除します。
 参考：

 https://github.com/ItzCrazyKns/Perplexica/issues/177

```diff
--- a/ui/components/EmptyChat.tsx
+++ b/ui/components/EmptyChat.tsx
@@ -12,7 +12,7 @@ const EmptyChat = ({
 }) => {
   return (
     <div className="relative">
-      <ThemeSwitcher className="absolute top-2 right-0 lg:hidden" />
+      <ThemeSwitcher size={17} className="absolute top-2 right-0 lg:hidden" />

       <div className="flex flex-col items-center justify-center min-h-screen max-w-screen-sm mx-auto p-2 space-y-8">
         <h2 className="text-black/70 dark:text-white/70 text-3xl font-medium -mt-8">

--- a/ui/components/Navbar.tsx
+++ b/ui/components/Navbar.tsx
@@ -50,7 +50,7 @@ const Navbar = ({ messages }: { messages: Message[] }) => {
       </div>
       <p className="hidden lg:flex">{title}</p>

-      <ThemeSwitcher className="lg:hidden ml-auto mr-4" />
+      <ThemeSwitcher size={17} className="lg:hidden ml-auto mr-4" />

       <div className="flex flex-row items-center space-x-4">
         <Share
```

修正が済んだら、今度こそ起動します。

```sh
docker compose up -d
```

## 設定

`http://localhost:3000/` にアクセスします。

![Perplexica_01](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/651bc1f8-0460-28fd-9c76-ba71a47ded45.png)

設定画面で、Chat model Provider に Ollama を選択し、Chat Model で使いたいモデルを選択します。Farfalle と違って、選択できるモデルに制限はありません。また、Embedding model Provider も Ollama を選択し、Embedding Model で使いたいモデルを選択します。

![Perplexica_02](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/e7d81739-acdc-c43c-5dc1-4507c4586a04.png)

# 検索実行

前回と同じく、NVIDIA の CEO である Jen-Hsun Huang 氏について尋ねてみました。

![Perplexica_03](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/77c40b04-5ab9-cdf4-8241-380c26d2acec.png)

情報源が最初に表示され、画像や動画が右側に表示されるのは、本家 Perplexity と良く似ています。また、本家と同様に、フォーカスを選択できますし、ライブラリ機能もある様です。
更に、Copilot モードと言うものがあります。まだ開発途中ですが、さまざまなクエリを生成して検索を強化し、より関連性の高いインターネットソースを見つけるモードだそうです。

![Perplexica_05](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/731d10b5-3b62-d0e3-a7f8-ca4aa8809c04.png)

# まとめ

Perplexity の様な AI 搭載の対話型検索エンジンをローカルのみで動かせる Perplexica を試してみました。名前も構成も本家を強く意識した作りになっています。モデルの選択に制限が無い点やembedding modelも利用している点など、Farfalleより高機能・高性能が期待できますが、バグを放置したまま2週間ほど更新が止まっているのが気がかりです。