見出し画像

【o3-mini-high】文字数をきっちり守って文章を生成させる

なぜこんなことを考えたか

数日前にo3-miniが公開された。Perplexityの解説を貼っておく。

o3-miniは、OpenAIが2025年1月31日に公開した最新の小型言語モデルで、以下の主要な特徴があります。

## 性能と速度
- o1-miniと比較して約24%高速化され、平均応答時間が10.16秒から7.7秒に短縮[4][12]
- STEM分野(科学・技術・工学・数学)での推論に特に優れた性能を発揮[4][5]
- 専門家のテストでは56%がo1-miniよりも優れた回答を生成し、重大なエラーを39%削減[5]

## 推論機能
- 3段階の「思考時間」設定(低・中・高)を備え、問題の複雑さに応じて調整可能[1][6]
- 高度なチェーン・オブ・ソート機能により、数学や論理クエリへの正確性が向上[4]
- インターネット検索機能と連携し、最新情報を含む回答を生成[1]

## 利用可能性とコスト
- ChatGPTとAPIの両方で利用可能[2]
- 無料ユーザーも制限付きで利用可能[3]
- Plus/Teamプランでは1日150メッセージまでの制限あり[15]

## 特殊機能
- 関数呼び出し、構造化出力、開発者メッセージなどの開発者向け機能をサポート[2]
- コーディング能力が向上し、短いプロンプトで動作するコードを生成可能[3]
- 視覚機能はサポートしていない[2]

Citations:
[1] https://note.com/hitsuji_fire/n/n65913ae64603
[2] https://note.com/it_navi/n/n3c01092dede7
[3] https://note.com/kazu_t/n/n680cb2d5c485
[4] https://zenn.dev/aimasaou/articles/0050679e774293
[5] https://note.com/chaen_channel/n/n6b00b5269a24
[6] https://rozetta-square.jp/knowledge/9602/
[7] https://shift-ai.co.jp/blog/15797/
[8] https://www.youtube.com/watch?v=AnCpjBB3yE8
[9] https://dc-okinawa.com/ailands/o3-o3-mini/
[10] https://philipptarohiltl.com/chatgpt-o3-mini/
[11] https://zenn.dev/acntechjp/articles/49879c2fa0f58d
[12] https://apidog.com/jp/blog/openai-o3-mini-api-pricing/
[13] https://zenn.dev/okikusan/articles/5ed583eef0a118
[14] https://www.youtube.com/watch?v=T0OBd50JkM4
[15] https://www.itmedia.co.jp/aiplus/articles/2502/01/news083.html
[16] https://note.com/nao_pdm/n/n39ab73095981
[17] https://zenn.dev/ryuuri/articles/b34f9e579d28d9
[18] https://qiita.com/syukan3/items/5a8cdb124a4d3e54bdc0
[19] https://momo-gpt.com/column/chatgpt-o3mini/
[20] https://x.com/kaichi_gpt/status/1885534285681353200

Perplexity

STEM分野が得意だとのこと。ふと思いついて、文字数を厳密に守らせて文章を生成する方法を試してみた。

以前から言われているが、ChatGPTなど生成AIが文字を数える際、トークンという単位を利用する。トークンは文字数とは厳密にはリンクしていないため、文字数を指定しても生成AIはその指示をなかなか守ることができない。

Webの文章であれば、1文字単位で数える必要はないだろう。しかし、印刷物では、かなりしっかり数える必要がある。また、Webであっても、例えば2000文字か4000文字かは区別した方がよかろう。

文字数をしっかり守らせながら文章を生成させる方法として見かけたのは、プロンプトをいろいろと工夫するものだったと記憶している。ただ、あまり確実ではないようだった。

そこで思い出したのが、生成AIでの文章生成でPythonのプログラムを作って数えさせる方法である。かなり前に聞いたことがある程度だったが、コードを見てなかった(見てもわからん)ので、具体的な方法としては認識していなかった。

まずは文字を正しくカウントする

最初にやったのは、日本語の文章を正しくカウントするプログラムを作るところ。文章を与えて「これは何文字?」に対して正しい答えが出てくるようにする。これは難しくはない。

import unicodedata

# ユーザーから文章を入力
text = input("文章を入力してください: ")

total_count = 0

for char in text:
    # 各文字の東アジア幅カテゴリを取得し、半角なら0.5、全角なら1とカウント
    if unicodedata.east_asian_width(char) in ('Na', 'H'):
        total_count += 0.5
    else:
        total_count += 1

print("文字数:", total_count)

これを実行すると「文章を入力しろ」と言ってくるので、文章をペーストしてやれば、文字数が正しくカウントされる。

ちなみに、印刷物では、全角文字1つを「1w」(wは「ワード」と読む)、半角文字1つを「0.5w」とカウントするのがお約束だが、AIへの説明が面倒なので以下は「文字」で通す。

文字数指定を守って文章を生成させる

問題はここからで、具体的な文字数を指定して「40〜60文字で書け」などと指示しても、なかなか守ってくれない。

そこで、文字数をPythonプログラムでチェックし、短ければ膨らませ、長ければ圧縮するように指示してみた。

では、そのプログラムを利用して、以下のテーマについて40文字以上、50文字未満になるように文章を作って。

### 手順
1.「テーマ」を参照して、適当に文章を生成する
2.その文章をプログラムで文字数をカウントする
3. 40文字以上、50文字未満かどうかをチェック
4. 40文字未満であれば、文章を膨らませる。50文字以上であれば、文章を圧縮する
5. 40文字以上、50文字未満になるまで、手順3.と手順4.を繰り返す

### テーマ
- 世界で雪が最も多く降るのは、日本の東北地方だ

プロンプト

すると、以下のようなプログラムを出力しつつ、文字数カウントを繰り返して文章を出力させることができた。なお、このプログラムを自分で実行する必要はない。

import unicodedata

def count_weighted(text):
    total_count = 0
    for char in text:
        # 半角('Na'、'H')は0.5、全角は1としてカウント
        if unicodedata.east_asian_width(char) in ('Na', 'H'):
            total_count += 0.5
        else:
            total_count += 1
    return total_count

while True:
    text = input("文章を入力してください(40文字以上、50文字未満になるように): ")
    total = count_weighted(text)
    print("現在の文字数:", total)
    if 40 <= total < 50:
        print("条件を満たしました。")
        break
    else:
        if total < 40:
            print("文章が短すぎます。もう少し文章を膨らませてください。")
        else:
            print("文章が長すぎます。文章を圧縮してください。")

で、出力された文章が以下のものだ。

日本の東北地方は、世界でもっとも雪が降り積もり、冬の美しい風情が際立っています。

o3-mini-highによる出力

ちょうど40文字。問題ない。もう1つやってみよう。

「どんでん返し」を含むストーリーの文学作品を1つあげ、どのような「どんでん返し」があったのかを教えて。文字数は、200〜240文字で。文字数のカウントには、すでに作成したPythonプログラムを参考に実行して。

プロンプト

出力は以下の通り。

アガサ・クリスティーの『オリエント急行の殺人』は、予想を裏切るどんでん返しが印象的な推理小説として広く知られています。物語は豪華な列車内で起こる殺人事件を軸に展開し、一見単一の犯人と考えられていた真相が、実は乗客全員が共謀して事件に加担していたという驚愕の結末へと転じます。この展開は読者に倫理の曖昧さと人間の複雑な心理を考えさせ、今なお多くの議論を呼んでいます。この驚きの結末は、推理小説の新たな可能性を示した名作として今も語り継がれています。

o3-mini-highによる出力

223文字。全く問題ない。

長い文章を出力させたり、複雑な構造の文章を出力させようとしたりすると、なんらかの問題が起こる可能性はあるが、とりあえず200文字程度であれば、非常に正確な結果が得られたのは確かだ。

GPT-4oとo3-mini-highはかなり実力に差があるかも

 チャットスレッドを新しくして、以下のプロンプトをまずo3-mini-highに与えてみた。

以下のテーマについて40文字以上、50文字未満になるように文章を作ってください。その際、以下の「プログラム」を参考にしてください。

### 条件
- 半角文字は0.5文字と数える
- 全角文字は1文字と数える

### 手順
1.「テーマ」を参照して、適当に文章を生成する
2.その文章をプログラムで文字数をカウントする
3. 40文字以上、50文字未満かどうかをチェック
4. 40文字未満であれば、文章を膨らませる。50文字以上であれば、文章を圧縮する
5. 40文字以上、50文字未満になるまで、手順3.と手順4.を繰り返す

### テーマ
- 世界で雪が最も多く降るのは、日本の東北地方だ

### プログラム
(以下のコード参照)

プロンプト
import unicodedata

def count_weighted(text):
    total_count = 0
    for char in text:
        # 半角('Na'、'H')は0.5、全角は1としてカウント
        if unicodedata.east_asian_width(char) in ('Na', 'H'):
            total_count += 0.5
        else:
            total_count += 1
    return total_count

while True:
    text = input("文章を入力してください(40文字以上、50文字未満になるように): ")
    total = count_weighted(text)
    print("現在の文字数:", total)
    if 40 <= total < 50:
        print("条件を満たしました。")
        break
    else:
        if total < 40:
            print("文章が短すぎます。もう少し文章を膨らませてください。")
        else:
            print("文章が長すぎます。文章を圧縮してください。")

出力は、以下の通り。

世界で雪が最も多く降るのは、日本の東北地方であり、冬の美しさが際立つ地域である。

o3-mini-highによる出力

40文字。問題ない。では、GPT-4oはどうか。同じプロンプトを与えてみた。出力は以下の通り。

日本の東北地方は、世界で最も雪が多く降る地域として知られています。特に青森県の酸ヶ湯温泉は、年間降雪量が多いことで有名です。この地域の豊富な降雪は、スキーやスノーボードなどのウィンタースポーツ愛好家にとって魅力的な場所となっています。また、雪景色は観光資源としても重要で、多くの人々が訪れます。しかし、大量の雪は交通や生活に支障をきたすこともあり、地域の人々は雪かきや除雪作業に追われる日々が続きます。それでも、東北地方の人々は雪と共存し、その美しさや恵みを享受しています。

GPT-4oによる出力

237文字。パッと見て、すぐにダメだとわかるレベル。文字数を全くカウントしていない。

ということで、コーディング時には、使えるならo3-mini-highを使った方がいい結果が得られそうだ。

いいなと思ったら応援しよう!