Rust × WASM ゼロコスト文章診断 — 推敲チェッカーの設計思想

サーバーレスポンス不要・APIコールゼロ。Rust で書いた解析エンジンをブラウザ上で直接実行する推敲チェッカーの技術設計と、創作支援ツールにおける「コストゼロ原則」の意味

Published: 2026-05-04

toolwritingtechwasmproofreading

はじめに — なぜサーバーが要らないのか

多くのオンライン文章診断ツールは、テキストをサーバーに送信し、解析結果を受け取るしくみになっています。シンプルに見えますが、これには3つの問題があります。

  1. プライバシー: 書きかけの小説がサーバーに送信される
  2. 速度: ネットワーク往復が加わるため、リアルタイム性が損なわれる
  3. コスト: サーバー側でリクエストを処理するたびに費用が発生する

hakadoru.ai の推敲チェッカーは、この3つの問題をすべて根本から解消する設計を採っています。解析処理をブラウザ内で実行する ことで、テキストはネットワークに出ません。サーバーへの接続は発生しません。処理コストはゼロです。

この設計を可能にしているのが、Rust で書かれた解析エンジンと WebAssembly(WASM)のコンパイルパスです。


アーキテクチャの概要

推敲チェッカーは以下の3コンポーネントで構成されています。

ProofreadingEngine(Rust crate)
  ├── Vibrato         — 形態素解析(IPAdic 辞書)
  ├── Daachorse       — 多パターン照合(Aho-Corasick)
  └── CheckOrchestrator — PC-01〜PC-12 の並列実行

このクレートは2つのターゲットにコンパイルされます。

ターゲット 用途
wasm32-unknown-unknown ブラウザ内の Web Worker で実行
x86_64-unknown-linux-gnu サーバーサイドのバッチ処理(将来対応)

ブラウザ側では、wasm-pack build --target no-modules でビルドした WASM モジュール(292KB)を Web Worker 内でロードし、チェック処理を UI スレッドとは分離して実行します。


Vibrato を選んだ理由

形態素解析器として Vibrato(ヴィブラート)を採用しています。MeCab 互換の辞書形式(IPAdic)を使いながら、Rust ネイティブで動作します。

WASM 環境で日本語形態素解析を実現する上で重要なのは、辞書のサイズ管理です。IPAdic の辞書は非圧縮だと 41MB になりますが、zstd 圧縮(ruzstd による純 Rust デコンプレッサ)を使うと 6.5MB まで圧縮できます。これを public/wasm/system.dic として配信し、ブラウザの gzip 転送エンコーディングと組み合わせることで、実際の転送サイズを約 7MB に抑えています。

辞書は初回ロード後にブラウザの Service Worker キャッシュに保存されるため、2回目以降の診断は即座に開始されます。


Daachorse によるパターン照合

NG語辞書の照合には Daachorse(ダーコース)を使用しています。Daachorse は Aho-Corasick 法を実装した高速なマルチパターンマッチングライブラリです。

NG語辞書は次の構造を持ちます。

pub struct NgEntry {
    pattern: String,           // 照合するパターン
    is_regex: bool,            // 正規表現フラグ
    description: String,       // UI 表示用の説明
    severity: Severity,        // error / warning / info
    category: Option<String>,  // 分類タグ(任意)
}

Daachorse オートマトンは辞書の内容から動的に構築されます。ユーザーがカスタム辞書を追加・更新したとき、オートマトンをミリ秒単位で再構築できるのが特徴です。


12のチェック項目(PC-01〜PC-12)

推敲チェッカーは 12 項目のチェックを実行します。Vibrato による形態素解析を1回だけ実行し、その結果をすべてのチェッカーで共有することで、処理効率を最大化しています。

ID チェック内容 手法
PC-01 語尾パターンの連続(だ・だった・ます の連続) TokenStream
PC-02 文長の分布(一文あたりの文字数) 句点区切り
PC-03 会話文と地の文の比率 括弧対応
PC-04 記号の過多(三点リーダ、感嘆符) Daachorse
PC-05 同語の近接反復(近い位置での単語の繰り返し) TokenStream
PC-06 表記ゆれ(同じ語の異なる漢字/かな表記) 読み仮名比較
PC-07 文字種の比率(漢字率・ひらがな率) Unicode ブロック
PC-08 会話文と地の文のバランス PC-03 共有
PC-09 投稿先プリセットのフォーマット規則 ルール照合
PC-10 文字数制限との照合 カウント
PC-11 禁則文字(JIS X 4051) 行頭行末判定
PC-12 改行パターン(不統一・過多) 正規表現

投稿先プリセット

Web 小説の主要投稿先に特化したフォーマットチェックを内蔵しています。

プリセット 主要チェック内容
小説家になろう ルビ記法 |漢字《かんじ》、挿絵タグの有無
カクヨム ルビ記法 《》、太字 **、章タイトル文字数
pixiv 小説 [newpage] タグ、ルビ記法 [[rb:漢字 > かんじ]]
アルファポリス ルビ記法(なろう互換)、章文字数の推奨範囲

ブラウザ完結の利点

プライバシー

テキストはブラウザ外に出ません。診断処理は完全にローカルで完結します。API ログにもサーバーログにも残りません。

即応性

ネットワーク往復がないため、診断ボタンを押してから結果が返るまでの時間は、テキストの長さに依存します。1万文字のテキストでも通常1秒以内に診断が完了します。

コストゼロ

サーバーへの接続がないため、チェックを何回実行してもサーバーコストは発生しません。

オフライン動作

初回ロード後は、インターネット接続がなくても診断を実行できます(Service Worker キャッシュが有効な場合)。


指標推移 — 作品全体の俯瞰

単一シーンの診断に加えて、作品全体の指標推移を可視化する機能があります。

全シーンを WASM エンジンで逐次解析し、4つの指標の推移を棒グラフで表示します。

指標 意味
漢字率 テキスト中の漢字の割合
ひらがな率 テキスト中のひらがなの割合
会話文率 テキスト全体に占める会話文の割合
平均文長 1文あたりの平均文字数

全シーンの平均から 1.5σ 以上外れたシーンを赤色でハイライトし、文体の逸脱を一目で確認できます。


設計思想 — LLM を使わない選択

推敲チェッカーは、LLM(大規模言語モデル)を一切使用しません。

LLM は柔軟で創造的な応答が可能ですが、「語尾が3文連続している」「文字数が2万字を超えている」といった 機械的・決定論的な検査 には向いていません。

  • 毎回異なる応答が返ってくる(非決定論的)
  • 処理コストが高い(トークン消費)
  • 根拠の説明が必要な場合、プロンプト設計が複雑になる

hakadoru.ai では、こうした機械的な品質チェックを決定論的なルールベースエンジンで処理し、LLM は「創造的な支援」にのみ使うという役割分担を採っています。

推敲チェッカーで機械的な問題を取り除いた後、LLM を使った熟考モードや変換エンジンで表現を磨く——この2段階のパイプラインが、コストと品質の最適なバランスを実現しています。


まとめ

hakadoru.ai の推敲チェッカーは次の設計原則で構築されています。

  1. ブラウザ完結 — テキストをサーバーに送らない
  2. Rust ネイティブ — 高速・決定論的・安全なメモリ管理
  3. 役割分担 — 機械的チェックは決定論的エンジン、創造的支援は LLM
  4. コストゼロ — サーバーコストをユーザーに転嫁しない

推敲チェッカーは /tools/proofreading から無料でご利用いただけます。ログインも登録も不要です。

ぜひ、書いたシーンを貼り付けてみてください。

Rust × WASM ゼロコスト文章診断 — 推敲チェッカーの設計思想 — hakadoru.ai