gpt-4o-miniからgpt-4.1-miniに変更でどのくらい賢くなったか。

HAGKURE PROGRAMMING塾のSlack内には、hagakure君というチャットボットが住んでおります。

hagakure1

OpenaiのAPIを使って作った、プログラミング学習にストイックな男前です。 バックエンドはFlaskで、一つ前の会話から3分以上空かない限りは会話を溜めながらチャットできる仕様になっています。

今回APIのモデルをこれまでのgpt-4o-miniからOpenaiが新しく出したgpt-4.1-miniに変更してみました。 どのくらい賢くなったか簡単に検証。

gpt-4o-mini時代。 しりとりが一発目で破綻する(泣

hagakure2

モデル変更後。

hagakure3

余裕でしりとりを成立させながら、一つ一つの単語へのコメントもなんか気が利いている。 ござる口調もしっかり維持。まあ賢くなった。速度も、体感で早くなったと思う。

コードなんかも出させてみた。

指示

キーワードをいれるとweb検索して、その内容をOpenAIのAPIで要約させるアプリケーションをstreamlitで作成して。

拙者に任せてくだされ、早速StreamlitでPython使い、キーワード入れてWeb検索、その結果をOpenAIのAPIで要約するアプリケーションの雛形を示すでござる!

import streamlit as st
import requests
from bs4 import BeautifulSoup
import openai

# OpenAIのAPIキーをセットしてください
openai.api_key = "YOUR_OPENAI_API_KEY"

def web_search_summary(keyword):
    # 本例では簡単にGoogle検索のAPIは使わず、検索結果のスクレイピングの雛形でござる
    # 注意:現実にはGoogleのスクレイピングは規約違反や技術的制限あるため、
    # 実務なら公式APIか他の検索APIを使うのが望ましいでござる

    search_url = f"https://www.google.com/search?q={keyword}"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
    }
    res = requests.get(search_url, headers=headers)
    soup = BeautifulSoup(res.text, "html.parser")

    snippets = []
    # Googleの検索結果からスニペットを抜き出す試みでござる
    for g in soup.find_all('div', class_='BNeawe s3v9rd AP7Wnd'):
        text = g.get_text()
        if text and len(text) > 20:
            snippets.append(text)
        if len(snippets) >= 5:
            break

    combined_text = "\n".join(snippets)

    if not combined_text:
        return "検索結果の要約対象テキストが取得できなかったでござる。"

    # OpenAIのAPIで要約する処理
    prompt = f"次の文章を日本語で簡潔に要約せよ:\n{combined_text}"

    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=150,
        temperature=0.5,
        n=1,
        stop=None
    )
    summary = response.choices[0].text.strip()
    return summary

def main():
    st.title("簡単Web検索&要約アプリ - HAGAKURE君流")

    keyword = st.text_input("キーワードを入れてくだされ")
    if st.button("検索して要約する"):
        if not keyword.strip():
            st.warning("キーワード入れてほしいでござる")
            return
        with st.spinner("検索と要約を行っておるでござる..."):
            summary = web_search_summary(keyword)
            st.subheader("要約結果")
            st.write(summary)

if __name__ == "__main__":
    main()

コード自体おかしくはなさそうだが、"text-davinci-003"ってまた随分古い。以下突っ込んだら修正してくれた。

text-davinci-003って古くない?君カットオフいつ?

おお、鋭い質問、感謝するでござる!

拙者の知識は2024年6月まで更新されておるゆえ、それ以降の最新モデルには追いつけておらぬのじゃ。たしかにtext-davinci-003はちと古く、2024年にはgpt-4やgpt-4-turboといったより新しきモデルが主流になっておる。

拙者の最善策としては、以下のようにOpenAIのchat completions APIを使い、新しいgpt-4モデルで要約を試みるのが良いでござるぞ。例を示すでござる。

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[
        {"role": "system", "content": "あなたは優秀な要約者でござる。"},
        {"role": "user", "content": f"次の文章を日本語で簡潔に要約せよ:\n{combined_text}"}
    ],
    max_tokens=150,
    temperature=0.5,
)
summary = response.choices[0].message["content"].strip()

お値段はこんな感じ。(1Mトークン=100万トークン)

モデル 入力料金(1Mトークン) 出力料金(1Mトークン) ファインチューニング入力 ファインチューニング出力
GPT-4.1 mini $0.40 $1.60 $0.80 $3.20
GPT-4o mini $0.15 $0.60 $0.30 $1.20

みんなで寄ってたかって遊んでもなかなか1ドルは行かない感じ。かなり遊べる。 あと、なぜか最近Openaiが無料枠提供してくれた(そして4月までの予定が延長になった)のでしばらくはお金かからなそう。

この数ヶ月の各社APIモデルの進化は本当にエグい。どんどん使って追っていきたいですね。