ログや掲示板の投稿から、「危ないわりに割に合わない依頼」のような条件で行を探したくなったことはないだろうか。「危険」でも「割に合わない」でも、その言葉自体が書かれているとは限らない。正規表現のgrepは文字列のパターンでしか探せないので、結局は目で全部読むしかなかった。5日前にAIモデル「Jev」が早期アクセス公開されたのをきっかけに、この条件を扱えるツールが登場している。2026年9月19日、個人開発者がJevを使い、意味そのものを条件にして行を探すツール「jev-semgrep」を公開した。数十行の検索なら1秒もかからず、費用も1円に届かない。
正規表現では書けない条件とは何か
開発者のuehaj氏が公開したツール「jev-semgrep」のデモには、冒険者ギルドの依頼一覧のようなテキストファイルが使われている(Zenn記事)。「【討伐】ドラゴン退治。報酬は銅貨5枚」という行と、「【討伐】ゴブリン退治。報酬は銀貨20枚」という行が並んでいる。ここから「危険のわりに報酬が安すぎる依頼」を探したいとき、正規表現ではそもそも条件を書けない。正規表現は文字列の並びをパターンとして書く仕組みで、「ドラゴン」や「安い」という単語が探している条件そのものとしては現れないからだ。
jev-semgrepは、この条件を英語の一文で渡す形で解決する。
semgrep -n -p -e "the reward is far too low for the danger involved" tests/guild.txt
結果は次の1行だけがヒットした。
5:【討伐】ドラゴン退治。報酬は銅貨5枚 [0.86]
銀貨20枚のゴブリン討伐の行は出てこない。「ドラゴンは危険な相手だ」「銅貨5枚は依頼の報酬として安い」という、このテキストのどこにも書かれていない前提知識を踏まえた判定になっている。自分がまず驚いたのは、この2つの言葉が対象のテキストのどこにも出てこないのに判定が当たっていたことだ。次に気になるのは、単語も出てこないのにどうやって「合っている」と判定しているのか、という点になる。
単語が一致しないのになぜヒットするのか
jev-semgrepの裏側で動いているのは、TypeSafe AIが2026年9月15日に早期アクセスで公開したAIモデル「Jev」だ。Jevは文章を生成する代わりに、「ある行はこの条件に当てはまるか」という真偽の判定に特化している。この判定はJevの用語で「noul」と呼ばれ、確率つきで返る(daily-notesの解説記事)。
jev-semgrepは、ファイルの各行と検索条件の組み合わせをまとめて1回のリクエストに詰め、Jevにすべて並列で判定させている。さきほどの「[0.86]」は、その行が条件に合っている確率だ。1行ずつ順番にAIへ聞いているわけではないので、行数が増えても待ち時間はほとんど伸びない。
先ほどのドラゴンの例で起きているのは、単語の言い換えを探す処理ではない。「ドラゴン」という単語と「危険」という条件の間には、辞書的なつながりも文字の類似もない。Jevは学習した一般的な知識を使い、「ドラゴンを倒すのは危険で、銅貨5枚はその対価として安い」という関係を判定に持ち込んでいる。人が読めば当たり前でも、文章そのものには書かれていない関係だ。これが、正規表現だけでなく単純な類似度検索とも違う点になる。
実際どのくらい速くて安いのか
uehaj氏の記事によると、30行を1回のリクエストにまとめて処理した場合、応答は約0.2秒。同じ30行を1行ずつ送ると約7秒かかるという。これが、行をまとめて並列に判定する効果だ。
費用はTypeSafe AIの公式単価である入力100万トークンあたり0.042ドルに基づく。2つの検索条件を30行に当てはめると、消費するトークンはおよそ3,000程度だ。日本円に直すと1円に届かない(GitHub README、単価はTypeSafe AI公式サイトの記載とも一致)。
この安さと速さは、別の開発者が公開したツールでも裏づけられている。mizchi氏は2026年9月20日、「jev-lint」というツールを公開した(Zenn記事)。関数名・テスト名・コメントが、実際のコードの中身と食い違っていないかをJevで判定するツールだ。同氏によると、1ファイル内で約1,950件の判定を約7.7秒・約8円でこなせるという。静的解析では見つけられない「名前と中身のズレ」を、コードを実行せずに大量チェックできる計算になる。
自分の手元でも試せるのか
jev-semgrepはNode.js 20.12以降があれば、次のコマンドだけで使える。
npm install -g @uehaj/semgrep
TypeSafeのコンソールでAPIキーを取得する。環境変数TYPESAFE_API_KEYか~/.config/semgrep/.envに設定すれば準備は完了だ。
検索条件は-eオプションで複数指定でき、その場合はOR。-aはAND、-vはAND NOTとして働く。「護衛の依頼で、報酬額が明記されていないもの」のような複合条件も、一文ずつ積み重ねて書ける。日本語のクエリで英語のテキストを、あるいはその逆を検索することもできる。
ただし、試す前に知っておいたほうがいい条件が2つある。1つは、検索した行がすべてTypeSafe AIのサーバー(api.typesafe.ai)へ送られること。手元だけで完結する従来のgrepとは違い、パスワードや個人情報を含むファイルにはそのまま使わないほうがいい。もう1つは精度で、TypeSafe AIの公式ドキュメントによれば英語が最も精度が高く、日本語を含む他の言語は同等の精度ではないとされている。uehaj氏のデモでは童話のテキストを対象に日本語とドイツ語が混じった検索も動いているが、公式の説明に従うなら、条件文はできるだけ英語で書くほうが安定する。
独立した開発者が5日で複数動いている
ここまで見てきたjev-semgrepとjev-lintは、別々の開発者が別々の目的で作ったツールだ。実はこの2つだけではない。Jevの早期アクセス公開からまだ5日というタイミングで、「意味で探すgrep」という同じ発想の実装が、少なくとももう2つ見つかる。
| ツール名 | 実装言語 | 著者 | 用途 |
|---|---|---|---|
| jev-semgrep | Node.js | uehaj | テキストの行を意味で検索 |
| jgrep | Rust | Neel49 | テキストの行を意味で検索 |
| jev-grep | Python | jiayao | テキストの行を意味で検索 |
| jev-lint | Node.js | mizchi | コードの命名とコメントの矛盾を検出 |
RustのjgrepもPythonのjev-grepも、Jevに「この行は条件に合うか」を問い合わせる仕組みは共通している。速度は1行あたり約200ミリ秒。費用は1行あたり0.0000126ドル程度で、jev-semgrepの数値とおおむね近い(Neel49/jgrep、jiayao/jev-grep)。3人の著者に接点がある様子はなく、それぞれ独立に同じ着想へたどり着いたとみられる。
Jevはまだ早期アクセス限定で、一般提供の時期も正式な料金プランも公開されていない(前回記事の確認事項)。それでもAPIキーさえ手に入れば誰でも呼び出せるホスト型のモデルなので、モデル自体の一般提供を待たずに周辺のツールが先に増えていく。広く使われているとは言えないモデルの上に、接点のなさそうな開発者がこれだけ短期間で実装を重ねてきた。これはJev単体の発表を見ていただけでは分からなかった点で、自分にとって意外だった。
まとめ
正規表現では書けなかった「意味」の条件で、テキストの行を検索できるOSSツールが実際に使える状態になった。最初に公開されたjev-semgrepは、文章に書かれていない前提知識まで踏まえた判定ができ、数十行なら1秒未満・1円未満で終わる。裏側にあるのは、TypeSafe AIが2026年9月15日に早期アクセス公開したAIモデルJevの「noul」判定だ。公開から5日足らずのうちに、コード検索・コード品質チェックという別々の用途で、少なくとも4つの独立した実装が生まれている。検索対象が外部のAPIへ送られる点と、精度が英語ほど安定しない言語がある点にだけ注意すれば、今すぐ試せる。
コメント
気づきや感想をどうぞ記事への補足や、読んで考えたことをお寄せください。個人情報や、他の人を傷つける内容の投稿はお控えください。
投稿にはGoogleログインが必要です。
Googleでログイン投稿にはGoogleアカウントの表示名が公開されます。メールアドレスは取得・公開しません。
コメントを読み込んでいます…