Intel·ligència artificial Programació Qwen LM Studio al·lucinacions Code Needle LLM locals Alex Ziskind

Code Needle: el test que destapa les al·lucinacions dels LLM locals en codi

Alex Ziskind crea un benchmark de recuperació literal sobre codi real. La dada reveladora no és només quantes línies encerta cada model, sinó quantes se n’inventa.

Mesurar quants tokens per segon genera un model local és senzill. Saber si ha entès un repositori, en canvi, és molt més difícil. Alex Ziskind proposa Code Needle, un benchmark obert que introdueix un fitxer de codi complet al context i demana al model que reprodueixi literalment fragments de funcions situades a profunditats diferents.

La prova sembla elemental, però revela un problema que un únic percentatge d’encert pot ocultar. Un model pot recuperar totes les línies demanades i afegir-ne desenes que no existeixen. Si només es compten els encerts, aquesta resposta sembla millor que una de més curta i fiable.

Una agulla de codi dins d’un context llarg

Code Needle selecciona funcions d’un o més fitxers i, per a cadascuna, envia tot el corpus al model. A continuació li demana les primeres vint línies exactes d’una funció concreta. La mostra pot incloure funcions al principi, al mig i al final del fitxer.

L’objectiu no és comprovar si el model sap JavaScript o Python de memòria, sinó si recupera informació que ja té al context. Si respon amb una implementació probable apresa durant l’entrenament, però no amb el text proporcionat, la comparació ho detecta.

El projecte admet fitxers JavaScript i Python, corpus configurables amb patrons i models locals o allotjats darrere d’una API compatible. Els resultats queden guardats per generar taules i gràfics de recuperació segons la posició.

Dues mètriques expliquen més que un rànquing

El corrector fa una comparació determinista línia per línia. No utilitza un altre LLM com a jutge. Compta les línies esperades que apareixen en l’ordre correcte i, separadament, les línies generades que no pertanyen al fragment.

Ziskind distingeix quatre casos visuals: coincidències, línies esperades però absents, text al·lucinat o alterat i línies correctes addicionals que continuen més enllà de les vint demanades. Al repositori, una funció supera el llindar amb almenys vuit coincidències.

Aquesta divisió canvia la lectura del resultat. Una resposta amb vint encerts i seixanta-cinc invencions obliga a revisar vuitanta-cinc línies. Una altra amb tretze encerts i una sola línia sobrera pot ser molt més útil, tot i tenir menys recuperació bruta.

La quantització no era la culpable

Una de les primeres proves comparava Gemma en BF16 i en una quantització MLX de quatre bits. El resultat inicial semblava absurd: la versió comprimida superava la de precisió completa. La temptació hauria estat concloure que quantitzar millorava la qualitat.

En inspeccionar les diferències, Ziskind va descobrir una causa més prosaica. Gemma eliminava la indentació de mètodes de classe quan emetia codi, i les dues versions tractaven l’espai en blanc de manera lleugerament diferent. El model coneixia el fragment, però el corrector literal el penalitzava.

L’error no invalida el benchmark; en defineix l’abast. Code Needle mesura recuperació literal i forma de renderitzar el codi. No mesura directament si una solució compila, resol una incidència o manté l’estil semàntic d’un projecte.

El fitxer gran separa els models

El vídeo utilitza dos corpus. El primer és un servidor HTTP en Python d’unes 1.300 línies. El segon és jQuery, amb més de 10.000 línies i aproximadament 80.000 tokens segons la documentació actual del repositori.

En la matriu de Ziskind, els models allotjats mantenen una recuperació alta quan passen del fitxer petit al gran. Alguns models locals baixen més i els més petits poden començar a produir molt soroll. El cas extrem citat és un Qwen de 4B que recupera 115 línies de jQuery però en genera més de mil que no corresponen al text.

La conclusió no és que tots els models petits siguin inútils. És que admetre el fitxer dins de la finestra de context no garanteix saber-lo utilitzar. Capacitat nominal, recuperació i obediència a la instrucció són propietats diferents.

El model que semblava bo inventava massa

El moment que dona títol al vídeo arriba amb Qwen 3.5 9B. Ordenat només per línies coincidents, queda en una posició intermèdia respectable: 217 de 320. Però també genera 318 línies al·lucinades, molt per sobre dels models locals pròxims en encerts.

En una funció concreta de jQuery obté vint de vint, però emet 85 línies. Seixanta-cinc no formen part del fragment sol·licitat. Un altre model en recupera tretze i n’emet catorze en total. El primer guanyaria una classificació unidimensional; el segon requeriria molta menys verificació.

El patró també és irregular segons la profunditat. El 9B funciona bé en alguns punts, cau bruscament en altres i pot tornar a obtenir vint encerts al final del fitxer. Per a un desenvolupador, aquesta imprevisibilitat és tan important com la mitjana.

Els gràfics també revelen manies de format

Qwen 3.6 35B concentra moltes respostes en dinou de vint. La inspecció mostra que perd el tabulador inicial de la primera línia de manera sistemàtica. Gemma presenta un comportament relacionat amb la indentació.

Un gràfic agregat podria interpretar aquestes respostes com petits errors aleatoris. Veure el detall per funció permet reconèixer que el model repeteix una mateixa transformació. Aquesta distinció és útil per decidir si cal ajustar el prompt, normalitzar espais o mantenir l’avaluació estricta.

Code Needle deixa el corrector deliberadament simple. Això facilita reproduir resultats, però obliga a mirar les diferències abans d’atribuir cada punt perdut a una falta de comprensió.

Com provar-lo sense enganyar-se

El repositori permet definir el corpus, el nombre de funcions, la llavor de la mostra i la configuració de cada model. Amb LM Studio cal carregar una finestra de context prou gran; també es pot apuntar a Ollama o a un servei compatible. Els models de raonament necessiten un pressupost de sortida suficient perquè no el consumeixin abans de respondre.

La comparació més valuosa és sobre codi propi. Un resultat amb jQuery no prediu necessàriament el comportament en un projecte Python petit, en fitxers generats o en un repositori amb moltes col·lisions de noms.

Ziskind no presenta Code Needle com un veredicte universal. El missatge és més pràctic: no triïs un assistent de programació per un sol número, comprova’l amb el teu context i llegeix alhora recuperació i invenció. La línia que el model afegeix sense que ningú la demani pot ser més important que les vint que ha copiat bé.

Contrast i context

Fonts consultades

2 fonts
  1. 01
  2. 02

Font de treball

Transcripció amb marques de temps

10 fragments
Consulta la transcripció
  1. 0:00 , obre el vídeo en una pestanya nova

    Speed benchmarks are easy, but code quality depends on the developer and codebase. Alex introduces an open-source test inspired by Protorikis that puts a full source file in context and asks a model to reproduce functions verbatim.

  2. 1:55 , obre el vídeo en una pestanya nova

    Code Needle samples functions at different depths and asks for their first twenty lines. A deterministic diff counts matched lines and invented lines separately, because high recall with many hallucinations is not equivalent to a short, reliable answer.

  3. 3:51 , obre el vídeo en una pestanya nova

    Reasoning models can spend the output budget on thinking, so model configurations include endpoint, temperature, token limit and thinking controls. The sponsored section presents an autonomous-agent service before the benchmark tests resume.

  4. 5:46 , obre el vídeo en una pestanya nova

    A BF16 and a four-bit Gemma quantization initially produce a suspicious result. Inspection shows that whitespace and class-method indentation, not model knowledge, caused much of the difference. The test also exposes code-rendering behavior.

  5. 7:42 , obre el vídeo en una pestanya nova

    The repository can be installed in a virtual environment and configured with local files and models. LM Studio is preconfigured, while another compatible endpoint such as Ollama can be substituted. The first corpus is a small Python HTTP server.

  6. 9:37 , obre el vídeo en una pestanya nova

    The harness tests eleven functions and displays matching, missing, hallucinated and extra correct lines. Hosted frontier models establish a high baseline, while a local Qwen mixture-of-experts model comes closer than expected on the small file.

  7. 11:33 , obre el vídeo en una pestanya nova

    On the much larger jQuery file, hosted-model recall stays comparatively flat while several local models decline. A small model fits the context but produces over one thousand invented lines, showing that context capacity is not the same as clean recall.

  8. 13:28 , obre el vídeo en una pestanya nova

    A Qwen 9B model appears respectable when sorted by matched lines, but it emits 318 hallucinated lines. One function scores twenty out of twenty while adding sixty-five wrong lines, making the answer less useful than a shorter response with fewer matches.

  9. 15:24 , obre el vídeo en una pestanya nova

    Recall plotted against function position is irregular for the 9B model: it collapses at some depths and recovers at others. Larger local and hosted models are flatter, although each still has occasional dips that an aggregate score would hide.

  10. 17:19 , obre el vídeo en una pestanya nova

    Clusters of nineteen-out-of-twenty scores reveal a systematic missing leading tab in Qwen responses, similar to Gemma indentation behavior. Alex recommends testing on one's own codebase and reading both recall and hallucination columns instead of trusting one number.