AIに「訊いて応えて」ワーク

今年度、大学で担当している「教育の方法及び技術(情報通信技術の活用含む)」は、教育と情報・ICTに関する内容を主軸に据えて始まりました。

そして、このタイミングならChatGPTなどのAIチャットを導入しない手はないので、毎回の講義の中でAIチャットを前提とした課題を設けることにしたわけです。

課題名は「訊いて応えて」。

AIやネットに「訊いて」みて、得られた結果について学生本人の意見やコメントで「応えて」いく、という枠組みの連続課題です。

教職を目指している大学生たちがAIチャットを未体験なままに百出している議論を眺めるのではなく、自分たちで使いながらAIのいま現在を見極められるようにしようという趣旨です。

利用環境面

初回、パソコン教室で46名の受講者が一斉にChatGPTにサインアップやログインを試みたところトラブりました。

初回は何人かの学生がこの制限を受けたものの、次週は大丈夫だろうと高を括った2回目もログインすらできない学生が続出。

緊急避難的にChatGPTからPerplexity AIに逃そうとしたものの、しばらくするとそちらも利用のリミットに引っかかって、またお手上げ状態でした。

第3回も失敗すると学生の興味関心が極端に薄れてしまう懸念があったため、chatbot-uiをどこかのサーバーに独自に立ち上げて、そこを避難所にする対策をしました。

課題内容面

これまでの「訊いて応えて」ワークは以下の通り。

〈01〉教科書のキーワードを訊いて応えて
〈02〉ニュース記事の数値整理を訊いて応えて
〈03〉対象の比較を箇条書きで訊いて応えて

〈01〉は教科書に掲載されているキーワードから3つほど選んで、AIチャットに訊いてみて、自身のコメントで応える課題でした。

パソコン操作を思い出してもらうことや、ワークの取り組み方を説明するため、課題内容自体は月並みなキーワード調べものです。提出ワークシートはGoogleドキュメントで配布したシートなので、実質作業はコピペ。

それでも、学生達の画面には、「クラスルーム」「授業専用Web資料」「ワークのGoogleドキュメント」「AIチャット」という4種類のウインドウが最低限表示されることになり、これに課題内容によって指定されたリソースがプラスされると、慣れてない学生にとって操作は難解レベルに突入します。

初めのうちは、その状態に慣れてもらうことも織り込んで課題について支援していきます。

ChatGPTなどからのコピペは、単純コピペだとちょっとグレイがかった背景も一緒にペーストされるので、初めのうちはそれを許容しつつ、次第に書式なしペーストなども使えるようになって欲しいという方針です。

それから、自身のコメントで応えていく部分についても、初めは言葉少なですし、賢い学生はAIの出力をそこに貼り付けるといったことも起きますが、そういう取り組みは評価が高くないことも強調して伝えます。結果的にこちらが騙されるレベルに達しているなら、まぁそれはそれでよしとします。

〈02〉はニュース記事を使った課題で、文章で紹介された統計数値を表形式にするタスクです。

ちょうど徳島県の人口について紹介したコンパクトなNHKニュースが配信されていたので、この文章をAIチャットに渡して、表形式に変換して見せてくれたら、AIの威力についても感じてもらえるのではないかと思って設定しました。

題材順序として「表形式への変換」は早過ぎでは?とも思いましたが、よい素材と遭遇しましたし、コピペ・テクニックを垣間見せる意味でも、悪くない課題だと判断しました。

導入のプロンプトとして

次の文章の中の数値を表形式に整理してください:

と入力してもらい、あとは数値が含まれている部分のニュース記事をコピペするだけ。記事をもとにした表が出力される様子を目撃することになります。

しかし、多人数でやっていることで、同じ質問文を入れて同じコピペをしたのに、出力される表の形式が違っていたりすることも見えてくるわけです。さらに、出来上がってくる表も正確性が怪しい。

こうして、AIチャットが常に同じ動作をするわけではないことや、正解を生成するものでもないことを体験して理解していくことになるわけです。最終的には人間の確認も必要だと。

そうした各自が遭遇した事態に応じて、学生自身のコメントを書いてもらうことで課題が完結します。

また、表のコピペも、貼り付けた先でセルの高さが異様に大きいことや背景の色などの諸々を修正していくことが必要になり、細かな修正作業のコツを身につけたり、あるいは表計算アプリ経由でスマートにやる方法へと辿り着く学生がいたりと、多様なパスを支援していく感じになります。

〈03〉では、ここまでバタバタと取り組んできたものを一旦立ち止まって振りかえることに注力するため、課題内容自体は、対象の比較を箇条書きにまとめさせたものへ自身のコメントを加えるものにしました。

訊いてコピペして応えていく単純作業。

ただし、「箇条書き」という指定をすることで、どんな出力がなされるのか知って欲しいということ。比較の箇条書きが比較対象個別に出てきたり、比較して分かることをまとめて箇条書きしてくれたり、箇条書きの個数が多すぎたり、といろいろであることを体験し、必要に応じて再回答を指定したり、箇条書きの個数を絞ったりするなど追加の依頼ができるようになることを期待しています。

実際の授業では、前回の表のコピペが思いの外難しかったようなので、そちらを丁寧にフォローすることに時間が割かれました。そのため箇条書きの文章コピペという今回の課題分量は良かったようです。

学生達も、作業段取りについてようやく理解が深まったようで、学生コメントからも今回は自信を持って取り組めた様子が伝わってきました。

また、単にコピペ作業に終わるわけではなく、AIチャットに訊いたことを自身のコメントで応える作業を通して、AIチャットの出力に自分では届かない側面からの視点があって勉強になったという場面もあったようです。作業的な負荷がある程度落ち着けば、課題内容にフォーカスして吟味したり考えたりする余裕が生まれるということなのでしょう。


こんな形でまだ3回しかやっていませんが、AIチャット利用を前提とした「訊いて応えて」ワークを進めているところです。

ワーク課題の作成については自転車操業的にやっているので、この時点でご披露できる将来計画のようなものは残念ながらありませんが、教職志望者がメインの授業ですから、問題作成側の用途に関わるネタも当然入ってくるのかなとは思っています。

今回の授業の技術的条件整備などのお話は、あらためて別のところに書いてみようかと思います。

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をどのように自分の生産活動に活かすとよいのか模索中ですが,可能性があることは嫌というほど感じているので,何かしら自分で取り組む糸口を見つけ出してみようと思います。

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