実現したいこと
PythonのOpenAI・CGIライブラリを使って作成したウェブページで、ChatGPTの返答の文字数を調整してツイートテキストに含めたい。
前提
PythonのOpenAI・CGIライブラリを用いて作成した下記のウェブページで、ChatGPTの返答の文字数を調整してツイート用テキストに含める処理が正しく行われないことがあります。
問題が発生する原因・解決方法をご存知の方がいらっしゃいましたら、ご教示いただければ幸いです。
発生している問題・エラーメッセージ
エラーは発生しておらずツイート用リンクを選択するとポスト作成画面へ問題なく遷移するのですが、本来85文字まで表示されるはずのツイートテキストのうち始めの2文字「1.」しか表示されないことがあります。
なお当初は「1行目から85文字を超えている場合」に発生しているものと考えていたのですが、その後より短い文字数でも発生する場合があることが判明し、問題の発生する状況が解らなくなってしまっている状況です。
※発生頻度は2〜3回に1回、入力されたキャラクター名や結果の文字数に関わらず正しく動作する時・しない時があるようです。
該当のソースコード
Python
1 2#!/usr/local/bin/python3.7 3import openai 4import os 5import sys 6import cgi 7 8print("Content-Type: text/html; charset=utf-8") 9print() 10 11openai.api_key = "xx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 12form = cgi.FieldStorage() 13 14chat = [] 15chat.append({"role": "system", "content": "あなたは名言をリストアップするためのプログラムです。特定の人物/キャラうたーの名言を聞かれると、数字を着けて有名な名言3つを教えてくれます。"}) 16character = form.getvalue("character") 17chat.append({"role": "user", "content": f"{character}の名言を3つ挙げて。なお、返事は行ごとに/を表示して。"}) 18response = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=chat) 19msg = response["choices"][0]["message"]["content"].lstrip() 20lines = msg.split('/') 21line1 = lines[0] # 追加部分1 22tweet = msg 23if len(line1) > 85: 24 tweet = line1[0:85] + '...' # 追加部分2 25elif len(msg) > 85: 26 tweet = msg[0:85] + '...' 27tweet = tweet.split('/') 28 29print(f'<!doctype html>\n<html lang="ja">\n<head>\n<meta charset="UTF-8">\n<meta name="viewport" content="width=device-width,initial-scale=1">\n<title>タイトル</title>\n') 30print('<script>…</script>\n<link rel="stylesheet" href="quotes.css" type="text/css" />\n</head>\n<body>\n<main>\n<h1>タイトル</h1>\n<br><img id="titlepic" src="cgi-bin/xxx.png" width="320" height="240" alt="...">\n') 31print(f'<br>\n<h2>{character}の名言</h2>\n<div>\n<p>') 32for line in lines: 33 print(f'{line}<br>') 34print(f'</p>\n</div>\n<p><a href="https://twitter.com/intent/tweet?related=xxx&text=AIに{character}の名言を教えてもらいました!%0D%0A') 35for t in tweet: 36 print(f'{t}%0D%0A') 37print(f'%0D%0A%20%23タイトル%20by%20%23サイト名%20&url=https://xxx.com/">ツイート(ポスト)する</a></p>\n<br>\n') 38print('</main>\n<footer id="footer-outer">\n</footer>\n') 39print('<script type="text/javascript">\n...\n</script>\n</body>\n</html>') 40
正しく文字数調整されない場合の結果例
※人物/キャラクター名「スヌーピー」で実行した時:
1. "愛は、二人で一つのベッドで寝ても、一緒に目を覚ましても、いっしょに笑い合うことだよ。" 2. "幸せとは、人に認められていることではない。自分が大切に思っていることを持っていることだ。" 3. "明日のことを考えすぎるな、今日を楽しめばいいんだ。"
試したこと
始めは「1行目の文字数がすでに85文字を超えていること」が原因とばかり考えていたので、上記ソースコードの「追加部分」というコメントの通り、「返答全体が85文字より多ければ」という条件のまえに「1行目の文字数が85文字より多ければ」という条件を追加してみましたが、状況に変わりはありませんでした。
補足情報(FW/ツールのバージョンなど)
※使用しているレンタルサーバの事情により古いバージョンのOpenAIライブラリを使用していますが、ウェブページ上には正しく返答が表示されることから、プログラムへの影響はないものと考えております。
以上です。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/09/16 13:05
2024/09/16 13:11