AI問合せ CGI 改良

以前、 note.com にて Google の API を使い、自分の PC で AI に質問するスクリプトの作り方をどう書くか、紹介しました。 その後、3つの AI に同じ質問を訊く CGI を書きましたが、 一般的な、短い質問を考えていたため、 テキスト内に > < & など特殊な文字が含まれることをほぼ考えていませんでした。 また、複数行の問いも考えませんでした。 今回は、可能な限りの特殊文字、それに複数行の問いを考慮に入れて改良しています (答えとして画像をもらうものは、現在も考慮外です)。

それはともかく、以下の CGI をローカルに置けば(公開の場所には置かないでください)、 複数行、プログラミングなどの特殊文字のほとんどに対応の AI 質問 CGI ができます。 これは gemini-2.5-flash 用ですが、chatGPT, claude 用の CGI も同様に動きます。 そして、複数の AI に問い合わせるスクリプト を参考にしてもらえば、 同時に 3つの AI に複数行の質問を投げかけることができます。
#!/usr/local/bin/python3
import cgi
from google import genai
api = "gemini-2.5-flash"
apikey = "あなたの APIキー"
answer = ''
def ask_gemini():
global question, answer
client = genai.Client(api_key=apikey)
response = client.models.generate_content(
model=api,
contents=question)
answer = response.text
print("Content-Type: text/html") # CGIヘッダーを出力
form = cgi.FieldStorage() # フォームデータを取得
question = form.getvalue("question", "")
oldques = question
if question: # 質問がある場合
ask_gemini()
print(f"""
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>AIに質問</title>
<script>
height = window.innerHeight;
wheight = Math.round(height * 0.75);
</script>
</head>
<body style="background-color:#aaa">
<form method="post" action="">
<table style="width:100%">
<tr>
<td style="width:10%">
<h2>AIに質問</h2>
</td>
<td style="width:85%;vertical-align:top">
<label for="question">質問:</label>
<textarea id="question" name="question"
style="width:90%;background-color:#cccccc;"
placeholder="何か質問してください。">{oldques}</textarea>
</td>
<td style="width:5%">
<input type="submit" value="送信">
</td>
</tr>
</table>
</form>
<table style="width:100%">
<td style="width:95%;"> </td>
<td style="width:5%">
<input type="button" onclick="deletetxt();" value="削除">
</td>
</tr>
</table>
<table style="width:100%;margin-top:-20px">
<tr>
<td style="width:100%">
<h3><a href="https://gemini.google.com/app?hl=ja" target="_blank">
{api}</a>の回答:
<textarea style="width:99%;height:25%;background-color:#cccccc;"
id="ta">{answer}</textarea>
</td>
</tr>
</table>
<script>
document.getElementById("ta").style.height = wheight + "px";
document.getElementById("question").style.height = (wheight / 4) + "px";
function deletetxt() {{
document.getElementById("question").value = '';
}}
</script>
</body>
</html>
""")
例えば、以下のような質問を書いたとします。
次の文章を 100字程度に要約して。
ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。
広い門の下には、この男のほかに誰もいない。
ただ、所々丹塗の剥げた、大きな円柱に、蟋蟀が一匹とまっている。
羅生門が、朱雀大路にある以上は、この男のほかにも、
雨やみをする市女笠や揉烏帽子が、もう二三人はありそうなものである。
それが、この男のほかには誰もいない。
返ってくる答えは次のような感じです。
ある日の暮方、一人の下人が羅生門の下で雨やみを待っていた。
広い門の下には彼以外誰もいない。
朱雀大路にある羅生門としては異例なほど人通りがなく、
本来なら人影があってもおかしくない場所の閑散さが際立っていた。
答えは国語としては十分正確で、字数もちょうど100字前後で、使えそうです(文学性は問わず)。
さて、問題の CGI の使い勝手ですが、本家は質問欄が狭く、答えが上にくるのに対し、 このスクリプトは自分が扱いやすい形にいくらでもカスタマイズできます。 同一フォーマットで、chatGPT、claude の CGI も作っておけば、 さらに便利に使えるでしょう。
ついでに次の質問をしてみました。
Perl で次のソースは何をしている?
$sum = 0;
for ($i = 1; $i <= 50; $i++) {
$sum += $i;
}
print("$sum\n");
すると、驚いたことに次のような回答が返ってきました。 AI も進歩したものです。
このPerlのソースコードは、**1から50までの整数を合計し、その結果を出力する**ことを目的としています。
具体的には、以下の処理が行われます。
1. **'$sum = 0;'**
* '$sum' という名前のスカラー変数(Perlで'$'が付く変数はスカラー変数)を宣言し、初期値として '0' を代入します。この変数に合計値を蓄積していきます。
2. **'for ($i = 1; $i <= 50; $i++) { ... }'**
* 標準的なC言語スタイルの 'for' ループです。
* '$i = 1;': ループカウンタ '$i' を '1' で初期化します。
* '$i <= 50;': '$i' が '50' 以下である限りループを続けます。
* '$i++;': ループの各イテレーション(繰り返し)の後に '$i' の値を '1' ずつ増やします。
* つまり、このループは '$i' が '1' から '50' まで順に値を取りながら、中括弧 '{}' 内の処理を合計50回繰り返します。
3. **'$sum += $i;'**
* これはループの内側で実行されるコードです。
* '$sum += $i;' は '$sum = $sum + $i;' の短縮形です。
* ループの各回で、現在の '$i' の値(1, 2, 3, ..., 50)が '$sum' に加算されていきます。
4. **'print("$sum\n");'**
* 'for' ループが終了した後、最終的に計算された '$sum' の値を標準出力(通常は画面)に表示します。
* ダブルクォーテーション '""' 内では変数が展開されるため、'$sum' の値が文字列として挿入されます。
* '\n' は改行コードであり、出力後に新しい行に移動します。
---
**実行結果:**
1から50までの合計は、数学の公式 'n * (n + 1) / 2' を使って計算できます。
'50 * (50 + 1) / 2 = 50 * 51 / 2 = 25 * 51 = 1275'
したがって、このスクリプトを実行すると、以下のように出力されます。
'''
1275
'''
では、よきパソコンライフをお過ごしください。
コメント 記事が気に入ったらいいねしてね!
0
57
🕍 同ジャンル最新記事(-7件)
2025/10/02
2024/10/28