Applicazioni di chat LLM con Declarai, FastAPI e Streamlit – Parte 2 🚀

Chat LLM Applications with Declarai, FastAPI, and Streamlit - Part 2 🚀

Screenshot della chat | Scattata dall'autore | Tutti i diritti riservati

A seguito della popolarità del nostro precedente articolo su VoAGI (link 🔗), che ha approfondito l’implementazione di applicazioni di chat LLM, abbiamo preso in considerazione i vostri feedback. Questa seconda parte introduce funzionalità più avanzate, con un particolare emphasis sullo streaming per le applicazioni di chat.

Molti dei nostri lettori hanno espresso il desiderio di avere una funzione di streaming per le chat. Lo streaming diventa cruciale quando si tratta di risposte estese. Invece di far attendere gli utenti per l’intera risposta, lo streaming consente di inviare la risposta mentre viene generata 🔄. Ciò garantisce che gli utenti possano accedervi istantaneamente una volta inviata dal webserver.

Grazie agli ultimi miglioramenti in Declarai, siamo entusiasti di sfruttare lo streaming, ora disponibile dalla versione 0.1.10 in poi 🎉.

Streaming in Azione 📹

Video in Streaming | Registrato dall’autore | Tutti i diritti riservati

Come dimostrato, lo streaming offre una maggiore reattività ed è diventato uno standard nelle recenti applicazioni di chat AI. Siete curiosi di vedere come abbiamo ottenuto questo? Approfondiamo il codice:

Declarai 💻

Per utilizzare lo streaming, assicurarsi che il chatbot sia dichiarato con la funzione di streaming abilitata passando streaming=True.

import declaraigpt_35 = declarai.openai(model="gpt-3.5-turbo")@gpt_35.experimental.chat(streaming=True)class StreamingSQLChat:    """    Sei un assistente SQL. Stai aiutando un utente a scrivere una query SQL.    Dovresti prima sapere quale sintassi SQL l'utente vuole utilizzare. Può essere mysql, postgresql, sqllite, ecc.    Se l'utente dice qualcosa che non ha nulla a che fare con SQL, dovresti rispondere "Non capisco. Sono qui per aiutarti a scrivere una query SQL."    Dopo aver fornito all'utente una query, dovresti chiedere all'utente se ha bisogno di qualcos'altro.    """    greeting = "Ciao caro utente SQL. Spero che tu stia bene oggi. Sono qui per aiutarti a scrivere una query SQL. Cominciamo! Quale sintassi SQL vorresti utilizzare? Può essere mysql, postgresql, sqllite, ecc."

Quando si interagisce con il chatbot utilizzando lo streaming:

chat = StreamingSQLChat()res = chat.send("Voglio utilizzare mysql")for chunk in res:    print(chunk.response)>>> Ottimo>>> Ottimo!>>> Ottimo! MySQL>>> Ottimo! MySQL è>>> Ottimo! MySQL è una>>> Ottimo! MySQL è una scelta>>> Ottimo! MySQL è una scelta popolare>>> Ottimo! MySQL è una scelta popolare per>>> Ottimo! MySQL è una scelta popolare per la>>> Ottimo! MySQL è una scelta popolare per la sintassi>>> Ottimo! MySQL è una scelta popolare per la sintassi SQL>>> Ottimo! MySQL è una scelta popolare per la sintassi SQL.>>> Ottimo! MySQL è una scelta popolare per la sintassi SQL. Come>>> Ottimo! MySQL è una scelta popolare per la sintassi SQL. Come posso>>> Ottimo! MySQL è una scelta popolare per la sintassi SQL. Come posso aiutarti>>> Ottimo! MySQL è una scelta popolare per la sintassi SQL. Come posso aiutarti con>>> Ottimo! MySQL è una scelta popolare per la sintassi SQL. Come posso aiutarti con la>>> Ottimo! MySQL è una scelta popolare per la sintassi SQL. Come posso aiutarti con la tua>>> Ottimo! MySQL è una scelta popolare per la sintassi SQL. Come posso aiutarti con la tua query MySQL>>> Ottimo! MySQL è una scelta popolare per la sintassi SQL. Come posso aiutarti con la tua query MySQL?>>> Ottimo! MySQL è una scelta popolare per la sintassi SQL. Come posso aiutarti con la tua query MySQL?

Cosa succede dietro le quinte? Abilitando lo streaming, OpenAI restituisce un generatore, che produce elementi uno alla volta e solo quando richiesto. Pertanto, non appena è disponibile un nuovo blocco da OpenAI, viene elaborato immediatamente.

FastAPI 🛠️

Per la capacità di streaming, abbiamo introdotto un endpoint REST distinto. Questo endpoint invia un StreamingResponse – essenzialmente un generatore in cui ogni blocco è un JSON contenente i dettagli del blocco. È essenziale specificare il media_type come media_type="text/event-stream" che indica che il tipo di risposta è di tipo stream.

@router.post("/chat/submit/{chat_id}/streaming")def submit_chat_streaming(chat_id: str, request: str):    chat = StreamingSQLChat(chat_history=FileMessageHistory(file_path=chat_id))    response = chat.send(request)    def stream():        for llm_response in response:            # Convert the LLMResponse to a JSON string            data = json.dumps(jsonable_encoder(llm_response))            yield data + "\n"  # Yielding as newline-separated JSON strings    return StreamingResponse(stream(), media_type="text/event-stream")

App Streamlit

Da parte del front-end, il nostro obiettivo è visualizzare ogni nuovo blocco di risposta all’utente man mano che viene ricevuto. Ciò richiede l’accesso alla differenza di risposta tra ogni blocco di risposta.

Ecco come viene realizzato:

  1. Inizia con una richiesta HTTP POST con stream=True.
  2. Itera attraverso ogni blocco e decodifica il suo JSON.
  3. Estrai il valore delta e aggiungilo alla risposta completa. Questo rappresenta essenzialmente i valori appena generati.
  4. Aggiorna l’interfaccia utente con la risposta accumulata.
res = requests.post(f"{BACKEND_URL}/api/v1/chat/submit/{session_name}/streaming",                  params={"request": prompt},                  stream=True)with st.chat_message("assistant"):  message_placeholder = st.empty()  full_response = ""  buffer = ""  for chunk in res:      decoded_chunk = chunk.decode('utf-8')      buffer += decoded_chunk      while "\n" in buffer:          line, buffer = buffer.split("\n", 1)          parsed_chunk = json.loads(line.strip())          try:              full_response += parsed_chunk["raw_response"]["choices"][0]["delta"]["content"]              message_placeholder.markdown(full_response + "▌")          except KeyError:              pass  message_placeholder.markdown(full_response)

Pronto per distribuire il tuo chatbot in streaming 🤖? Approfondisci il codice completo in questo repository —

GitHub – matankley/declarai-chat-fastapi-streamlit: Un esempio su come costruire un chatbot utilizzando declarai…

Un esempio su come costruire un chatbot utilizzando declarai per interagire con il modello di linguaggio, fastapi come server backend e…

github.com

Rimani in contatto con gli sviluppi di Declarai 💌. Collegati con noi sulla pagina Linkedin e dacci una stella ⭐️ su GitHub se trovi i nostri strumenti utili!

Puoi anche approfondire le funzionalità di Declarai esplorando la nostra documentazione 📖

Streaming — Declarai

Alcuni fornitori LLM supportano lo streaming delle risposte LLM. Questo è molto utile quando si desidera ottenere i risultati il prima possibile…

declarai.com