ailia LLMのAPIの概要
基本的な使用方法
ailia LLMの使用例です。
int main(int argc, char *argv[]){
struct AILIALLM* llm;
unsigned int n_ctx = 8192;
std::vector<AILIALLMChatMessage> messages;
message.
content =
"語尾に「くま」をつけて回答してください。";
messages.push_back(message);
messages.push_back(message);
std::string text = "";
while(true) {
unsigned int done = 0;
break;
}
unsigned int size = 0;
std::vector<char> delta(size);
text = text + std::string(&delta[0]);
}
return 0;
}
AILIA_LLM_API int ailiaLLMSetPrompt(struct AILIALLM *llm, const AILIALLMChatMessage *message, unsigned int message_cnt)
プロンプトを設定します。
AILIA_LLM_API int ailiaLLMGetDeltaText(struct AILIALLM *llm, char *text, unsigned int buf_size)
テキストを取得します。
AILIA_LLM_API int ailiaLLMGetDeltaTextSize(struct AILIALLM *llm, unsigned int *buf_size)
テキストの長さを取得します。(NULL文字含む)
AILIA_LLM_API int ailiaLLMGenerate(struct AILIALLM *llm, unsigned int *done)
生成を行います。
#define AILIA_LLM_STATUS_SUCCESS
成功
Definition: ailia_llm.h:40
AILIA_LLM_API int ailiaLLMOpenModelFileA(struct AILIALLM *llm, const char *path, unsigned int n_ctx)
モデルファイルを読み込みます。
AILIA_LLM_API int ailiaLLMCreate(struct AILIALLM **llm)
LLMオブジェクトを作成します。
AILIA_LLM_API void ailiaLLMDestroy(struct AILIALLM *llm)
LLMオブジェクトを破棄します。
Definition: ailia_llm.h:197
const char * content
Represent the content of the message. For role "tool" the content is the tool result,...
Definition: ailia_llm.h:207
const char * role
Represent the role. (system, user, assistant, tool) "tool" holds a tool result for tool use,...
Definition: ailia_llm.h:202
画像入力(VLM)
画像対応のTextモデルと対応するmmprojを用意します。ailiaLLMCreate → ailiaLLMOpenModelFileA → ailiaLLMOpenMultimodalProjectorFileA の順に呼び、 ailiaLLMGetMultimodalCapabilities の vision_support を確認してください。 <__media__> は media_data の各要素と出現順・個数を一致させます。
int set_image_prompt(struct AILIALLM *llm, const char *image_path) {
unsigned int vision = 0, audio = 0;
message.
content =
"この画像を説明してください: <__media__>";
}
AILIA_LLM_API int ailiaLLMGetMultimodalCapabilities(struct AILIALLM *llm, unsigned int *vision_support, unsigned int *audio_support)
マルチモーダル機能がサポートされているかを確認します。
AILIA_LLM_API int ailiaLLMSetMultimodalPrompt(struct AILIALLM *llm, const AILIALLMMultimodalChatMessage *message, unsigned int message_cnt)
マルチモーダルプロンプトを設定します。
#define AILIA_LLM_STATUS_INVALID_ARGUMENT
引数が不正
Definition: ailia_llm.h:52
マルチモーダル対応チャットメッセージ
Definition: ailia_llm.h:281
const AILIALLMMediaData * media_data
Array of media data (images, audio) referenced by <media> markers
Definition: ailia_llm.h:294
const char * role
Represent the role. (system, user, assistant, tool) "tool" holds a tool result for tool use,...
Definition: ailia_llm.h:286
unsigned int media_count
Number of media items in media_data array
Definition: ailia_llm.h:298
const char * content
Represent the content of the message. Use <media> placeholder for media.
Definition: ailia_llm.h:290
成功後は基本例と同じ生成APIでテキストを取得します。画像はファイルパスのほか、 エンコード済み画像バッファ(data / data_size、width=height=0)または Raw RGB(width * height * 3 バイト)を渡せます。
音声入力(ALM)
音声認識・音声内容への質問には、音声入力に対応するTextモデルと、そのモデルに対応した 音声encoder入りmmprojが必要です。画像専用mmprojでは音声を処理できません。 対応する機能・言語はモデルに依存します。音声合成・音声出力には対応していません。
ailiaLLMCreate 後、ailiaLLMOpenModelFileA でTextモデルを開きます。
ailiaLLMOpenMultimodalProjectorFileA で対応するmmprojを開きます。
ailiaLLMGetMultimodalCapabilities の audio_support が非0であることを確認します。
- 以下の例で音声promptを設定します。
- 成功後は基本例と同じ
ailiaLLMGenerate、 ailiaLLMGetDeltaTextSize、ailiaLLMGetDeltaText でテキストを取得します。 各APIの戻り値を確認し、失敗時は ailiaLLMGetErrorDetail を参照してください。
int set_audio_prompt(struct AILIALLM *llm, const char *audio_path) {
unsigned int vision = 0, audio = 0;
message.
content =
"Transcribe this audio: <__media__>";
}
音声はWAV/MP3/FLACのファイルパス、またはエンコード済みファイルのバッファを渡します。 バッファ入力では file_path=NULL、data と data_size を設定します。 data がある場合はパスより優先されます。data_size はunsigned intに収まるサイズを使い、 呼出しが完了するまでバッファと文字列を保持してください。 音声の width と height は必ず0です。Raw PCMやマイクの逐次入力APIではありません。 <__media__> とメディア配列は順序・個数を一致させます。
Android QNNでの音声入力
事前コンパイル済みText .qnn と、音声context・CPU用weightを含むmmproj .qnn を 上記のモデルopen APIへ渡せます。元のGGUFを端末へ配置する必要はありません。 SoCに一致するモデルとQNNライブラリ、本体と同じビルドのQNN pluginを使用してください。 古い画像専用 .qnn を読み込んでも音声機能は追加されません。
特徴抽出とsubsamplingはCPU、全12 Conformer層と最終射影は単一HTPグラフで実行します。 短音声のパディングと長音声の履歴付き分割はランタイムが処理します。 旧linear版の音声packageは、現在のコンパイラで再生成してください。 音声と画像を一つのpromptに混在させることはできません。別のpromptとして実行してください。 音声入力時は以前のpromptのKVを再利用しません。音声tokenはcausalに処理するため、 AR256を跨ぐ入力も可能ですが、音声から生成されたtoken列はモデルのcontext容量内に収める必要があります。 音声入りpackageのQNN linear weightにはCPU fallbackを使えません。
Android QNNモデル
QNN対応ビルドでは、端末に合う事前コンパイル済みのText .qnn を ailiaLLMOpenModelFileA に渡します。VLM/ALMには同じモデル向けの projector .qnn を ailiaLLMOpenMultimodalProjectorFileA に渡します。 GGUFと異なり .qnn はSoC固有です。モデルとprojectorの組み合わせ、 QNNランタイム・pluginのバージョンを揃えてください。 バックエンド未選択なら<tt>.qnnはHTP (QNN)へ自動振り分けされます。 明示選択する場合は、CPU/GPUで.qnnを、HTP (QNN)でGGUFを開けません。
const char *stem = NULL;
AILIA_LLM_API int ailiaLLMGetQNNModelName(const char **model_name)
現在の端末に対応するQNNモデル名を取得します。
AILIA_LLM_API int ailiaLLMOpenMultimodalProjectorFileA(struct AILIALLM *llm, const char *mmproj_path)
マルチモーダルプロジェクタファイルを読み込みます。
Textだけを使う場合、projectorを開く必要はありません。n_ctx=0 はpackageの コンテキスト長を使用します。非QNNビルドやplugin不在ではモデル名取得は UNIMPLEMENTED、未対応SoCでは OTHER_ERROR を返します。 失敗の詳細は ailiaLLMGetErrorDetail で確認できます。
Tool Use(JSON API)
Tool Useでは最初のuserメッセージからailiaLLMSetPromptJsonを使用します。 ailiaLLMSetToolsでツールが設定されている間、従来のailiaLLMSetPromptとailiaLLMSetMultimodalPromptは AILIA_LLM_STATUS_INVALID_STATEを返します。ツールを解除すると再び利用できます。
ailiaLLMSetToolsにOpenAI互換のツール定義配列を渡します。
ailiaLLMSetPromptJsonにmessages配列そのもの(UTF-8 JSON)を渡します。
ailiaLLMGenerateを完了まで呼び出します。deltaはailiaLLMGetDeltaTextでプレビューできますが、取得・連結は必須ではありません。
ailiaLLMGetResponseJsonSize / ailiaLLMGetResponseJsonで構造化assistant JSONを取得します。
- 成功したオブジェクトをそのまま履歴に追加し、tool_callsがあれば実行して、ID付きのtool結果を追加し、次のプロンプトを設定します。
SDKが生成結果を蓄積するので、生の出力をアプリ側で引き回す必要はありません。 GetResponseJsonは読み取りで蓄積を消去しません。新しいプロンプトでリセットします。
例えばツール定義と最初の入力は次の形式です。ツールの実行はアプリ側で行い、 モデルから返された名前・引数を検証してから呼び出してください。
[{"type":"function","function":{"name":"get_weather","description":"都市の天気を取得する","parameters":{"type":"object","properties":{"city":{"type":"string"}},"required":["city"]}}}]
[{"role":"user","content":"東京の天気は?"}]
int run_tool_turn(struct AILIALLM *llm, const char *tools_json,
const char *messages_json, char **response) {
unsigned int done = 0;
while (!done) {
}
unsigned int size = 0;
*response = (char *)malloc(size);
return status;
}
AILIA_LLM_API int ailiaLLMGetResponseJsonSize(struct AILIALLM *llm, unsigned int *buf_size)
SDK内部に蓄積した生成結果のassistant JSONサイズを取得します(NULL文字含む)。
AILIA_LLM_API int ailiaLLMGetResponseJson(struct AILIALLM *llm, char *json, unsigned int buf_size)
SDK内部に蓄積した生成結果を構造化assistant JSONとして取得します。
AILIA_LLM_API int ailiaLLMSetPromptJson(struct AILIALLM *llm, const char *messages_json)
構造化されたJSON会話履歴からプロンプトを設定します。
AILIA_LLM_API int ailiaLLMSetTools(struct AILIALLM *llm, const char *tools_json)
OpenAI互換のツール定義JSON配列を設定します。NULL/空文字列/空配列で解除します。
#define AILIA_LLM_STATUS_OTHER_ERROR
不明なエラー
Definition: ailia_llm.h:191
この例では <stdlib.h> をincludeし、response は有効な char ** とします。
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を使用してください。