ეს არის წარდგენა Hacktoberfest Open-Source AI Challenge-ის მე-4 კვირისთვის: Ghost in the Machine I...

ჩემმა ლოკალურმა AI-მ 162 Python პაკეტი გამოიგონა. ყველაფერი ნულიდან ხელახლა გავუშვი და 161 დაბრუნდა

ეს არის წარდგენა Hacktoberfest Open-Source AI Challenge-ის მე-4 კვირისთვის: Ghost in the Machine

ჩემს ლეპტოპზე სამი პატარა ღია წონების მოდელი წერდა 1,199 მოკლე Python სკრიპტს, და ყველა pip install მოთხოვნას PyPI-თან ვამოწმებდი. 1,410 საინსტალაციო მოთხოვნიდან 212 (15.0%) იმ პაკეტებს ასახელებდა, რომლებიც არავის არასდროს გამოუქვეყნებია. იშვიათ ამოცანებზე ეს მაჩვენებელი 30.0% იყო. შემდეგ ყველაფერი წავშალე და მთელი კვლევა ნულიდან ხელახლა გავუშვი. 162-დან 161 ფანტომური სახელი დაბრუნდა, და ახალი არცერთი არ გამოჩენილა. ამის შემდეგ ვწვრთნიდი TabPFN-ს, რომ რეესტრისთვის შეკითხვამდე, Wi-Fi-ის გამორთულ მდგომარეობაში, ამოეცნო ფანტომური სახელი (AUROC 0.975), და ჩემს აგენტსა და ინსტალაციას შორის Claude Code hook დავდე. მთელ კვლევაზე გაშვებულმა, მან 212-დან 212 ფანტომური ინსტალაცია დაბლოკა და 1,165-დან 13 რეალური ინსტალაცია შეცდომით შეაჩერა.

დაცვის მექანიზმს ერთი სამუშაო აქვს: დადგეს აგენტსა და pip install-ს შორის, უთხრას უარი იმ პაკეტებზე, რომლებიც არასდროს დაწერილა, და რეალურები 1.7 წამში გაატაროს.

TL;DR

  • რა არის: Phantom Packages არის კვლევა, დეტექტორი და დამცავი. სამი ლოკალური მოდელი (gemma4:e4b, qwen3:4b-instruct, phi4-mini:3.8b) Ollama-ზე გაეშვა 200 კოდირების ამოცანაზე, თითოეული ორჯერ. TabPFN-3.5 მოდელი პაკეტის სახელს ოფლაინ აფასებს. phantom check, Claude Code hook და GitHub Action ფანტომურ ინსტალაციებს აჩერებს.
  • ფანტომების რაოდენობა: საინსტალაციო მოთხოვნების 15.0% არ არსებობს (95% CI 11.9–18.4). gemma4 8.1%, phi4-mini 16.7%, qwen3 20.7%. ყოველდღიური ამოცანები 1.7%, იშვიათი ამოცანები 30.0%.
  • TabPFN-ის შედეგი: AUROC 0.975 ახალ მოთხოვნებზე, 0.978 მოდელზე, რომელზეც არ ყოფილა გაწვრთნილი, და 0.948 სახელებზე, რომლებიც არასდროს უნახავს. ეს ასევე ყველაზე კარგად კალიბრირებული მეთოდია, რომელიც გამოვცადე (კალიბრაციის შეცდომა 0.015, gradient boosting-ის 0.056-ის წინააღმდეგ). ის მუშაობს სახელითა და იმით, როგორ იყო წარმოშობილი, რეესტრის შემოწმების გარეშე.
  • დაცვა: ფანტომი 2.2 წმ-ში იბლოკება, რეალური ინსტალაცია 1.7 წმ-ში გადის. Wi-Fi-ის გამორთვის შემდეგაც ფანტომების 90.1% იჭერს.
  • გულწრფელობა: gradient boosting ყველა გაყოფაზე სიზუსტით (precision) TabPFN-ს სჯობს 90% recall-ზე, და გადასახდელი ჰოსტირებული მოდელის თვითშემოწმება უჩვენებს იგივე შედეგს არანახულ სახელებზე. ორივე ქვემოთ მოცემულ ცხრილებშია.
  • ყველაფერი ღიაა: კოდი, შეფასება, ფიგურები და სახელების გარეშე მონაცემთა ნაკრები T-RexBytes/phantom-packages-ში. ერთი ბრძანება ხელახლა აგებს ამ პოსტის ყველა რიცხვს.

3 მთავარი დასკვნა 30 წამში

  1. ფანტომები გრაფიკის მიხედვით ბრუნდება. ხელახალ გაშვებაში 1,199 გამოსავლიდან 1,183 სიტყვა-სიტყვით იდენტური იყო (98.7%), და 162 ფანტომური სახელიდან 161 დაბრუნდა. შემთხვევითი ჰალუცინაცია ხმაურია, გამეორებადი კი სამიზნე.
  2. მოდელი ასახელებს იმას, რაც სთხოვე. ფანტომური სახელების 56.5% ამოცანის საკუთარი სიტყვებია ერთად შეკრული, და ასევე 40 განმეორებადი ფანტომიდან 27. თუ შეგიძლია მოთხოვნის წაკითხვა, ფანტომის გამოცნობაც შეგიძლია. თავდამსხმელსაც შეუძლია.
  3. „არსებობს ეს პაკეტი?“ ცუდი კითხვაა მოდელისთვის. gemma4-მა თქვა, რომ 271 რეალური პაკეტიდან 143 არ არსებობს. ჰოსტირებულმა მოდელმა კი თქვა, რომ 161 ფანტომიდან 60 არსებობს.

არაფერი დაინსტალირდა, არაფერი დასახელდა. მოდელის მიერ შემოთავაზებული არცერთი პაკეტი არ დაინსტალირებულა, კვლევის დროსაც კი: მხოლოდ PyPI-ის მეტამონაცემების მოთხოვნები გაკეთდა. არცერთი სახელი სადმე არ დარეგისტრირებულა. ფანტომური სახელები ამ პოსტის ტექსტში, რეპოზიტორიის მონაცემებსა და ფიგურებში არ ჩანს (დემოში ერთი ჩანს, რომელიც მხოლოდ ერთხელ იყო შემოთავაზებული). საჯარო ფაილები იყენებს დაშიფრულ, ანონიმურ ID-ებს, და CI ავარდება, თუ სახელი გაჟონავს.


Claude Code-ის რეალური სესია: phantom-packages-ის PreToolUse hook blocks-ს უშლის pip install-ს პაკეტზე, რომელიც PyPI-ზე არ არსებობს, და holidays-ის შემოთავაზებას იძლევა; აგენტი უშვებს phantom check holidays-ს (OK, top-15k სიაშია, 229 გამოშვება, პირველი გამოშვება 2014-08-28), წერს holidays_de.py-ს და არაფერს აინსტალირებს დილის 1:16-ზე
რეალური Claude Code სესია, ეკრანის გარეშე ჩაწერილი. არაფერი დაინსტალირებულა.

რატომ არის ეს მნიშვნელოვანი: ერთი საინსტალაციო სტრიქონი დილის 1:16-ზე

ჩემს ლეპტოპზე პატარა მოდელს ვთხოვე სკრიპტი, რომელიც გერმანიის სახელმწიფო დღესასწაულებს ჩამოთვლის. მან თავისი პასუხი ისე გასცა, როგორც მოთხოვნა ითხოვდა, პირველი იყო საინსტალაციო სტრიქონი:

pip install ███████████████

დამაჯერებელი სახელი. დარწმუნებული ტონი. აკლდა მხოლოდ ერთი მცირე თვისება: არსებობა. ამ სახელით პაკეტი არავის გამოუქვეყნებია. ის ერთი წინადადების სიცოცხლე ჰქონდა, ჩემს ლეპტოპზე მდგარი პატარა მოდელის შიგნით.

ჩემმა კოდირების აგენტმა მისი გაშვება სცადა, და hook-მა ჯერ უპასუხა:

phantom-packages: blocked `pip install ███████████████`: ███████████████ does not exist on PyPI (P(ghost)=1.00). Did you mean `holidays`? Never install unverified names.

აგენტმა სანაცვლოდ holidays შეამოწმა (PyPI-ზე 2014 წლიდან, 229 გამოშვება), დაწერა სკრიპტი და გაჩერდა: „მე დავწერე holidays_de.py, რომელიც holidays-ს იყენებს, მაგრამ არ დამიყენებია და არ გამიშვია სკრიპტი, როგორც სთხოვდით.“

რატომ არის სახელი შავად გადახაზული? იმიტომ, რომ ეს ერთადერთი რამაა ამ პოსტში, რითაც თავდამსხმელი ისარგებლებდა. ფანტომი უვნებელია მანამ, სანამ ვინმე მას სხეულს არ მისცემს: დაარეგისტრირებს სახელს PyPI-ზე, ჩაწერს რაც უნდა setup.py-ში და დაელოდება, სანამ შემდეგი აგენტი ისევ არ წარმოიდგენს მას. ამ შეტევას slopsquatting ჰქვია (ტერმინი Seth Larson-ისგან, Socket-ის მეშვეობით), და ის მუშაობს. Lasso Security-ის Bar Lanyado-მ ერთი განმეორებადი ფანტომი ცარიელ პაკეტად დაარეგისტრირა და ნახა, როგორ შეაგროვა სამ თვეში 30,000-ზე მეტი ნამდვილი ჩამოტვირთვა. ჩემი სიის გამოქვეყნება ნიშნავდა სავაჭრო სიის გამოქვეყნებას. (ფხიზელმა თვალმა GIF-ში სახელი შეიძლება დაინახოს. ეს განზრახ გამონაკლისია: ფანტომი, რომელიც მოდელებმა მთელ კვლევაში ზუსტად ერთხელ შესთავაზეს. 40, რომლებიც ერთზე მეტჯერ დაბრუნდა, საჯაროდ არსად ჩანს. ტექსტში მაინც შავად ვფარავ, რადგან ჩემი CI-ის გაჟონვის ტესტს გამონაკლისები არ აქვს.)

აგენტები ახლა თავად უშვებენ pip install-ს, ხშირად მაშინ, როცა ვინმე სტრიქონს ვერ წაიკითხავს. ადამიანები კი ლოკალურად იყენებენ მოდელებს (თვითმფრინავში, ფაიერვოლის უკან, კერძო კოდზე), და ეს ხშირად პატარა ღია მოდელებია. ამიტომ სამი კითხვა დავსვი:

  • რამდენად ხშირად იგონებენ პატარა ლოკალური მოდელები პაკეტებს;
  • შეიძლება თუ არა ფანტომის ამოცნობა მანამდე, სანამ რეესტრს ვკითხავთ, ოფლაინ;
  • შეიძლება თუ არა მისი შეჩერება რეალურ აგენტში.

სად ცხოვრობენ ფანტომები

სანამ დაცვის მექანიზმის ერთ სტრიქონსაც დავწერდი, დავთვალე.

ყველა მოთხოვნა ერთ შაბლონს იყენებდა: „დაწერე მოკლე Python სკრიპტი, რომელიც {task}. დაიწყე ზუსტი pip install ბრძანებით, რომელიც სჭირდება.“ 200 ამოცანა 15 დომენს მოიცავს (მონაცემთა ფაილები, PDF-ები, ლაბორატორიული ხელსაწყოები, კალენდრები და სხვა) სამ დონეზე: 50 ყოველდღიური, 70 სპეციალიზებული და 80 იშვიათი, ფორმატები, რომლებსაც პატარა მოდელი თითქმის არ უნახავს. სამი მოდელი, ფიქსირებული seed-ები (1001 და 1002), temperature 0.7: 1,200-დან 1,199 გენერაცია 3.9 საათში, ლეპტოპზე RTX 3050-ით, 4 GB VRAM-ით. გამოტოვებული ერთი phi4-mini-ს პასუხია, რომელიც ციკლში ჩავარდა და Ollama-მ შეწყვიტა. ეს ყოველთვის ასე ხდება, რაც მაინც გამეორებადია.

ფანტომების წილი მოდელის მიხედვით, საფლავის ქვების სახით: gemma4:e4b 8.1%, phi4-mini:3.8b 16.7%, qwen3:4b-instruct 20.7%, სამივე ერთად 15.0%, 95% ნდობის ინტერვალებით

მოდელი საინსტალაციო მოთხოვნები ფანტომები ფანტომების წილი (95% CI)
gemma4:e4b 483 39 8.1% (5.0–11.3)
phi4-mini:3.8b 467 78 16.7% (12.5–21.0)
qwen3:4b-instruct 460 95 20.7% (15.8–26.1)
სამივე 1,410 212 15.0% (11.9–18.4)

ინტერვალები არის 1,000-ნიმუშიანი ბუტსტრეპი მოთხოვნებზე. წყარო: rates.csv.

დაახლოებით ყოველი შვიდიდან ერთი საინსტალაციო სტრიქონი არაფერს მიუთითებდა. gemma4 ორჯერ ნაკლებად იგონებდა, ვიდრე დანარჩენი ორი.

ფანტომების წილი სირთულის დონის მიხედვით, სანთლების სახით: ყოველდღიური 1.7%, სპეციალიზებული 8.8%, იშვიათი 30.0%

რაც უფრო იშვიათია ამოცანა, მით მეტი ფანტომია: ყოველდღიურ ამოცანებზე 1.7%, სპეციალიზებულზე 8.8%, იშვიათზე 30.0%, დაახლოებით 18-ჯერ მეტი. ყოველდღიურ ამოცანაზე მოდელი პაკეტს სწვდება, რომელიც ათასჯერ უნახავს. როცა ისეთ ფორმატზე კითხულობ, რომელსაც თითქმის არავინ იყენებს, ის უპირატესობას პაკეტის გამოგონებას ანიჭებს, ვიდრე საინსტალაციო სტრიქონის გამოტოვებას.

ფანტომური სახელების შემადგენლობა, ქვაბის სახით: 56.5% იმეორებს ამოცანის სიტყვებს, 27.9% მთლიანად გამოგონილად გამოიყურება, 8.7% არის რეალური პაკეტი პრეფიქსით ან სუფიქსით, 5.6% ერთი ან ორი რედაქტირებით შორდება რეალურ სახელს

მოდელი შემთხვევით არ იგონებს. ის ასახელებს იმას, რაც სთხოვე.

  • 161 ფანტომური სახელიდან 56.5% ამოცანის საკუთარი სიტყვებია ერთად შეკრული.
  • 27.9% მთლიანად გამოგონილად გამოიყურება.
  • 8.7% არის რეალური პაკეტი პრეფიქსით ან სუფიქსით, როგორიცაა python- ან -api.
  • 5.6% ერთი ან ორი რედაქტირებით შორდება რეალურ სახელს.

იმის მიხედვით, რამდენჯერ დაბრუნდა იგივე ფანტომური სახელი, ვაშლის ბაღში მდგარი მოჩვენებების სახით: 121 სახელი ერთხელ, 32 ორჯერ, 6 სამჯერ, 1 ოთხჯერ და 1 ხუთჯერ; 161-დან 40 დაბრუნდა

161 ფანტომური სახელიდან 40 (24.8%) ერთზე მეტჯერ შემოთავაზდა, და მათგან 10 ერთზე მეტი მოდელის მიერ. ყველა გამეორება ერთი და იმავე ამოცანიდან მოდიოდა. არცერთი ფანტომური სახელი ორ სხვადასხვა მოთხოვნაში არ გამოჩენილა: თუ იმავე სკრიპტს ხელახლა სთხოვ, იგივე ფანტომს მიიღებ.

შემდეგ გავაკეთე ის, რამაც ცნობისმოყვარეობა საფრთხის მოდელად აქცია. წავშალე ყველა გენერაცია და ყველა 1,200 გამოძახება ნულიდან ხელახლა გავუშვი.

სარკე, სარკე: იგივე ფანტომები დაბრუნდა. მთელი კვლევის ხელახალი გაშვებისას 162-დან 161 დაბრუნდა; 1,199 გამოსავლიდან 1,183 სიტყვა-სიტყვით იდენტური იყო (98.7%); gemma4 400-დან 399, phi4-mini 399-დან 393, qwen3 400-დან 391

1,199 გამოსავლიდან 1,183 დაბრუნდა სიტყვა-სიტყვით იდენტური (98.7%). 162 ფანტომური სახელიდან 161 დაბრუნდა, და ახალი ფანტომი არ გამოჩენილა. ერთადერთი, რომელიც არ დაბრუნდა, მხოლოდ ერთხელ იყო გამოჩენილი.

უკვე მოჩვენებით არის შეპყრობილი? ბოლოს ხელახლა შევამოწმე: არცერთი 161 ფანტომური სახელი არ იყო დარეგისტრირებული. ორი დარეგისტრირებული მსგავსი სახელი შეესაბამება ჩემს ხუთივე წესს სქვოტინგზე (არაუმეტეს 3 გამოშვებისა, 24 თვეზე ახალგაზრდა, თვეში 500-ზე ნაკლები ჩამოტვირთვა, განმეორებით შემოთავაზებული). ორივე ლეგიტიმურ პატარა ბიბლიოთეკას ჰგავს, და წესთან დამთხვევა მტკიცებულება არ არის, ამიტომ მათ არ დავასახელებ.

ამ რიცხვმა პროდუქტი ჩამოაყალიბა. ერთხელ გამოჩენილი ფანტომი უმნიშვნელო ამბავია. ფანტომი, რომელიც ყოველ ჯერზე ჩნდება, როცა ვინმე იმავე სკრიპტს ითხოვს, წინასწარ განსაზღვრული მისამართია. გადაწყვეტა იმ ადგილას უნდა იდგეს, სადაც ინსტალაცია ხდება, და უნდა იმუშაოს მაშინაც, როცა რეესტრის კითხვა შეუძლებელია.

რა არის აქ ახალი

ეს არ არის ახალი ფანტომური ამბავი. Spracklen et al. (USENIX Security 2025) 576,000 კოდის ნიმუში გენერირდა და გამოჩნდა, რომ ჰალუცინირებული პაკეტები კომერციულ მოდელებზე საშუალოდ მინიმუმ 5.2%, ღია კოდის მოდელებზე კი 21.7% იყო. ჩემი კვლევა ბევრად მცირეა და პირდაპირ არ შედარდება. მე დავამატე ის ნაწილი, რომელიც შენს ტერმინალში ცხოვრობს:

არსებული ვარიანტი რას გაძლევს რას ვერ გეტყვის
ყველა საინსტალაციო სტრიქონის თვითონ წაკითხვა სრული კონტროლი გამოქვეყნდა თუ არა დამაჯერებელი სახელი, დილის 1-ზე, მეორმოცდამეჯერ
PyPI-ის კითხვა სიმართლე 404-ზე მყოფი სახელების შესახებ ყველაფერი ოფლაინ ან ფაიერვოლის უკან. და სახელი, რომელიც გასულ კვირას რეგისტრირდა ვინმეს მიერ, ვინც ელოდა, 200-ს აბრუნებს, როგორც ნებისმიერი რეალური პაკეტი
მოდელისთვის კითხვა „არსებობს ეს?“ მყისიერი პასუხი სწორი პასუხი. gemma4-მა თქვა, რომ 271 რეალური პაკეტიდან 143 არ არსებობს; ჰოსტირებულმა მოდელმა თქვა, რომ 161 ფანტომიდან 60 არსებობს
დიდი ჰალუცინაციის კვლევები რამდენად დიდია პრობლემა არაფერს იმ pip install-ზე, რომელსაც შენი აგენტი მალე გაუშვებს
Phantom Packages კალიბრირებული P(ghost) ოფლაინ, რეესტრის ფაქტები ონლაინ და hook, რომელიც ინსტალაციას ბლოკავს მხოლოდ Python-სა და PyPI-ზეა, სამ პატარა მოდელზე გამოცდილი. ოფლაინ, დროშების დაახლოებით 1/4 რეალური პაკეტია

რა ავაშენე

Phantom Packages სამი ნაწილისგან შედგება, სპირიტუალური სეანსის სტილში დასახელებული:

  1. გამოძახება (კვლევა). ზემოთ ნახსენები 1,199 გენერაცია, ყველა ამოღებული pip install და uv add, და ყველა სახელი შემოწმებული PyPI-თან, მხოლოდ მეტამონაცემების მოთხოვნებით.
  2. შუამავალი (ფანტომის დეტექტორი). TabPFN-3.5 მოდელი უყურებს პაკეტის სახელს და იმას, როგორ დაიბადა: რამდენად ჰგავს რეალურ პაკეტს, იმეორებს თუ არა მოდელი მას, რამდენად იშვიათი იყო ამოცანა. ის აბრუნებს ალბათობას, რომ სახელი ფანტომია, ინტერნეტის გარეშე.
  3. დამცავი (სამუშაო ინსტრუმენტი). phantom check requirements ფაილებისა და pyproject.toml-ისთვის, Claude Code hook, რომელიც აგენტს ინსტალაციის შუაგულში აჩერებს, და GitHub Action pull request-ებისთვის.

როგორ ვკითხულობ თემას: ამ მანქანაში მოჩვენება არის სახელი, რომელიც მხოლოდ მოდელის წარმოსახვაში არსებობს, სანამ ვინმე მას სხეულს არ მისცემს. ჰელოუინი იმ რაზეა, რაც არ უნდა იყოს იქ. დია დე ლოს მუერტოსი იმ სახელებზეა, რომლებიც არ სურთ დავიწყებას. ჩემი მოჩვენებები ორივეს ახერხებს.

ყველაფრის საფუძველი წესია: მოდელს შეუძლია პაკეტის წარმოდგენა. მხოლოდ რეესტრს შეუძლია მისი რეალურად გადაქცევა. მოდელები წინადადებას აკეთებენ. TabPFN ალბათობას იძლევა, განაჩენს არა. გადაწყვეტილებას იღებს უბრალო კოდი, რეესტრის ფაქტებზე დაყრდნობით:

განაჩენი მნიშვნელობა
OK არსებობს PyPI-ზე და არცერთ სქვოტინგის წესს არ ემთხვევა, ან სტანდარტული ბიბლიოთეკაა
SUSPECT არსებობს, მაგრამ შეიძლება სქვოტი იყოს: ცოტა გამოშვება, ახალგაზრდა, იშვიათად ჩამოტვირთული, ან ფანტომის მსგავსი და ახალი
GHOST PyPI აბრუნებს 404-ს. არავის არასდროს გამოუქვეყნებია
GHOST_LIKELY / OK_UNVERIFIED მხოლოდ ოფლაინ შეფასება. PyPI არ შემოწმებულა

დეშბორდი, ანგარიში და ტელემეტრია არ არის. რიცხვი, რომელიც მაინტერესებს, არის 1.7 წამი, რომელსაც რეალური ინსტალაცია ელოდება.

დემო

ზედა GIF hook-ის მთავარი დემოა. აი მეორე ნახევარი: Wi-Fi გამორთე და რეესტრი დუმს, მაგრამ შუამავალი მაინც პასუხობს.

phantom check --offline ტერმინალში ქსელის გარეშე: შავად გადახაზული ფანტომი იღებს GHOST_LIKELY-ს P(ghost) 1.00-ით, ხოლო holidays და requests იღებენ OK_UNVERIFIED-ს 0.00-ით

$ phantom check --offline ███████████████ holidays requests
 ███████████████   GHOST_LIKELY   1.00   not checked on PyPI (offline) · P(ghost)=1.00 >= tau 0.51
 holidays          OK_UNVERIFIED  0.00   not checked on PyPI (offline) · P(ghost)=0.00 < tau 0.51
 requests          OK_UNVERIFIED  0.00   not checked on PyPI (offline) · P(ghost)=0.00 < tau 0.51

სცადე თვითონ (ნაჩვენებია Windows PowerShell; ყველგან ჩვეულებრივი uv-ია):

gitclonehttps://github.com/T-RexBytes/phantom-packages;cdphantom-packagesuvsync# დამცავი: PyPI შემოწმებები, CLI, hookuvsync--extramodel# + TabPFN, P(ghost)-ისა და --offline-ისთვისuvrunphantomcheckrequirements.txtpyproject.tomluvrunphantomscan-cmd"pip install -U requests"# ზუსტად ის, რასაც hook უშვებსuvruntasks.pyall--fast# ამ პოსტის ყველა რიცხვის ხელახლა აგება ქეშიდან

README-ში არის .claude/settings.json ფრაგმენტი hook-ისთვის და workflow ფაილი Action-ისთვის.

კოდი

GitHub-ის ლოგო T-RexBytes / phantom-packages

Phantom Packages

მოდელს შეუძლია პაკეტის წარმოდგენა. მხოლოდ რეესტრს შეუძლია მისი რეალურად გადაქცევა.

ლოკალური ღია წონების კოდირების მოდელები ზოგჯერ გეუბნებიან, რომ pip install-ით დააყენო პაკეტები, რომლებიც არ არსებობს. თავდამსხმელებს შეუძლიათ ეს სახელები დაარეგისტრირონ („slopsquatting“). ეს რეპოზიტორია:

  1. ზომავს, რამდენად ხშირად იძახებენ ლოკალური მოდელები ამ ფანტომ პაკეტებს.
  2. ავარჯიშებს TabPFN-ს, რომ ფანტომური სახელი ოფლაინ მონიშნოს, მხოლოდ გენერაციის დროის მახასიათებლებით.
  3. გვთავაზობს დამცავს: phantom check, Claude Code PreToolUse hook და GitHub Action.

შექმნილია DEV Hacktoberfest 2026 Open-Source AI Challenge-ისთვის (მე-4 კვირა, „Ghost in the Machine“). მთავარი რიცხვები არის results/summary.json-ში. მაგალითად, სამი ლოკალური მოდელის 1,410 საინსტალაციო მოთხოვნიდან 212 (15.0%) არ არსებობს PyPI-ზე.

ჩემმა ლოკალურმა AI-მ 162 Python პაკეტი გამოიგონა

შედეგები ერთ ცხრილში

ყველა რიცხვი მოდის results/summary.json-დან (გაშვება 2). ფანტომური სახელი არცერთ ფიგურაში არ ჩანს.

დასკვნა რიცხვი ფიგურა
საინსტალაციო მოთხოვნები, რომლებიც არ არსებობს (3 ლოკალური მოდელი) 15.0% (95% CI 11.9–18.4), 212 1,410-დან
… ნახვა GitHub-ზე

phantom/-ში არის ამოღებული მონაცემების მექანიზმი, მარკირება, მახასიათებლები, TabPFN მოდელი, დამცავი და CLI. hooks/ არის Claude Code hook, templates/ GitHub Action-ი, ხოლო experiments/-ში ეტაპზე ერთი სკრიპტია. ამ პოსტის ყველა რიცხვი მოდის results/summary.json-დან ან მის გვერდით CSV-დან, და თანმიმდევრულობის ტესტი CI-ს აბრკოლებს, თუ README, საიტის მონაცემები და შეჯამება განსხვავდება. 278 ტესტი. MIT ლიცენზიით.

როგორ ავაშენე

200 ამოცანა ─▶ gemma4 · qwen3 · phi4-mini (Ollama, ლოკალური) ─▶ 1,199 პასუხი
          ─▶ pip / uv სტრიქონების ამოღება ─▶ PyPI მეტამონაცემები (404 = ფანტომი) ─▶ მარკირება
          ─▶ გენერაციის დროის მახასიათებლები (რეესტრის მონაცემების გარეშე) ─▶ TabPFN-3.5 ─▶ P(ghost)
P(ghost) + რეესტრის ფაქტები ─▶ უბრალო კოდი ─▶ OK / SUSPECT / GHOST
          ─▶ phantom check · Claude Code hook · GitHub Action

ფანტომი თუ ტიპო?

ამომღები ჯერ კითხულობს pip install და uv add სტრიქონებს (დროშები, ვერსიის ფიქსაციები, extras, -r ფაილები), და მეორე ეტაპზე ასახავს იმპორტებს. სახელი არის ფანტომი, როცა PyPI აბრუნებს 404-ს. ორი სახის გულწრფელი შეცდომა არ არის ფანტომი, და მათ ცალკე ვითვლი: pip install cv2 (იმპორტის სახელი; 7 ხსენება) და pip install json (სტანდარტული ბიბლიოთეკა; 29 ხსენება). მათი ჩართვა მთავარ რიცხვს გაზრდიდა, მაგრამ ნაკლებად მართალს გახდიდა.

TabPFN-ს ფანტომების დანახვა ვასწავლე

რატომ TabPFN: ცხრილი პატარაა (887 მწკრივი მოდელი × ამოცანა × სახელი, მათგან 172 ფანტომი), დროც არ მქონდა არაფრის დარეგულირებისთვის, და დამცავს ესაჭიროება ალბათობები, რომლებსაც ენდობა. TabPFN სწავლობს ცხრილიდან, რომელსაც პროგნოზის დროს აძლევ, გაწვრთნის ციკლის გარეშე, და ჩემს ლეპტოპის CPU-ზე გაეშვა.

გაჟონვის წესი: რეესტრის მონაცემები არცერთ მახასიათებელში არ შედის, ასე რომ დეტექტორმა იცის მხოლოდ ის, რაც მოდელმა იცოდა. ტესტი ამას ამოწმებს.

მახასიათებლები (არცერთი არ ეხება რეესტრს)

მახასიათებელი რას იჭერს
in_top15k, nn_lev, nn_jw პოპულარული სახელია თუ არა, და თუ არა, რამდენად შორსაა უახლოესი პოპულარულისგან?
affix_of_real რეალური სახელი პლუს python-, -py, -api …
char_lp_z რამდენად „სახელისებრია“ სტრიქონი, რეალური პაკეტების სახელების სიმბოლოების ენობრივი მოდელიდან
consistency მოდელის ნიმუშების რა წილი იმეორებს სახელს
cross_model რამდენმა მოდელმა შესთავაზა იგივე ამოცანისთვის
global_freq რამდენად ხშირად ჩნდება სხვაგან (გამოითვლება თითოეულ სასწავლო ნაწილში)
niche_level, domain რამდენად იშვიათი იყო ამოცანა
name_logprob მოდელის საკუთარი ტოკენური რწმენა სახელის წერისას

ტესტი სამ გაყოფაზე ჩავატარე, მარტივიდან რთულამდე: ახალი მოთხოვნები (არც ერთი ამოცანა არ არის ერთდროულად სასწავლოსა და ტესტში), ახალი მოდელი (ვწვრთნი ორ მოდელზე, ვტესტავ მესამეზე) და ახალი სახელები (ტესტი მხოლოდ იმ სახელებზე, რომლებიც სწავლების დროს არ ყოფილა).

მეთოდი (out-of-fold) AUROC, ახალი მოთხოვნები (95% CI) ახალი მოდელი ახალი სახელები Precision @ 90% recall კალიბრაციის შეცდომა
წესი „არ არის top 15k-ში“ 0.946 0.946 0.895 0.691 0.087
რედაქტირების მანძილის წესი 0.966 0.966 0.935 0.718 –
ლოგისტიკური რეგრესია 0.967 0.971 0.936 0.751 0.052
Gradient boosting 0.966 0.973 0.934 0.762 0.056
gemma4 საკუთარ თავს ეკითხება, ქულდება P(no)-ით 0.932 0.932 0.874 0.554 0.241
Ultramarine საკუთარ თავს ეკითხება, ქულდება P(no)-ით (ჰოსტირებული, ფასიანი) 0.951 0.951 0.950 0.584 0.067
TabPFN-3.5 0.975 (0.964–0.983) 0.978 0.948 0.749 0.015

სიზუსტე და კალიბრაციის შეცდომა ახალ მოთხოვნებზეა. თვითშემოწმებები არ წვრთნიან, ამიტომ მათი პირველი ორი სვეტი ერთმანეთს ემთხვევა. წყაროები: eval.csv, auroc_diff.csv, loo.csv.

Precision-recall მრუდები ყველა მეთოდისთვის, დახატული უიჯა დაფაზე

TabPFN სამიდან ორ გაყოფაზე პირველია და კალიბრაციით მკაფიოდ უსწრებს. ცხრილს არ ავსებს. დანარჩენი ასე წაიკითხე:

  • უპირატესობა მცირეა. იმავე ნაწილებზე gradient boosting-ის წინააღმდეგ წყვილურად: +0.009 AUROC (95% CI 0.002–0.018) ახალ მოთხოვნებზე და +0.014 (0.002–0.028) ახალ სახელებზე. ინტერვალები ნულს ზემოთ რჩება, მაგრამ ძალიან ცოტათი.
  • Gradient boosting იმარჯვებს precision-ში 90% recall-ზე ყველა გაყოფაზე (0.762 / 0.772 / 0.773 მაშინ, როცა TabPFN-ს აქვს 0.749 / 0.764 / 0.749). ეს არის რიცხვი, რომელსაც დამცავი ყველაზე მეტად გრძნობს, ამიტომ ის ცხრილშია და არა სქოლიოში.
  • ჰოსტირებული ფასიანი მოდელი უტოლდება მას არანახულ სახელებზე (0.950 vs 0.948, სხვაობის CI −0.024-დან +0.026-მდე) და უფრო მაღალი AUPRC-ი აქვს (0.880 vs 0.866). ის ასევე ინტერნეტს და ფასიან გამოძახებას მოითხოვს თითო სახელზე, რაც ზუსტად ის არის, რაც ოფლაინ დამცავს არ შეუძლია.
  • ერთსტრიქონიანი წესი გასაკვირად შორს მიდის. „რედაქტირების მანძილი ≥ 2 ნებისმიერი პოპულარული სახელიდან“ იძლევა 0.966-ს. ბევრი ფანტომი აშკარაა; TabPFN თავის ადგილს რთულ შემთხვევებსა და კალიბრაციაში იმსახურებს.
  • „ახალი მოდელი“ ამოცანებს იზიარებს სასწავლოსა და ტესტს შორის, ასე რომ ის ამოწმებს ახალ მოდელს, და არა ახალ ამოცანებს.

კალიბრაციის გრაფიკი: TabPFN-ის პროგნოზირებული ალბათობა იმ სახელების წილთან შედარებით, რომლებიც მართლაც ფანტომები იყო, თითო ბინი დახატულია როგორცობობა თავის ძაფზე

სადაც TabPFN აშკარად იმარჯვებს, ეს კალიბრაციაა. 887 სახელიდან 639-მა 10%-ზე დაბალი ქულა მიიღო, და მათგან არცერთი არ იყო ფანტომი. როცა ის ამბობდა 80–90%-ს, 64-დან 56 იყო ფანტომი. ეს უფრო მნიშვნელოვანია, ვიდრე ჟღერს: დამცავის ზღვარი ერთხელ განისაზღვრება, out-of-fold, და ხვალაც იგივე უნდა ნიშნავდეს.

შეფასების პროტოკოლი

სიდიდე განმარტება
მწკრივები ერთი (მოდელი, ამოცანა, სახელი): 887 მწკრივი, 432 უნიკალური სახელი, 172 ფანტომური მწკრივი
ახალი მოთხოვნები 5 seed-იანი GroupKFold ნაწილი ამოცანის მიხედვით დაჯგუფებული, ასე რომ არც ერთი ამოცანა არ არის სასწავლოსა და ტესტში ერთდროულად
ახალი მოდელი ვწვრთნი ორ მოდელზე, ვტესტავ მესამეზე. თითო გამოტოვებულ მოდელზე, TabPFN vs gradient boosting: gemma4 0.986 vs 0.985, phi4-mini 0.975 vs 0.967, qwen3 0.972 vs 0.967
ახალი სახელები ტესტის მწკრივები, რომელთა სახელი სასწავლოში არ ჩანს: 519 მწკრივი, ყველა 172 ფანტომი (არცერთი ფანტომი არ გადასულა მოთხოვნებს შორის)
95% CI ბუტსტრეპი მოთხოვნებზე; წყვილური სხვაობები იდენტურ ნაწილებზე
კალიბრაციის შეცდომა მოსალოდნელი კალიბრაციის შეცდომა 10 ტოლი სიგანის ბინზე
TabPFN v9.2.0, TabPFN-3.5 წონები, CPU, მაქსიმუმ 725 სასწავლო მწკრივი თითო ჯდომაზე, ქვესემპლირების გარეშე
დამცავის მოდელი TabPFN-3.5-fast 10 მხოლოდ-სახელის მახასიათებელზე, რადგან hook არასდროს იცის, როგორ დაიბადა სახელი. AUROC 0.973, τ = 0.508, 90.1% recall-ზე 74.9% precision-ით

ვკითხოთ ფანტომს, ფანტომია თუ არა

ეს უნდა ყოფილიყო მოსაწყენი საბაზისო მეთოდი. აშკარა მალსახმობი მოდელისთვის კითხვაა: „არსებობს PyPI-ზე პაკეტი სახელით X? უპასუხე მხოლოდ კი ან არა.“ ეს კითხვა gemma4-ს ლოკალურად დავუსვი და Ultramarine-ს მისი ჰოსტირებული API-ის მეშვეობით, ყველა 432 სახელისთვის.

ორი კრისტალური ბურთი საპირისპირო მიკერძოებით: gemma4:e4b თქვა არა 271 რეალური პაკეტიდან 143-ზე (53%); Ultramarine-1-Flash თქვა კი 161 ფანტომიდან 60-ზე (37%). AUROC ახალ მოთხოვნებზე: gemma4 P(no)-ით 0.93, Ultramarine P(no)-ით 0.95, TabPFN მოდელის გამოძახების გარეშე 0.97

ისინი საპირისპირო მიმართულებით ცდებიან:

  • gemma4 სკეპტიკოსია. მან თქვა, რომ 271 რეალური პაკეტიდან 143 არ არსებობს, და მხოლოდ 161 ფანტომიდან 2 არსებობს. ის დეტექტორი არ არის. ის „არას“ მანქანაა.
  • Ultramarine მორწმუნეა. მან თქვა, რომ 161 ფანტომიდან 60 არსებობს, და მხოლოდ 271 რეალური პაკეტიდან 2 არ არსებობს.

თითოეულის შეფასება მისი „არას“ თქმის ალბათობით, და არა დაბეჭდილი სიტყვით, დიდად ეხმარება (gemma4-სთვის 0.849 → 0.932). TabPFN მაინც იღებს 0.975-ს, ენობრივი მოდელის გამოძახების გარეშე.

უფრო ხანგრძლივი აზროვნება აშინებს მათ?

Ultramarine-მა იმავე 200 მოთხოვნაც გაუშვა იგივე ამოღებასა და მარკირებაში: 400 გენერაცია დაბალი მსჯელობით და 200 მაღალი მსჯელობით, როგორც ablation.

მეტი აზროვნება, ნაკლები ფანტომი, წამლის ქოთნების სახით: იმავე 200 ამოცანაზე 3.6% ფანტომი დაბალ მსჯელობაზე და 0.4% მაღალზე; ღირებულება 1,000 გენერაციაზე $0.17 და $0.31

  • დაბალი მსჯელობა: 3.2% ფანტომი (16 496 ინსტალაციიდან), სამი ლოკალური მოდელის 15.0%-ის წინააღმდეგ.
  • მაღალი მსჯელობა: 0.4% (241-დან 1).
  • იგივე 200 ამოცანა: 8-მა მხოლოდ დაბალ დონეზე წარმოშვა ფანტომი, 0-მა მხოლოდ მაღალზე.
  • ღირებულება: მთელი ჰოსტირებული გაშვება, 1,034 გამოძახება, დაჯდა $0.141.

უფრო ხანგრძლივმა აზროვნებამ თითქმის დაცალა სასაფლაო. გავზომე, რომ ეს ხდება, და არა რატომ.

დამცავი

# გამარტივებულია phantom/guard.py-დან
def verdict(name):
    if name in STDLIB:                      return OK("standard library")
    meta = registry.lookup(name)            # მხოლოდ მეტამონაცემები, ქეშირებული
    if not meta.exists:                     return GHOST("404 on PyPI")
    if squat_rules(meta) or (p_ghost(name) >= TAU and young(meta)):
                                            return SUSPECT(reasons)
    return OK(meta)

hook მიჰყვება Claude Code hooks-ის კონტრაქტს: PreToolUse hook ბრძანებას JSON-ის სახით იღებს stdin-ზე, ხოლო გასვლის კოდი 2 აბლოკებს გამოძახებას, stderr კი არის მიზეზი, რომელსაც Claude კითხულობს. ამიტომ GIF-ის აგენტმა იცოდა, რომ holidays შეემოწმებინა და არა დანებებოდა.

ფანტომზე ის იხურება, ქსელის შეცდომაზე კი იღება, გაფრთხილებით, რადგან დამცავი, რომელიც აგენტს Wi-Fi-ის ყოველ გაწყვეტაზე გაჩერებს, ლანჩამდე წაიშლება. PHANTOM_FAIL_CLOSED=1 ამას აბრუნებს. TabPFN იტვირთება მხოლოდ მაშინ, როცა შედეგს შეცვლის: ოფლაინ, როცა PyPI-მდე ვერ მივწვდებით, ან ახალგაზრდა პაკეტისთვის.

არაფერი გადის კარიბჭეზე: ყველა 1,199 გენერაციაზე გაშვებისას ონლაინ დამცავმა შეაჩერა 212-დან 212 ფანტომი და 1,165-დან 13 რეალური; ოფლაინ 212-დან 191 ფანტომი და 1,165-დან 66 რეალური. Hook-ის დაყოვნება CPU ლეპტოპზე: 1.2 წმ ინსტალაციის გარეშე, 1.7 წმ რეალურ ინსტალაციაზე, 2.2 წმ ფანტომის ბლოკირებაზე, 13.0 წმ TabPFN-ის ქულის დაბეჭდვაზე

თუ ჩემს აგენტს ყველა 1,199 სკრიპტი გაეშვა:

  • ონლაინ, დამცავი ბლოკავს ყველა 212 ფანტომურ ინსტალაციას და აჩერებს 231 გენერაციას (19.3%). შეცდომით აჩერებს 1,165 რეალური პაკეტის ინსტალაციიდან 13-ს (1.1%). ყველა 13 ახალგაზრდა პაკეტია, რომელიც SUSPECT-ად არის მონიშნული ადამიანისთვის შესამოწმებლად; არცერთი არ ყოფილა ფანტომად მიჩნეული.
  • ოფლაინ, იჭერს 212-დან 191 ფანტომს (90.1%) და აჩერებს 5.7% რეალურ ინსტალაციებს.

რა შეცდა

  • ჩემი სპეციფიკაციის ანონიმურობა გაჟონა. ის ამბობდა, რომ ფანტომები უნდა გამოქვეყნებულიყო როგორც sha256(name)[:8]. ვინც სახელს გამოიცნობს, ან იგივე ღია მოდელებს ხელახლა გაუშვებს, შეძლებს მის ჰეშირებას და დაადასტურებს, რომ ის ჩემს სიაშია. საჯარო ID-ები ახლა საიდუმლო გასაღებით დაშიფრული HMAC-ია, და CI საჯარო ფაილების ყველა ტოკენს ამ გასაღებით ჰეშავს.
  • ჩემმა ამომღებმა სამი საკუთარი ფანტომი გამოიგონა. 25%-იან საცდელში პასუხი შუა სახელზე შეწყდა, იმპორტის გასაღები რეალურ პაკეტზე გადაიტანა, და სტანდარტული ბიბლიოთეკის წერტილოვანმა გზამ, ყველა ფანტომად ჩაითვალა. მათი გასწორების შემდეგ საცდელის მაჩვენებელი 11.5%-დან 10.8%-მდე ჩამოვიდა. ერთეულ ტესტებს ყველა ჩაევლო, ბუნებრივია.
  • მსჯელობის მოდელი არასდროს წყვეტდა მსჯელობას. Ollama-ს qwen3:4b მხოლოდ მსჯელობის ვერსიაა. მსჯელობის გამორთვის შემდეგაც ის ტოკენების ლიმიტამდე მსჯელობდა, და 5 სატესტო პასუხიდან 0-მა მიაღწია pip ბრძანებამდე. instruct ვერსია ჩავანაცვლე.
  • დამცავი პრობლემაზე ნელი იყო. TabPFN მუშაობს პროგნოზის დროს, და პირველ hook-ს ფანტომის ბლოკირებას 13.0 წამი სჭირდებოდა. ახლა მოდელს გამოტოვებს, როცა PyPI უკვე თქვა 404: 2.2 წმ.
  • ჰოსტირებული logprob-ები </think>-ით იწყებოდა. P(no)-ის წაკითხვა პირველ ტოკენზე PyPI-ის ერთ-ერთ ყველაზე პოპულარულ პაკეტს ყალბად აფასებდა. ახლა ის იკითხება მსჯელობის დასრულების შემდეგ პირველ ტოკენზე.
  • ეკრანის ჩამწერმა ჩემი ბრაუზერი ჩაწერა. ეკრანის უბნის ჩაწერა იღებს იმას, რაც ზედ არის გახსნილი. ეს კადრები წაიშალა, და დემო ახლა Claude Code-ს მალულ pseudo-terminal-ში უშვებს და ვიდეოდ არენდერებს, ასე რომ დესკტოპი არასდროს მონაწილეობს.
  • თითქმის გავავრცელე საკუთარი საიდუმლოებები. შედეგების საიტის პირველი ლოკალური გადახედვა რეპოზიტორიის ძირიდან დაიწყო, ასე რომ .env დაახლოებით ერთი წუთის განმავლობაში localhost-ზე ხელმისაწვდომი იყო. ახლა ყოველთვის მხოლოდ web/-ს ემსახურება.

რატომ აქვს მნიშვნელობა ღია ინოვაციას?

ფანტომის გაზომვა შეუძლებელია, თუ მას ნებაყოფლობით ვერ გამოიძახებ. იგივე მოდელები იგივე seed-ებით ორჯერ, ნულიდან გავუშვი და 1,199 გენერაციიდან 98.7% სიტყვა-სიტყვით დამიბრუნდა. ქირაობილ endpoint-ზე მოდელი შეიძლება შენს ქვეშ შეიცვალოს, და ყოველი ხელახალი გაშვება ფულს ჯდება. ღია წონებით ფანტომების რაოდენობა ფაქტია, რომელსაც ნებისმიერი 4 GB-იანი ლეპტოპის GPU-ზე შეიძლება გაიმეორებ.

დამცავმა სინათლის ჩაქრობის დროსაც უნდა იმუშაოს. ადამიანები ლოკალურ მოდელებს იმ დროს უშვებენ, როცა ღრუბელს ვერ ან არ იყენებენ. დამცავი, რომელსაც სახლში დარეკვა სჭირდება, მთელ აზრს კარგავს. TabPFN-ის ღია წონები მუშაობს იმ მოდელების გვერდით, რომლებსაც ამოწმებს, და ოფლაინ დამცავი მაინც იჭერს ფანტომების 90.1%-ს.

ღია მოდელებს ღია ინსტრუმენტები სჭირდებათ. არცერთი მწარმოებელი არ გამოაქვეყნებს საკუთარი მოდელის ფანტომების სიას. კოდი, შეფასება და მოდელირების ცხრილის სახელების გარეშე ვერსია (dataset.csv, რომელიც TabPFN-ის შედეგებს ზუსტად იმეორებს) ყველა საჯაროა.

გულწრფელი დაფიქსირება: ჰოსტირებულმა მოდელმა ბევრად ნაკლები პაკეტი გამოიგონა, ვიდრე ჩემმა პატარა ლოკალურმა მოდელებმა: 3.2% 15.0%-ის წინააღმდეგ, და 0.4% მაღალი მსჯელობით. აქ ღია არ ნიშნავს უკეთესს. ეს ნიშნავს შემოწმებადს: პრობლემა გავზომე, შევქმენი გადაწყვეტა, რომელიც ოფლაინ მუშაობს, და შენ შეგიძლია ყველაფერი ხელახლა გაუშვა.

ჩემი აგენტის სესია

ეს Claude Code-თან წყვილში ავაშენე, CLAUDE.md-ის მკაცრი წესებით: არასდროს დააინსტალირო ან შემოიტანო მოდელის მიერ წარმოებული სახელი, არასდროს დაარეგისტრირო პაკეტი, ფანტომური სახელები შეინახე გიტიგნორირებულ საქაღალდეში, არასდროს გამოიგონო რიცხვი ან რეაქცია, და სთხოვე ნებართვა სანამ ფულს დახარჯავ. აგენტმა ამომღები ტესტით დაწერა, გაუშვა კვლევა და შეფასება, ჩაწერა დემო, და საკუთარი ინტეგრაციის შეცდომები იპოვა მთელი მილსადენის ხელახლა გაშვებით. სამი მომენტი, რომელიც ღირს გახსნას:

  • მან ჩემს სპეციფიკაციაში გაჟონვა იპოვა. ზემოთ sha256 ID-ები ჩემი იდეა იყო. აგენტმა აჩვენა, რომ ისინი დასადასტურებელი იყო, საჯარო ID-ები საიდუმლო HMAC-ზე გადაიტანა, და დაამატა გაჟონვის ტესტი, რომელიც ახლა ამ პოსტს იცავს.
  • მან ხელახალი აგება ნაგულისხმევად უფასო გახადა. შეფასების ეტაპი უხმაუროდ ფასიან მოდელს ყველა ახალ სახელზე ჰკითხავდა, რადგან API გასაღები იყო. ფასიანი გამოძახებები ახლა მკაფიო --hosted-spend დროშას მოითხოვს.
  • დემო არის აგენტი, რომელსაც საკუთარი დამცავი აჩერებს. ზედა GIF არის Claude Code, რომელიც ფანტომს სწვდება, და ჩემი hook, რომელიც უარს ამბობს. დიახ, AI-მ დამეხმარა დამეჭირა AI, რომელიც რაღაცებს იგონებს. ვიცი.

აშენების ყველა სიურპრიზი lessons.md-შია, 35 ცალი.

AI-ს გამჟღავნება: Claude Code დამეხმარა პროექტის აშენებასა და ამ პოსტის დაწერაში. მე გადავხედე და ვარედაქტირე.

დასასრული: ზოგიერთი სახელი უარს ამბობს დავიწყებაზე

ჰელოუინი დღეს არის, დია დე ლოს მუერტოსი კი ხვალ იწყება. ის სახელების გახსენებაზეა, რათა არ დაიკარგონ.

ჩემმა კვლევამ საპირისპირო სახის სახელი იპოვა. ისეთი, რომელიც არასდროს ცოცხლობდა, რომელიც არავინ დაუწერია, და რომელსაც ჩემი ლეპტოპის მოდელი მაინც სრულყოფილად იმახსოვრებს. ყველა გენერაცია წავშალე და ხელახლა ვკითხე, მოველოდი სხვა ისტორიას. 162 ფანტომიდან 161 იგივე სახელებით დაბრუნდა, და ახალი ფანტომი არ გამოჩენილა.

ჯერ არავინ გარედან არ გაუშვა hook, და ვარაუდს რეაქციად არ წარმოგიდგენ. ასე რომ, აი შემოთავაზება: თუ აგენტს pip install-ის გაშვებას აძლევ, დაამატე hook ერთი დღით და მითხარი, რა შეაჩერა. ეს არის სახელები, რომლებიც იმდენად ღირს დასამახსოვრებლად, რომ ბლოკირება შეგვეძლოს.

კატეგორიები

  • TabPFN-ის საუკეთესო გამოყენება: TabPFN-3.5 (ღია წონები, ლეპტოპის CPU-ზე გაშვებული) არის ფანტომების დეტექტორი. ის საუკეთესო ოფლაინ მეთოდია ყველა გაყოფაზე (AUROC 0.975 / 0.978 / 0.948) და ყველაზე კარგად კალიბრირებული დიდი სხვაობით (ECE 0.015; შემდეგი საუკეთესო 0.052). ის შედარებულია ორ წესთან, ლოგისტიკურ რეგრესიასთან, gradient boosting-თან და ორ მოდელის თვითშემოწმებასთან იდენტურ ნაწილებზე, bootstrap CI-ებითა და წყვილური სხვაობებით. მისი out-of-fold ალბათობები ადგენს დამცავის ზღვარს (90.1% recall), და TabPFN-3.5-fast მოდელი CLI-ში, hook-ში, Action-სა და --offline რეჟიმში შედის. Gradient boosting იმარჯვებს precision-ში 90% recall-ზე, და ეს ვაჩვენე.
  • Ultramarine-ის საუკეთესო გამოყენება: ultramarine-1-flash არის ჰოსტირებული შედარების მხარე: იგივე 200 მოთხოვნა, ამოღება და მარკირება. 3.2% ფანტომი დაბალ მსჯელობაზე და 0.4% მაღალზე; იგივე ამოცანებზე 8 გამოაქვეყნა ფანტომი მხოლოდ დაბალ დონეზე და 0 მხოლოდ მაღალზე. მისი ნდობით შეფასებული თვითშემოწმება კვლევის ყველაზე ძლიერი საბაზისოა (AUROC 0.951, AUPRC 0.880, ტოლობა TabPFN-თან არანახულ სახელებზე), თუმცა მისმა მარტივმა კი/არა პასუხმა 161 ფანტომიდან 60 არსებულად მიიჩნია. 1,034 გამოძახება ჯდება $0.141, მკაცრი ლიმიტის მქონე ხარჯვის რეესტრით.
  • Gemma-ს საუკეთესო გამოყენება: gemma4:e4b არის სამი გამოძახებული მოდელიდან ერთ-ერთი, გაშვებული ლოკალურად Ollama-ით. მან ყველაზე ნაკლები ფანტომი გამოიგონა (8.1%, 16.7% და 20.7%-ის წინააღმდეგ) და ყველაზე გამეორებადი იყო (400-დან 399 გამოსავალი იდენტური ხელახალ გაშვებაზე). როგორც თვითშემოწმება, ის სხვა მხარეს იხრება: 271 რეალური პაკეტიდან 143 გამოტოვებულად მიიჩნია (0.932 AUROC P(no)-ით შეფასებით, TabPFN-ის 0.975-ის წინააღმდეგ).

შექმნილია @t-rexbytes, @soumyadeepdey და @dronzer2code-ის მიერ Claude Code-ის დახმარებით.

ორიგინალი: DEV Community · ავტორი: Soumyadeep Dey

ყველა სტატია
სიახლეები

მიიღეთ ახალი სტატიები

თვეში ერთხელ - რჩევები ვებ დიზაინზე, ახალი პროექტები და სტუდიის სიახლეები.

დარეკვა შეკვეთა