以下の内容はhttps://kazuhira-r.hatenablog.com/entry/2025/08/30/170219より取得しました。


ローカルで動く日本語のテキスト埋め込みモデル、PLaMo-Embedding-1Bを動かしてみる(+最近の日本語のテキスト埋め込みモデル)

これは、なにをしたくて書いたもの?

ローカルで動かせる日本語のモデルはたまに把握しておきたいと思うのですが、今回はテキスト埋め込みモデルであるPLaMo-Embedding-1Bを
少し動かしてみます。

ついでに、他のモデルも少しメモ。

PLaMo-Embedding-1B

PLaMo-Embedding-1Bについてのブログはこちら。

テキスト埋め込みモデルPLaMo-Embedding-1Bの開発 - Preferred Networks Research & Development

Hugging Faceで公開されています。

pfnet/plamo-embedding-1b · Hugging Face

JMTEBのベンチマークで計測するとかなり高くなるようです。

GitHub - sbintuitions/JMTEB: The evaluation scripts of JMTEB (Japanese Massive Text Embedding Benchmark)

Leaderboard。

https://github.com/sbintuitions/JMTEB/blob/main/leaderboard.md

現在は、他にはこのあたりのモデルもスコアが高いようです。

PLaMo-Embedding-1BはTransformer、Sarashina-Embedding-v1-1BとRuri v3はSentence Transformersで動かすようです。

サンプルコードを動かしてみます。

環境

今回の環境はこちら。

$ python3 --version
Python 3.12.3


$ uv --version
uv 0.8.14

CPU環境です。

PLaMo-Embedding-1Bを動かしてみる

uvでプロジェクトを作成。

$ uv init --vcs none plamo-embedding-example
$ cd plamo-embedding-example
$ rm main.py

ライブラリーを追加。

$ uv add sentencepiece torch transformers
$ uv add --dev mypy ruff

pyproject.toml

[project]
name = "plamo-embedding-example"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
    "sentencepiece>=0.2.1",
    "torch>=2.8.0",
    "transformers>=4.56.0",
]

[dependency-groups]
dev = [
    "mypy>=1.17.1",
    "ruff>=0.12.11",
]

[tool.mypy]
strict = true
disallow_any_unimported = true
disallow_any_expr = true
disallow_any_explicit = true
warn_unreachable = true
pretty = true

インストールされたライブラリーの一覧。

$ uv pip list
Package                  Version
------------------------ ---------
certifi                  2025.8.3
charset-normalizer       3.4.3
filelock                 3.19.1
fsspec                   2025.7.0
hf-xet                   1.1.9
huggingface-hub          0.34.4
idna                     3.10
jinja2                   3.1.6
markupsafe               3.0.2
mpmath                   1.3.0
mypy                     1.17.1
mypy-extensions          1.1.0
networkx                 3.5
numpy                    2.3.2
nvidia-cublas-cu12       12.8.4.1
nvidia-cuda-cupti-cu12   12.8.90
nvidia-cuda-nvrtc-cu12   12.8.93
nvidia-cuda-runtime-cu12 12.8.90
nvidia-cudnn-cu12        9.10.2.21
nvidia-cufft-cu12        11.3.3.83
nvidia-cufile-cu12       1.13.1.3
nvidia-curand-cu12       10.3.9.90
nvidia-cusolver-cu12     11.7.3.90
nvidia-cusparse-cu12     12.5.8.93
nvidia-cusparselt-cu12   0.7.1
nvidia-nccl-cu12         2.27.3
nvidia-nvjitlink-cu12    12.8.93
nvidia-nvtx-cu12         12.8.90
packaging                25.0
pathspec                 0.12.1
pyyaml                   6.0.2
regex                    2025.8.29
requests                 2.32.5
ruff                     0.12.11
safetensors              0.6.2
sentencepiece            0.2.1
setuptools               80.9.0
sympy                    1.14.0
tokenizers               0.22.0
torch                    2.8.0
tqdm                     4.67.1
transformers             4.56.0
triton                   3.4.0
typing-extensions        4.15.0
urllib3                  2.5.0

あとは動かしてみます。

サンプルコードを参考に、こんな感じで作成。

app.py

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

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():
    query_embedding = model.encode_query(query, tokenizer)
    print(f"query embegging: {query_embedding}, size: {query_embedding.numel()}")

    document_embeddings = model.encode_document(documents, tokenizer)
    print(
        f"document embeddings: {document_embeddings}, size: {document_embeddings[0].numel()}, {document_embeddings[1].numel()}"
    )

similarities = F.cosine_similarity(query_embedding, document_embeddings)
print(f"similarities: {similarities}")

追加しているのは要素数を表示しているくらいですけどね。

確認。

$ uv run app.py
query embegging: tensor([[-1.6400,  0.2824,  0.7169,  ..., -4.3330, -2.5590,  2.6742]]), size: 2048
document embeddings: tensor([[ 0.8587, -1.4075,  0.8854,  ..., -1.5349, -7.1651,  1.8051],
        [-3.8246,  5.2329,  4.4291,  ...,  5.3871, -3.0507, -4.3188]]), size: 2048, 2048
similarities: tensor([0.8371, 0.4783])

実行時間入り。

$ time uv run app.py
query embegging: tensor([[-1.6400,  0.2824,  0.7169,  ..., -4.3330, -2.5590,  2.6742]]), size: 2048
document embeddings: tensor([[ 0.8587, -1.4075,  0.8854,  ..., -1.5349, -7.1651,  1.8051],
        [-3.8246,  5.2329,  4.4291,  ...,  5.3871, -3.0507, -4.3188]]), size: 2048, 2048
similarities: tensor([0.8371, 0.4783])

real    0m5.261s
user    0m16.147s
sys     0m2.751s

ひとまず動かしてみただけですが、今回はここまでで。

おわりに

ローカルで動く日本語のテキスト埋め込みモデル、PLaMo-Embedding-1Bを動かしてみました。

本当に動かしてみただけなのですが、最近このあたりの情報を追っていなかったのでそのあたりを見返す意味も含めて扱ってみました。

あまり頻繁に使うことはないと思うのですが、時々触っていないと完全に忘れてしまうので。




以上の内容はhttps://kazuhira-r.hatenablog.com/entry/2025/08/30/170219より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14