メインコンテンツまでスキップ

「AI」タグの記事が61件件あります

AI tag description

全てのタグを見る

Project AIRIをエージェント化するメモ1

· 約3分
もみじーな
個人開発者

Project AIRIっていうAIキャラクターに萌えを求めてエージェント化を実施中・・・

実装した機能とか使い方忘れるのでメモも兼ねてます。

Githubに公開してます。

昨日実装したやつ

追加機能1(ウェブ検索)

とりあえずウェブ検索機能を追加しました。

明日の天気は?
○○について調べて

とかあとはAIがわからない検索する必要があると考えたやつを勝手に検索します。

ウェブ検索はブリッジサーバーと拡張機能をChromeに登録しておく
browserというフォルダを拡張機能として取り込みが必要
start-bridge-server.batで検索サーバーが起動

追加機能2 (アラーム、タイマー)

あったら使いそうな機能としてタイマーを追加

3分タイマーをお願い
今,タイマーどれくらい経過した?
タイマー取り消し
アラート止めて

アラームは正直な話 ヘッドセットつけてる人がほとんどなので寝てたら聞こえないのでいらんですよね

明日の7時にアラームをセットして
アラーム止めて

などに対応

今日追加したやつ

カレンダー機能を追加

カレンダー機能を追加してます。
Airiの予定と自分自身の予定を追加可能

Airiの予定は指定の時間になったら自動で実行されます。

今日の私の予定は?

今日のAiriの予定は?
明日の7:00時に天気を調べる予定を追加して
カレンダーを開いて

今後の計画

Qwen3-tts 0.6bあたりを組み込みたいかな?
DBもSQLiteに変更はいずれしたいけどテストするのがめんどくさいので後かな

容量増えるのでどっちも少し機能追加してからだけど

コーディング機能とかは絶対不要だしAIキャラクターって何に使うか迷いますね。
TODOとかスケジュールはあってもいいかなと思って実装してます。

Playwrightはもう古い?時代はAIが直接操作みたい

· 約7分
もみじーな
個人開発者

作成したものはGithubに公開しています。


そもそもPlaywrightってどう使うのが正解なんですかね?
Playwrightを使っていると私はロボットではありませんがでて使えないしボットのログがおそらくサーバー側に残ります。(もう私はボットですがほしいです)
playwright stealthも微妙

ってことで現在はブラウザの直接操作が主流見たいですね。

Manusとかいい例ですね。

ってことでエージェントに組み込むべく拡張機能を作成してみました。
もちろんバイブコーディングですよ?
一部、手動で修正したりもしますがClaude Opus 4.6は本当にいいですね・・・

もう戻れないですよ使ったら・・・

作成したコードとかはGithubみてください。
Claude Opusとかなら独自のやつも普通につくれますので試してください。

拡張機能とLM Studio連携による操作

スクショとるのも面倒なので動画です。

エージェントによる操作

ウェブサーチをエージェントと呼んでいいかはしらないけどこっちも動画

サーバーのログ

全部AIエージェントのログですがこんな感じ

xxx.xxx.xxx.xxx - - [20/Mar/2026:18:20:32 +0900] "GET /img/mylogo.webp HTTP/2.0" 304 0 "https://momijiina.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:20:32 +0900] "GET /assets/css/styles.337dd95d.css HTTP/2.0" 304 0 "https://momijiina.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:20:37 +0900] "GET /assets/js/7463.6cbf5ab1.js HTTP/2.0" 200 8961 "https://momijiina.com/blog" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:20:37 +0900] "GET /assets/js/acecf23e.b95306be.js HTTP/2.0" 304 0 "https://momijiina.com/blog" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:20:37 +0900] "GET /assets/js/ccc49370.7f76acc6.js HTTP/2.0" 304 0 "https://momijiina.com/blog" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:20:37 +0900] "GET /assets/images/20260315-06662a2c5816e1ef7a4e3d0568dfb7ce.webp HTTP/2.0" 200 179974 "https://momijiina.com/blog" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:20:37 +0900] "GET /assets/images/20260315-2-4361c14c9a3ace2b365296cd1dd82a08.webp HTTP/2.0" 200 30936 "https://momijiina.com/blog" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:20:37 +0900] "GET /assets/images/20260315-4-cfa7123d1af9115600fbe73818a8f1ac.webp HTTP/2.0" 200 154000 "https://momijiina.com/blog" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:20:37 +0900] "GET /assets/js/9e4087bc.4d156f5f.js HTTP/2.0" 200 887 "https://momijiina.com/blog" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:20:37 +0900] "GET /assets/js/f81c1134.69d99465.js HTTP/2.0" 200 67612 "https://momijiina.com/blog" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:20:37 +0900] "GET /assets/js/33fc5bb8.1e9b670b.js HTTP/2.0" 200 3560 "https://momijiina.com/blog" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:20:37 +0900] "GET /assets/js/129538fd.2ad13eed.js HTTP/2.0" 200 356 "https://momijiina.com/blog" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:22:20 +0900] "GET /blog HTTP/2.0" 301 239 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:22:20 +0900] "GET /blog/ HTTP/2.0" 200 22294 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:22:21 +0900] "GET /img/mylogo.webp HTTP/2.0" 304 0 "https://momijiina.com/blog/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:22:21 +0900] "GET /assets/css/styles.337dd95d.css HTTP/2.0" 304 0 "https://momijiina.com/blog/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:22:21 +0900] "GET /assets/images/20260315-2-4361c14c9a3ace2b365296cd1dd82a08.webp HTTP/2.0" 304 0 "https://momijiina.com/blog/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:22:21 +0900] "GET /assets/images/20260315-06662a2c5816e1ef7a4e3d0568dfb7ce.webp HTTP/2.0" 304 0 "https://momijiina.com/blog/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:22:21 +0900] "GET /assets/js/7463.6cbf5ab1.js HTTP/2.0" 304 0 "https://momijiina.com/blog/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:22:21 +0900] "GET /assets/images/20260315-4-cfa7123d1af9115600fbe73818a8f1ac.webp HTTP/2.0" 304 0 "https://momijiina.com/blog/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:22:21 +0900] "GET /assets/js/129538fd.2ad13eed.js HTTP/2.0" 304 0 "https://momijiina.com/blog/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:22:21 +0900] "GET /assets/js/33fc5bb8.1e9b670b.js HTTP/2.0" 304 0 "https://momijiina.com/blog/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:22:21 +0900] "GET /assets/js/9e4087bc.4d156f5f.js HTTP/2.0" 304 0 "https://momijiina.com/blog/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"
xxx.xxx.xxx.xxx - - [20/Mar/2026:18:22:22 +0900] "GET /img/myfavicon.ico HTTP/2.0" 200 67646 "https://momijiina.com/blog/20260315" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "

"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36" "-"として表示されているので素晴らしいです。
これは人が検索したものと区別がつかないですね。(playwright stealthもこんな感じ)
ふるまい検知とか実装されればもしかしたら検出されるのかもしれないですが

最後に

ボット検出はされないですが個人利用の範囲で使ってください・・・
こうやってAIしかサイトは見なくなるのかもしれないですね

ローカルAIとクラウドAIで弾幕ゲームを作って比べる

· 約4分
もみじーな
個人開発者

※公開を忘れていた記事

Qwen3.5 27bとコーディング最高峰のClaude Opus 4.6だとやっぱり圧倒的な差がでます・・・

そもそもパラメータ数的に比べるのが間違っているのですがこれから本当にローカルGPUでコーディングを行おうとする人へのメッセージは本当にGPUを買うのか?
クラウドで良くないかとだけ書いておきます。

※一部の画像生成とか動画生成目的だけはありです。

弾幕ゲーム作成による比較

以下のGemini3.1 Proが生成したプロンプトから派生させていきました。

あなたは優秀なゲームプログラマーです。HTML5のCanvasとJavaScriptを使用して、東方Projectにインスパイアされた「弾幕シューティングゲーム」のプロトタイプを作成してください。
以下の要件を満たすコードを、1つのHTMLファイル(CSSとJSを含む)として出力してください。

【ゲームの基本要件】
1. 画面サイズ: 幅600px、高さ800pxの黒背景のCanvas。
2. メインループ: requestAnimationFrameを使用して滑らかに描画と更新を行うこと。

【プレイヤーの要件】
1. 操作: 矢印キーで上下左右に移動。
2. 東方風の特殊操作: Shiftキーを押している間は「低速移動」になり、自機の中心に小さな円(当たり判定の可視化)が表示されるようにすること。自機自体のグラフィックは適当な図形でよい。

【ボスと弾幕の要件】
1. ボス: 画面上部の中央に配置し、左右にゆっくりと移動させる。
2. 弾幕パターン: Math.sin() と Math.cos() を使用して、ボスから美しい幾何学模様の弾幕を発射する。
- 例として「全方位弾(円形に広がる)」と「渦巻き弾(回転しながら発射される)」を一定間隔で切り替えながら撃たせること。
3. パフォーマンス: 画面外(Canvas領域外)に出た弾は必ず配列から削除し、処理落ちを防ぐこと。

【当たり判定】
1. プレイヤーの中心の小さな当たり判定と、敵の弾(円)との間で円の衝突判定(ピタゴラスの定理)を行う。
2. 衝突した場合はコンソールに「Game Over」と出力し、ゲームの進行を停止させる。

Qwen3.5 27bが生成したもの

まぁ悪くはないですよね。

Claude Opus 4.6が生成したもの

Github Copilotで生成してます。
一応,もう何年か忘れましたかがPro+という39ドルにずっと入ってます。

これがClaudeです・・・
少なくともQwen3.5 397bでも使わないと現状はこのレベルは厳しいです。

コーディングをするならクラウド一択

上の比較の通りコーディングに関してはローカルでやらないといけない事情がない限りはクラウドを使ってください。
現在のローカルでクラウドに勝つには少なくともKimi K2などの超大型モデルをロードできる環境をよういできない限り不可能です。

勝てたとしてその予算は見合っているのかですがKimiやDeepSeekの量子化モデルで無理やりMacやRTX Proとかにロードするとして数百万円かかります。
Github Copilot+は39ドルです。
12か月使っても390ドル(年間だとお得)です。

Qwen3.5 27bを動かすためだけIntel Arcなどの安めのグラボを買ったとしても価格には見合っていません。
作りたいものがあるだけならGemini,Claude,ChatGPTを契約することおすすめだけします。

おまけ(Gemini 3.1で作ってみた)

これがGemini 3.1 Proの力だ!
ほぼ東方弾幕ゲームです。
素材さえ用意すればさらにいい感じにおそらくなります
Claudeよりやっぱりキャラデザインは強いきがします。

AI生成で東方の弾幕ゲームが完璧に作れる日はおそらく近いです。
SVGもそれっぽいですよね

プレイはこちら

エージェント(Qwen3.5 27b)のテストとAIに実行計画させるのは大事?

· 約3分
もみじーな
個人開発者

自分用のAIエージェントアプリを作成しているのですがGithub CopilotとかManusみたいに作業中の項目が見たいので実行計画をまず立てさせてから開発させるようにしたら生成の精度がよくなりました。

実行計画の実装前・実装後どうだったか

エラーがなくてもバグが多かったりAI自体がループに入ったりしましたが計画させて作業を分割したらなぜ1回でそこそこ動くアプリを作成してくれるようになりました。
ループもあんまりしなくなった。(なぜだ?むしろループを見ていない気も)
一度に色々と考えて生成させるのが原因なのか?
ある程度制限すれば減るのか?

生成テスト

テトリスの作成テスト

画像生成はStable Diffusionを起動していないのでエラーです
立ててれば自動で画像も生成して画像確認してつかってくれます。
あとこれは生成後に背景がなかったのでテストも兼ねておしゃれにしてと命令してます。

エージェントが勝手にエラーチェックもして修正してから報告してくるので基本的にはエラーがでるとかもないです。
スタートボタンなども勝手に押してテストしてくれます。(自分でもここまで機能実装して何を目指しているのかですが)

リバーシの作成テスト

エージェントの1回の完了報告でエラーやバグ、UIがずれているかもなさそう?
このリバーシとかもそうですがQwen3.5 27bとかQwen3.5シリーズが作成したものってなんか似たり寄ったりのUIと機能になりますよね。

TODOアプリの作成テスト

TODOアプリはなんとなくテストしただけです。 普通に動くし普通に使えなくはない。

最後に

Qwen3.5 27bいいですよねやっぱ 9bとかで開発テストしてますが使うときに27bを使うとここまで違うのかと実感します。(特にUIとか)
実行計画を立てさせるのがどれくらい効果的かはわかりませんが去年、Github CopilotでClaude 3.7(記憶が曖昧)とかの時に生成させたものに近いものが作れる気もしますのでQwen4.5に期待してます。
あと1bit量子化まだか?
富士通のQEPどうなったんですかね?3月になったので公開はされてるかもしれないですが精度89%がどれくらい響くのかもありますがはやくそこそこ精度の100bレベルが32GBくらいのVRAMで動いてくれると面白いですよね。

Qwen3.5のエージェントにWikipediaのDBを与えてみた

· 約8分
もみじーな
個人開発者

※3/11に追加でベクトル化もしましたが大変よかったです。

通常のAIモデルだと学習以前のデータは間違った答えを渡してくるので少しでもデータの正確性を保つためにWikipediaのデータを自動で検索するようにしてみました。

本当はベクトル化したいですけど時間かかるぽいので今回はテストとしてやってます。
来週か再来週あたりベクトル化したいですね。

画像のように現在の総理大臣も前のも大丈夫です。
なぜか私だけさんがつかないのがこのAIへの毎回の疑問ですが・・・

ちなみLM Studioだけだとこんな感じです。

ウェブリサーチさせる方法もありますけどネットを挟むとローカルだけだと動かないですしボットは嫌われる(企業ならやめたほうがいい)ので今回はWikipediaがデータベースを配布していることもあるのでダウンロードしてSQLite FTS5にデータを変換してAIが検索できるようにしてみました。

SQLite FTS5のデータはAPIでAIが参照するようにしているので割愛しますがデータベース化の仕方だけ残しておきます。

データベース作成方法

Wikipediaのデータ自体はhttps://dumps.wikimedia.org/jawiki/ から最新をダウンロードするだけです。
jawiki-20260301-pages-articles-multistream.xml.bz2 という4.4 GBを今回はダウンロードしました。

適当に学習させるフォルダに入れておいてください。
最終的にこうなります。

準備

学習に使ったコードは以下です。

requirements.txt

mwparserfromhell

build_wiki_db.py

"""
jawiki XML.bz2 → SQLite FTS5 (wiki.db) 変換スクリプト

出力:
wiki.db (同フォルダに作成)
"""

import bz2
import re
import sqlite3
import os
import sys
import time
import gc
import xml.sax
import xml.sax.handler

DB_PATH = "wiki.db"
BATCH_SIZE = 500 # 一度にINSERTする記事数
MAX_ARTICLES = 0 # 0 = 無制限。テスト時は例えば 10000 に設定すること
CHUNK_SIZE = 1024 * 1024 # 1MB ずつ bz2 展開

def strip_markup(text: str) -> str:
if not text:
return ""

# コメント除去
text = re.sub(r'<!--.*?-->', '', text, flags=re.DOTALL)
# <ref> タグ除去
text = re.sub(r'<ref[^>]*>.*?</ref>', '', text, flags=re.DOTALL)
text = re.sub(r'<ref[^/]*/>', '', text)
# その他HTMLタグ除去
text = re.sub(r'<[^>]+>', '', text)
# {{テンプレート}} 除去(ネスト対応・最大5段)
for _ in range(5):
prev = text
text = re.sub(r'\{\{[^{}]*\}\}', '', text)
if text == prev:
break
# [[File:...]] [[Image:...]] 除去
text = re.sub(r'\[\[(?:File|Image|ファイル|画像):[^\]]*\]\]', '', text, flags=re.IGNORECASE)
# [[リンク|表示テキスト]] → 表示テキストのみ残す
text = re.sub(r'\[\[[^\]|]*\|([^\]]*)\]\]', r'\1', text)
# [[リンク]] → テキストのみ残す
text = re.sub(r'\[\[([^\]]*)\]\]', r'\1', text)
# [URL 表示] → 表示テキスト
text = re.sub(r'\[https?://\S+\s+([^\]]+)\]', r'\1', text)
# 単独URL除去
text = re.sub(r'\[https?://\S+\]', '', text)
# 見出し記号除去
text = re.sub(r'={2,}(.+?)={2,}', r'\1', text)
# 太字・斜体
text = re.sub(r"'{2,3}", '', text)
# 表・wikitable
text = re.sub(r'^\s*[|!{][^\n]*', '', text, flags=re.MULTILINE)
# 余白整理
text = re.sub(r'\n{3,}', '\n\n', text)
return text.strip()


class WikiHandler(xml.sax.handler.ContentHandler):
"""
XML要素をツリーに蓄積せず、文字列バッファのみ使用。
メモリ使用量は記事1件分のテキストのみ (数KB〜数百KB)。
"""

def __init__(self, on_article):
super().__init__()
self._on_article = on_article
self._in_page = False
self._in_revision = False
self._tag = None
self._title_buf = []
self._ns_buf = []
self._text_buf = []

def startElement(self, name, attrs):
if name == 'page':
self._in_page = True
self._in_revision = False
self._title_buf = []
self._ns_buf = []
self._text_buf = []
self._tag = None
elif name == 'revision' and self._in_page:
self._in_revision = True
if name in ('title', 'ns') and self._in_page:
self._tag = name
elif name == 'text' and self._in_page and self._in_revision:
self._tag = name

def endElement(self, name):
if name in ('title', 'ns', 'text'):
self._tag = None
elif name == 'revision':
self._in_revision = False
elif name == 'page':
self._in_page = False
ns = ''.join(self._ns_buf).strip()
title = ''.join(self._title_buf).strip()
text = ''.join(self._text_buf)
self._title_buf = []
self._ns_buf = []
self._text_buf = []
if ns == '0' and title and text \
and not text.lstrip().startswith('#REDIRECT') \
and not text.lstrip().startswith('#転送'):
self._on_article(title, text)

def characters(self, content):
if not self._in_page or self._tag is None:
return
if self._tag == 'title':
self._title_buf.append(content)
elif self._tag == 'ns':
self._ns_buf.append(content)
elif self._tag == 'text':
self._text_buf.append(content)


class _StopBuild(Exception):
pass


# ── DB構築 ───────────────────────────────────────────────
def build_db(dump_path: str):
print(f"入力ファイル : {dump_path}")
print(f"出力DB : {DB_PATH}")
print("─" * 50)

con = sqlite3.connect(DB_PATH)
cur = con.cursor()
cur.executescript("""
PRAGMA journal_mode = WAL;
PRAGMA cache_size = -32000;
PRAGMA temp_store = FILE;
PRAGMA mmap_size = 0;
""")

cur.executescript("""
DROP TABLE IF EXISTS wiki;
CREATE VIRTUAL TABLE wiki USING fts5(
title,
body,
tokenize = 'unicode61'
);
""")
con.commit()

batch = []
count = [0]
t0 = time.time()

def on_article(title: str, text: str):
body = strip_markup(text)
if len(body) < 50:
return
batch.append((title, body))
count[0] += 1
if len(batch) >= BATCH_SIZE:
cur.executemany("INSERT INTO wiki(title, body) VALUES (?, ?)", batch)
con.commit()
batch.clear()
elapsed = time.time() - t0
rate = count[0] / elapsed
print(f"\r{count[0]:,} 件処理済 ({rate:.0f} 件/秒)", end='', flush=True)
if count[0] % 5000 == 0:
gc.collect()
if MAX_ARTICLES and count[0] >= MAX_ARTICLES:
raise _StopBuild()

handler = WikiHandler(on_article)
parser = xml.sax.make_parser()
parser.setFeature(xml.sax.handler.feature_namespaces, False)
parser.setContentHandler(handler)

opener = bz2.open if dump_path.endswith('.bz2') else open
try:
with opener(dump_path, 'rb') as f:
while True:
chunk = f.read(CHUNK_SIZE)
if not chunk:
break
parser.feed(chunk)
parser.close()
except _StopBuild:
pass
except xml.sax.SAXParseException as e:
print(f"\n[警告] XML解析終了: {e}")

if batch:
cur.executemany("INSERT INTO wiki(title, body) VALUES (?, ?)", batch)
con.commit()

elapsed = time.time() - t0
print(f"\n{'─'*50}")
print(f"完了: {count[0]:,} 記事 所要時間: {elapsed/60:.1f} 分")
if os.path.exists(DB_PATH):
print(f"DBサイズ: {os.path.getsize(DB_PATH) / 1024**3:.2f} GB")
con.close()


# ── 検索テスト ────────────────────────────────────────────
def test_search(query: str, limit: int = 5):
if not os.path.exists(DB_PATH):
print("wiki.db が見つかりません。先に build を実行してください。")
return
con = sqlite3.connect(DB_PATH)
cur = con.cursor()
rows = cur.execute(
"SELECT title, snippet(wiki, 1, '[', ']', '...', 20) FROM wiki WHERE wiki MATCH ? ORDER BY rank LIMIT ?",
(query, limit)
).fetchall()
con.close()
if not rows:
print(f"「{query}」に一致する記事が見つかりませんでした。")
return
for i, (title, snip) in enumerate(rows, 1):
print(f"\n[{i}] {title}")
print(f" {snip}")


# ── エントリーポイント ────────────────────────────────────
if __name__ == '__main__':
if len(sys.argv) >= 2:
cmd = sys.argv[1]
if cmd == 'search':
q = ' '.join(sys.argv[2:]) if len(sys.argv) > 2 else '機械学習'
test_search(q)
else:
# 引数をダンプファイルとして扱う
build_db(cmd)
else:
# 自動検索
candidates = [f for f in os.listdir('.') if f.endswith('.xml.bz2')]
if not candidates:
print("エラー: *.xml.bz2 ファイルが見つかりません。")
print("使い方: python build_wiki_db.py <ダンプファイル>")
sys.exit(1)
build_db(candidates[0])

私がbatファイルで起動したいので作成してます。
build.bat

@echo off
chcp 65001 > nul
echo ============================================
echo Wikipedia FTS5 DB ビルダー
echo ============================================
echo.

:: Python確認
python --version > nul 2>&1
if %errorlevel% neq 0 (
echo [エラー] Python が見つかりません。
echo Python 3.8以上をインストールしてください。
pause
exit /b 1
)

:: 依存ライブラリインストール
echo [1/2] 依存ライブラリをインストール中...
pip install -r requirements.txt
if %errorlevel% neq 0 (
echo [エラー] pip install に失敗しました。
pause
exit /b 1
)

echo.
echo [2/2] wiki.db を構築します(数十分かかります)...
echo 処理中はウィンドウを閉じないでください。
echo.

python build_wiki_db.py

if %errorlevel% neq 0 (
echo.
echo [エラー] ビルドに失敗しました。
pause
exit /b 1
)

echo.
echo ============================================
echo 完了! wiki.db が作成されました。
echo ============================================
echo.
pause

batファイル起動

batファイル実行したらこんな感じですね

完了

私の環境では20分程度で終わりました。

API実装などは自由に

12GB程度のデータベースが生成されますがデータベースなので自由に組み込めるはずです。
最新のデータがほしくなったら都度、DBを更新する必要がありますがある程度のデータには答えてくれるようになります。

最後に

そもそも現状のローカルAIに求めすぎな気がするんですよね所詮はローカルです。
物足りないならクラウドを使うべきだとは思いますがローカルで楽しみたいですよね・・・

もし時間に余裕があるならembedding,ベクトル化することをお勧めします。
精度が多分ですが全然違います。

追加でベクトル化もしました(2026/03/11)

結局、次の日にembeddingを作成しましたが更新してなかったので書いておきますが
embed + FTS5ハイブリッド検索に切り替えた方が確実に精度が上がります。
これは確実です。
FTS5だけだったときは時々違うデータが入っていたのでそれはなくなりました。

DB→embed作成で所要時間はRTX5090で50分かからなかったのでこの精度ならやる価値はあると思いますが最新データがどうしてもほしい場合だけです。

せっかくなのでコーディング用に次はBigCodeとか試して見ようと思いますがどれくらい精度があがってくれるか楽しみです。

Qwen3.5搭載のAIエージェントを作れば案外使える

· 約2分
もみじーな
個人開発者

Gensparkを契約しようか考えてたのですがManusと同じく一瞬でクレジットなくなるので微妙なんですよね。
あとGensparkは画像を集めろと命令しても著作物はあつめ・・なんでもないです。

なので自作してますが少なくとも作るのは難しくないです。
データベースも自分しか使わないのでSQLiteにしてるので楽ですね。

今は色んなオープンソースやライブラリがあるので結構いい感じに個人用なら作成が可能です。
Qwen3.5の9bと2bなどで切り分けて使えるようにしてますが27bとかでもいいですが速度がちょっとって感じですね。
gpt-oss-20bとかでもそりゃいいですけど画像が使えないです。

動作動画も張っておきます。

AIのエンドポイントはLM StudioとOpenRouterに対応させてるのでローカルでもクラウドでも可能にしてます。

ウェブリサーチもPlaywrightでいい感じになってますが精度があまりまだよくないですしエージェントに画像生成も組み込ませたいのでまだまだ理想のエージェントは遠そうです。

Qwen3.5 Small(0.8b,2b,4b,9b)の画像認識テスト(内容を訂正しました)

· 約2分
もみじーな
個人開発者

※3月4日にかなり修正してます


帰ってきて適当に作ってデバッグログみない自分が悪いのですが昨日作成した分は補助モードに勝手に入っており綺麗にできていただけでした。

補助モードを実装した理由は生成失敗によるミスをなくすためでしたがそれが悪さをしてましたね・・・

補助モードを削除したうえでOpenCVで画像加工処理するように変更しました。

結局,2Bが一番組み込むならいいです。

Thinkingもなんとかきれました。
9Bでも爆速です。

もうしばらくは満足です。

昨日(3月3日)までの分↓
動画はあれみて4bすごいと思われないように限定公開にしました。

小さくて画像認識精度が高いモデルを日頃さがしてるのですがQwen3.5 4Bはかなりよかったです。

テトリス作って画像認識操作テストした動画です。
Qwen3-VL-4Bから2Bまでは処理できてませんがQwen3.5 4Bから圧倒的です。
もちろん画像認識精度だけの問題ではないですが性能がここまであがるとこれからが楽しみです。
ロボットとかドローンとかに組み込めば面白そう?

このクラスが2Bにおさえられたら夢が広がりますがとりあえずQwen3.5 4Bでここまで動くならよさそうです。

ホールド機能つけてないので配置がおかしいところがありますが私がテトリスやるより早いですたぶん・・・・

Intel ArcでLora学習するたのメモ(Pony)

· 約4分
もみじーな
個人開発者

IntelでLora学習するためのメモですがIntel Arc Pro B60でしかテストしてないので他で動くのか不明
VRAMが20GB超えるのでoptimizerの変更が必要かも

寝る前にテストしたやつをまとめました。
Githubにbatファイルで動作テストしたやつ上げましたので必要があればそっちを
Githubはこちら

学習するための手順

必要かも

エラーが出た記憶もあるので必要ならインストールしてください。
Docker触ってた時のメモかもしれないので不明(たぶんいらない)
1.base-toolkit
インストール後 以下を実行する。

& "C:\Program Files (x86)\Intel\oneAPI\setvars.bat"

2.vc_redist.x64.exeまたは[https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170]

準備

PowerShellを使うので必要があれば

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force

ダウンロード

git clone https://github.com/ostris/ai-toolkit.git
cd ai-toolkit

環境を構築する

venvはお好み
今回は除外
install順番は崩さないでください。

python -m pip install --upgrade pip
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/xpu
pip install intel-extension-for-pytorch
pip install psutil
pip show psutil
pip install intel-extension-for-pytorch --index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/us/

バージョン確認

ここでエラーがでると失敗しています。

python -c "import torch; print('PyTorch Version:', torch.__version__)"

bitsandbytesを置き換え

(Get-Content requirements.txt) | Where-Object { $_ -notmatch "bitsandbytes" } | Set-Content requirements.txt

依存関係のインストール

pip install -r requirements.txt

CUDAの記述をXPU用に書き換え

PowerShellで実行
Intelの良いところはここです。
置き換えるだけで基本的に動きます。
注意として同一フォルダ内でvenvで環境つくってると中身置き換えれられるのでフォルダを除外してください。

Get-ChildItem -Path . -Filter "*.py" -Recurse | ForEach-Object {
$content = Get-Content $_.FullName -Raw

# 3つのパターンを置換
# 1. "cuda" -> "xpu"
# 2. 'cuda' -> 'xpu'
# 3. .cuda() -> .to("xpu")

$newContent = $content -replace '"cuda"', '"xpu"' `
-replace "'cuda'", "'xpu'" `
-replace '\.cuda\(\)', '.to("xpu")'

# 変更があった場合のみ保存
if ($content -ne $newContent) {
Write-Host "Modifying: $($_.FullName)"
$newContent | Set-Content $_.FullName -NoNewline
}
}

学習設定ファイル (yaml) の作成

今回はconfig/myscript_b60.yaml として保存してください。
設定はサンプルなので修正してください。

job: extension
config:
# Lora名を下に記入してください
name: "my_pony_lora"
process:
- type: 'sd_trainer'
training_folder: "output"
device: "xpu" # Intel Arc

# モデル設定
model:
# ここにダウンロードしたPonyのファイルのパスを書いてください
name_or_path: "C:/Users/momijiina/Documents/ponyDiffusionV6XL_v6StartWithThisOne.safetensors"

is_flux: false
is_xl: true
quantize: false

# ネットワーク設定
network:
type: "lora"
linear: 16
linear_alpha: 16

# 学習設定
train:
batch_size: 1
steps: 1500
gradient_accumulation_steps: 1
train_unet: true
train_text_encoder: false
content_or_style: "balanced"
#optimizer: "adamw"
optimizer: "adafactor"
lr: 1e-4

# データセット設定
datasets:
# 画像フォルダのパスをここに記入してください
- folder_path: "C:/Users/momijiina/Documents/lora"
caption_ext: "txt"
caption_dropout_rate: 0.05
shuffle_tokens: false
cache_latents_to_disk: true
resolution: [1024, 1024]

# サンプル生成設定
sample:
sampler: "ddim"
sample_every: 100
width: 1024
height: 1024
prompts:
- "score_9, score_8_up, score_7_up, source_anime, simple background, 1girl, standing"
neg: "score_6, score_5, score_4"
seed: 42
walk_seed: true
guidance_scale: 7.0
sample_steps: 28

学習開始

とりあえずは動くはずです。
私の環境では・・・

python run.py config/myscript_b60.yaml

Ubuntu25でllm-scalerのvllmもテストする

· 約4分
もみじーな
個人開発者

WSLで動かないですしUbuntu 24だとGPU2枚だとエラーが出て使えなかったので公式推奨のサポート期限切れのUbuntu 25.04をインストールしてみました。

とりあえず最初にもう言っておきますがさすが推奨バージョンです。
マニュアル通り基本動きます。
あとWSLと内容が重複してます。

準備

ドライバーインストール

公式を一応みてください
dgpu-docs-intel

sudo apt-get update
sudo apt-get install -y software-properties-common
sudo add-apt-repository -y ppa:kobuk-team/intel-graphics
sudo apt-get install -y libze-intel-gpu1 libze1 intel-metrics-discovery intel-opencl-icd clinfo intel-gsc
sudo apt-get install -y intel-media-va-driver-non-free libmfx-gen1 libvpl2 libvpl-tools libva-glx2 va-driver-all vainfo
sudo apt-get install -y libze-dev intel-ocloc
sudo apt-get install -y libze-intel-gpu-raytracing

base-toolkitをインストール

公式を見てください
base-toolkit

Ubuntu25も更新しないとパッケージは見つかりません。

公開鍵の取得

wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
| gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null

リポジトリの追加

echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" \
| sudo tee /etc/apt/sources.list.d/oneAPI.list

インストール

終わったらrebootかけてください

sudo apt update
sudo apt install intel-oneapi-base-toolkit

GPUの認識確認

export LD_LIBRARY_PATH=""
source /opt/intel/oneapi/setvars.sh --force
sycl-ls

llm-scalerのvllmをdockerでインストール

現在はlatestも1.3なので確認してください。
一覧

sudo docker run -it --name my-vllm \
--privileged \
--net=host \
--device=/dev/dri \
--name=lsv-container \
-v /home/intel/LLM:/llm/models/ \
-e no_proxy=localhost,127.0.0.1 \
-e http_proxy=$http_proxy \
-e https_proxy=$https_proxy \
--shm-size="16g" \
--entrypoint /bin/bash \
intel/llm-scaler-vllm:1.3

モデルのダウンロード

最初にモデルダウンロードしたほうが絶対いいですね・・・

huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-7B --local-dir DeepSeek-R1-Distill-Qwen-7B

gpt-oss-20b

huggingface-cli download openai/gpt-oss-20b --local-dir /llm/models/gpt-oss-20b

実行する

gpt-ossはbfloat16で大丈夫みたいですね
float16でやったり前はしてたので今回のバージョンはしっかりエラーでたのでわかりました。

VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 \
VLLM_WORKER_MULTIPROC_METHOD=spawn \
vllm serve \
--model /llm/models/gpt-oss-20b \
--served-model-name gpt-oss-20b \
--quantization mxfp4 \
--dtype bfloat16 \
--host 0.0.0.0 \
--port 8000 \
--trust-remote-code \
--gpu-memory-util 0.9 \
--max-model-len 8192
-tp 2

速度はどれくらいでるのか

1枚も2枚も速度差はなかったです。
最大70token/sなのでLM Studio以下ですね。
今,LM Studioなら80token/s以上一応でてますので・・・・

途中でモニターを4Kに変えたので見ずらいですけど編集めんどくさいのでズームしてください(必要なら)

一応、以下を実行してます。

curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-oss-20b",
"messages": [
{"role": "user", "content": "Hello! How are you?"}
],
"max_tokens": 4096
}'

ArcシリーズはやっぱりWindowsでのほうが速そうですね。
llm-scalerのomniももしかしたらテストするかもしれないです。

Wan2.2をGPU2枚で実行できるらしい?ので

ConoHa VPSのL4でLora学習する

· 約3分
もみじーな
個人開発者

ConoHa VPSのL4でLora学習するためのメモです。
Google Colabとどっちがいいかと言われればどっちもメリットかデメリットあるので好きな方をColab Pro+の方が財布には優しいです。
Colab Proもバックグラウンド実行できるならよかったんですけどね。
長時間作業してると間違ってブラウザ閉じたり再起動されたりするのでバックグラウンド実行(最低Colab Pro+)はほしいです。

あと学習させる画像によってはBanされるリスクがあるのでね?

長いので開発の方に入れてもよかったですけど今回はblog側に

準備

アップデート

立てたばっかなので更新

sudo apt -y update && sudo apt -y upgrade

Nvidiaのドライバーインストール

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | 
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

ドライバーをインストール

sudo ubuntu-drivers autoinstall

再起動は必須

体感で5分くらいかかった気がする長い

sudo reboot

確認

sudo nvidia-smi

python3をインストールする

pythonはaptで十分です

sudo apt install python3.10-venv
sudo apt install python3-dev

ai-toolkitのインストール

基本公式通りに
エラーは特にでなかった

git clone https://github.com/ostris/ai-toolkit.git
cd ai-toolkit
python3 -m venv venv
source venv/bin/activate
pip3 install --no-cache-dir torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 --index-url https://download.pytorch.org/whl/cu126
pip3 install -r requirements.txt

起動テストする

nodejsを使うのでインストール
aptでいれたら古かったですね

sudo apt -y install nodejs npm
sudo npm install n -g
sudo n lts

WebUI使うのでパスワードを設定しておく必要があります。
super_secure_passwordは公式初期パスワードなので長く使うなら変更してください。

cd ui
AI_TOOLKIT_AUTH=super_secure_password npm run build_and_start

ポート開放とか

どうせすぐ消すので直接
ConoHaはコントロールパネルからも許可が必要

sudo ufw allow 8675
ufw reload

Screenコマンドで一時的に動かす

screen
AI_TOOLKIT_AUTH=super_secure_password npm run build_and_start

起動後はCtrl+A+Dとかで抜けれます。

Lora学習を開始する

WebUIへアクセスする

初めてパスワード画面みたので新鮮です。

Z-Image-Turboを学習する

VRAM 24GBあるのでせっかくならZ-Image-Turboを学習する
ちょうど学習したいやつあったのでdatasetsフォルダに新しくフォルダ作ってRLoginから放り込みました。

設定はこれでいいかでやりました

とりあえず学習を開始してから6時間くらいで完了してたと思います。

私はローカルでいいかな。