文章の要約に生成AIを使いたい。けれど、手元の文書をそのまま貼り付けてよいものか迷う。この記事は、その迷いを出発点に作った[Summarin](/)というサービスについて、なぜローカルで動く言語モデルを選んだのかを書いたものです。

貼り付けてよいのか分からない、という壁

長い議事録や報告書を前にして、要約したいと思う場面はよくあります。しかし実際に生成AIのサービスへ貼り付けようとすると、手が止まります。

  • 入力した文章が、モデルの学習に使われるのではないか
  • そもそも、社外のサービスに業務上の文書を送ってよいのか

後者は規程の問題なので、個人の判断ではどうにもなりません。前者については、主要なサービスの多くが「入力を学習に使わない」と明示するようになりました。それでも、送った文章が自分の手を離れて外部のサーバーに渡るという事実は変わりません。

この「技術的には問題なくても、気持ちとして踏み切れない」という感覚は、私自身が業務で感じていたものでした。

選択肢は2つあった

言語モデルを使う方法は、大きく2つに分かれます。

1つ目は、事業者が提供するAPIを呼び出す方法です。 高い性能のモデルをすぐに使えますし、サーバーの用意も要りません。開発の手間は圧倒的に小さくて済みます。一方で、入力した文章は事業者のサーバーへ送られます。

2つ目は、自分で管理する環境でモデルを動かす方法です。 文章が外部へ出ていかないため、先ほどの懸念は小さくなります。そのかわり、モデルの選定、動かす環境の用意、速度と費用の調整を、すべて自分で引き受けることになります。

Summarinでは2つ目を選びました。「入力が外部に出ない」という一点が、このサービスで一番伝えたい価値だったからです。

小さなモデルで足りるのか

ローカルで動かすとなると、使えるモデルの大きさには限りがあります。数百億のパラメータを持つモデルを個人のサーバーで動かすのは現実的ではありません。

ただ、ここで考えを切り替えました。必要なのは「何でもできるモデル」ではなく、「要約ができるモデル」です。

要約や要点抽出は、用途としてはかなり狭い作業です。自由な対話や複雑な推論は必要ありません。であれば、小さなモデルでも十分に戦えるはずです。

小さなモデルの弱点は、出力の形式が揃わないこと

とはいえ、小さなモデル(SLM)をそのまま使うと困る点がありました。知識はある程度持っているものの、出力の形式が固定できないのです。同じ指示を与えても、返ってくる形が毎回揺れます。

そこで、出力の形式を揃えた学習データを用意し、そのデータでチューニングを行いました。 これによって形式が安定し、あわせて要約の精度も用途に合わせられるようになりました。Summarinが使っているのは、Googleが公開しているGemmaをこの方法で調整したモデルです。

現在は2つのモデルを用意していて、画面から選べるようにしています。

モデル特徴
Gemma 3 1B軽量で応答が速い。まず試すならこちら
Gemma 4 E2Bより自然で、内容を汲んだ出力になりやすい

同じ文章でも結果は変わるので、片方で納得できなければもう片方を試せる、という作りにしています。

動かす場所をどうするか

モデルを動かす基盤には、llama.cppを使っています。GGUF形式に変換したモデルを読み込んで推論する仕組みで、量子化によってメモリの使用量を大きく減らせます。

サーバーはGoogle Cloud Runです。個人開発で常時稼働のGPUサーバーを持つのは現実的ではないので、アクセスがないときは費用がかからない構成を選びました。

コールドスタートとの戦い

ただし、この構成には避けられない弱点があります。アクセスが無い間はサーバーが停止しているため、最初のリクエストが来てから起動が始まるという点です。そのままでは、モデルをメモリに展開し終えるまで待たせることになります。

対策として2つのことをしています。

  1. モデルをあらかじめダウンロードした状態でイメージに焼き込む — 起動のたびにモデルを取りに行く時間をなくします
  2. 複数のモデルを並列でメモリに展開する — 順番に読み込むと提供モデルを増やすほど遅くなるため、同時に展開します

この2つによって、2種類のモデルを用意しても起動の遅れが大きくならないようにしています。

入力した文章をどう扱っているか

「外部に送らない」と書きましたが、では自分のサーバーでは何をしているのか。ここは正直に書いておきます。

  • 入力された文章をモデルの学習には使っていません。
  • 他社の生成AIサービスへ転送することもありません。 要約はすべて自分が管理しているサーバー上で完結します。
  • ただし、どんなキーワードを含む文章が入力されたかという統計は取っていて、その結果を要約トレンドとして公開しています。ここで表示しているのは単語の出現回数だけで、入力された文章そのものが公開されることはありません。

詳しい内容はプライバシーポリシーに書いています。

作ってみて思うこと

性能だけを比べれば、大手のサービスには及びません。3,500文字という入力の上限もありますし、長い文章では要約が物足りないこともあります。

それでも、複雑な用途でなければローカルLLMで十分に間に合う、というのが実際に作ってみた感想です。速度、費用、情報の扱いやすさのどこに重心を置くかは、使う場面によって変わります。Summarinは、そのうちの一つの答えとして作りました。

チューニング済みのモデルではありますが、このサービスを通して、ローカルLLMがどの程度のものかを知っていただけたらうれしいです。今後もよいモデルが出てきたら、順次追加していく予定です。

実際の出力がどの程度のものかは、要約サンプル集で原文とあわせて公開しています。よろしければ[実際の画面](/)でもお試しください。