দ্বিতীয় সমস্যা হল আমরা আরও ভাল করতে পারি। আমি খুশি যে আমরা এখন এমন একটি সময়ে বাস করি যখন প্রোগ্রামাররা তাদের নিজস্ব পরীক্ষা লেখে, কিন্তু আমরা প্রোডাকশন কোডের মতো পরীক্ষার ক্ষেত্রে নিজেদেরকে একই মান ধরে রাখি না। এটি একটি যুক্তিসঙ্গত ট্রেডঅফ; দিনে মাত্র অনেক ঘন্টা আছে। কিন্তু এলএলএমদের গাণিতিক দক্ষতার যে অভাব রয়েছে, তা তারা উৎসাহে পূরণ করে।
এর একটি আরও ভাল পরীক্ষার জন্য জিজ্ঞাসা করা যাক.
পরীক্ষায়, একটি স্লাইসে পরিচিত মানগুলির একটি নির্দিষ্ট সেটের উপরে কোয়ার্টাইলের জন্য স্ট্যান্ডার্ড কোডের সবচেয়ে সহজ, সবচেয়ে পঠনযোগ্য সংস্করণটি প্রয়োগ করুন। তারপরে স্ট্যান্ডার্ড কোড এবং জলাধার স্যাম্পলারের মাধ্যমে পরীক্ষার কেসগুলি পাস করুন এবং নিশ্চিত করুন যে তারা একে অপরের এপিসিলনের মধ্যে রয়েছে। তুলনা কোডটি এমনভাবে গঠন করুন যাতে এটি একটি ফাজ পরীক্ষাতেও ব্যবহার করা যেতে পারে।
এটি আমাদের কিছু নতুন পরীক্ষার কোড পেয়েছে:
// referenceQuartiles calculates the exact quartiles for a slice of float64 values
// using linear interpolation, matching the behavior expected from the sampler.
func referenceQuartiles(data []float64) (q1, median, q3 float64) { … }
// compareQuartiles checks if two sets of quartiles are within epsilon of each other.
// Returns true if they match within the tolerance, false otherwise.
func compareQuartiles(q1a, meda, q3a, q1b, medb, q3b, epsilon float64) bool { … }
// checkQuartiles is a test helper that compares sampler output against the reference
// implementation and reports any differences.
func checkQuartiles(t *testing.T, data []float64, epsilon float64) {
t.Helper()
// Get reference values
wantQ1, wantMed, wantQ3 := referenceQuartiles(data)
// Get sampler values using a large reservoir for accuracy
qs := NewQuartileSampler(1000)
for _, v := range data {
qs.Add(v)
}
gotQ1, gotMed, gotQ3 := qs.Quartiles()
if !compareQuartiles(gotQ1, gotMed, gotQ3, wantQ1, wantMed, wantQ3, epsilon) {
t.Errorf("Quartiles mismatch:\ngot (q1=%v, med=%v, q3=%v)\nwant (q1=%v, med=%v, q3=%v)\nepsilon=%v",
gotQ1, gotMed, gotQ3, wantQ1, wantMed, wantQ3, epsilon)
}
}
উপরে থেকে আসল পরীক্ষাটি চেক কোয়ার্টাইল ব্যবহার করার জন্য পুনরায় কাজ করা হয়েছে এবং আমাদের কাছে নতুন কিছু আছে:
func FuzzQuartileSampler(f *testing.F) {
// Add some seed corpus
f.Add([]float64{1, 2, 3, 4, 5})
f.Fuzz(func(t *testing.T, data []float64) {
// Use a larger epsilon for fuzzing since we might get more extreme values
checkQuartiles(t, data, 0.2)
})
}
এটা মজা কারণ এটা ভুল. আমার দৌড় gopls
টুল অবিলম্বে বলে:
fuzzing arguments can only have the following types:
string, bool, float32, float64,
int, int8, int16, int32, int64,
uint, uint8, uint16, uint32, uint64,
[]byte
সেই ত্রুটিটিকে এলএলএম-এ পেস্ট করলে এটি ফাজ পরীক্ষাটি পুনরায় জেনারেট করতে পারে যাতে এটি একটি চারপাশে নির্মিত হয় func(t *testing.T, data []byte)
যে ফাংশন ব্যবহার করে math.Float64frombits
ডাটা স্লাইস থেকে ফ্লোট বের করতে। এই ধরনের মিথস্ক্রিয়া আমাদের টুল থেকে প্রতিক্রিয়া স্বয়ংক্রিয় করার দিকে নির্দেশ করে; দরকারি কিছুর দিকে দৃঢ় অগ্রগতি করার জন্য সুস্পষ্ট ত্রুটির বার্তার প্রয়োজন ছিল। আমার প্রয়োজন ছিল না।
আমার এলএলএম চ্যাটের ইতিহাসের শেষ কয়েক সপ্তাহের একটি দ্রুত সমীক্ষা করা দেখায় (যা আমি আগে উল্লেখ করেছি, কোনও পরিমাপ দ্বারা সঠিক পরিমাণগত বিশ্লেষণ নয়) যে 80 শতাংশের বেশি সময় একটি টুলিং ত্রুটি থাকে, এলএলএম করতে পারে আমার কোন অন্তর্দৃষ্টি যোগ ছাড়া দরকারী অগ্রগতি করুন. প্রায় অর্ধেক সময়, এটি আমাকে লক্ষণীয় কিছু না বলে সম্পূর্ণভাবে সমস্যার সমাধান করতে পারে। আমি শুধু বার্তাবাহকের চরিত্রে অভিনয় করছি।