Langfuse è uno strumento utile per testare in modo flessibile gli agenti AI. Di recente, abbiamo deciso di implementare un framework per testare gli agenti AI basati su chat. Quello che segue è un resoconto del nostro viaggio alla scoperta degli strumenti disponibili.
Ci concentreremo principalmente su come portare a termine questo compito ora, ma alla fine affronteremo alcune riflessioni sulle sfide che dobbiamo ancora affrontare e su cosa possono fare gli strumenti a nostra disposizione per supportare meglio questo tipo di caso d'uso in futuro.
Prima di esaminare come abbiamo costruito il nostro sistema, analizzeremo rapidamente i nostri obiettivi e i criteri di successo.
I casi d’uso dell’IA generativa sono generalmente facili da implementare ma difficili da controllare. Quando si distribuisce un agente con un modello a contesto ampio, le modifiche a monte nei prompt del modello, nelle impostazioni della temperatura, nella policy di moderazione dei contenuti, ecc., possono incidere drasticamente sulle sue prestazioni.
La sfida è creare un sistema in grado di valutare la capacità di un agente di svolgere compiti specifici senza avere allucinazioni o infrangere la politica sui contenuti. Lo equiparamo al test unitario, garantendo che il tuo agente mantenga la sua capacità di svolgere un ampio elenco di attività, anche quando il team dietro potrebbe concentrarsi su miglioramenti specifici. Eseguire questo tipo di test manualmente può essere impreciso, dispendioso in termini di tempo e difficile da monitorare.
Quindi, abbiamo deciso di creare un sistema in grado di creare facilmente questi test e monitorarne i risultati. È importante sottolineare che volevamo che questo sistema fosse utilizzabile con una frequenza minima di modifiche al codice richieste, in modo che un Product Manager o un tester del QA potessero contribuire senza dover toccare il codice.
Partiamo da alcuni parametri chiave per la nostra ricerca:
Conformità HIPAA, poiché sia i prodotti che costruiamo che molti dei nostri partner di consulenza operano nel settore sanitario.
Basso costo, sia per resistere che per operare, poiché operiamo in modo abbastanza snello, così come i nostri partner.
Momento evolutivo. Lo spazio di osservabilità LLM è in rapida evoluzione. Fin dall'inizio della nostra ricerca eravamo pronti a sbagliarci, ma volevamo ridurre al minimo questa possibilità scegliendo uno strumento che probabilmente si evolvesse con noi.
Funzionalità di valutazione LLM personalizzata. La capacità di avviare ed eseguire un valutatore personalizzato è stata sorprendentemente qualcosa che non abbiamo trovato facilmente supportato tra tutte le opzioni che abbiamo trovato, in particolare tra le opzioni open source.
Per semplificare la nostra ricerca, abbiamo identificato i seguenti attori nelle categorie enterprise e open source che sembravano soddisfare i nostri criteri, elencati qui in ordine approssimativo.
Impresa
Open Source
Abbiamo scelto Langfuse principalmente perché è facile da implementare autonomamente senza interagire con un team di vendita aziendale e perché riteniamo che abbia le caratteristiche fondamentali di cui abbiamo bisogno. Finora ciò si è rivelato corretto.
Distribuzione
Abbiamo riscontrato che il processo di distribuzione, nel complesso, è relativamente semplice. Langfuse fornisce un'immagine docker di facile utilizzo e una solida documentazione su come eseguire la distribuzione locale. Creare un file YAML e distribuirlo su EKS è stato semplice e abbiamo messo a punto un'istanza demo in un paio d'ore. Non abbiamo configurato l'SSO per il nostro POC, quindi utilizzavamo la gestione degli utenti di base fornita immediatamente (non molto) e ci affidavamo a dati anonimizzati per soddisfare i requisiti di sicurezza. Un database PG di livello gratuito su RDS potrebbe gestire molte query, valutazioni e gestione tempestiva per più utenti. L'applicazione è molto leggera. Alcuni problemi che abbiamo riscontrato:
- Non è possibile ottenere un elenco di prompt nell'SDK a livello di codice. Ciò significava che quando mettevamo insieme vari prompt di sistema o chat di test unitari, dovevamo memorizzare i nomi dei prompt nelle configurazioni di qualunque punto di ingresso usassimo per un particolare caso d'uso (ad esempio, un elenco di test unitari nel prompt di sistema per un agente)
- Non abbiamo trovato un modo per ottenere un elenco di variabili nei prompt da utilizzare nella compilazione. Stavamo utilizzando variabili diverse per i diversi prompt di sistema che avremmo inserito e dovevamo codificare quali bit di dati sarebbero stati compilati in ciascuna o fare qualche prova ed errore.
- Le osservazioni non erano ben documentate. Durante la registrazione dei punteggi in Langfuse, abbiamo visto che potevi aggiungere un applicationId, ma la documentazione generalmente buona non forniva contesto aggiuntivo. Probabilmente li utilizzeremo in futuro una volta individuate tutte le possibilità che offrono
Un diagramma di come abbiamo utilizzato le configurazioni del prompt di sistema per creare un sistema di test centrale senza codice in Langfuse
Con un paio di settimane di lavoro, abbiamo creato un sistema di test end-to-end. Langfuse offre più funzionalità di quelle utilizzate finora, ma ci siamo concentrati sull'utilizzo di prompt, sessioni e tracce.
Un requisito fondamentale che avevamo nell'eseguire i test su un agente basato su chat era la capacità di inserire un agente nel mezzo di uno scenario di chat, utilizzando i messaggi scambiati in precedenza come contesto. È possibile creare qualsiasi richiesta personalizzata per includere la cronologia della chat, ma Langfuse lo rende particolarmente semplice.
Inoltre, abbiamo creato un'interfaccia chat per l'agente che consente agli utenti di testare e generare nuove richieste di test in situ per le valutazioni. Questo risolve uno dei
potenziali problemi con l'inserimento di prompt come contesto, le chat devono rappresentare gli output effettivi che il modello potrebbe creare.
Ciò crea una potenziale vulnerabilità: le cronologie delle chat che utilizziamo come contesto devono essere aggiornate se il comportamento sottostante del modello cambia. Detto questo, consideriamo questo metodo più controllabile e coerente rispetto alle potenziali alternative, come far interagire un agente con un altro, qualcosa che esploreremo come un'altra aggiunta a questo tipo di sistema.
L'altra sfida chiave che abbiamo affrontato è stata come creare un'intera suite di test senza richiedere codice. Innanzitutto, per definire un set di test, abbiamo creato un oggetto di configurazione nel prompt di sistema per l'agente, che definiva l'elenco dei test da eseguire su di esso.
Ciò ci ha anche permesso di passare il prompt del sistema come variabile durante l'esecuzione di una serie di test. Uno dei vantaggi principali di un sistema come Langfuse è la sua capacità di abilitare la gestione rapida come codice nella sua interfaccia utente. A tal fine, i prompt di sistema di follow-up che potrebbero essere inseriti nel sistema sono anche collegati al prompt di sistema nella configurazione, consentendoci di forzare il modello sottostante in stati specifici durante i test rafforzando al contempo il sistema contro le modifiche al modello primario o successivo. -sul sistema richiede.
Gestendo l'elenco dei test da eseguire come configurazioni nel prompt del sistema, richiediamo la modifica del codice solo una volta per agente. L'elenco dei test da eseguire può essere modificato e ampliato nell'interfaccia utente di Langfuse.
Ogni richiesta di test è collegata al suo valutatore come parte della sua configurazione. Ogni richiesta di test ha almeno 1 valutazione personalizzata in esecuzione, con richieste che seguono tutte più o meno questo modello: un utile valutatore AI che fornirà feedback e punteggio sull'attività seguente.
You are a helpful AI evaluator who will provide feedback and scoring on the task below.(Describe the scenario and how the agent has been instructed to behave in said scenario)Based on the transcript output, you will determine whether this task was successfully completed. You will return a JSON object in the following form:-------------Example outputs:{"score": -1, "comment": (Description of an example negative case}{“score”: 1, “comment”: (Description of an example positive case)}------------In this object, score is a number between -1 and 1, with 1 indicating complete success and a -1 indicating complete failure. The comment is a string indicating your reasoning for the score.-------------BEGIN TRANSCRIPT:{{transcript}}END TRANSCRIPT--------------Do not return any output except the JSON object referenced above.
Utilizzando questo sistema
Consideriamo questo framework di test e valutazione come un insieme ragionevole di compromessi per creare un sistema a basso costo e facile da utilizzare. Consideriamo le sue applicazioni principali come parte di una pipeline CI/CD, garantendolo o come fonte di una rapida scorecard per qualcuno che cerca di modificare le istruzioni di un sistema e desidera un input più approfondito di quello che può ottenere attraverso i test manuali.
In base ai modelli alla base dell'agente e dei valutatori, l'utilizzo dei token può significare che l'esecuzione di una suite di test completa, che nel nostro caso può facilmente contenere dozzine di prompt di test e valutatori, può costare decine di dollari.
Un modo per controllare il costo di gestione di un sistema come questo come mezzo per eseguire iterazioni su prompt e strumenti, in particolare quando si apportano grandi quantità di modifiche nel tentativo di migliorare in modo iterativo le prestazioni, è iniziare con un modello più piccolo, misurare le prestazioni relative e intensificare i test su modelli più grandi solo quando trovi un risultato incoraggiante.
Nel complesso, siamo soddisfatti della nostra decisione di utilizzare Langfuse. Con una quantità di lavoro ragionevolmente piccola, potremmo implementare qualcosa che si adatti alle nostre esigenze. Il sistema era sufficientemente flessibile da consentirci di personalizzarlo per adattarlo al nostro caso d'uso in tempi relativamente brevi.
Abbiamo notato alcune carenze che speriamo vengano risolte con lo sviluppo futuro:
Il Langfuse UX manca di qualche rifinitura, che aumenterebbe significativamente la qualità della vita dei suoi utenti. Gli esempi includono l'impossibilità di duplicare un prompt e l'impossibilità di cercare prompt disponibili in base a parametri diversi dal nome.
L'opzione self-hosted non consente di attivare nuove esecuzioni di test dall'interno dell'interfaccia utente, il che significa che qualcuno che gestisce il sistema deve farlo tramite la riga di comando o un'altra interfaccia utente sviluppata per questo scopo.
Comprendiamo che questo ambiente si sta evolvendo rapidamente, ma crediamo che questo quadro approssimativo sia ragionevolmente portabile, qualora alla fine decidessimo di implementarlo in un altro sistema.
Un modo per aumentare la copertura dei nostri test sarebbe creare varianti dei nostri prompt di test esistenti. Strumenti come TestGen-LLM stanno emergendo nello spazio, ma nel complesso, lo spazio per utilizzare GenAI per testare GenAI è giovane. Poiché questi payload sono essenzialmente oggetti JSON, è certamente possibile istruire un LLM a creare varianti. La domanda, quindi, è come controllare la qualità di tali varianti in modo che rappresentino ancora test validi.
I set di dati Langfuse sono una caratteristica interessante dello strumento, che consente agli utenti di collegare particolari porzioni di tracce come input e output attesi di un modello. Anche se avremmo potuto utilizzare qualcosa di simile nei nostri test unitari, abbiamo trovato più semplice creare prompt di chat come input e in generale descrivere ciò che stavamo cercando nei prompt di valutazione piuttosto che creare un “output previsto” da utilizzare in una valutazione del set di dati. Riteniamo che i set di dati siano la strada giusta da percorrere per i test che possono essere valutati nel codice (ad esempio, il chatbot ha restituito l'anno corretto quando richiesto? Il chatbot ha restituito JSON funzionale?). Potremmo usarli in futuro per test più generali, ma abbiamo trovato più veloce avviare nuovi test creando i prompt separatamente.
Fonte: towardsdatascience.com