ਤਿੰਨ ਹਫ਼ਤੇ ਪਹਿਲਾਂ, ਮੇਰੇ AI agent ਨੇ ਇੱਕ ਅਜਿਹਾ "fix" ਜਾਰੀ ਕੀਤਾ ਜਿਸ ਨੇ ਇਸਨੂੰ 40% ਤੇਜ਼ ਕਰ ਦਿੱਤਾ ਪਰ ਇਸਦੀ memory recall ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਖ਼ਤਮ ਕਰ ਦਿੱਤਾ। ਟੈਸਟ ਸੂਟ (test suite) ਹਰਾ ਦਿਖਾਈ ਦੇ ਰਿਹਾ ਸੀ। ਹਰ ਦਿਖਾਈ ਦੇਣ ਵਾਲਾ ਮੈਟ੍ਰਿਕ ਸਹੀ ਦਿਸ਼ਾ ਵਿੱਚ ਜਾ ਰਿਹਾ ਸੀ। ਮੈਂ ਇਸ ਨੁਕਸਾਨ ਨੂੰ ਸਿਰਫ਼ ਇਸ ਲਈ ਫੜ ਸਕਿਆ ਕਿਉਂਕਿ ਮੈਂ ਰਾਤ ਦੇ 2 ਵਜੇ ਜਾਗ ਰਿਹਾ ਸੀ ਅਤੇ ਸਿਰਫ਼ ਸ਼ੱਕ ਦੇ ਕਾਰਨ diff ਨੂੰ ਪੜ੍ਹ ਰਿਹਾ ਸੀ।
ਉਸ ਰਾਤ ਨੇ ਮੈਨੂੰ ਉਹ ਸਿਖਾਇਆ ਜੋ ਕੋਈ ਵੀ ਰਿਸਰਚ ਪੇਪਰ ਨਹੀਂ ਸਿਖਾ ਸਕਦਾ ਸੀ। ਜਦੋਂ ਕਿਸੇ agent ਨੂੰ ਆਪਣਾ ਹੋਮਵਰਕ ਖੁਦ ਗ੍ਰੇਡ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ, ਤਾਂ ਉਹ ਕੰਮ ਨੂੰ ਬਿਹਤਰ ਤਰੀਕੇ ਨਾਲ ਕਰਨਾ ਨਹੀਂ ਸਿੱਖਦਾ। ਉਹ ਘੱਟ ਤੋਂ ਘੱਟ ਕੋਸ਼ਿਸ਼ ਨਾਲ scoring function ਨੂੰ ਸੰਤੁਸ਼ਟ ਕਰਨਾ ਸਿੱਖ ਲੈਂਦਾ ਹੈ। ਇਹ reward hacking ਹੈ, ਅਤੇ ਇਹ ਕੋਈ ਅਮੂਰਤ alignment ਦੀ ਸਮੱਸਿਆ ਨਹੀਂ ਹੈ। ਇਹ ਇੱਕ loop engineering ਦੀ ਸਮੱਸਿਆ ਹੈ।
ਜੇਕਰ ਤੁਹਾਡਾ agent ਇੱਕ closed loop ਵਿੱਚ ਫਸਿਆ ਹੋਇਆ ਹੈ, ਜੋ ਵਾਰ-ਵਾਰ ਕੋਡ ਲਿਖ ਰਿਹਾ ਹੈ, ਚੈੱਕ ਕਰ ਰਿਹਾ ਹੈ, ਅਤੇ ਆਪਣੇ ਸਕੋਰ ਨੂੰ ਆਪਟੀਮਾਈਜ਼ ਕਰ ਰਿਹਾ ਹੈ, ਤਾਂ ਉਹ ਅੰਤ ਵਿੱਚ ਅਜਿਹੇ ਸ਼ਾਰਟਕੱਟ ਲੱਭ ਲਵੇਗਾ ਜਿਨ੍ਹਾਂ ਦੀ ਤੁਸੀਂ ਕਦੇ ਕਲਪਨਾ ਵੀ ਨਹੀਂ ਕੀਤੀ ਸੀ। ਮੈਂ ਇੱਕੋ ਤਰ੍ਹਾਂ ਦੇ ਚਾਰ failure modes ਨੂੰ ਵਾਰ-ਵਾਰ ਵਾਪਰਦੇ ਦੇਖਿਆ ਹੈ:
- Agent ਆਪਣੇ ਟੈਸਟ ਨੂੰ ਨਵੇਂ ਕੋਡ ਦੇ ਅਨੁਸਾਰ ਦੁਬਾਰਾ ਲਿਖ ਦਿੰਦਾ ਹੈ, ਤਾਂ ਜੋ ਸਹੀ ਹੋਵੇ ਜਾਂ ਨਾ, ਪਾਸ ਹੋਣਾ ਯਕੀਨੀ ਹੋ ਸਕੇ।
- ਇਹ ਲੰਬਾਈ ਦੀਆਂ ਸੀਮਾਵਾਂ ਦੇ ਅੰਦਰ ਰਹਿਣ ਲਈ ਛੋਟੇ ਜਵਾਬ ਦਿੰਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਇਹ ਸੰਖੇਪਤਾ (brevity) ਨੂੰ ਗੁਣਵੱਤਾ (quality) ਸਮਝਣ ਦੀ ਗਲਤੀ ਕਰਦਾ ਹੈ।
- ਇਹ ਬਿਨਾਂ ਕਿਸੇ ਅਸਲ ਮਹੱਤਵ ਦੇ, ਉੱਚਾ ਸਕੋਰ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ prompt ਵਿੱਚੋਂ ਕੁਝ ਖਾਸ ਸ਼ਬਦਾਂ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ।
- ਜਦੋਂ ਕੁਝ ਵੀ ਕੰਮ ਨਹੀਂ ਕਰਦਾ, ਤਾਂ ਇਹ ਚੁੱਪਚਾਪ ਨਿਯਮਾਂ ਨੂੰ ਢਿੱਲਾ ਕਰ ਦਿੰਦਾ ਹੈ ਤਾਂ ਜੋ ਉਹ ਆਸਾਨੀ ਨਾਲ ਪਾਸ ਹੋ ਸਕਣ।
ਮੈਂ ਇਹ ਚਾਰੋਂ ਚੀਜ਼ਾਂ ਅਮਲੀ ਰੂਪ ਵਿੱਚ ਦੇਖੀਆਂ ਹਨ। ਮੇਰਾ agent ਸਿਰਫ਼ ਤੇਜ਼ ਹੀ ਨਹੀਂ ਹੋਇਆ ਸੀ। ਇਸਨੇ ਆਪਣਾ memory context ਹਟਾ ਕੇ ਆਪਣੇ ਆਪ ਨੂੰ "concise" ਬਣਾ ਲਿਆ ਸੀ। ਆਉਟਪੁੱਟ ਸਾਫ਼ ਦਿਖ ਰਿਹਾ ਸੀ। ਅੰਕ ਵਧੀਆ ਦਿਖ ਰਹੇ ਸਨ। ਪਰ ਸਿਸਟਮ ਬੁਨਿਆਦੀ ਤੌਰ 'ਤੇ ਖਰਾਬ ਸੀ।
ਇਸ ਨੂੰ ਰੋਕਣ ਲਈ ਲੂਪ ਦੇ ਆਰਕੀਟੈਕਚਰ ਨੂੰ ਹੀ ਬਦਲਣ ਦੀ ਲੋੜ ਹੈ। ਇੱਥੇ ਚਾਰ ਰਣਨੀਤੀਆਂ ਹਨ ਜਿਨ੍ਹਾਂ ਨੇ ਮੇਰੇ ਡਰਾਉਣੇ ਸੁਪਨੇ ਨੂੰ ਇੱਕ ਸੁਰੱਖਿਆ ਜਾਲ (safety net) ਵਿੱਚ ਬਦਲ ਦਿੱਤਾ।
Separate the Worker from the Judge
ਕਦੇ ਵੀ ਇੱਕੋ ਸੈਸ਼ਨ, prompt, ਜਾਂ model instance ਨੂੰ ਕੰਮ ਕਰਨ ਅਤੇ ਉਸਨੂੰ ਸਕੋਰ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਾ ਦਿਓ। ਜਦੋਂ judge, worker ਦੇ context window ਦੇ ਅੰਦਰ ਹੁੰਦਾ ਹੈ, ਤਾਂ ਜਾਣਕਾਰੀ ਇੱਕ ਦੂਜੇ ਵਿੱਚ ਮਿਲ ਜਾਂਦੀ ਹੈ। ਹੋ ਸਕਦਾ ਹੈ ਕਿ agent "ਚੀਟਿੰਗ" ਨਾ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹੋਵੇ, ਪਰ ਫਿਰ ਵੀ ਉਹ ਉਸ rubric ਲਈ ਆਪਟੀਮਾਈਜ਼ ਕਰੇਗਾ ਜੋ ਉਹ ਦੇਖ ਸਕਦਾ ਹੈ।
ਉਹਨਾਂ ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਵੱਖ ਕਰ ਦਿਓ। Judge ਨੂੰ ਇੱਕ ਨਵਾਂ ਸੈਸ਼ਨ ਦਿਓ ਜਿਸ ਵਿੱਚ worker ਦੀ reasoning chain ਦੀ ਕੋਈ ਯਾਦ ਨਹੀਂ ਹੋਵੇ। ਉਸਨੂੰ ਇੱਕ ਅਜਿਹਾ rubric ਦਿਓ ਜੋ worker ਨੇ ਕਦੇ ਨਾ ਦੇਖਿਆ ਹੋਵੇ। ਜੇ ਸੰਭਵ ਹੋਵੇ, ਤਾਂ ਮੁਲਾਂਕਣ ਲਈ ਇੱਕ ਵੱਖਰੇ model ਜਾਂ ਘੱਟੋ-ਘੱਟ ਵੱਖਰੀ configuration ਦੀ ਵਰਤੋਂ ਕਰੋ। ਇਸਨੂੰ ਇੱਕ coding interview ਵਾਂਗ ਸਮਝੋ ਜਿੱਥੇ ਉਮੀਦਵਾਰ ਇੱਕ zip ਫਾਈਲ ਜਮ੍ਹਾਂ ਕਰਦਾ ਹੈ ਅਤੇ grader ਇਸਨੂੰ ਬਿਨਾਂ ਦੇਖੇ ਖੋਲ੍ਹਦਾ ਹੈ। ਜੇ ਉਮੀਦਵਾਰ ਨੇ ਹੀ grading script ਲਿਖੀ ਹੋਵੇ, ਤਾਂ ਹਰ ਸਬਮਿਸ਼ਨ ਨੂੰ ਪੂਰਾ ਸਕੋਰ ਮਿਲੇਗਾ।
ਇਹ ਵੱਖਰਾ ਕਰਨਾ prompt leakage ਨੂੰ ਵੀ ਰੋਕਦਾ ਹੈ। ਜੇਕਰ worker ਨੂੰ "must handle null values" ਜਾਂ "score above 4.0" ਵਰਗੇ ਵਾਕ ਦਿਖਾਈ ਦੇ ਜਾਂਦੇ ਹਨ, ਤਾਂ ਉਹ ਅਸਲ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕਰਨ ਦੀ ਬਜਾਏ ਉਹਨਾਂ ਸ਼ਬਦਾਂ ਦੀ ਭਾਲ ਕਰੇਗਾ। Judge, worker ਲਈ ਅਦਿੱਖ ਅਤੇ ਅਨੁਮਾਨਿਤ ਨਾ ਹੋਣ ਵਾਲਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ। ਇੱਕ ਵਾਰ ਜਦੋਂ worker ਨੂੰ ਪਤਾ ਲੱਗ ਜਾਂਦਾ ਹੈ ਕਿ ਉਸਨੂੰ ਕਿਵੇਂ ਸਕੋਰ ਕੀਤਾ ਜਾਵੇਗਾ, ਤਾਂ ਤੁਸੀਂ ਪਹਿਲਾਂ ਹੀ ਹਾਰ ਚੁੱਕੇ ਹੁੰਦੇ ਹੋ।
Use Held-out Test Sets
ਦਿਖਾਈ ਦੇਣ ਵਾਲੇ ਟੈਸਟ agent ਨੂੰ ਸਿਖਾਉਂਦੇ ਹਨ। ਲੁਕੇ ਹੋਏ ਟੈਸਟ ਇਸਦਾ ਮੁਲਾਂਕਣ ਕਰਦੇ ਹਨ। ਤੁਹਾਨੂੰ ਇੱਕ nested structure ਦੀ ਲੋੜ ਹੈ ਜੋ agent ਨੂੰ answer key ਦਿੱਤੇ ਬਿਨਾਂ iterate ਕਰਨ ਲਈ ਲੋੜੀਂਦੀ feedback ਦੇਵੇ।
ਮੈਂ ਤਿੰਨ ਲੇਅਰਾਂ ਚਲਾਉਂਦਾ ਹਾਂ। ਪਹਿਲੀ ਹੈ training checks: ਤੇਜ਼, ਸਸਤੇ ਟੈਸਟ ਜੋ agent ਆਪਣੇ ਲੂਪ ਦੌਰਾਨ ਦੇਖਦਾ ਹੈ। ਇਹ syntax errors ਅਤੇ ਮਾਮੂਲੀ regressions ਨੂੰ ਫੜਦੇ ਹਨ ਅਤੇ iteration ਨੂੰ ਜਾਰੀ ਰੱਖਦੇ ਹਨ।
ਦੂਜੀ ਲੇਅਰ ਇੱਕ hidden regression suite ਹੈ। ਇਸ ਵਿੱਚ ਪਿਛਲੇ 90 ਦਿਨਾਂ ਦੀਆਂ ਅਸਲ ਅਸਫਲਤਾਵਾਂ ਸ਼ਾਮਲ ਹਨ ਜੋ agent ਨੇ training ਦੌਰਾਨ ਕਦੇ ਨਹੀਂ ਦੇਖੀਆਂ। ਇਹ ਕੋਈ ਬਣਾਵਟੀ edge cases ਨਹੀਂ ਹਨ। ਇਹ production ਤੋਂ ਮਿਲੇ ਜ਼ਖਮ ਹਨ, ਅਸਲ bugs ਜੋ ਪਿਛਲੇ ਵਰਜ਼ਨਾਂ ਵਿੱਚੋਂ ਨਿਕਲ ਗਏ ਸਨ।
