XinferenceにhuggingfaceからRuriシリーズのモデルを登録

# はじめに

[前回の続き](https://qiita.com/ce_kazz/items/9aaa244903be0b2b1e2d)

Difyにモデルプロバイダーを統合する上で、OllamaはLLMとText Embeddingのみのようだけど、Xinferenceはこれに加えてRerank, Speech-to-Text, Text-to-Speechもサポートしている様子。
Xinference経由で標準モデル以外を入れたい、日本語特化モデルが無いしね。
どうやらRegister modelから登録できるようだけどドキュメントが見当たらない。公式を参考にするしかないか。
[公式ドキュメント > Models > Custom Models](https://inference.readthedocs.io/en/stable/models/custom.html#)

# モチベーション
* LLM, Embedding, Rerankをすべて日本語モデルでRAGを構築したい
* GGUF形式以外のモデルも使えるようにしたい
* huggingfaceの膨大な公開モデルから自由に選択したい

# JSONの用意
[名大 笹野研](http://cr.fvcrc.i.nagoya-u.ac.jp/)のRuriが良いようなので、ありがたく使わせて頂きます。

[hppさんの記事: Ruri: 日本語に特化した汎用テキスト埋め込みモデル](https://zenn.dev/hpp/articles/b5132c64c40d24)
[ぬこぬこさんの記事: 日本語の高性能な文埋め込みモデルを試す](https://note.com/schroneko/n/n8e36e2b8cb10)

LLMは前回いれたcyberagentが日本語でファインチューニングしたDeepSeek-R1のまま。

公式によるとURLの記述がなかったらmodel_idでhuggingfaceのリポジトリを読みに行くそうな。なんて素晴らしいんだ！！
ファイル形式に指定はないのかな。

> **model_id**: A string representing the model ID, possibly referring to an identifier used by Hugging Face. **If model_uri is missing, Xinference will try to download the model from the huggingface repository specified here..**

とりあえずJSONにhuggingfaceのモデルを書いて準備する。

## Embedding model
[ruri-large](https://huggingface.co/cl-nagoya/ruri-large)
```JSON:ruri-large.json
{
    "model_name": "ruri-large",
    "model_type": "embedding",
    "model_id": "cl-nagoya/ruri-large",
    "dimensions": 1024,
    "max_tokens": 512,
    "language": [
        "ja"
    ]
}
```
model_typeをembeddingにして、dimとmax tokenは公式の数値を指定しています。
model_idはhuggingfaceのリポジトリ名とモデル名を入れる。

## Rerank model
[ruri-reranker-large](https://huggingface.co/cl-nagoya/ruri-reranker-large)

Rerankも同じ要領で、typeをnormalに指定するくらい。

```JSON:ruri-reranker-large.json
{
    "model_name": "ruri-reranker-large",
    "type": "normal",
    "model_id": "cl-nagoya/ruri-reranker-large",
    "language": [
        "ja"
    ]
}
```

# xinferenceのコンテナにモデルを登録
前回 docker composeで起動しておいたxinferenceコンテナにjsonを入れてCLIで登録を実行します。

## まずはEmbedding model
1. JSONをコピー
    ```shell
    docker cp ruri-large.json xinference:/ruri-large.json
    ```
1. コンテナの外(ホスト)から登録を試みる
    ```shell
    docker exec -it xinference xinference register --model-type embedding --file /ruri-large.json --persist
    ```

## 次にRerank model
1. JSONをコピー
    ```shell
    docker cp ruri-reranker-large.json xinference:/ruri-reranker-large.json
    ```
1. コンテナの外(ホスト)から登録を試みる
    ```shell
    docker exec -it xinference xinference register --model-type rerank --file /ruri-reranker-large.json --persist
    ```
    
# 登録したモデルをロード(Launch)
Launch Model > CUSTOM MODELS > EMBEDDING MODELS / RERANK MODELS に追加されました。
Launch時はDifyに渡すModel UIDをちゃんと書きましょう。
CLIでlaunchする方法は公式ドキュメントに記載があります。

![launch](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610236/3c6350d9-ed1d-5859-c642-2aecd206aa9f.png)

WebアプリからではなくCLIでコンテナの外(ホスト)からLaunchする場合
```shell
docker exec -it xinference xinference launch -n ruri-large -t embedding
docker exec -it xinference xinference launch -n ruri-reranker-large -t rerank
```

# Dify

Difyの管理ページに移って、前回と同様にServer urlとModel UIDに注意してモデルプロバイダーから登録します。

![dify](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610236/516d8fd6-cce2-d832-5b20-a7abd109a2b0.png)

jina-embeddingとbge-rerankerがまだ残ってますが、ひとまず連携完了。

# おわりに
以上で、日本語DeepSeek-R1に日本語特化Embeddin, RerankでRAGを構築する準備が整いました。
前回の組み合わせより賢くなってる気がする（不要な前置きが無くなって完結に返事してくれてる気がする）。

※ Dify + Xinferenceで用意できるのでollamaは不要かもしれないが、VRAMの管理をみて検討します。

# 参考
* [笹野研究室](http://cr.fvcrc.i.nagoya-u.ac.jp/)
* [Ruri: Japanese General Text Embeddings](https://arxiv.org/abs/2409.07737)
* [cl-nagoya/ruri-large](https://huggingface.co/cl-nagoya/ruri-large)
* [cl-nagoya/ruri-reranker-large](https://huggingface.co/cl-nagoya/ruri-reranker-large)