AIがたくさんの事をできるようになり、プログラムをAIに「こういうことがしたい!」と頼むことが増えてきました。そして、最近はChatGPTでプログラムを作っているときに、コードが600行を超えたあたりから「修正を頼むと動作が遅い」「返事が返ってこない」ということが頻発しました。
作業のサイクルが長くなり、効率が下がってしまうのは大きなストレスとなっています。
そこで見つけたのが、「全文ではなく差分(unified diff)」で修正箇所だけやり取りする方法です。
この工夫を取り入れてから、ChatGPTとのやり取りが一気に軽くなり、作業がスムーズになりました。
この記事前半では、初心者でも体験できるように「シンプル電卓アプリ」を題材に、
- 完成版を動かす
- わざとバグらせる
- 差分だけで直す
という流れを実際にやってみます。
「差分(unified diff)」ってなに?
プログラムの修正点を表す方法のひとつで、
-
が削除する行+
が追加する行
というルールで修正部分だけを表示します。
イメージは「赤線で消して青線で追加する」感じです。
全文ではなく修正部分だけを見られるので、ChatGPTも人間も理解が早くなります。
1. シンプル電卓(完成版)を動かす
記事をただ読むより、以下のコードを実際に修正しながら読むと理解しやすい気がします。
手順
- 以下のコードを
app.py
として保存します。
# file: app.py
import tkinter as tk
from tkinter import ttk, messagebox
class CalculatorApp(tk.Tk):
def __init__(self):
super().__init__()
self.title("シンプル電卓")
self.geometry("320x220")
self.resizable(False, False)
self._build_ui()
def _build_ui(self):
frm = ttk.Frame(self, padding=12)
frm.pack(fill=tk.BOTH, expand=True)
ttk.Label(frm, text="数値1").grid(row=0, column=0, sticky=tk.W, padx=4, pady=4)
self.entry1 = ttk.Entry(frm, width=18)
self.entry1.grid(row=0, column=1, sticky=tk.W, padx=4, pady=4)
ttk.Label(frm, text="数値2").grid(row=1, column=0, sticky=tk.W, padx=4, pady=4)
self.entry2 = ttk.Entry(frm, width=18)
self.entry2.grid(row=1, column=1, sticky=tk.W, padx=4, pady=4)
btns = ttk.Frame(frm)
btns.grid(row=2, column=0, columnspan=2, pady=8)
ttk.Button(btns, text="+", width=6, command=self.on_add).grid(row=0, column=0, padx=3)
ttk.Button(btns, text="-", width=6, command=self.on_sub).grid(row=0, column=1, padx=3)
ttk.Button(btns, text="×", width=6, command=self.on_mul).grid(row=0, column=2, padx=3)
ttk.Button(btns, text="÷", width=6, command=self.on_div).grid(row=0, column=3, padx=3)
ttk.Button(btns, text="クリア", width=8, command=self.on_clear).grid(row=0, column=4, padx=8)
sep = ttk.Separator(frm)
sep.grid(row=3, column=0, columnspan=2, sticky="ew", pady=8)
self.result_var = tk.StringVar(value="結果:")
ttk.Label(frm, textvariable=self.result_var, font=("", 12, "bold")).grid(
row=4, column=0, columnspan=2, sticky=tk.W, padx=4
)
def _read_numbers(self):
a = self.entry1.get().strip()
b = self.entry2.get().strip()
if a == "" or b == "":
raise ValueError("数値が空です")
try:
return float(a), float(b)
except Exception:
raise ValueError("数値として解釈できません")
def _show_result(self, value):
self.result_var.set(f"結果:{value}")
def _safe_calc(self, op_name, f):
try:
x, y = self._read_numbers()
self._show_result(f(x, y))
except ZeroDivisionError:
messagebox.showerror("エラー", "0で割ることはできません。")
except ValueError as e:
messagebox.showerror("入力エラー", str(e))
except Exception as e:
messagebox.showerror("エラー", f"{op_name} エラー: {e}")
def on_add(self):
self._safe_calc("加算", lambda x, y: x + y)
def on_sub(self):
self._safe_calc("減算", lambda x, y: x - y)
def on_mul(self):
self._safe_calc("乗算", lambda x, y: x * y)
def on_div(self):
self._safe_calc("除算", lambda x, y: x / y)
def on_clear(self):
self.entry1.delete(0, tk.END)
self.entry2.delete(0, tk.END)
self._show_result("")
if __name__ == "__main__":
app = CalculatorApp()
app.mainloop()
- PowerShell(またはコマンドプロンプト)で実行
python app.py
- 画面に「数値1」「数値2」の入力欄とボタン、結果ラベルが出れば成功です。

2. わざとバグらせてみる
学習用に、あえて「文字列連結バグ」を仕込みます。on_add
を次のように書き換えてください。
def on_add(self):
# ❌ バグ:文字列のまま結合(2 + 3 → 23)
a = self.entry1.get()
b = self.entry2.get()
self._show_result(a + b)
バグの症状
- 数値1に「2」、数値2に「3」を入力 → 「+」を押す
- 本来は「結果:5」になるところが、「結果:23」と表示される

3. 差分(unified diff)で修正
ChatGPTに依頼するときは、関数だけを指定して、差分で返してもらいます。
依頼文例
【目的】on_add で文字列連結ではなく数値の加算に修正
【範囲】app.py の on_add 関数のみ
【制約】他は触らない。出力は30行以内
【出力】unified diff 形式
返答イメージ
--- a/app.py
+++ b/app.py
@@
- def on_add(self):
- # ❌ バグ:文字列のまま結合(2 + 3 → 23)
- a = self.entry1.get()
- b = self.entry2.get()
- self._show_result(a + b)
+ def on_add(self):
+ # ✅ 修正:数値として取得してから加算
+ self._safe_calc("加算", lambda x, y: x + y)
こうすることで、ChatGPTは修正部分だけ返してくれるので、やり取りが速く・わかりやすくなります。
まとめ(前半)
- ChatGPTが重くなる原因は「全文を読み直して書き直す」から
- 差分(unified diff)を使えば「修正箇所だけ」でやり取りできる
- 小さなアプリで練習すると、すぐに体感できる
ここまでが**前半(初心者向け編)**です。
👉 後半では「実務者向けTips集」として、依頼テンプレ・スレッド運用・出力量制限・Git適用法などをまとめます。
コメント