[C++] 387 ChatAIアプリの製作 その56 API使用頻度の推移 (2023/3 – 2025/2)

[Mac M2 Pro 12CPU RAM 16GB, Sonoma 14.7.1, clang++ 16.0.0]

2023年3月にChatAIアプリ初版を製作して2年が経とうとしています。

APIを使用して作成されたJSONファイル数の推移をまとめてみました。

ChatGPT、Perplexity、つい最近ではDeepSeekとますます充実してきました。

gpt-4oとDeepSeekにPythonでのグラフ作成スクリプトを考えさせました。gpt-4oは一発で動きましたが、DeepSeek考案スクリプトはこちらで一回修正してあげてもダメでした。これにはガッカリです。

蒸留、量子化しなければまともに働くかどうかは不明です。

今月2502は2/8まで

 [C++] 386 ChatAIアプリの製作 その55 DeepSeek日本語量子化GGUFファイルの検証 llama.cpp

[Mac M2 Pro 12CPU RAM 16GB, Sonoma 14.7.1, clang++ 16.0.0]
GGUF: cyberagent-DeepSeek-R1-Distill-Qwen-14B-Japanese-Q5_K_M.gguf 10.5GB

DeepSeek日本語版をサイバーエージェントが公開したので、量子化ファイルを動作検証しました。

前回記事のGGUFと同様に時間はかかりますが、コード提案能力はなかなかのものです。これまで量子化するとかなり能力が落ちるという印象でしたが、DeepSeekではそのようなことはありませんでした。蒸留が効いているのでしょうか。

プログラミング用途ではgpt-4oやPerplexityからこちらに移行します。

ローカルLLMをまともに動かすにはユニファイドメモリ 64GB以上が必要、という認識が見事に覆りました。最新GGUFはRAM 16GBで使用に耐えるレベルにて動作します。

VRAM 12GBのWindowsPCではどうなるか検証してみたいです。

 [C++] 385 ChatAIアプリの製作 その54 DeepSeek量子化GGUFファイルの検証 llama.cpp

[Mac M2 Pro 12CPU RAM 16GB, Sonoma 14.7.1, clang++ 16.0.0]
GGUF: DeepSeek-R1-Distill-Llama-8B-Q4_K_M.gguf 4.9GB

話題のDeepSeekを量子化ファイルで試してみました。

プログラミング用途ではこれまで扱ってきたGGUFと比べてかなり優秀です。gpt-4oと比べると回答内容はまずまず、レスポンス時間はかなり長いです。

DeepSeekチャットサーバ起動コマンド

cd /AI/llama.cpp && ./bin/llama-server -m models/DeepSeek-R1-Distill-Llama-8B-Q4_K_M.gguf -ngl 1 -c 4096

 [C++] 384 ChatAIアプリの製作 その53 推論モデルo3-miniの導入

[Mac M2 Pro 12CPU, Sonoma 14.7.1, clang++ 16.0.0]
[C++] 383は非公開

普段はgpt-4oで十分足りていますが、評判がいいようなのでo3-miniも使えるようにしました。temperatureを削除して、reasoning_effortを追加しています。

if(countQ == 0 && load == false){
    cout << "question1回目\n" << question << endl;
    cout << "model: \n" << model.c_str() << endl;

    if (model.find("gpt") != string::npos){
        // gpt-4
        requestData = "{\"model\":\"" + model + "\", \"messages\":[{\"role\":\"system\",\"content\":\"" + systemStr + "\"},{\"role\":\"user\",\"content\":\"" + question + "\"}], \"temperature\":0.0}";
    } else if (model.find("mini") != string::npos){
        // o3-mini
        requestData = "{\"model\":\"" + model + "\", \"messages\":[{\"role\":\"system\",\"content\":\"" + systemStr + "\"},{\"role\":\"user\",\"content\":\"" + question + "\"}], \"reasoning_effort\":\"medium\"}";
    } else if (model.find("llama.cpp") != string::npos){
        // llama.cpp
        requestData = "{\"model\":\"" + model + "\", \"messages\":[{\"role\":\"system\",\"content\":\"" + systemStr + "\"},{\"role\":\"user\",\"content\":\"" + question + "\"}], \"temperature\":0.0}";
    } else if (model.find("sonar") != string::npos){
        // perplexity
        requestData = "{\"model\":\"" + model + "\", \"messages\":[{\"role\":\"system\",\"content\":\"" + systemStr + "\"},{\"role\":\"user\",\"content\":\"" + question + "\\n日本語で回答してください。" + "\"}], \"temperature\":0.0}";
    }

[C++] 373 ChatAIアプリの製作 その51 LLMの序列変更 Perplexity API

[Mac M2 Pro 12CPU, Sonoma 14.3.1, clang++ 15.0.0]

Perplexity APIを使うことで最新情報も取得できるようになったので、第1選択LLMに昇格させました。

間違った情報が混ざっていることもありますが、ラフな情報収集としてはまずまずかと思います。

24/05/17追記
Perplexity APIは回答の言語が不安定(日本語 or 英語)なので、第1選択LLMをgtp-4oに戻しました。Webサービス(無料 or Pro)で使う方が良さそうです。

[C++] 372 ChatAIアプリの製作 その50 gpt-4oとPerplexity APIの導入

[Mac M2 Pro 12CPU, Sonoma 14.3.1, clang++ 15.0.0]

5月13日に発表されたgpt-4oを早速導入しました。Perplexity APIも導入しました。

gpt-4oについてはこれから検証していきます。

まず驚いたのがPerplexity API(llama-3-sonar-large-32k-online)のネット検索能力です。年度、日付などはいい加減ですが、プレミアリーグの最新データを取得してくれました。順位、勝敗、得失点は正確でした。

ただしPerplexity APIはgptのようにあまり行間を読んでくれないため、くどくどしくプロンプトを書かないと意図に沿った回答が得られないケースがあります。

またsystemで日本語で回答するように指示しても、英語で返す方が多かったりします。なので最初のプロンプトでも日本語指定のテンプレを自動追記するようにしました。それでも頑なに英語で返すことがあります。

アプリに登録しているLLM一覧(左上のプルダウンメニュー)

[C++] 368 ChatAIアプリの製作 その49 ローカルLLMの性能を引き出す OpenAI互換APIサーバ llama.cpp

[Mac M2 Pro 12CPU, Sonoma 14.3.1, clang++ 15.0.0]

ChatAIアプリのGUI右側CMDボタンでOpenAI互換APIサーバの起動コマンドを生成し、自動的にターミナルを開いて実行するようにしました(AppleScript)。サーバの状況はターミナルからモニタリングします。

CodeLlama日本語版とチャットしてみると相当に気難しくてうまく誘導しないと正答にたどり着けないことが分かりました。これはこれで面白く、ローカルLLMですから無料というのが魅力です。

gpt-4への課金がどれくらい削減できるか、楽しみです。

1回目の回答:”コード修正は無理”と回答
3回目の回答:やり取りを経て何とか正解を引き出せた

[C++] 367 ChatAIアプリの製作 その48 ローカルLLMをOpenAI互換APIサーバ(llama.cpp)で動かす

[Mac M2 Pro 12CPU, Sonoma 14.3.1, clang++ 15.0.0]

llama.cppでOpenAI互換APIサーバを立ち上げ、ChatGPTのようにチャットできるようにしました。

モデルは ELYZA-japanese-CodeLlama-7b-instruct-q4_K_M.gguf です。

cd /Volumes/DATA_m1/AI/llama.cpp && ./server -m models/ELYZA-japanese-CodeLlama-7b-instruct-q4_K_M.gguf -ngl 1 -c 4096

サーバのURLは以下のようになります。
url : http://localhost:8080/v1/chat/completions

ターミナルでサーバの動作を監視

参考サイト

[AI] ローカルLLM検証アプリの製作 llama.cpp SwiftUI

[Mac M2 Pro 12CPU, Sonoma 14.3.1, clang++ 15.0.0]

ローカルLLMの性能を検証するアプリをSwiftUIで製作しました。

modelsディレクトリに入っているggufファイルを選択し、promptを入力してtxtファイル化、llama.cppのmainコマンドを作成します。コマンドはクリップボードに自動コピーされます。あとはターミナルにコマンドを貼り付けて実行し、responseを手動で右側のTextEditorにペーストしてtxtファイルにします。

promptファイルとresponseファイルのプレフィックスはコマンド作成時のタイムスタンプ(yymmdd_hhmmss)になっています。

今回はほとんどclaude-3 opusとgpt-4にコードを考えてもらいました。Buttonラベルの改行表示についてはclaude-3では埒が開かず、gpt-4がテキスト分割を提案して不本意ながら解決しました。SwiftUIに関してはclaude-3とgpt-4はほぼ互角といった印象です。

SwiftUIのmacOS版ではButtonのラベルを改行できないようです。iOS版では問題なく出来るはずですが、macOS版の後進性に若干引いています。

※claude-3利用状況
claude-3のAPIキーを取得して5日経ち、5ドルの無料分がほぼ無くなりました。私の用途ではgpt-4に対する優位性を体感できなかったので、今後は割安なgpt-4メインに戻ります。なおclaude-3 APIの支払いで個人はマイナンバーの入力を求められているため、登録は見送りました。Claude Pro($20/month)への登録もしません。

[C++] 366 ChatAIアプリの製作 その47 “role:systemの扱い”公式版 claude-3 

[Mac M2 Pro 12CPU, Sonoma 14.3.1, clang++ 15.0.0]
対応LLM:gpt-4, gpt-4-vision, claude-3

claude-3ではgptのようにrole:systemは設定できず、systemという独立したパラメータとして扱います。つまりmodelやtemperatureと同じです。

以前の記事で紹介したようにuserのcontentの先頭に追加しても効果は同じだと思いますが、一応公式の方法に従います。

if (urls == ""){
    // claude-3 画像なし
    requestData = "{\"model\":\"" + model + "\", \"messages\":[{\"role\":\"user\",\"content\":\"" + question + "\"}], \"system\":\"" + systemStr + "\",\"temperature\":0.0, \"max_tokens\":4096}";
} else {
    // claude-3 画像あり
    string requestData_1 = "{\"model\":\"" + model + "\", \"system\":\"" + systemStr + "\", \"messages\":[{\"role\":\"user\",\"content\":[{\"type\":\"text\",\"text\":\"" + question + "\"},";

<以下略>

公式サイト