その他
記事内に商品プロモーションを含む場合があります

QwQ-32Bは本当にすごいのか?プログラミング能力をチェックしてみた

Aru

以前、ChatGPTのプログラミング能力をチェックするために、「素数かどうかを判定する」コードの生成を依頼し、結果を検証してみました。あれから2年、LLMのプログラミング能力もかなり向上しました。この記事では、ローカルLLMとしても動作させることができるQwQ-32bで同じことをやって能力をチェックしてみました。

あわせて読みたい
ChatGPTのプログラミング能力を素数判定コードを使ってチェックする
ChatGPTのプログラミング能力を素数判定コードを使ってチェックする

はじめに

大規模言語モデル(LLM)の性能も向上し、LLMを使ってプログラムの作成・アシストをさせることが普通になってきました。ChatGPT-o1などの推論モデルならかなり複雑なプログラムも作成できるようになりました。

私も、日頃からLLMにちょっとしたプログラム作成の支援をお願いしています。

ただ、プログラムってクラウド型のLLMで聞きたくないこともあるんです(公開したくないコードとかありませんか?)。といういわけで、ローカルPCで動作するローカルLLMでどの程度コード生成ができるかチェックしてみました。

今回は、2年前にChatGPTで試したのと同じ、「Nが素数かどうか判定する関数」の作成でチェックしてみました。素数判定は、典型問題でWebにもたくさん情報があり、Webのデータで学習しているLLMなら当然作れるプログラムです。

評価に利用したLLMは、2025年に新しく登場したQwQ-32Bというモデルです。このモデルはDeepSeek-R1(671B)と同じレベルの性能をベンチマークで実現したという触れ込みのモデルです。環境はMacBook Pro(M4Max)で、4bit量子化のモデルを使いました。

モデルのURL:https://huggingface.co/Qwen/QwQ-32B

4bit量子化モデルなら24GBで動きそうなので、試してませんがRTX4090なら動かせるかもしれません

「Nが素数かどうかを判定する関数」を作成させる

プロンプトでは、計算量を考慮して欲しいと伝えています。また、プログラミング言語はPythonと指定しました。入力したプロンプトは以下の通りです。

入力したプロンプト

以下の処理を行う関数を計算量を考慮して作成してください。なお、プログラミング言語はPythonとします

Nが与えられ、素数かどうかを判定する関数

QwQ-32Bは、推論モデルなのでthinkingでしばらく考えてから出力が始まるので、少し時間がかかります。出力は以下の通り(Thoughtで5分近く考えていましたが、これはPCを省電力で動かしているからです。省電力でない場合は二倍程度は速いです)。

以前、ChatGPTで作成した時は、エラトステネスの篩でテーブルを作成して素数判定をするプログラムを作成していましたが、こちらは無駄な配列など使わないコードが出力されました。

2の倍数を先にやっている部分もポイントです。

QwQ-32Bの出力

ちなみに、Thoughtの中は中国語でした。QwQ-32Bはアリババのモデルなので当然といえば当然かもですが。なお、状況により日本語だったり、英語だったり、中国語だったり、これらが混じったりします。

ただ、個人的には、int(math.sqrt(n))というぶぶんが気に入らないです。ここって、i*i <= Nとすれば整数化できます。そこで以下のプロンプトを続けて入力してみます。

入力したプロンプト

int(math.sqrt(N))は好みではないので、i*i > Nをループの脱出条件にしてください。

するとこんな感じで出力してくれました。とりあえず、こちらが想定していた出力をちゃんと出してくれたので満足です。ただ、thinkingが長いです(8tok/secくらいの生成速度なのでどうしても時間がかかります)。

Screenshot

QwQ-32Bは数学系が強いみたいです。実際、京都大学の入試問題を1問解かせてみましたが、20分ほどで正解を出力しました。

競技プログラミングの問題で使った感想

また、後追いでAtCoderの問題を解いていて、自分で解きつつ同時にLLMで解かせて競争しているのですが、QwQ-32BはABCコンテストならある程度解けるようになってきた印象があります。

簡単なB,C問題で苦戦するのに、D問題などをサクッと解いたりするのが結構驚きです。A,B問題は推論モデルより、普通のQwen-Coderなどの方がサクッと正解を出力できたりします。

AtCoderでLLMを使う場合、以下のようなプロンプトを最初に書いておくと良いです(ローカルLLMではシステムプロンプトに入れてテンプレート化しています)。

ただ、AtCoderでは競技中の生成AIの使用には制限があります。特に「AtCoderから提供される問題文のテキストや画像を、直接生成AIなどのプログラムに与えることを禁止する」なので、そのままコピペでもだいを解くのはルール違反なので気をつけましょう。

AtCoder用のプロンプト
これから解いてもらう問題は、AtCoderのABCの問題の1つです。
AtCoderの問題は以下のような特徴があります。

# AtCoderの問題の特徴
- A問題からF問題と難易度が上昇する
- 演算量が問題になることが多い。例えば、N^2で解ける問題だがNで解かないと間に合わないなど
- 演算量が1e7程度なら愚直にやっても問題ない
- 問題には制約が与えられるのでそれを見て演算量を考え、適切な解放を選ぶ必要がある
- 二分探索、動的計画法、グラフなどをつかうことで解ける問題も多い
- 数学的な問題が出題されることもある

ここでは、以下の手順で解き、最終的にプログラムを作成してください。

1. 問題の理解:問題を読み、まとめた内容を書く
2. 方針の整理:どのようなアプローチで解くかを書く
3. 解法:解法とそれに沿ったプログラムを書く

なお以下の情報が与えられます。

# 与えられる情報
- 問題文:問題文です
- 制約:制約です
- 入力フォーマット
- 入力例と出力例:入力と出力例です

ちなみに「1. 問題の理解:問題を読み、まとめた内容を書く」「2. 方針の整理:どのようなアプローチで解くかを書く」は、問題をちゃんと正しく理解できているかと、どのようなアルゴリズムを使って解いたかを確認したいからつけています。

出力サンプル(ABC-395A問題)

ためしに、AtCoder ABC395のA問題を解かせてみました。約1分で返答が戻ってきて、以下のような出力が得られました。コードは、問題なくACします。

ABC395-A問題に対する解答

競技プログラミングは、自分のスキルアップのためのものなので生成AIにお任せじゃ楽しくありませんが、ローカルLLMでも解けるようになったというのは正直驚きです。

自分で考えるのに価値がありますので、競技で使うなら、「こういうことするアルゴリズムってある?」みたいな使い方が、一番良い気がします。

ここに書いた以外の競技プログラミングの問題もいくつか解かせているのですが、難しい問題はThinkingのままずっと考えていることも多いです。簡単な問題で長考してループにはまることもあります。問題によっては軽めのモデル(Gemma3など)がサクッと解くのにQwQ-32Bは延々考え続けるということもしばしばありました。

QwQ-32BやDeepSeek-R1-distillなどの推論モデルを使う場合は、コンテキスト長をできるだけ長めにしておく必要があります。メモリ量と相談しつつ長めに設定しましょう。

終わりに

LLMはプログラミングサポートのツールとしてかなり優秀です。ただ、APIの引数などに誤りがあることが多いのでWebでの検索とペアで使うべきだと思います。

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
ある/Aru
ある/Aru
IT&機械学習エンジニア/ファイナンシャルプランナー(CFP®)
専門分野は並列処理・画像処理・機械学習・ディープラーニング。プログラミング言語はC, C++, Go, Pythonを中心として色々利用。現在は、Kaggle, 競プロなどをしながら悠々自適に活動中
記事URLをコピーしました