🌐

【速報】Ollama Web Search登場!ローカルLLM gemma3と組み合わせて"完全ローカルAIニュースデスク"を作ってみた!

に公開

ども!最新のAI技術を触りまくることに命を燃やすテックブロガーのタカマツです。

いやー、ついにこの日が来ちゃいましたね。2025年9月24日、我らがOllamaが、しれっとヤバすぎる新機能Web Searchをリリースしました。

https://ollama.com/blog/web-search

これ、何がヤバいって、今までローカルLLMの弱点だった「最新情報へのアクセス」を、Ollamaのエコシステム内だけで完結させられるようになったってことなんですよ。外部の検索APIキーを別途用意して…みたいな手間が、もういらない。

新しいおもちゃを手に入れたエンジニアがやることは一つ。とりあえず触って、何か作ってみる!

ってことで、早速 Ollama Web Search とローカルで動かす gemma3:4b を組み合わせて、AIが最新ニュースを収集・分析して、ジャーナリスト風の記事を自動生成してくれるアプリを作ってみました。

先に完成品をお見せしましょう。こんな感じです。


ね、ちょっとイイ感じでしょ?
この記事では、この「AI News Daily」をどうやって作ったのか、核心となるコードを抜粋しながら解説していきます。Ollamaの新しい可能性にワクワクしてる人は、ぜひ最後までついてきてください!

作ったもの:AI News Daily の仕組み

今回作ったアプリの処理フローは至ってシンプル。

  1. 🤖 Ollama Web Search でAI関連の最新ニュースを検索
  2. 📝 検索結果のURLから記事本文を取得
  3. 🧠 ローカルの gemma3:4b が内容を分析・要約
  4. ✍️ ジャーナリスト風の物語(ナラティブ)調で記事を生成

これをStreamlitでサクッとWebアプリ化しただけ。ポイントは、検索から記事生成まで、すべてOllamaの機能(とローカルモデル)で完結している点です。

ここがキモ!Ollamaを使い倒す2つの核心コード

さて、お待ちかねのソースコード解説です。今回はこのアプリの心臓部とも言える、特に重要な2つのコードブロックに絞って解説します。

1. Ollama Web Searchを使いこなす検索クライアント

まず、最新情報を引っ張ってくる検索部分。UniversalSearchClientクラスとして実装しました。

やっていることは公式の仕様に沿ったシンプルなものですが、REST APIとSDKを両方試すのがミソです。

app.py (UniversalSearchClient.search)
    # -------- 公開:検索(REST→SDK の順で試す) --------
    def search(self, query: str, max_results: int = 20) -> List[Dict]:
        # REST APIを先に試す
        res = self._try_ollama_http(query, max_results)
        if res:
            return res
        
        # ダメならSDKを試す
        res = self._try_ollama_sdk(query, max_results)
        if res:
            return res
            
        st.info("SDK/REST いずれも結果ゼロでした。APIキー・レート・ネットワークをご確認ください。")
        return []

    # -------- 1) 公式RESTエンドポイント(先に叩く:上限エラーを即検出) --------
    def _try_ollama_http(self, query: str, max_results: int) -> Optional[List[Dict]]:
        try:
            # 公式エンドポイントにPOSTリクエストを送る
            resp = self.session.post(
                self.fixed_search_url,
                json={"query": query},
                timeout=self.timeout
            )
            if resp.status_code == 200:
                # 結果を正規化して返す
                return self._normalize_search(resp.json())[:max_results]
            # ...エラー処理...
        except Exception as e:
            # ...例外処理...
        return None

なぜREST APIを先に試すかというとFail Fast (早く失敗させる)ため。APIキーの間違いや利用上限のエラー(401402)を素早く検知できるので、デバッグが楽になるんです。

ちなみに、OllamaのPythonライブラリはimport ollamaの瞬間にAPIキーを読み込む仕様なので、コードの一番最初os.environ["OLLAMA_API_KEY"] = "..."と設定しておくのが重要、というハマりどころも共有しておきますね。

2. gemma3:4bを"AIジャーナリスト"に変身させる魔法の呪文(プロンプト)

次に、検索結果を元に記事を生成する部分。ここでの主役は、ローカルで動くgemma3:4bと、それに与える"魔法の呪文"、つまりプロンプトです。

app.py (analyze_ai_news_narrative)
    system = textwrap.dedent("""
    あなたは経験豊富なAI技術ジャーナリストです。
    提供された情報源を深く分析し、読者に分かりやすく魅力的な記事を作成してください。
    
    重要な要件:
    - 各AIニュースについて、独立したセクションを作成する
    - 各セクションには明確な「タイトル」と詳細な「内容」を含める
    - 箇条書きは使用せず、流れるようなナラティブ(物語的)な文章で書く
    - 技術的な内容を一般読者にも理解できるよう噛み砕いて説明する
    - 各ニュースの背景、意義、影響を深く掘り下げる
    - 最後に「引用元一覧」セクションを追加し、[番号] URL の形式で列挙
    
    文章スタイル:
    - 読者を引き込む導入文から始める
    - 「である」調の落ち着いた文体
    - 具体例や比喩を用いて理解を促進
    """).strip()

見ての通り、かなり具体的に役割とタスクを指示しています。ポイントはただ要約してと頼むのではなく、「経験豊富なジャーナリストとして、背景や意義を深掘りして」とお願いしている点。こうすることで、比較的小さなモデルでも、期待を大きく上回る質の高いアウトプットを引き出せるんです。


全コードはこちらのGitHubリポジトリで公開中!

今回解説した核心部分を含むアプリケーションの全コードは、以下のGitHubリポジトリで公開しています。

https://github.com/tamagashi-makoto/zenn-ai-showcase/blob/main/Ollama_AI_News_Tools/publish4zenn.py

ぜひコード全体を眺めたり、フォークして自分だけのAIニュースアプリに改造したりして遊んでみてください!


動かしてみた結果と、正直な感想

さて、実際に「AI周りの今日のトレンドを教えて」と入力して生成された記事の一部がこちら。

誤認逮捕の悲劇:AIによる人種的偏見の再生産

AIは、感情や個人的な先入観に囚われない、冷静なツールとして期待されることが多い。しかし、現実には、人間が作成したデータから学習するため、AIは偏見を減らすのではなく、むしろそれを増幅する可能性がある。複数の事例と研究がこの点を明確に示している。

2021年、ミズーリ州セントルイス郡で発生した事件において、Mr. G氏は、顔認識AIによって誤って容疑者として特定され、16か月以上にわたり拘留された。DNA鑑定やアリバイといった明確な矛盾が存在するにも関わらず、捜査官はAIの出力に過度に信頼し、人種的偏見に基づいた誤認逮捕という悲劇を招いた。この事件は、AIの出力に盲信することの危険性を浮き彫りにし、人種的偏見が社会に根付いている現状を改めて認識させるものとなった。

gemma3:4bの記事生成能力、相変わらずイイ感じですよね。ローカルで動く4Bモデルでここまでできれば、十分すぎるクオリティです。

そして、肝心の検索結果の鮮度

実は、以前、APIキーが不要なGoogle/BingのRSSフィードをフォールバックとしてOllamaのLLMモデルで実装していた最初の試作版では、古いニュースが混ざってしまうのが少し気になっていました。「まぁGoogle/BingのRSSフィード版だし、今後の課題かな…」なんて思っていたんですが、今回Ollama公式のWeb Searchで実装をしたところ…。

…驚くほど結果が改善しました。

「9月28日のAIトレンド」と検索すれば、ちゃんとその日周辺のドンピシャな記事を的確に引っ張ってきてくれるようになったんです。以前のような数日前のニュースが混ざるストレスが、ほぼなくなりました。

これはもう、Ollama Web Searchのポテンシャルがこちらの想定を上回っていたということでしょう。シンプルなクエリだけでこれだけ精度の高い最新情報を返してくれるなら、複雑なフィルタリング処理を自前で実装する必要もなさそうです。いやー、正直ちょっと感動しました。

この鮮度と精度なら、リアルタイム性が求められるアプリケーションにも十分活用できそうですね!

まとめ:Ollamaの"第2章"が始まった音がする

いくつかの課題はありつつも、今回 Ollama Web Search を使ってみて感じたのは、あ、これでOllamaの遊び方のフェーズが変わったなということです。

これまでは「ローカルでLLMを動かせる」のが主な魅力でしたが、これからはローカルで、最新情報と連携した実用的なAIアプリを開発できるプラットフォームとして、さらに存在感を増していくはずです。

外部APIへの依存が減ることで、開発はもっとシンプルに、そして(ここ重要)お財布にも優しくなります。

今回私が作った「AI News Daily」は、その可能性のほんの一例です。みなさんもぜひ Ollama Web Search を使って、自分だけの面白いアプリケーションを爆速で開発してみてください。

それではまた、次の記事で!

Discussion