ChatGPTもStableDiffusionも変化が速いな
ChatGPTはAPI公開。 同時に Whisper APIという 音声からテキストを起こすAPIも公開。
StableDiffusionはLoRA(追加学習)とかControlNet(ポーズ指定)が登場。
まだ半年も経ってない気がするんだが...。
pythonアプリ/ライブラリのgitリポジトリはスクリプト一発でセットアップできるの便利
automatic1111のリポジトリ https://github.com/AUTOMATIC1111/stable-diffusion-webui がそうなんだけど、webui.batを実行すると各種依存ライブラリなどを自動でインストールしてWEBサーバが起動するのは便利だった。
python言語ランタイムにパッケージマネージャーpipとvenvが標準で入っているのが大きい。 Javaで言うとmavenが標準搭載されているようなものか。
tag: edge, bing, chatgpt
Windows Update したら Edge ブラウザのサイドバーから ChatGPT が使用できるようになっていた
Edgeのサイドバーは ChatGPT-4 を使っているらしい。 返事が遅いけど、皆で使い倒しているからだろうか?
上のサイトにユーザー登録すれば(1時間に30回までだが)無料でも使える ChatGPT-3.5 と比較すると、回答が良くなっている印象。
ChatGPT-4 良いなぁ。
これは OpenAIの方の ChatGPT Plus に加入してChatGPT-4が使用できる月額20ドルの有料プランを契約する価値はあるように感じる。
...。
早速 $20 の subscribe をやってみた。
んで ChatGPT-4 モデルを選択して質問したら 「We're currently processing too many requests. Please try again later.」という返事がwww
惨敗である。
とりあえず今のところは有料だけど使えないサービスになってるので Windows PC なら Edge のサイドバーから無料のBing検索経由で使うのが良いかな。 スマホならBingアプリを入れて検索する感じかな?こちらはChatGPT-4かわからんけど(Microsoft アカウントによるサインインが必要)。
追記 3/22 Edgeのサイドバーだとチャットのコンテキスト情報を保持していないので本物のGPT-4の凄さは体験できない...。
気が向いた時に動いたかどうか記録しておくか。
date time | ChatGPT-4 response | error message |
2023/03/17(金) 23:00 | BUSY | We're currently processing too many requests. Please try again later. |
2023/03/18(土) 03:45 | BUSY | Hmm...something seems to have gone wrong. Maybe try me again in a little bit. (4時間で50回に制限中) |
2023/03/18(土) 13:21 | OK | 初めて動いたwww (3時間で25回に制限中) |
2023/03/19(日) 05:00 | OK | 普通に動いた! (3時間で25回に制限中) |
2023/03/19(日) 10:15 | OK | 普通に動いた! (3時間で25回に制限中) |
2023/03/20(月) 12:18 | OK | 動く(3時間で25回に制限中) |
2023/03/20(月) 21:28 | OK | 動く(3時間で25回に制限中) |
2023/03/21(火) 03:00 | BUSY | ログイン不能 |
2023/03/21(火) 08:35 | OK | 動く(3時間で25回に制限中)(セッション情報なくなった) |
2023/03/21(火) 10:55 | OK | 動く(3時間で25回に制限中)(セッション情報が取れないらしい) |
2023/03/22(水) 20:55 | OK | 動く(3時間で25回に制限中)(セッション情報が取れないらしい) |
3回目で動いたけど、だんだん制限が厳しくなってきてるような...!?
週末だから仕事で使う人が減って動くようになったのか、アメリカ時間で平日の日中はダメなのか、もうちょい調査が必要だな。
アメリカ時間で土曜の午後、日曜の夜は動くっぽい。
はたしてアメリカ時間の月曜日の仕事時間でどうなるか...。
日本時間午前3時、東部時間14時、西部太平洋時間11時にはログインすら受け付けないwwwWwwWwww
アメリカでは平日の勤務時間内の負荷が高いので研究やら業務で使っている印象。 ギークが深夜に遊ぶおもちゃではない様子。
日本時間の8時30分には動くので、日本の勤務時間内なら動きそうな気配は感じる。 日本のAI研究者の人がChatGPT-4の過負荷に伴うサービス停止に言及しないのはこのためか。
深夜のおもちゃとして遊ぼうとしているとアメリカ時間の勤務時間と衝突して利用できないが。
日本時間の21時までなら動くっぽい。アメリカの東部時間では08時相当。アメリカの西部時間では05時相当。
ChatGPT-4のプロンプトメモ (part 1)
tag: chatgpt
まずはプロンプトの基本的な所からメモ。
前置きで回答の信頼度を表示させたり、曖昧なら知らんけど表示を追加させる。 ChatGPTはとにかくいい感じにまとめて出力してくれるが、信頼度を表示させた方が良い。 というか標準で信頼度の出力はして欲しいw (人間だと信頼度の低い情報を出す場合は自信がないオーラを出してくるけどGPT-4は同じトーンで出力してくるので困る。)
コード生成はそれっぽいのを出してくれるが、(信頼度:8)くらいの出力はちょっとアヤシイw。 学習は2021年9月くらいまでのデータが元になっているとのことで最新のネタを聞いても古いネタが出力される。 (お絵描きAI向けdiffusersライブラリの使い方は出てこなかった)
定型文章作成はお手の物。まあファクトとか動く動かないとか関係無いしな。
リサーチについても信頼度を表示しておくと便利。 リサーチの出力結果には微妙に嘘が混じっていることがあるので鵜呑みにするのは危険。 調査開始時点の検索キーワードを入手するのに使うのが良いかも。
Webインタフェースで入力した文字列はOpenAIの学習に使われるので、秘密文書の添削とか機密コードの添削とかは頼めないのが難点か。
これローカル学習ができて情報を外に漏らさない社内ローカルオンプレで動くGPT-4(無理か..)とか、秘密は洩らさない契約のGPT-4とか販売すれば良いのにな。 (API経由で使うと情報漏れないぽい?)
p.s.
ローカル学習はお絵描きAIだとLoRAと呼ぶけど、GPT2の時代はファインチューニングって呼んでいたらしい。 以下はGPT-2日本語モデルでファインチューニングをやっている例。 モデルが大規模だと大量のメモリが必要になる模様。 GPT-4クラスの超大型言語モデルだとローカル学習はちとキツイか。
ChatGPT API発行してみた
tag: chatgpt
今の所、API呼び出しはChat GPT-3.5までしか公開されていない模様。
Chain of Thought (思考の連鎖) を表現するchat APIは、ChatGPT-3.5の頃はmessages配列に過去の会話履歴を全部送信する形で実現していたのか。
APIの返事はまあまあ遅い(ChatGPT-4の場合だと30秒近くかかる)らしく、streamフラグを指定して、結果が出た所から徐々に表示するみたいな使い方ができるように工夫されているようだ。
ChatGPTのWebインターフェースだと返事がゆっくり表示されていたけど、アレはstream表示をしていたんだな。
要求を出すところ。ChatGPT-3.5-turbo。
import json import openai def chat(): """ チャット型API。Chain of Thoughtを使う。会話履歴はmessagesに連結していく。 """ res = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ # { # "role": "system", # "content": "日本語で質問します。日本語で返答してください。" # }, { "role": "user", "content": "古代ローマ帝国について私が学習する時に私が知っているべき5個のキーポイントは何?" }, ], ) return res # 呼び出し チャット型 res = chat() strres = json.dumps(res, ensure_ascii=False, indent=2) print(strres)
ChatGPTからの返事 openai.ChatCompletion.create
{ "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "object": "chat.completion", "created": 1679794740, "model": "gpt-3.5-turbo-0301", "usage": { "prompt_tokens": 51, "completion_tokens": 571, "total_tokens": 622 }, "choices": [ { "message": { "role": "assistant", "content": "1. ローマ共和政:紀元前509年から紀元前27年にかけて、ローマは共和政として統治されていた。 この期間、政治的権力は貴族層によって支配され、執政官や元老院が重要な役割を果たした。\n\n2. ローマ帝国の創設:紀元前27年、オクタウィアヌスが元首となり、ローマ帝国が成立した。彼は後にアウグストゥスとして知られ、帝国の最 初の皇帝として統治し、現代世界で知られるローマ文化の発展に重要な役割を果たした。\n\n3. 帝国の拡大:帝国の成立後、ローマは周辺地域を征服し、最盛期にはヨーロッパ、アフリカ、西アジアの大部分を支配下に置いた。この拡大には 軍事力と道路網の整備が大きく貢献した。\n\n4. 宗教の変化:ローマ帝国は当初、古代ローマ宗教を信仰していたが、後にキリスト教が広がり、313年のミラノ勅令によって公認された。キリスト教はローマ帝国の文化や社会に大きな影響を与え、現代でもその影響が見られる。\n\n5. 帝国の崩壊:ローマ帝国は5世紀に入ると西ローマ帝国と東ローマ帝国に分裂 し、476年に西ローマ帝国はオドアケルによって滅ぼされた。東ローマ帝国はその後も存続し、ビザンツ帝国として繁栄したが、ローマ帝国は古代世界の中で終焉を迎えた。" }, "finish_reason": "stop", "index": 0 } ] }
実験用のメインルーチン。
# # chatgpt main program # import os import sys import json import argparse import openai # 定数 # 過去のメッセージを保存するファイル名 MESSAGES_FILE = 'message.json' # デバッグモード DEBUG_MODE = False def completion(prompt: str, messages: list): """ プロンプト型API。Chain of Thought は使用しない。質問毎に思考は途切れる。 """ d = {'role': 'user', 'content': prompt} messages.append(d) response = openai.Completion.create( model="text-davinci-003", prompt=prompt, temperature=0, max_tokens=800, top_p=1, frequency_penalty=0.0, presence_penalty=0.0, ) # 応答のjsonを表示 strres = json.dumps(response, ensure_ascii=False, indent=2) print(strres) if 'choices' in response: assistant_content = response['choices'][0]['text'] d = {'role': 'assistant', 'content': assistant_content} messages.append(d) print('') print('prompt:') print(prompt) print('') print('chatgpt:') print(assistant_content) return response def chomp_messages(messages: list): """ 過去発言のリストの中から、チャット内容のフラッシュを意味する"----"から始まる文字列が 最後に出現した位置より下のみのリストを作って返却する。 """ # 最後に出現した位置を取得 i: int = 0 idx: int = 0 for d in messages: role: str = d['role'] txt: str = d['content'] if role == 'system': if txt.startswith('----'): idx = i i = i+1 # 新しくリストを作って返却 result = [] i = 0 for d in messages: if idx < i: result.append(d) i = i+1 return result def chat(prompt: str, messages: list): """ チャット型API。Chain of Thoughtを使う。会話履歴はmessagesに連結していく。 """ d = {'role': 'user', 'content': prompt} messages.append(d) # フラッシュ指定がある後のメッセージを抽出 flushed_messages = chomp_messages(messages) response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=flushed_messages, ) # 応答のjsonを表示 strres = json.dumps(response, ensure_ascii=False, indent=2) print(strres) if 'choices' in response: assistant_content = response['choices'][0]['message']['content'] d = {'role': 'assistant', 'content': assistant_content} messages.append(d) print('') print('prompt:') print(prompt) print('') print('chatgpt:') print(assistant_content) return messages def main(argv: list): # APIキー初期化 api_key = os.getenv("OPENAI_API_KEY") if api_key is None: raise ValueError('環境変数 OPENAI_API_KEY が設定されていません。') openai.api_key = api_key # 引数解析初期化 parser = argparse.ArgumentParser(description='Description of ChatGPT client program') parser.add_argument('--prompt', help='prompt string') parser.add_argument('--flush', action='store_true', help='flush chat sequence') parser.add_argument('--comp', action='store_true', help='single completion mode') parser.add_argument('--chat', action='store_true', help='sequence chat mode') parser.add_argument('--debug', action='store_true', help='debug mode') args = parser.parse_args(argv) # prompt = "What are 5 key points I should know when studying Ancient Rome?" # prompt = "古代ローマ帝国について私が学習する時に私が知っているべき5個のキーポイントは何?" prompt = None if args.prompt: prompt = args.prompt if prompt is None: print('プロンプトが指定されていません。') return # デバッグモード if args.debug: global DEBUG_MODE DEBUG_MODE = True # 動作モード mode = 'comp' if args.comp: mode = 'comp' if args.chat: mode = 'chat' # 発言履歴ロード messages = [] if os.path.isfile(MESSAGES_FILE): with open(MESSAGES_FILE, 'r', encoding='UTF-8') as fp: messages = json.load(fp) # フラッシュ指定があれば目印を挿入 if args.flush: d = { "role": "system", "content": "--------" } messages.append(d) if mode == 'comp': # 呼び出し 単発のcompletion型 completion(prompt, messages) if mode == 'chat': # 呼び出し 過去発言のsequence指定のチャット型completion型 chat(prompt, messages) # 発言履歴セーブ with open(MESSAGES_FILE, 'w', encoding='UTF-8') as fp: json.dump(messages, fp, ensure_ascii=False, indent=2) if __name__ == '__main__': main(sys.argv[1:]) # # end of file #
質問の実行。
ChatGPTからの回答文もAPIに載せて過去の会話履歴として送っているので使用トークン数がバンバン増えていくwww
トークン数課金なのやめてwww
関連する話題を続けるには良い機能なんだけどね。
python ./src/chatgptmain.py --flush --chat --prompt "JavaScriptでWindows GUIを作成する時に、私が知っているべき5つのライブラリを教えて" python ./src/chatgptmain.py --chat --prompt "Electronについて教えて" python ./src/chatgptmain.py --chat --prompt "Electronのサンプルを表示して" python ./src/chatgptmain.py --chat --prompt "Electronのインストール方法を教えて"
ChatGPTはテキストの分類が得意と聞いて
tag: chatgpt
自分では使い道が全然思い浮かばなかったけど以下のまとめを見て感心することしきり。
Skebの利用規約違反チェックの例は言ってみればテキストの分類だしこれは割とすぐに使えそう。
CGMやSNS周辺だと使える用途が多そうだ。
テキストの分類で言えば自分の書いたブログやTweetの文章をChatGPTに解析させて好感度を根拠付きで判定させるのもいいかもしれない。
イケメンな内容のブログ記事が書けるかも?