पाठ 6 / 29
Files को भरोसे से संपादित करना
पूरी-file पुनर्लेखन, search/replace संपादन और diffs की तुलना करें।
छोटे, जाँचने योग्य संपादन पुनर्लेखन से बेहतर
Editing वह जगह है जहाँ agents सबसे अक्सर ग़लती करते हैं, इसलिए edit format मायने रखता है। पूरी file दोबारा लिखना सरल है पर धीमा, महँगा और असंबंधित पंक्तियाँ चुपचाप बदलने का जोखिम। Search/replace संपादन सटीक पुराना पाठ और नया पाठ देते हैं; tool बदलाव तभी लगाता है जब पुराना पाठ ठीक एक बार आए, वरना साफ़ error लौटाता है (नहीं मिला: file दोबारा पढ़ें; अस्पष्ट: और संदर्भ जोड़ें)। Unified diffs (git diff format) बदलाव संक्षेप में वर्णित करते हैं पर ग़लत पंक्ति संख्याओं और पुराने संदर्भ के प्रति संवेदनशील हैं। जो भी format हो, अच्छे harnesses संपादन लगने की पुष्टि करते हैं, परिणामी diff दिखाते हैं, संपादन छोटे और केंद्रित रखते हैं, और संपादन इसलिए विफल हो कि file बदल गई तब file दोबारा पढ़ते हैं। पुराना संदर्भ (मॉडल के आख़िरी बार पढ़ने के बाद file बदली) विफलताओं का आम कारण है।
सटीक-मिलान search/replace, चलाकर
मैंने यह सादे Python 3 (सिर्फ़ standard library) से चलाया, अस्थायी folder में बनाए throwaway project के साथ। Tool उस संपादन को अस्वीकार करता है जिसका पुराना पाठ दो बार आता है (और संदर्भ माँगता है), न मिलने वाले पाठ को अस्वीकार करता है (file बदली हो सकती है), और संपादन तभी लगाता है जब पुराना पाठ अनोखा हो।
def apply_edit(source, old, new):
"""Exact search/replace edit: the old text must appear exactly once."""
count = source.count(old)
if count == 0:
return None, "error: old text not found (the file may have changed; re-read it)"
if count > 1:
return None, f"error: old text appears {count} times; include more context to make it unique"
return source.replace(old, new), "ok"
code = "def f(a):\n return a * 2\n\ndef g(a):\n return a * 2\n"
for old in (" return a * 2\n", "return a * 3", "def f(a):\n return a * 2\n"):
result, status = apply_edit(code, old, "def f(a):\n return a * 20\n")
print(repr(old[:22]), "->", status)
Output:
' return a * 2\n' -> error: old text appears 2 times; include more context to make it unique 'return a * 3' -> error: old text not found (the file may have changed; re-read it) 'def f(a):\n return a' -> ok
Unified diff, चलाकर
मैंने यह सादे Python 3 (सिर्फ़ standard library) से चलाया, अस्थायी folder में बनाए throwaway project के साथ। difflib early return जोड़ने का मानक diff format बनाता है: हटाई पंक्तियाँ - से, जोड़ी + से शुरू होती हैं, और अपरिवर्तित संदर्भ पंक्तियों पर कोई चिह्न नहीं। Agent का काम स्वीकारने से पहले आप यही समीक्षा करते हैं।
import difflib
before = """def total(items):
return sum(items)
"""
after = """def total(items):
if not items:
return 0
return sum(items)
"""
diff = difflib.unified_diff(before.splitlines(True), after.splitlines(True), "a/cart.py", "b/cart.py")
print("".join(diff))
Output:
--- a/cart.py
+++ b/cart.py
@@ -1,2 +1,4 @@
def total(items):
+ if not items:
+ return 0
return sum(items)त्वरित जाँच: Edit tool पुराने पाठ को ठीक एक बार आने क्यों माँगता है?
- यह क़ानूनी नियम है
- संपादन धीमे करने के लिए
- क्योंकि files में एक ही पंक्ति हो सकती है
- ग़लत जगह बदलने से बचने और पुरानी file सामग्री पहचानने के लिए
Answer
ग़लत जगह बदलने से बचने और पुरानी file सामग्री पहचानने के लिए — अस्पष्टता या अनुपस्थिति दर्शाती है कि मॉडल file की ग़लत तस्वीर से काम कर रहा है।