ショートストーリー:「AIプログラミングアシスタントとの出会い」
東京都心のビル群の一角にある、静かなカフェで、主人公・亮(りょう)はラップトップの前に座っていた。彼は新進気鋭のプログラマーとして、日々忙しい生活を送っていたが、プログラミングの技術をさらに効率的に学びたいという焦燥感を抱えていた。彼は早朝から夜遅くまでコードを書き、エラーと戦いながら、次第に疲弊していった。
ある日、彼の友人から「AIプログラミングアシスタント」について聞いた。そのアシスタントは、コードを生成するだけでなく、エラーが出たときには自動的に修正案まで提示してくれるという夢のようなツールだった。
「本当にそんなことができるのか?」
半信半疑の亮は、最初のテストとして、AIに「1から10までの数字を出力するPythonプログラムを書いてください」と依頼した。瞬く間に、プログラムがエディタに表示された。
for i in range(1, 11):
print(i)
「簡単だな」と亮は思った。次に、彼は少し難しい要求をしてみた。「指定された数が偶数か奇数かを判定するプログラムを書いてください」と。
すると、再びコードが生成された。
def is_even_or_odd(num):
if num % 2 == 0:
return "Even"
else:
return "Odd"
しかし、亮はわざとプログラムにミスを加え、エラーが出るようにした。その後、「コードを実行」ボタンを押すと、案の定エラーが発生した。AIはエラー内容を分析し、修正提案を提示してくれた。修正ボタンを押すと、完璧に修正されたコードが再びエディタに表示された。
「これなら、ミスを恐れずにどんどん挑戦できるな。」
亮は感動した。今まで何時間もかけていたデバッグ作業が、AIアシスタントのおかげで数分で解決できるようになった。自分のコードを書きながら、どんなエラーが出てもすぐに解決策が提示される。彼はそれを使いこなし、ますます複雑なアルゴリズムやプログラムに挑戦し始めた。
「これこそ、僕が求めていた学び方だ。」
AIはただコードを生成するだけでなく、亮にとって最適な学習プロセスを提供してくれた。彼は効率的にプログラミングのスキルを磨き、次第に難しいプロジェクトに取り組めるようになった。そして、彼はふと思った。「このAIアシスタントがあれば、もっと多くの人がプログラミングを学び、創造力を発揮できるようになるかもしれない。」
カフェを出た亮は、街の喧騒の中で、新たな夢を描いていた。自分だけでなく、他の人々にもAIを使ったプログラミング学習の可能性を広めたい――そう決意したのだった。
東京のビルの明かりが、夜の空にキラキラと輝いていた。
Google corab に張り付けて GPU設定にすれば快適に動作します。( CPUだと遅いです。)
# 必要なライブラリのインストール
!pip install accelerate gradio transformers
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import gradio as gr
import subprocess
import re
# GPUが利用可能かどうかをチェック
device = "cuda" if torch.cuda.is_available() else "cpu"
# 言語モデルとトークナイザーの読み込み
language_model_name = "Qwen/Qwen2.5-1.5B-Instruct"
language_model = AutoModelForCausalLM.from_pretrained(
language_model_name,
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(language_model_name)
def generate_code(prompt):
try:
# プロンプトに基づいてコードを生成
messages = [
{"role": "system", "content": "あなたは優れたプログラミングアシスタントです。"},
{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(device)
generated_ids = language_model.generate(
model_inputs.input_ids,
max_new_tokens=512
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
return response
except Exception as e:
return f"コード生成エラー: {str(e)}"
def extract_python_code(response):
code_match = re.search(r'```python(.*?)```', response, re.DOTALL)
if code_match:
code = code_match.group(1).strip()
return code
else:
return "Pythonコードが見つかりませんでした。"
def execute_code(code):
try:
# 生成されたコードをファイルに保存して実行
with open("generated_code.py", "w") as file:
file.write(code)
result = subprocess.run(["python", "generated_code.py"], capture_output=True, text=True)
return result.stdout if result.returncode == 0 else result.stderr
except Exception as e:
return f"コード実行エラー: {str(e)}"
# エラー修正関数
def fix_code(error_message, original_code):
try:
# エラーメッセージを元にコード修正を生成
prompt = f"以下のエラーを修正してください:\n\nエラーメッセージ: {error_message}\n元のコード: {original_code}"
response = generate_code(prompt)
return extract_python_code(response)
except Exception as e:
return f"コード修正エラー: {str(e)}"
def handle_interaction(input_text, sample_prompt):
prompt = input_text or sample_prompt
response = generate_code(prompt)
code = extract_python_code(response)
return response, code
def handle_code_execution(code):
result = execute_code(code)
return result
def handle_code_fix(error_message, code):
fixed_code = fix_code(error_message, code)
return fixed_code
# サンプルプロンプト
sample_prompts = [
"1から10までの数字を出力するPythonプログラムを書いてください。",
"文字列を逆にするPythonコードを書いてください。",
"リストの要素を一つずつ出力するPythonプログラムを作成してください。",
"指定された数が偶数か奇数かを判定するPythonコードを書いてください。",
"ユーザーから名前を入力させて挨拶をするPythonプログラムを書いてください。",
"足し算をするPythonコードを書いてください。",
"二つの数を掛け算するPythonプログラムを作成してください。",
"リストの長さを取得するPythonコードを書いてください。",
"与えられた文字列が何文字あるかを数えるPythonプログラムを書いてください。",
"0から5までの数を繰り返し出力するPythonコードを書いてください。"
]
with gr.Blocks() as iface:
gr.Markdown("# 日本語プログラミングアシスタント")
with gr.Row():
with gr.Column():
input_text = gr.Textbox(label="入力テキスト")
sample_prompt = gr.Dropdown(sample_prompts, label="サンプルプロンプト")
generate_button = gr.Button("チャットの応答を生成")
response_output = gr.Textbox(label="言語モデルの応答")
with gr.Column():
code_editor = gr.Textbox(label="プログラミングエディタ", lines=15)
execute_button = gr.Button("コードを実行")
execution_result_output = gr.Textbox(label="実行結果", lines=10)
fix_button = gr.Button("エラーを修正する")
generate_button.click(handle_interaction, inputs=[input_text, sample_prompt], outputs=[response_output, code_editor])
execute_button.click(handle_code_execution, inputs=[code_editor], outputs=execution_result_output)
fix_button.click(handle_code_fix, inputs=[execution_result_output, code_editor], outputs=code_editor)
if __name__ == "__main__":
iface.launch(debug=True)
以下の流れで操作が行えます:
コード生成: プロンプトを入力して「チャットの応答を生成」ボタンを押すと、言語モデルがコードを生成し、そのコードがプログラミングエディタに表示されます。
コード実行: 「コードを実行」ボタンを押すと、生成されたコードが実行され、実行結果が表示されます。
エラー修正: 実行した際にエラーが発生した場合、そのエラーが「実行結果」に表示されます。次に「エラーを修正する」ボタンを押すと、エラー内容を基に修正されたコードが生成され、その修正後のコードがプログラミングエディタに表示されます。
修正後の実行: 修正されたコードがエディタに表示された後、再度「コードを実行」ボタンを押すことで、修正されたコードが実行され、動作を確認できます。
これにより、エラーが発生した場合でも、そのエラーに基づいた修正を行い、再度動作確認できるプロセスがフロントエンドでスムーズに行える仕組みになっています。