LLMをチャットとして実用的に使う上でWeb検索は欠かせない機能要素だろう。
ラフに訊ねた文言から検索キーワードを良い感じに定めて検索を実行し、複数のサイトから情報を拾って時には翻訳までして情報をまとめてくれる。
LLMの性質上どこまでいってもハルシネーションの懸念はあるので全幅の信頼を寄せることはできないものの、ユーザビリティを損ねるWeb広告があふれる昨今では粗めの情報を手っ取り早く得るには便利な手段ではある。
さて、ローカルLLMをWebチャットとして運用できるOpenWebUIにも勿論この機能は搭載されており、検索エンジンとして色々なサービスを選ぶことができる。
ただ、大抵のものにはAPIキーの登録だったり場合によっては課金が必要なようで、ちょっとプライベートでお試しで触るには気兼ねしてしまうところがある。
DDGSはそのあたりの手間なく使えはするんだけど、中身としてはスクレイピングで各種検索エンジンの結果を拾う感じのものなので、実際に触ってると割とすぐにRateLimitに引っかかったりして、ちゃんと使うには辛い印象を持っている。


そこでもう一つの選択肢となるのが、Searxngというメタ検索エンジンをローカルで立ち上げて繋ぐという方法。
こちらも本質的にはDDGSと同じくスクレイピングによるものではあるんだけど、複数のエンジンへの検索結果を集約できたり良い感じにLimitに引っかからないように加減してくれたり細かい設定ができたりするので、体感ベースだけど丸く使える印象。
それでは実際にDockerコンテナとして立ち上げてみる。
以下のようなcompose.ymlを作成する。また、configというディレクトリをあらかじめ用意しておく。
※前回前々回のドメインおよびtraefikがある前提で作っているけど、そうじゃない環境は普通にportsで内部の8080ポートを出す感じで良いと思う
services:
searxng:
image: searxng/searxng:latest
container_name: searxng
volumes:
- "./config:/etc/searxng"
environment:
- "BASE_URL=http://0.0.0.0:8080/"
- "INSTANCE_NAME=SEARXNG"
networks:
- traefik-network
labels:
traefik.enable: true
traefik.http.routers.searxng.rule: Host(`searxng.<取得したドメイン>`)
traefik.http.services.searxng.loadbalancer.server.port: 8080
restart: unless-stopped
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
networks:
traefik-network:
external: true
一旦docker compose upで起動するとconfigディレクトリ内にsettings.ymlファイルが作成されるので、その中のformats項にjsonを追記しておく。
# remove format to deny access, use lower case.
# formats: [html, csv, json, rss]
formats:
- html
- json
以上でdocker compose up -dで起動してブラウザでアクセスしてちゃんと動くことを確認する。



Searxngが単体で動くことが確認できたら、OpenWebUIの設定を行っていく。
アイコンをクリックして出てくるメニューから管理者パネルを開き、設定>ウェブ検索に移動。
ウェブ検索をONにして、ウェブ検索エンジンとしてsearxngを選択、SearxngクエリURLとして以下のような設定を入れる。
http://searxng.******/search?lang=ja&q=<query>

処理時間がかかってでも中身をちゃんと踏まえてほしいので、「埋め込みと検索をバイパス」も個人的にはONの方が良いのかなって感触を持ってる。
これでチャットからのウェブ検索が動くことが確認できる。
