本文へスキップ
`Ctrl`+`K`

# 7.16.17. `language_model_vectorize`

Added in version 14.1.0.

注釈

これは実験的な機能です。現時点ではまだ安定しきっていません。

## 7.16.17.1. 概要

`language_model_vectorize`は指定されたテキストの正規化されたエンべディングを返します。

言語モデルの準備方法は言語モデルを参照してください。

エンべディングを自動生成するために生成カラムを使うことができます。

この関数を有効にするには次のコマンドで`functions/language_model`プラグインを有効にしてください。

    plugin_register functions/language_model

## 7.16.17.2. 構文

`language_model_vectorize`には必須の引数が2つとオプションのパラメーターがあります。

    language_model_vectorize(model_name, text)
    language_model_vectorize(model_name, text, options)

`model_name`は使用する言語モデルの名前です。この名前はファイル名と紐付いています。もし`${PREFIX}/share/groonga/language_models/mistral-7b-v0.1.Q4_K_M.gguf`が存在している場合、この言語モデルは`mistral-7b-v0.1.Q4_K_M`という名前で参照できます。この名前はディレクトリー部分と`.gguf`拡張子を削除することで計算できます。

Added in version 15.1.8: `model_name`にはHugging FaceのURIも指定できます。

`text`は入力テキストです。

Added in version 16.0.1: `options`を追加

`options`には以下のキーを指定します。すべてのキー・値のペアは省略可能です。

      {
        "prefix": prefix_string
      }

## 7.16.17.3. 必要条件

llama.cppを有効にしたGroongaが必要です。公式パッケージでは有効になっています。

この機能を使うには十分なCPU・メモリーリソースが必要です。言語モデル関連の機能は他の機能よりも多くのリソースを必要とします。

将来的にはGPUも使えるようになります。

## 7.16.17.4. 使い方

最初に`functions/language_model`プラグインを登録する必要があります。

実行例：

    plugin_register functions/language_model
    # [[0,1337566253.89858,0.000355720520019531],true]

スキーマ定義とサンプルデータは次のとおりです。

サンプルスキーマ：

実行例：

    table_create --name Memos --flags TABLE_NO_KEY
    # [[0,1337566253.89858,0.000355720520019531],true]
    column_create \
      --table Memos \
      --name content \
      --flags COLUMN_SCALAR \
      --type ShortText
    # [[0,1337566253.89858,0.000355720520019531],true]

サンプルデータ：

実行例：

    load --table Memos
    [
    {"content": "Groonga is fast and embeddable full text search engine."},
    {"content": "PGroonga is a PostgreSQL extension that uses Groonga."},
    {"content": "PostgreSQL is a RDBMS."}
    ]
    # [[0,1337566253.89858,0.000355720520019531],3]

`Memos.content`のエンべディングを自動生成する生成カラムの定義は次のとおりです。

実行例：

    column_create \
      --table Memos \
      --name content_embedding \
      --flags COLUMN_VECTOR \
      --type Float32 \
      --source content \
      --generator 'language_model_vectorize("mistral-7b-v0.1.Q4_K_M", content)'
    # [[0,1337566253.89858,0.000355720520019531],true]

`language_model_vectorize()`は正規化されたエンべディングを返すので、`distance_cosine()`ではなく`distance_inner_product()`を使ってマッチしたレコードを類似度で並び替えることができます。以下の例ではわかりやすさのために絞り込まれたレコードではなくすべてのレコードを対象にしています。

実行例：

    select \
      --table Memos \
      --columns[similarity].stage filtered \
      --columns[similarity].flags COLUMN_SCALAR \
      --columns[similarity].types Float32 \
      --columns[similarity].value 'distance_inner_product(content_embedding, language_model_vectorize("mistral-7b-v0.1.Q4_K_M", "high performance FTS"))' \
      --output_columns content,similarity \
      --sort_keys -similarity
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         3
    #       ],
    #       [
    #         [
    #           "content",
    #           "ShortText"
    #         ],
    #         [
    #           "similarity",
    #           "Text"
    #         ]
    #       ],
    #       [
    #         "Groonga is fast and embeddable full text search engine.",
    #         "0.6581704020500183"
    #       ],
    #       [
    #         "PGroonga is a PostgreSQL extension that uses Groonga.",
    #         "0.6540993452072144"
    #       ],
    #       [
    #         "PostgreSQL is a RDBMS.",
    #         "0.6449499130249023"
    #       ]
    #     ]
    #   ]
    # ]

## 7.16.17.5. 引数

必須の引数が2つとオプションのパラメーターがあります。

### 7.16.17.5.1. 必須引数

#### 7.16.17.5.1.1. `model_name`

`model_name`は使用する言語モデルの名前です。この名前はファイル名と紐付いています。もし`${PREFIX}/share/groonga/language_models/mistral-7b-v0.1.Q4_K_M.gguf`が存在している場合、この言語モデルは`mistral-7b-v0.1.Q4_K_M`という名前で参照できます。この名前はディレクトリー部分と`.gguf`拡張子を削除することで計算できます。

Added in version 15.1.8: `model_name`にはHugging FaceのURIが指定できます。

Hugging FaceのURIが指定されるとモデルを自動でダウンロードします。

モデルはGroongaのデータベースファイルが置いてあるディレクトリにダウンロードされます。

URIの例: `https://huggingface.co/groonga/bge-m3-Q4_K_M-GGUF` のモデルを指定したいときは `hf:///groonga/bge-m3-Q4_K_M-GGUF` を指定します。

関数の実行例:

    language_model_vectorize("hf:///groonga/bge-m3-Q4_K_M-GGUF", content)

#### 7.16.17.5.1.2. `text`

`text`は入力テキストです。

### 7.16.17.5.2. 省略可能引数

#### 7.16.17.5.2.1. `options`

Added in version 16.0.1.

`options`はJSONオブジェクトとして渡すことができます。

##### 7.16.17.5.2.1.1. `prefix`

Added in version 16.0.1.

`prefix`は`text`に付与するプレフィックスを指定します。

`multilingual-e5`などのモデルでは、検索対象テキストと検索クエリーにプレフィックスを付ける必要があります。

- 検索対象のテキストをベクトル化するときは`"passage: "`を指定します。

- 検索クエリーのテキストをベクトル化するときは`"query: "`を指定します。

例:

    language_model_vectorize("hf:///groonga/multilingual-e5-base-Q4_K_M-GGUF", \
                             content, \
                             {"prefix": "passage: "})

    language_model_vectorize("hf:///groonga/multilingual-e5-base-Q4_K_M-GGUF", \
                             "male child", \
                             {"prefix": "query: "})

## 7.16.17.6. 戻り値

`language_model_vectorize`は`Float32`のベクターとして正規化されたエンべディングを返します。