GPTのAPIを使う

自然言語AIであるChatGPTのベースとしてGPT-4もリリースされて、一般の人々でもサービスとして利用できるようになった。日々、新しいサービスが登場している。

年内には私たちが触れているオフィスソフトやネットサービスにAI機能が搭載されているのは珍しくない状況が揃うだろう。使うかどうかは使途に応じて変わってくると思うけれど。

ニュースばかり追いかけても面白くはないので、私もAPIを触ってみることにする。

まずは初歩的にPDFファイルを要約させることから挑戦してみた。

試行錯誤の末に出来上がったのがこちら。

https://www.con3.com/pdf/

読み込んだPDFファイルの内容を、OpenAIに登録して発行してもらったAPIキーを利用して、相手に投げて、要約文を返してもらう。シンプルにそういうWebページである。

実際にはもっと簡素な画面でつくったのだが、公開するとなるとページのお化粧をしたくなって、個人的に便利に使っているBootstrap Studioで作り直してみた。

OpenAIへの登録とAPIキーの発行が必要なので、便利とは言い難い。PDFなどの手持ち情報をもとにAIチャットを実現するサービスは立派なものがたくさんあるし、もはやブラウザでPDFを表示させてチャットで要約させることもできるようになってきたので、自作するメリットはお勉強のためくらい。

それでも、実際にAPIを使ってみる経験は、ニュースを追うだけでは曖昧な部分を知るよい機会となる。

高等学校の情報Ⅰ・Ⅱの内容を考えると、この程度のアプリ開発を高校生で理解できるようになる時代になったのだといえる。少なくとも、この分野のAIアシスタントは飛躍的に実用的になってきたのだから、あと何年かすれば、AIとペアプログラミングしている高校生の姿を学校でみることもできるだろう。

今回つくった要約ツールは、PDFの全文を細切れにして、順にAPIに投げることで、細切れに返ってくる要約を繋ぎ合わせて表示する形になっている。だから通して読むときの繋がりはあまりよくない。

この問題に対処した方法は、すでに先達の皆さんがいろいろ提示しているので、次の機会にそれらに挑戦してみたいと考えている。自分で再現してみたいという気持ちを大事にしたい。

もともとの目的は、自分の授業の見直しにあたって、新しい教科書の内容を要約させてみたいと思ったからだった。

とりあえず要約文を得ることができたので、第一段階は達成。それをもとに本文も精査しながら、授業の資料や課題を捻り出すとしよう。

また余裕が出来たら、課題生成ツールとか、穴埋め問題作成ツールとか、つくってみよう。

ICカードでおかいもの(親子教室)

ICカードを読み取るScratch3.0拡張機能を利用して、電子マネーのお買い物活動をするワークショップを徳島新聞社さんと阿波銀行さんのご協力のもとで行ないました。

ゼミ生達にも企画と当日の運営に参加してもらいながら、午前と午後に合計20組40名の親子と、お店屋さん準備とICカードづくりをして、参加者同士のお店でお買い物する活動を楽しみました。

ご参加いただいた皆さんありがとうございます。

このテーマでの教室は過去3回ほどやってきたのですが、実は、参加者同士のお店に訪れてお買い物活動をするのは今回が初めて。

これまではコロナ禍の厳しい条件があったため、参加者同士が交わる活動は制限されていました。各自でお店やICカードはつくるけれど、お買い物も自分のお店で試して終わりでした。

今回、ようやく参加者同士の関わり合いも活動に取り込むことができました。

そして、会場も阿波銀行 本店営業部コワーキングスペースを特別にお借りして開催。本物の銀行で本物の銀行員さんに、おもちゃ電子マネーをチャージしてもらうという贅沢な洒落にもご協力いただきました。

あわぎん用スペシャル画面で雰囲気を盛り上げ

わ〜っと始まって、さ〜っと終わってしまうほど、盛りだくさんであっという間だったという教室。

エンディングで皆さんの様子や感想を伺うとわりと楽しかったという反応。こちらとしてはハラハラしながらでしたが、参加してくださった皆さんは楽しげな雰囲気で過ごされていました。

参加者同士の関わりがあったというのも、プラスに働いたのだろうなと思います。

おかげで、活動やプログラムの要改善点も見えてきたので、いつかまたの機会に向けてネタを仕込んでおこうと思います。

今回の活動で利用したのは、PaSoRichという改造Scratch3.0用拡張機能です。

SC2Scratchというサイトでご紹介しています。だれでも利用できます。ただし、ICカードリーダーは特定製品のみの対応になってしまっているので、そこが実施のハードルになっています。

今年中に新しいモデルに対応することや、他の方が開発したQRコード読み取りの拡張機能を使った場合の活動の仕方など、やってみたい方々への情報提供を充実させようと思っています。

それにしても、ずっとひきこもってばかりいたので、朝から夕方まで立ちっ放しのしゃべりっ放しの催事は久し振り。すっかりぐったりしてしまいましたので、ぐっすり休みます。

画像生成AIを試す

この年末年始は帰省をしつつ,原稿執筆をしていました。

プログラミング体験・学習に関する原稿でしたが,他と違った角度から照らしたものにしようと悪戦苦闘してました。詳しくはまた機会をあらためて書こうと思います。

締切仕事から解放されて,ようやく画像生成系のAIを自分のパソコン環境に導入してみました。

この記事のアイキャッチ画像はその画像生成AIモデルの一つである「Anything-v4.0」を導入して描画させたものです。

これは「1boy, computer, typing, looking screen, indoor, casual」というプロンプト(画像描画させるためのキーワード群)を指定して,横長サイズに指定した結果です。

同じ条件でも描画させる度に画像が変わるので,今回も3回目に描画させた結果を採用したものです。この辺は導入の仕方によって生成の手順は異なってくるので,1枚1枚描かせるパターンもあれば,自動的に複数枚の画像を生成させるやり方もあります。コマンドラインで済ます人もいれば,WebUIを利用することもできます。

導入手順は簡単で,たとえばWebUIで使いたければ…

  • Python
  • pythonライブラリ
    • torch
    • diffusers
    • gradio
  • 学習モデル
    • Stable Diffusion v2-1
    • Anything-v4.0

といったものをインストールして,pythonのスクリプトを起動するとローカルでWeb画面を開くことができます。それらはいろんな方々がネットでやり方をシェアしてくださっているので参考にしました。

ちょっと雑になりますがインストール手順はおおむね以下のような感じです。

(各自の環境によってコマンドは変わってきますので,その辺の説明はごめんなさいします。)

Macであれば,もしPythonが未導入ならHomebrewを使ってPython入れてもいいです。

brew install python@3.10

あとはpipもしくはpip3でライブラリ導入:

pip3 install torch
pip3 install --upgrade diffusers transformers accelerate
pip3 install gradio

それから導入ツールの導入:

brew install git-lfs
git lfs install

(git LFSについてはこちら

そして学習モデルの導入:

git clone https://huggingface.co/stabilityai/stable-diffusion-2-1

あるいは

git clone https://huggingface.co/andite/anything-v4.0

そしたら次のpythonスクリプトをファイルに保存して動かします。(ファイル名は任意で可)

import gradio as gr
import torch
import click
import datetime
import random
from diffusers import StableDiffusionPipeline
import numpy as np

# 学習モデルを選ぶ
ai_model = "./stable-diffusion-2-1"
# ai_model = "./anything-v4.0"

def generate(prompt, nega_prom, height, width, steps, cfg, seed):
    pipe = StableDiffusionPipeline.from_pretrained(
      ai_model,
    )

    pipe.safety_checker = lambda images, **kwargs: (images, [False] * len(images))
    if seed == "":
      seed = int(random.randrange(4294967294))
    else:
      seed = int(seed)
    print(f"Seed value : {seed}")
    latents = torch.tensor(get_latents_from_seed(seed, width, height))

    gen_img = pipe(prompt=prompt, negative_prompt=nega_prom, height=height, width=width, num_inference_steps=steps, guidance_scale=cfg, latents=latents).images[0]
    gen_img.save(f"./any3_step{steps}-cfg{cfg}-{seed}.png")
    return gen_img

def get_latents_from_seed(seed: int, width: int, height:int) -> np.ndarray:
    # 1 is batch size
    latents_shape = (1, 4, height // 8, width // 8)
    # Gotta use numpy instead of torch, because torch's randn() doesn't support DML
    rng = np.random.default_rng(seed)
    image_latents = rng.standard_normal(latents_shape).astype(np.float32)
    return image_latents


webui = gr.Interface(fn=generate,
                     inputs=[
                     gr.Textbox(label = 'Prompt text', value="", lines=2, elem_id="prompt"),
                     gr.Textbox(label = 'Negative Prompt text', value="", lines=2, elem_id="nega_prom"),
                     gr.Slider(minimum=64, maximum=1024, step=64, label="縦サイズ(px)", value=768, elem_id="height"),
                     gr.Slider(minimum=64, maximum=1024, step=64, label="横サイズ(px)", value=512, elem_id="width"),
                     gr.Slider(minimum=10, maximum=150, step=1, label="ステップ数", value=25, elem_id="steps"),
                     gr.Slider(minimum=1, maximum=10, step=0.5, label='CFG', value=7.5, elem_id="cfg"),
                     gr.Textbox(label = 'seed', value=None, placeholder="0 - 4294967294. Blank is random.", elem_id="seed"),
                     ],
                     outputs=gr.Image().style(height=768)
                     )
webui.launch()

Pythonスクリプトについて参考にしたWebページはこちら(感謝感謝)。

本来であれば,画像生成系AIについて整理してから書きたいところですが,それもまた別の機会に。

私自身はまだ生成系AIをどのように自分の生産活動に活かすとよいのか模索中ですが,可能性があることは嫌というほど感じているので,何かしら自分で取り組む糸口を見つけ出してみようと思います。

でも生成した画像をブログ記事のアイキャッチ画像にするのは,地味に実用的かも。

電子決済ごっこ

…と私が名付けたわけではないのですが,今回,徳島県上板町高志幼稚園で,園児の皆さんがお買い物活動をする際のお手伝いをしてきたことがニュースでそう呼ばれました。

JRT四国放送のニュースはYahooニュースでも配信されました。

〈追記20221215〉放送網のNNNニュースでも自動的に配信されていました。

〈/追記〉

NHK徳島でもローカルニュースで取り上げていただきました。

〈追記20221215〉徳島新聞もWebでは閲覧は有償ですが取り上げてくださいました。

〈/追記〉

年少さんたちとちょっと仲良くなって,私も楽しく参観しました。

今回の実践は,開発して提供したシステムを使ったものとしては徳島県内の幼稚園では初めてというのは間違いではありません。正確に言えば,日本の幼稚園で初めてです。ということは世界の幼稚園で初めてです。

ICカードを使った電子決済ごっこの試みということなら,先行した事例があります。

ただし,実際のインターネットクラウドを利用したシステムはこれまでありません(ローカルネットワークで組んだものだけ)。よって,インターネットクラウドを利用した電子決済ごっことしては,幼稚園で初です。

他は,東京学芸大学附属小金井小学校の学級で取り組んだ例が小学校として初です。また単発的なイベントで利用したことは徳島県内ですでに数回あります。

〈追記20221215〉長野県でも中学生向けにICカードの実践をしてくださっている報告いただきました。ありがとうございます。〈/追記〉

というわけで,この子たち,とっても最先端です。


今回,使っていただいたのはビジュアルプログラミング環境のScratch(スクラッチ)とICカードリーダーを組み合わせるツール(PaSoRich)でした。クラウドのデータベースに数値を預けるシステム(NumberBank)と組み合わせて実現しています。

利用前提としていたICカードリーダーがモデルチェンジしてしまい,新モデルの対応が必要になっているため,お試しいただくためのハードルが高くなってしまっています。

けれども,対応するICカードリーダーとFelicaカード(たとえばお古の交通系ICカード)があれば,誰でも試したり,自分たちでプログラミングすることができます。ぜひお試しください。

また追ってご紹介させていただきます。