Come l’Intelligenza Artificiale ci ha aiutato ad aggiungere la Ricerca Vettoriale a Cassandra in sei settimane

AI helps add Vector Search to Cassandra in six weeks

Con l’enorme domanda di funzionalità di ricerca vettoriale necessaria per abilitare applicazioni di intelligenza artificiale generativa, DataStax si è prefissata un obiettivo estremamente ambizioso: aggiungere questa capacità ad Apache Cassandra e Astra DB, il nostro servizio gestito basato su Cassandra.

Aprile scorso, quando ho chiesto al nostro vicepresidente capo di prodotto chi lo avrebbe costruito, mi ha detto: “Perché non lo fai tu?”

Con altri due ingegneri, mi sono impegnato a consegnare una nuova implementazione di ricerca vettoriale il 7 giugno, in soli sei settimane.

Potrebbero nuovi strumenti di programmazione AI aiutarci a raggiungere questo obiettivo? Alcuni ingegneri hanno affermato con sicurezza che l’IA commette così tanti errori da essere un impatto negativo sulla produttività. Dopo averli provati in questo progetto critico, sono convinto che questi strumenti siano, in realtà, un enorme aiuto alla produttività. In effetti, non tornerò mai più a scrivere tutto a mano. Ecco cosa ho imparato sul coding con ChatGPT, GitHub Copilot e altri strumenti AI.

Copilot

Copilot è semplice: è un’autocompletamento potenziato. La maggior parte delle volte, completerà una riga per te o farà corrispondere un completamento di diverse righe dal contesto. Qui ho scritto un commento e poi ho iniziato una nuova riga con ‘neighbors’. Copilot ha offerto di completare correttamente il resto (con il testo che segue ‘neighbors’ sulla seconda riga):

Ecco un esempio leggermente più complesso da un codice di test, in cui ho iniziato a scrivere il loop come ‘mapToLong’ ma poi ho cambiato le mie strutture dati in modo che fosse più pulito invocare un metodo con ‘forEach’ al suo posto. Copilot mi è stato d’aiuto:

E talvolta (questa è più l’eccezione che la regola), mi sorprende offrendosi di completare un intero metodo:

Copilot è utile ma limitato per due motivi. Primo, è tarato per (correttamente) sbagliare con cautela. Può ancora fare degli errori, ma è raro; quando non sa cosa fare, non offre completamenti. Secondo, è limitato dalla necessità di essere abbastanza veloce da integrarsi senza problemi con una breve pausa nella digitazione umana, il che esclude per ora l’uso di un modello pesante come GPT-4.

(Vedi anche questo tweet di Max Krieger per una visione “massimalista” di Copilot.)

ChatGPT

Puoi provare a far generare codice a Copilot dai commenti, ma per quel caso d’uso otterrai quasi sempre risultati migliori da GPT-4 tramite l’accesso a pagamento a ChatGPT o all’API.

Se non hai ancora provato GPT-4, dovresti assolutamente farlo. È vero che a volte fa delle allucinazioni, ma lo fa molto meno rispetto a GPT-3.5 o Claude. È anche vero che a volte non riesce a risolvere problemi semplici (qui sto cercando di farlo capire una semplice ricerca binaria). Ma altre volte è quasi incredibilmente bravo, come questa volta in cui ha capito la mia condizione di gara al primo tentativo. E anche quando non è eccezionale, avere un partner di debug come una papera di gomma che può rispondere con una simulazione accettabile di intelligenza è prezioso per rimanere concentrati e motivati.

E puoi usarlo per tutto. O almeno per tutto ciò che puoi descrivere con il testo, che è molto vicino a tutto, specialmente in un contesto di programmazione.

Ecco alcuni casi in cui ho usato GPT-4:

  • Domande casuali su API per le quali avrei dovuto fare ricerche approfondite. Questa è la categoria più probabile di generare allucinazioni e ho in gran parte iniziato a usare Phind per questo caso d’uso (vedi sotto).
  • Micro-ottimizzazioni. È come Copilot, ma fa corrispondenze su tutto Stack Overflow perché è (in parte) su ciò che è stato addestrato.
  • Ho coinvolto i flussi di Stream perché non sono ancora molto bravo a trasformare la logica nella mia testa in una catena funzionale di chiamate di metodi di Stream. A volte, come in questo esempio, il risultato finale è peggiore rispetto a dove abbiamo iniziato, ma questo accade spesso in programmazione. È molto più facile e veloce fare quella esplorazione con GPT che premendo un tasto alla volta. E rendere più veloce quel ciclo di tempo-risultati rende più probabile che io provi una nuova idea, poiché il costo dell’esperimento è inferiore.
  • Ovviamente, GPT sa anche di git, ma forse non hai capito quanto sia bravo a costruire strumenti personalizzati utilizzando git. Come gli altri punti di questa lista, queste sono cose che avrei potuto fare prima a mano, ma avere GPT lì per accelerare le cose significa che ora creerò strumenti come questo (prima, di solito avrei optato per la seconda soluzione migliore anziché dedicare un’ora a uno script occasionale come questo).

Ecco la mia collaborazione preferita con GPT-4. Ho dovuto scrivere una classe personalizzata per evitare l’onere della raccolta dei rifiuti del ciclo di box/unbox da un approccio ingenuo che utilizza ConcurrentHashMap<Integer, Integer>, e questo era per Lucene, che ha una rigorosa politica senza dipendenze esterne, quindi non potevo semplicemente utilizzare una mappa di primitivi concorrente come il wrapper di Trivago fastutil-concurrent.

Sono andato avanti e indietro diverse volte con GPT, migliorando la sua soluzione. Questa conversazione illustra ciò che penso siano diverse migliori pratiche con GPT (almeno fino a metà 2023):

  1. Quando si scrive codice, GPT si comporta meglio con problemi ben incapsulati. Al contrario, sono stato per lo più infruttuoso nel cercare di fargli eseguire refactoring che toccano più parti di una classe, anche se piccola.
  2. Suggerisci le frasi come domande. “Sarebbe più efficiente se…?” GPT (e ancora di più Claude) è riluttante a contraddire direttamente l’utente. Lascia spazio per il dissenso, o potresti involontariamente costringerlo ad iniziare a fare allucinazioni.
  3. Non cercare di fare tutto nel grande modello di linguaggio (LLM). L’output finale di questa conversazione ha ancora bisogno di alcuni aggiustamenti, ma è abbastanza vicino a quello che volevo che fosse più facile e veloce finirlo manualmente invece di cercare di far sì che GPT lo faccia esattamente giusto.
  4. In generale, non credo nei suggerimenti magici: è meglio usare un suggerimento diretto e, se GPT va nella direzione sbagliata, correggerlo. Ma ci sono situazioni in cui il suggerimento giusto può effettivamente aiutare molto. La programmazione concorrente in Java è una di quelle situazioni. La soluzione preferita di GPT è semplicemente aggiungere synchronized ovunque e chiamarla una giornata. Ho scoperto che dirgli di pensare nello stile del mago della concorrenza Cliff Click aiuta molto. Più di recente, ho anche iniziato a utilizzare una versione leggermente modificata del prompt di sistema di Jeremy Howard.

Guardando questa lista, è sorprendente quanto bene si adatti alla regola pratica secondo cui l’IA è come avere stagisti infiniti a disposizione. Gli stagisti si comportano meglio con problemi autocontenuti, spesso sono riluttanti a contraddire il loro responsabile del team e spesso è più facile finire il lavoro da soli anziché spiegare in dettaglio cosa si desidera affinché lo stagista lo faccia. (Mentre consiglio di resistere alla tentazione di farlo con veri stagisti, con GPT non importa.)

Analisi avanzata dei dati

L’analisi avanzata dei dati, precedentemente conosciuta come Code Interpreter, fa parte di ChatGPT ed è di un livello superiore, avrei voluto averla disponibile per Java ieri. Questo strumento avvolge la generazione di codice Python di GPT-4 in un sandbox simile a Jupyter e lo mette in un ciclo per correggere i propri errori. Ecco un esempio di quando stavo risolvendo un problema con il mio codice di indicizzazione che stava costruendo un grafo partizionato.

Il problema principale da tenere d’occhio è che ADA tende a “risolvere” i problemi con input imprevisti eliminando le righe offensive, cosa che di solito non si desidera. E di solito è soddisfatto dei suoi sforzi una volta che il codice viene eseguito senza errori: dovrai essere specifico riguardo ai controlli di coerenza che desideri includere. Una volta che gli dici cosa cercare, lo aggiungerà al suo ciclo “itera fino al successo” e non dovrai ripetere la stessa cosa più volte.

Vale anche la pena menzionare che secondo le voci di corridoio, ADA ora utilizza un modello più avanzato rispetto al normale GPT-4, con una finestra di contesto più lunga (almeno). Ora uso ADA per tutto di default e sembra essere un miglioramento; l’unico svantaggio è che a volte inizia a scrivere Python quando voglio Java.

Claude

Claude è un concorrente di GPT di Anthropic. Claude si trova approssimativamente al livello di GPT 3.5 per la scrittura di codice, è notevolmente peggiore di GPT-4.

Ma Claude ha una finestra di contesto di 100.000 token, che è più di dieci volte quello che si ottiene con GPT-4. (OpenAI ha appena annunciato un’Enterprise ChatGPT che aumenta la finestra di contesto di GPT-4 a 32.000 token, che è ancora solo un terzo di Claude.)

Ho utilizzato Claude per tre cose:

  1. Incollare intere classi di codice Cassandra per capire cosa fanno.
  2. Caricare articoli di ricerca e fare domande su di essi.
  3. Fare entrambe le cose contemporaneamente: ecco un articolo di ricerca; ecco la mia implementazione in Java. In cosa sono diverse? Queste differenze hanno senso, date le restrizioni X e Y?

Bing e Phind

Bing Chat ha attirato molta attenzione quando è stato lanciato all’inizio di quest’anno, ed è ancora una buona fonte di GPT-4 gratuito (seleziona l’opzione “Creativa”), ma è tutto qui. Ho smesso di usarlo quasi completamente. Qualsiasi cosa abbia fatto Microsoft alla versione di GPT-4 di Bing, l’ha resa molto peggiore nel scrivere codice rispetto alla versione in ChatGPT.

Invece, quando voglio una ricerca con sapore di intelligenza artificiale, uso Phind. È ciò che Bing avrebbe dovuto essere, ma per qualche motivo, una piccola startup ha superato Microsoft in uno dei suoi sforzi principali. Phind ha completamente sostituito Google per le mie domande di tipo “come faccio X” in Java, Python, git e altro. Ecco un buon esempio di risoluzione di un problema con una libreria sconosciuta. Su questo tipo di query, Phind quasi sempre ci azzecca – e con fonti pertinenti, anche. Al contrario, Bing quasi sempre cita almeno una fonte che dice qualcosa di diverso da quello che fa effettivamente.

Bard

Non ho ancora trovato nulla in cui Bard sia bravo. Non ha le capacità di GPT-4 nel scrivere codice o la grande finestra di contesto di Claude. Nel frattempo, allucina più di entrambi.

Rendere la Codifica Produttiva – e Divertente

Cassandra è una base di codice grande e matura, che può intimidire una persona nuova che cerca di aggiungere una funzionalità – anche me, dopo dieci anni principalmente trascorsi sul lato della gestione. Se l’intelligenza artificiale deve aiutare qualcuno di noi a muoversi più velocemente, è così che funziona. ChatGPT e strumenti correlati di intelligenza artificiale sono bravi a scrivere codice per risolvere problemi ben definiti, sia come parte di un progetto più ampio progettato da un ingegnere umano o per strumenti occasionali. Sono utili anche per il debug, per abbozzare prototipi ed esplorare codice sconosciuto.

In breve, ChatGPT e Copilot sono stati fondamentali per rispettare la nostra scadenza. Avere questi strumenti mi rende più produttivo del 50% al 100%, a seconda del compito. Hanno delle limitazioni, ma eccellono nel iterare in modo instancabile su compiti più piccoli e aiutano il loro supervisore umano a rimanere concentrato agendo come un partner instancabile e senza lamentele con cui confrontarsi. Anche se hai anni di esperienza di programmazione, devi farlo.

Infine, anche senza gli aspetti di produttività, programmare con un’intelligenza artificiale che aiuta nelle parti ripetitive è semplicemente più divertente. Mi ha dato una nuova energia e un nuovo livello di entusiasmo nel creare cose fantastiche. Non vedo l’ora di utilizzare versioni più avanzate di questi strumenti man mano che evolvono e maturano.