日本語に強くローカルで動作!テキスト埋め込みモデルPLaMo-Embedding-1Bを試してみた

日本語に強くローカルで動作!テキスト埋め込みモデルPLaMo-Embedding-1Bを試してみた

Clock Icon2025.04.18

はじめに

Preferred Networks様から、PLaMoをベースとしたテキスト埋め込みモデルPLaMo-Embedding-1Bが発表されました。Apache v2.0ライセンスで公開されており、商用利用を含めて自由に利用可となっています。詳細内容は以下のリリースをご参照ください。

https://tech.preferred.jp/ja/blog/plamo-embedding-1b/

開発の内容は以下をご参照ください。
https://tech.preferred.jp/ja/blog/plamo-based-embedding/

日本語テキスト埋め込みモデルとしてもトップクラスの性能とのことです。

https://x.com/preferred_jp/status/1912689053297963107

ローカルで動作するテキスト埋め込みモデルは以下のようなメリットがあります。

  • ベクトル化のコストが計算資源のみのため、大量の文章の埋め込みも可能
  • 文章がネットワークから出ることなくベクトル化可能

製造業のように工場からデータを出したくないようなケースなどにも活用が見込めます。

試してみる

前提

環境は以下の通りです。

要素 バージョン
チップ Apple M1(13-inchi, M1, 2020)
メモリ 16GB
macOS Sonoma 14.2.1
python 3.12.3

リポジトリはこちらです。今回紹介するコード及び、利用しているライブラリのバージョンの詳細はこちらはご確認ください。

https://github.com/shuntaka9576/plamo-embed

  • 補足
    • Python 3.13だとsentencepieceがuv add時に依存のエラーが発生したため3.12を使っています

READMEサンプル

まずはhuggingfaceからREADME_jaのサンプルを動かしてみます。

https://huggingface.co/pfnet/plamo-embedding-1b/blob/main/README_ja.md

文書をencode_documentメソッドでベクトルに変換し、クエリをencode_queryメソッドでベクトル(埋め込み)に変換してコサイン類似度を出力するサンプルです。

import torch
import torch.nn.functional as F
from transformers import AutoModel, AutoTokenizer

# 🤗 Huggingface Hubから以下のようにしてモデルをダウンロードできます
tokenizer = AutoTokenizer.from_pretrained(
    "pfnet/plamo-embedding-1b", trust_remote_code=True
)
model = AutoModel.from_pretrained("pfnet/plamo-embedding-1b", trust_remote_code=True)

device = "cuda" if torch.cuda.is_available() else "cpu"
model = model.to(device)

query = "PLaMo-Embedding-1Bとは何ですか?"
documents = [
    "PLaMo-Embedding-1Bは、Preferred Networks, Inc. によって開発された日本語テキスト埋め込みモデルです。",
    "最近は随分と暖かくなりましたね。",
]

with torch.inference_mode():
    # 情報検索におけるクエリ文章の埋め込みに関しては、`encode_query` メソッドを用いてください
    # tokenizerも渡す必要があります
    query_embedding = model.encode_query(query, tokenizer)
    # それ以外の文章に関しては、 `encode_document` メソッドを用いてください
    # 情報検索以外の用途についても、 `encode_document` メソッドを用いてください
    document_embeddings = model.encode_document(documents, tokenizer)

# モデルに文章を入力して得られたベクトル間の類似度は、近い文章は高く、遠い文章は低くなります
# この性質を用いて情報検索などに活用することができます
similarities = F.cosine_similarity(query_embedding, document_embeddings)
print(similarities)

初回はダウンロードの時間が入りますが、次回以降は必要ありません。

$ python3 main.py  
tokenizer_config.json: 100%|█████████████████████████████████████████████████████████████| 1.30k/1.30k [00:00<00:00, 1.85MB/s]
tokenization_plamo.py: 100%|█████████████████████████████████████████████████████████████| 7.63k/7.63k [00:00<00:00, 7.62MB/s]
A new version of the following files was downloaded from https://huggingface.co/pfnet/plamo-embedding-1b:
- tokenization_plamo.py
. Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.
tokenizer.model: 100%|█████████████████████████████████████████████████████████████████████| 805k/805k [00:00<00:00, 2.75MB/s]
special_tokens_map.json: 100%|███████████████████████████████████████████████████████████████| 477/477 [00:00<00:00, 5.54MB/s]
config.json: 100%|███████████████████████████████████████████████████████████████████████| 1.09k/1.09k [00:00<00:00, 4.66MB/s]
modeling_plamo.py: 100%|█████████████████████████████████████████████████████████████████| 38.9k/38.9k [00:00<00:00, 2.98MB/s]
A new version of the following files was downloaded from https://huggingface.co/pfnet/plamo-embedding-1b:
- modeling_plamo.py
. Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.
model.safetensors:  77%|██████████████████████████████████████████████████▎              | 1.63G/2.10G [10:37<02:55, 2.71MB/s]

model.safetensors: 100%|█████████████████████████████████████████████████████████████████| 2.10G/2.10G [13:48<00:00, 2.54MB/s]
tensor([0.8812, 0.5533])

DL時間を除けば、大体10秒程度で終わります。

sqlite-vssを使ってセマンティック検索をしてみる

sqlite-vss とは、SQLiteでFaiss(ベクトル検索ライブラリ)を使えるようにする、SQLiteの拡張モジュールです。

https://zenn.dev/koron/articles/8925963f432361

今回はブログ文章を埋め込んで、検索を行い意味的に近い文章を取得できるか確認します。ソースコードの全文は以下の通りです。それぞれ解説します。

https://github.com/shuntaka9576/plamo-embed/blob/a26f97291a5c1c2f754ed414df5eb2ea17f8e371/blog_search_demo.py#L1-L232

SQliteとsqlite_vssの初期化を行ます。
https://github.com/shuntaka9576/plamo-embed/blob/a26f97291a5c1c2f754ed414df5eb2ea17f8e371/blog_search_demo.py#L196-L198
https://github.com/shuntaka9576/plamo-embed/blob/a26f97291a5c1c2f754ed414df5eb2ea17f8e371/blog_search_demo.py#L18-L25

テーブルと投入するブログのサンプルデータを定義します。サンプルデータは全く異なる業界のデータを3つずつ投入しています。
https://github.com/shuntaka9576/plamo-embed/blob/a26f97291a5c1c2f754ed414df5eb2ea17f8e371/blog_search_demo.py#L28-L109

ブログのサンプルデータをsqlite及びsqlite-vssに紐付けながら投入します。
https://github.com/shuntaka9576/plamo-embed/blob/a26f97291a5c1c2f754ed414df5eb2ea17f8e371/blog_search_demo.py#L111-L136

DBの初期化が終わったので、検索クエリをループで実行します。
https://github.com/shuntaka9576/plamo-embed/blob/a26f97291a5c1c2f754ed414df5eb2ea17f8e371/blog_search_demo.py#L203-L219

encode_queryを利用して、クエリをベクトル化します。
https://github.com/shuntaka9576/plamo-embed/blob/a26f97291a5c1c2f754ed414df5eb2ea17f8e371/blog_search_demo.py#L152-L157

検索後、クエリベクトルとデータベース内の各ベクトルとの「距離」が近いものの上位3つを結果で返します。
https://github.com/shuntaka9576/plamo-embed/blob/a26f97291a5c1c2f754ed414df5eb2ea17f8e371/blog_search_demo.py#L159-L193

その結果を表示します。
https://github.com/shuntaka9576/plamo-embed/blob/a26f97291a5c1c2f754ed414df5eb2ea17f8e371/blog_search_demo.py#L222-L225

実行結果は以下の通りです。埋め込みと検索含めても14秒程度で終わります。検索結果も意味的に近いものが取得できています!

$ make exec
rm -f blog_search.db
uv run blog_search_demo.py
SQLite VSS バージョン: v0.1.2
/Users/shuntaka/repos/github.com/shuntaka9576/plamo-embed/blog_search_demo.py:112: DeprecationWarning: The default datetime adapter is deprecated as of Python 3.12; see the sqlite3 documentation for suggested replacement recipes
  cursor.execute(
データベースのセットアップが完了しました。

===== セマンティック検索デモ =====

検索クエリ: '機械学習について教えて'
検索結果 (上位 3):
1. 機械学習入門:基本概念とアルゴリズム - 類似度: -15627.5439
   URL: https://example.com/ml-intro
   概要: 機械学習は人工知能の一分野で、コンピュータがデータから学習し予測や判断を行う技術です。教師あり学習、教師なし学習、強化学習などの種類があります。
2. 深層学習の基礎:ニューラルネットワーク入門 - 類似度: -20483.5000
   URL: https://example.com/deep-learning
   概要: 深層学習はニューラルネットワークを多層化した機械学習手法です。画像認識、自然言語処理、音声認識など様々な分野で革命的な進歩をもたらしています。
3. 自然言語処理の最新トレンド - 類似度: -22065.3945
   URL: https://example.com/nlp-trends
   概要: 自然言語処理は人間の言語をコンピュータに理解させる技術です。Transformer、BERTなどのモデルの登場により、機械翻訳や質問応答システムが大きく進化しました。

検索クエリ: 'ニューラルネットワークの仕組み'
検索結果 (上位 3):
1. 深層学習の基礎:ニューラルネットワーク入門 - 類似度: -20647.8750
   URL: https://example.com/deep-learning
   概要: 深層学習はニューラルネットワークを多層化した機械学習手法です。画像認識、自然言語処理、音声認識など様々な分野で革命的な進歩をもたらしています。
2. 自然言語処理の最新トレンド - 類似度: -23973.9805
   URL: https://example.com/nlp-trends
   概要: 自然言語処理は人間の言語をコンピュータに理解させる技術です。Transformer、BERTなどのモデルの登場により、機械翻訳や質問応答システムが大きく進化しました。
3. 機械学習入門:基本概念とアルゴリズム - 類似度: -24846.5742
   URL: https://example.com/ml-intro
   概要: 機械学習は人工知能の一分野で、コンピュータがデータから学習し予測や判断を行う技術です。教師あり学習、教師なし学習、強化学習などの種類があります。

検索クエリ: '最新のがん治療について知りたい'
検索結果 (上位 3):
1. 最新のがん治療法とその効果 - 類似度: -14060.3242
   URL: https://example.com/cancer-treatment
   概要: がん治療は免疫療法や標的治療など革新的な手法が開発されています。従来の化学療法や放射線治療と比較して、より特異的で副作用の少ない治療が可能になってきま した。
2. 医療AIの進化と倫理的課題 - 類似度: -23695.0703
   URL: https://example.com/medical-ai
   概要: 医療分野でのAI活用は画像診断支援や治療計画の最適化など様々な場面で進んでいます。しかし、診断の責任や患者データのプライバシーなど、倫理的課題も多く存在 します。
3. 生活習慣病の予防と管理 - 類似度: -26791.4961
   URL: https://example.com/lifestyle-disease
   概要: 糖尿病、高血圧、脂質異常症などの生活習慣病は適切な食事管理と運動で予防・改善できます。定期的な健康診断により早期発見と適切な介入が重要です。

検索クエリ: '生活習慣病の予防法'
検索結果 (上位 3):
1. 生活習慣病の予防と管理 - 類似度: -11857.6172
   URL: https://example.com/lifestyle-disease
   概要: 糖尿病、高血圧、脂質異常症などの生活習慣病は適切な食事管理と運動で予防・改善できます。定期的な健康診断により早期発見と適切な介入が重要です。
2. 最新のがん治療法とその効果 - 類似度: -26957.2812
   URL: https://example.com/cancer-treatment
   概要: がん治療は免疫療法や標的治療など革新的な手法が開発されています。従来の化学療法や放射線治療と比較して、より特異的で副作用の少ない治療が可能になってきま した。
3. 投資初心者のための資産運用入門 - 類似度: -27317.4531
   URL: https://example.com/investment-basics
   概要: 資産運用は分散投資とリスク管理が基本です。株式、債券、不動産など異なる資産クラスへ配分することで、市場変動の影響を抑えつつ安定したリターンを目指せます 。

検索クエリ: '初心者向け投資方法'
検索結果 (上位 3):
1. 投資初心者のための資産運用入門 - 類似度: -19481.0039
   URL: https://example.com/investment-basics
   概要: 資産運用は分散投資とリスク管理が基本です。株式、債券、不動産など異なる資産クラスへ配分することで、市場変動の影響を抑えつつ安定したリターンを目指せます 。
2. フィンテックがもたらす金融革命 - 類似度: -26734.8125
   URL: https://example.com/fintech-revolution
   概要: フィンテックは金融とテクノロジーを融合した新サービスです。モバイル決済、ロボアドバイザー、クラウドファンディングなど、従来の銀行システムを変革していま す。
3. 暗号資産の仕組みと将来性 - 類似度: -27031.0977
   URL: https://example.com/crypto-future
   概要: ビットコインやイーサリアムなどの暗号資産はブロックチェーン技術を基盤としています。分散型金融(DeFi)やNFTなど、新たな応用領域も広がっています。

検索クエリ: '暗号通貨とブロックチェーン'
検索結果 (上位 3):
1. 暗号資産の仕組みと将来性 - 類似度: -13141.6260
   URL: https://example.com/crypto-future
   概要: ビットコインやイーサリアムなどの暗号資産はブロックチェーン技術を基盤としています。分散型金融(DeFi)やNFTなど、新たな応用領域も広がっています。
2. フィンテックがもたらす金融革命 - 類似度: -20126.8438
   URL: https://example.com/fintech-revolution
   概要: フィンテックは金融とテクノロジーを融合した新サービスです。モバイル決済、ロボアドバイザー、クラウドファンディングなど、従来の銀行システムを変革していま す。
3. 自然言語処理の最新トレンド - 類似度: -24633.2383
   URL: https://example.com/nlp-trends
   概要: 自然言語処理は人間の言語をコンピュータに理解させる技術です。Transformer、BERTなどのモデルの登場により、機械翻訳や質問応答システムが大きく進化しました。

さいごに

今回はPreferred Networks様のテキスト埋め込みモデル(PLaMo-Embedding-1B)を試しました。要求されるマシンスペックが低いので非常に大量の文章の埋め込みが可能で夢が広がりますね。ラズパイでも動作させられそうです。また最近話題のMCPもAPIキーを使わず、セキュアなローカルRAGMCPが出来そうですね!

Node.jsで動かしたかったのですが、pytorchやtransformersがないので難しそうでした。調べたらbindingがありそうなので別記事で試してみます。この記事をベースにMCPを作るならuvxですね!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.