ailia_llm  1.5.1.0
APIの使用方法

High Level API

ailia LLMの使用例です。

AiliaLLMModel llm = new AiliaLLMModel();
private List<AiliaLLMChatMessage> messages = new List<AiliaLLMChatMessage>();
string asset_path = Application.streamingAssetsPath;
string model_path = "gemma-2-2b-it-Q4_K_M.gguf";
llm.Create();
llm.Open(asset_path + "/" + model_path, 8192);
AiliaLLMChatMessage message = new AiliaLLMChatMessage();
message.role = "system";
message.content = "語尾に「だわん」をつけてください。";
messages.Add(message);
AiliaLLMChatMessage message2 = new AiliaLLMChatMessage();
message2.role = "user";
message2.content = "こんにちは。";
messages.Add(message2);
inputFiled.text = "";
llm.SetPrompt(messages);
bool done = false;
string text = "";
while (true){
bool status = llm.Generate(ref done);
if (done == true || status == false){
break;
}
string deltaText = llm.GetDeltaText();
text = text + deltaText;
}
Debug.Log(text);
message = new AiliaLLMChatMessage();
message.role = "assistant";
message.content = text;
messages.Add(message);

画像(VLM)・音声(ALM)入力

対応するTextモデルを開き、同じモデルのmmprojを OpenMultimodalProjector で開きます。 GetMultimodalCapabilities で画像・音声の対応を確認してから入力してください。 <__media__> の出現順・個数と media_data の要素を一致させます。

using ailiaLLM;
using System.Collections.Generic;
var llm = new AiliaLLMModel();
if (!llm.Create() || !llm.Open(textModelPath, 8192) ||
!llm.OpenMultimodalProjector(projectorPath)) return;
bool vision = false, audio = false;
if (!llm.GetMultimodalCapabilities(ref vision, ref audio)) return;
if (vision) {
var image = new AiliaLLMMediaData { media_type = "image", file_path = imagePath };
var message = new AiliaLLMMultimodalChatMessage {
role = "user", content = "この画像を説明してください: <__media__>",
media_data = new List<AiliaLLMMediaData> { image }
};
if (!llm.SetMultimodalPrompt(new List<AiliaLLMMultimodalChatMessage> { message })) return;
bool done = false;
string text = "";
while (!done) {
if (!llm.Generate(ref done)) return;
if (!done) text += llm.GetDeltaText();
}
Debug.Log(text);
}

ALMでは audio を確認し、media_type = "audio"、WAV/MP3/FLACの file_path、音声用の質問文を指定します。ファイルの代わりにエンコード済み byte[] data も使用でき、音声では width=height=0 にします。Raw PCMや 音声出力は対象外です。画像と音声は別々のpromptとして実行してください。

Android QNN

QNN対応ビルドでは AiliaLLMModel.GetQNNModelName() でSoCに対応する モデル名(例: sm7635)を確認し、同じSoC・モデル向けのText .qnn と mmproj .qnn を Open、OpenMultimodalProjector にそれぞれ渡します。 Textのみならmmprojは不要です。QNNパッケージは端末のSoCに合わせてコンパイルされた packageです。QNNランタイムとpluginの組み合わせも一致させてください。 バックエンド未選択時は<tt>.qnnがHTP (QNN)を自動選択します。明示選択する場合、 一覧はGPU、CPU、HTP (QNN)の順で、CPU/GPUでは.qnnを、HTPではGGUFを開けません。 HTPは対応するQNNランタイムが利用可能なときだけ一覧に表示されます。

string soc = AiliaLLMModel.GetQNNModelName();
// socに一致する配布済みのTextとmmprojのパスを選ぶ。
var llm = new AiliaLLMModel();
if (!llm.Create() || !llm.Open(textQnnPath, 0) ||
!llm.OpenMultimodalProjector(mmprojQnnPath)) return;

モデル名取得はQNN非対応ビルド・plugin不在・未対応SoCでは失敗します。 読み込みや生成の失敗は GetErrorDetail() で調べられます。

Tool Use(JSON API)

Tool Useでは最初のuserメッセージからailiaLLMSetPromptJsonを使用します。 ailiaLLMSetToolsでツールが設定されている間、従来のailiaLLMSetPromptとailiaLLMSetMultimodalPromptは AILIA_LLM_STATUS_INVALID_STATEを返します。ツールを解除すると再び利用できます。

  1. ailiaLLMSetToolsにOpenAI互換のツール定義配列を渡します。
  2. ailiaLLMSetPromptJsonにmessages配列そのもの(UTF-8 JSON)を渡します。
  3. ailiaLLMGenerateを完了まで呼び出します。deltaはailiaLLMGetDeltaTextでプレビューできますが、取得・連結は必須ではありません。
  4. ailiaLLMGetResponseJsonSize / ailiaLLMGetResponseJsonで構造化assistant JSONを取得します。
  5. 成功したオブジェクトをそのまま履歴に追加し、tool_callsがあれば実行して、ID付きのtool結果を追加し、次のプロンプトを設定します。

SDKが生成結果を蓄積するので、生の出力をアプリ側で引き回す必要はありません。 GetResponseJsonは読み取りで蓄積を消去しません。新しいプロンプトでリセットします。

string toolsJson = "[{\"type\":\"function\",\"function\":{\"name\":\"get_weather\",\"description\":\"都市の天気を取得する\",\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"]}}}]";
if (!llm.SetTools(toolsJson)) return;
if (!llm.SetPromptJson("[{\"role\":\"user\",\"content\":\"東京の天気は?\"}]")) return;
bool done = false;
while (!done) { if (!llm.Generate(ref done)) return; }
string assistantJson = llm.GetResponseJson();
// JSONを解析し、完全なtool_callsを検証・実行して履歴に追加する。

JSON履歴

[
{"role":"user","content":"東京の天気は?"},
{"role":"assistant","content":"","tool_calls":[
{"id":"call_0","type":"function","function":{
"name":"get_weather","arguments":"{\"city\":\"東京\"}"}}
]},
{"role":"tool","tool_call_id":"call_0","content":"雪、-3度"}
]

本文をツール構文として再解析しません。assistantのThinkingはreasoning_contentに指定します。 argumentsはJSONオブジェクトを表す**文字列**です。呼び出しのid/nameは空にできず、IDはassistant内で一意です。 別ターンではIDを再利用できます。連続するtool結果は直前のassistantの呼び出しにIDで対応付けます。 結果の順序は問いません。不明なID、重複結果、矛盾するツール名はINVALID_ARGUMENTです。 ツール結果のcontentには文字列を指定し、オブジェクトはJSON文字列に変換してください。

画像・音声

対応するprojectorをailiaLLMOpenMultimodalProjectorFileAで読み込んだ後、userのcontent配列に順番に指定します。 メディアはtoolsの有無にかかわらずJSONで入力できます。

[{"role":"user","content":[
{"type":"text","text":"この画像と音声について説明してください。"},
{"type":"image","file_path":"/path/to/image.jpg"},
{"type":"audio","file_path":"/path/to/audio.wav"}
]}]

image/audioはfile_pathまたはdataをちょうど1つ指定します。dataは標準Base64(パディング付き)で エンコードしたファイル内容です。JPEG/PNG、WAV/MP3/FLAC等を使用できます。URL取得、動画、生RGB/PCMには対応しません。 画像・音声を含む履歴は毎回再評価します。メディア非対応のモデル/projectorや未読込はINVALID_STATEです。 画像と音声の対応状況はailiaLLMGetMultimodalCapabilitiesで確認できます。

不完全な出力・エラー

  • GetResponseJson:生成完了後に呼び出してください。未完了tool call/ThinkingはPARSE_ERRORです。部分結果を実行したり、引数を補完したりしません。
  • SetPromptJson:不完全なarguments、不正なJSON・型・ID対応、空配列はINVALID_ARGUMENTです。自動切り捨ては行いません。
  • 再試行:GetResponseJsonがPARSE_ERRORの場合、失敗したassistantを追加せず、既存履歴に再試行を指示するuserメッセージを追加します。部分的な本文・Thinkingの取得は不要です。不完全な呼び出しのtool結果は作りません。
  • GetResponseJsonはプロンプト未設定、tools/Thinking変更後にINVALID_STATEを返します。プロンプト設定後・生成前の空出力は空のassistantです。
  • ファイル読込失敗はERROR_FILE_API、Base64からのデコード済みメディア読込失敗はERROR_BUFFER_API、不正なBase64はINVALID_ARGUMENTです。

SetTools(NULL)でツールを解除した後も、過去のtool_callsとtool結果をSetPromptJsonへ渡して要約・最終回答を生成できます。解除すると出力パーサーが無効になるため、結果JSONは解除前に取得してください。例外時もツール設定を解除するにはfinallyを使用してください。

if (!llm.SetPromptJson(messagesJson)) return;
bool done = false;
while (!done) { if (!llm.Generate(ref done)) return; }
string responseJson = llm.GetResponseJson();
// Empty string signals error. Otherwise append the object and ID-linked tool results.