openaiapi2.py
https://gyazo.com/0b7ced5176fd48fe0b31fb43037b6dfd
「5個挙げて」を5回やる例(画面では2回目で見切れてるけど)
並列で実行するので待ち時間は短い(普通に一回リクエストするのと大差ない)
code:py
import datetime
import asyncio
import aiohttp
import os
import openai
# ========
def parse_arguments():
import argparse
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
parser.add_argument('--input', default=None, required=True)
parser.add_argument('--use-ssl', default=None)
args = parser.parse_args()
return args
# ========
def todaystr_long():
todaydt = datetime.datetime.today()
datestr = todaydt.strftime('%Y/%m/%d')
timestr = todaydt.strftime('%H:%M:%S')
wd = todaydt.weekday()
return f'{datestr} {dow_e} {timestr}'
def file2str(filepath):
ret = ''
with open(filepath, encoding='utf8', mode='r') as f:
ret = f.read()
return ret
def str2file(filepath, s):
with open(filepath, encoding='utf8', mode='w') as f:
f.write(s)
LB = '\n'
def string2lines(s):
return s.split(LB)
def lines2string(lines):
return LB.join(lines)
# ========
async def parallel_ask(prompt):
responses = await asyncio.gather(*tasks, return_exceptions=True)
return responses
async def async_ask(prompt):
try:
response = await asyncio.wait_for(ask(prompt), timeout=25)
return response
except asyncio.TimeoutError:
return {"error": "Request timed out"}
# 同期で動く openai.ChatCompletion.create を非同期世界に持ち込むためにイベントループ化してるらしい by gpt-4o
async def ask(prompt):
loop = asyncio.get_running_loop()
response = await loop.run_in_executor(
None,
lambda: openai.ChatCompletion.create(
model='gpt-4o',
messages=[
{'role': 'user', 'content': prompt},
],
request_timeout=20,
)
)
return response
# ========
args = parse_arguments()
if args.use_ssl:
promptfilename = args.input
if not os.path.exists(promptfilename):
raise RuntimeError(f'Please prepare the prompt file {promptfilename}.')
q = file2str(promptfilename)
prompt=q
responses = asyncio.run(parallel_ask(prompt))
NEW_BLANKLINE = '\n'
outcontents = f'{prompt}{NEW_BLANKLINE}'
for i,response in enumerate(responses):
no = i+1
try:
answer = response.choices0.message.content except AttributeError as e:
answer = f'{e}'
outcontent = f'# {no}{NEW_BLANKLINE}{answer}{NEW_BLANKLINE}'
outcontents = f'{outcontents}{NEW_BLANKLINE}{outcontent}'
str2file(promptfilename, outcontents)
たとえばpara.mdに書く。
結果もここに追記される。
code:para.md
以下のキーワードから連想されるライトノベルのタイトル案を5個挙げて。
出力結果はタイトル名のみとし、余計なメッセージは一切書かないで。
・異世界
・主人公最強
・40歳独身の男
・ダンジョン
・人間と魔人
(ここに結果が書き込まれていく)
実行ランチャーは以下
code:para.bat
@echo off
start /b "" cmd /c python openaiapi2.py --input para.md
なので、実際の実行は以下のようにする
code:terminal
$ para
プロンプト
4oで結果長めになるので、意図的に「余計なメッセージ書くな」などで制御した方が良い
tempreture、もっとランダムにしようとtemperature=1.8とか指定したけどエラーになる
0~1だっけ?
ドキュメントでは 0 to 2 ってあるけどなー。。。
デフォが1なら、デフォですでにランダム性高くなってると言えるか
ならいじる必要はない
動作所感
4oなので動作速くていい
4oで速くなったからこそつくる決心ついたってのもある。並列でも待たされるの嫌だからねー。。
開発秘話
pythonで非同期処理書いたの何気に初めてや
jsのawaitとか思い出す。。。
呼び出す元からすべてを非同期化しなきゃいけないsta.icon
GPTやっぱり便利すぎるわー
マニュアルやgoogle検索しながらだともっと時間かかっていたであろう。。。