【ITニュース解説】Cara Membuat Plagiarism Checker (Bahasa Indonesia) — step-by-step (Postgres + Qdrant + sentence-transformers + Nuxt)
2025年09月25日に「Dev.to」が公開したITニュース「Cara Membuat Plagiarism Checker (Bahasa Indonesia) — step-by-step (Postgres + Qdrant + sentence-transformers + Nuxt)」について初心者にもわかりやすく解説しています。
ITニュース概要
PostgresやQdrant、Nuxtを使い、インドネシア語対応の剽窃チェッカーを構築する。文書を全文・段落・文単位でベクトル化し、既存データと類似度を比較して剽窃を検出するシステムだ。提出された課題などを自動で相互チェックできる。
ITニュース解説
この解説は、システムエンジニアを目指す初心者が、与えられたニュース記事の内容を理解し、実際に動作する剽窃チェッカーがどのように構築されているかを学ぶためのものである。このシステムは、PostgreSQL、Qdrant、sentence-transformers、そしてNuxtという現代的な技術スタックを組み合わせて、テキストの類似性を検出する機能を実現している。特にインドネシア語に対応し、文書全体、段落ごと、文ごとに剽窃をチェックできるのが特徴である。
まず、この剽窃チェッカーの全体像を把握しよう。システムは大きく分けて四つの主要なコンポーネントで構成されている。一つ目は、ユーザーが操作する画面を提供する「フロントエンドとAPIゲートウェイ」としてNuxtが使われている。これは、ユーザーインターフェースの提供と、バックエンドへのリクエストを中継する役割を担う。二つ目は、テキストの意味を理解し、数値のデータに変換したり、類似するテキストを探したりする「埋め込みと検索サービス」で、PythonとWebフレームワークのFastAPI、そしてsentence-transformersという技術がその役割を担う。三つ目は、変換された数値データを効率的に保存し、高速に検索するための「ベクトルデータベース」としてQdrantが利用されている。最後に、文書のタイトルや元のテキストといった「メタデータ」を保存する「リレーショナルデータベース」としてPostgreSQLが使われている。QdrantとPostgreSQLは異なる種類のデータを管理し、それぞれの専門性を生かして機能する。
これらのコンポーネントがどのように連携しているかを具体的に見ていこう。
開発環境の準備にはDockerとdocker-composeが推奨されている。これらを使うことで、PostgreSQLとQdrantのようなデータベースサービスを簡単にセットアップし、すぐに開発を始められる。docker-compose.ymlファイルには、PostgreSQLとQdrantの基本的な設定(イメージ名、環境変数、ポートマッピング、データ永続化のためのボリューム)が記述されており、docker-compose up -dコマンド一つでこれら二つのサービスをバックグラウンドで起動できる。これは開発者が環境構築の手間を大幅に削減できる便利な方法である。
次に、システムの心臓部であるバックエンドの「埋め込みと検索サービス」について深く掘り下げる。このサービスはPythonとFastAPIを使って構築されている。sentence-transformersというライブラリは、人間が理解する自然言語のテキストを、コンピューターが扱いやすい「ベクトル」と呼ばれる数値の配列に変換する役割を果たす。このプロセスを「埋め込み(Embedding)」と呼ぶ。具体的には、paraphrase-multilingual-mpnet-base-v2というモデルが使われており、これは多言語、特にインドネシア語の意味を効果的に捉えることができる。
このサービスには、テキストを受け取り、剽窃チェックを行い、その結果を返す/checkというAPIエンドポイントが用意されている。ユーザーから送信されたテキストは、まず「チャンク化」という処理によって、文書全体、段落ごと、そして文ごとに細かく分割される。これは、さまざまな粒度で剽窃を検出するために重要である。分割された各テキストチャンクは、sentence-transformersモデルを使ってそれぞれベクトルに変換される。
生成された各チャンクのベクトルは、Qdrantというベクトルデータベースに保存されている既存のベクトルと類似度を比較される。Qdrantは、このベクトルデータに特化したデータベースであり、コサイン類似度という手法を用いて、ベクトルの向きがどれだけ似ているか(つまり、テキストの意味がどれだけ似ているか)を数値で示す。検索時には、同じドキュメント内での自己一致を防ぐために、検索対象から現在のドキュメントのIDを除外するよう工夫されている。これにより、過去に登録された他のドキュメントとの類似性のみが検出される。
検出された類似性のスコアが事前に設定された閾値(デフォルトでは0.8)を超えた場合、そのテキストチャンクは剽窃の疑いがあると判断され、「フラグ付き」として報告される。この閾値は、より厳密に、またはより緩やかに検出するために調整可能である。 同時に、チェックされたドキュメントのメタデータ(ドキュメントID、タイトル、元のテキスト)はPostgreSQLに保存される。PostgreSQLは、構造化されたデータを堅牢に管理するのに適しており、ドキュメントの履歴や詳細情報を一元的に管理する役割を担う。そして、各テキストチャンクのベクトルデータとその関連情報(ドキュメントID、チャンクの種類、元のテキストなど)はQdrantに「アップサート(Upsert)」される。アップサートとは、データが存在しない場合は挿入し、存在する場合は更新するという操作を指し、これにより常に最新のデータがQdrantに保持される。このプロセスにより、新しくアップロードされた文書は、過去に蓄積されたすべての文書と自動的に比較され、剽窃が検出されるようになる。
フロントエンドのNuxtは、ユーザーがドキュメントID、タイトル、そしてチェックしたいテキストを入力するためのフォームを提供する。ユーザーがフォームを送信すると、NuxtのサーバーAPIルート(server/api/check.post.ts)がそのリクエストを受け取り、FastAPIで構築されたバックエンドサービスへと中継する。この中継の役割は、フロントエンドから直接バックエンドを呼び出すのではなく、セキュリティや設定の一元化のために一般的に採用される手法である。バックエンドからのチェック結果は、再びNuxtを通じてユーザーインターフェースに表示され、剽窃が疑われる文章や段落、そしてその類似元となるドキュメントの情報が分かりやすく提示される。
実際にシステムを運用する上では、いくつかのチューニングポイントがある。例えば、剽窃判定の閾値は、システムの目的や検出したい類似性のレベルに応じて0.7から0.85の範囲で調整することが推奨される。また、テキストをベクトルに変換する処理やQdrantでの検索処理は、大量のデータや高負荷な環境では時間を要する場合があるため、テキストのバッチ処理やGPUの活用によってパフォーマンスを向上させることができる。さらに、より正確な文の分割や単語の処理が必要な場合は、インドネシア語に特化した自然言語処理ライブラリ(例: spaCyのモデル)を導入することも検討される。 このようにして構築された剽窃チェッカーは、提出された複数の課題や文書を効率的に相互チェックし、不正行為の検出を支援する強力なツールとなる。システムエンジニアにとって、このように複数の技術要素を組み合わせ、具体的な課題解決に貢献するシステムを理解し構築する経験は、非常に価値のあるものとなるだろう。