Questo post del blog tratta di come costruire un’implementazione della cronologia chat utilizzando Azure Cosmos DB per NoSQL Go SDK e LangChainGo. Se sei nuovo nel Go SDK, l’applicazione chatbot di esempio presentata nel blog funge da introduzione pratica, coprendo operazioni di base come lettura, upsert, ecc. Dimostra anche l’uso dell’emulatore Linux di Azure Cosmos DB (in anteprima al momento della scrittura) per test di integrazione con Testcontainers per Go.
Sviluppatori Go che desiderano costruire applicazioni AI possono utilizzare LangChainGo, che è un framework per applicazioni alimentate da LLM. Fornisce API pluggabili per componenti come archivio vettoriale, embedding, caricamento documenti, catene (per comporre più operazioni), cronologia chat e altro ancora.
Prima di addentrarci, facciamo un passo indietro per comprendere le basi.
Cosa è la Cronologia Chat e perché è importante per le moderne applicazioni AI?
Un requisito comune per le applicazioni AI conversazionali è la possibilità di memorizzare e recuperare i messaggi scambiati come parte delle conversazioni. Questo è spesso chiamato “cronologia chat”. Se hai utilizzato applicazioni come ChatGPT (che utilizza anche Azure Cosmos DB, tra l’altro!), potresti essere familiare con questo concetto.
Quando un utente accede, può iniziare a chattare e i messaggi scambiati come parte della conversazione vengono salvati. Quando accedono nuovamente, possono vedere le loro conversazioni precedenti e continuare da dove avevano interrotto.
L’archivio delle chat è ovviamente importante per gli utenti finali dell’applicazione, ma non dimentichiamo gli LLM! Per quanto intelligenti possano sembrare, non riescono a ricordare le interazioni passate a causa della mancanza di memoria integrata (almeno per ora). Utilizzare la cronologia delle chat colma questa lacuna fornendo le conversazioni precedenti come contesto aggiuntivo, consentendo agli LLM di generare risposte più rilevanti e di alta qualità. Ciò migliora il flusso naturale delle conversazioni e migliora significativamente l’esperienza dell’utente.
Un esempio semplice illustra questo concetto: Supponiamo che chiedi a un LLM tramite un’API: “Dimmi qualcosa su Azure Cosmos DB,” e questo risponde con un lungo paragrafo. Se poi fai un’altra chiamata API dicendo: “Scomponi questo in punti elenco per una lettura più facile,” l’LLM potrebbe confondersi perché manca del contesto dall’interazione precedente.
Tuttavia, se includi il messaggio precedente come parte del contesto nella seconda chiamata API, è più probabile che l’LLM fornisca una risposta accurata (anche se non garantito, poiché gli output degli LLM sono intrinsecamente non deterministici).
Come Eseguire il Chatbot
Come ho menzionato in precedenza, l’applicazione di esempio è un modo utile per esplorare langchaingo
, l’implementazione della cronologia della chat di Azure Cosmos DB, nonché il Go SDK.
Prima di esplorare i dettagli dell’implementazione, è una buona idea vedere l’applicazione in azione. Fare riferimento alla sezione README del repository GitHub, che fornisce istruzioni su come configurare, eseguire e iniziare a conversare con il chatbot.
Panoramica dell’applicazione
L’applicazione di chat segue un modello di dominio diretto: gli utenti possono avviare più conversazioni e ogni conversazione può contenere più messaggi. Realizzata in Go, l’applicazione include sia componenti backend che frontend.
Backend
Ha diverse parti secondarie:
- L’implementazione della cronologia della chat di Azure Cosmos DB.
- Operazioni principali come avviare una chat, inviare/ricevere messaggi e recuperare la cronologia delle conversazioni sono esposte tramite un’API REST.
- L’API REST sfrutta una catena
langchaingo
per gestire i messaggi degli utenti. La catena incorpora automaticamente la cronologia delle chat per garantire che le conversazioni passate vengano inviate al LLM.langchaingo
gestisce tutta l’orchestrazione – invocazione del LLM, inclusione della cronologia delle chat e altro, senza richiedere implementazione manuale.
Frontend
È costruito utilizzando JavaScript, HTML e CSS. È confezionato come parte del server web Go (utilizzando il pacchetto embed) e invoca le API REST del backend in risposta alle interazioni degli utenti.
Implementazione della Cronologia delle Chat Utilizzando Azure Cosmos DB
LangChainGo è un framework pluggabile, che include il suo componente di cronologia delle chat (o memoria). Per integrare Azure Cosmos DB, è necessario implementare l’interfaccia schema.ChatMessageHistory
, che fornisce metodi per gestire la cronologia delle chat:
AddMessage
per aggiungere messaggi a una conversazione (o iniziarne una nuova).Messages
per recuperare tutti i messaggi di una conversazione.Clear
per eliminare tutti i messaggi in una conversazione.
Mentre puoi istanziare direttamente un’istanza di CosmosDBChatMessageHistory
e utilizzare questi metodi, l’approccio consigliato è integrarlo nell’applicazione langchaingo
. Di seguito un esempio di utilizzo della cronologia chat di Azure Cosmos DB con un LLMChain
:
// Crea un'istanza della cronologia chat
cosmosChatHistory, err := cosmosdb.NewCosmosDBChatMessageHistory(cosmosClient, databaseName, containerName, req.SessionID, req.UserID)
if err != nil {
log.Printf("Error creating chat history: %v", err)
sendErrorResponse(w, "Failed to create chat session", http.StatusInternalServerError)
return
}
// Crea una memoria con la cronologia chat
chatMemory := memory.NewConversationBuffer(
memory.WithMemoryKey("chat_history"),
memory.WithChatHistory(cosmosChatHistory),
)
// Crea un LLM chain
chain := chains.LLMChain{
Prompt: promptsTemplate,
LLM: llm,
Memory: chatMemory,
OutputParser: outputparser.NewSimple(),
OutputKey: "text",
}
Dal punto di vista di Azure Cosmos DB, nota che l’implementazione in questo esempio è solo una delle molte opzioni possibili. Quella mostrata qui si basa su una combinazione dell’ID utente come chiave di partizione e l’ID della conversazione (a volte chiamato anche ID sessione) come chiave unica (id
di un elemento di Azure Cosmos DB).
Questo consente a un’applicazione di:
- Ottenere tutti i messaggi per una conversazione. Questa è una lettura puntuale utilizzando l’ID unico (ID conversazione) e la chiave di partizione (ID utente).
- Aggiungi un nuovo messaggio a una conversazione. Utilizza un’operazione upsert (invece di create) per evitare la necessità di un read prima della scrittura.
- Elimina una conversazione specifica. Utilizza l’operazione delete per rimuovere una conversazione (e tutti i suoi messaggi).
Anche se l’interfaccia
langchaingo
non lo espone, quando integri questo come parte di un’applicazione, puoi anche emettere una query separata per ottenere tutte le conversazioni di un utente. Questo è anche efficiente poiché è limitato a una singola partizione.
Semplifica i test con l’emulatore Azure Cosmos DB e Testcontainers.
L’applicazione di esempio include casi di test di base sia per la cronologia della chat di Azure Cosmos DB che per l’applicazione principale. È importante sottolineare l’uso di testcontainers-go per integrare il contenitore docker dell’emulatore Azure Cosmos DB basato su Linux.
Questo è ottimo per i test di integrazione poiché il database è disponibile in locale e i test vengono eseguiti molto più velocemente (senza dimenticare anche il risparmio sui costi!). La ciliegina sulla torta è che non è necessario gestire manualmente il ciclo di vita del contenitore Docker. Questo viene gestito come parte del set di test, grazie all’API testcontainers-go
che rende comodo avviare il contenitore prima dell’esecuzione dei test e terminarlo una volta completati.
Puoi fare riferimento ai casi di test nell’applicazione di esempio per ulteriori dettagli. Ecco un estratto di come viene utilizzato testcontainers-go
:
func setupCosmosEmulator(ctx context.Context) (testcontainers.Container, error) {
req := testcontainers.ContainerRequest{
Image: emulatorImage,
ExposedPorts: []string{emulatorPort + ":8081", "1234:1234"},
WaitingFor: wait.ForListeningPort(nat.Port(emulatorPort)),
}
container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
ContainerRequest: req,
Started: true,
})
if err != nil {
return nil, fmt.Errorf("failed to start container: %w", err)
}
// Dare all'emulatore un po' più di tempo per inizializzarsi
time.Sleep(5 * time.Second)
return container, nil
}
Se sei interessato a utilizzare l’Emulatore Azure Cosmos DB nei pipeline CI, dai un’occhiata al post sul blog.
Conclusione
Essere in grado di memorizzare la cronologia delle chat è una parte importante delle app di intelligenza conversazionale. Possono fungere da ottimo complemento alle tecniche esistenti come RAG (generazione potenziata da recupero). Prova l’applicazione chatbot e facci sapere cosa ne pensi!
Sebbene l’implementazione nell’applicazione di esempio sia relativamente semplice, il modo in cui si modella i dati della cronologia delle chat dipende dai requisiti. Un tale scenario che è stato presentato è questo eccellentepost del blog su come Microsoft Copilot scala a milioni di utenti con Azure Cosmos DB.
Alcuni dei requisiti potrebbero includere:
- Memorizzazione di metadati, come reazioni (oltre ai messaggi)
- Visualizzazione dei primi N messaggi recenti
- Considerare il periodo di conservazione dei dati della cronologia delle chat (utilizzando TTL)
- Incorporare ulteriori analisi (sulle interazioni dell’utente) basate sui dati della cronologia delle chat e altro ancora.
Indipendentemente dall’implementazione, assicurati sempre di incorporare le migliori pratiche per la modellazione dei dati. Consulta qui per le linee guida.
Stai già utilizzando o pianificando di sfruttare Azure Cosmos DB per le tue applicazioni Go? Ci piacerebbe avere tue notizie! Inviaci le tue domande e feedback.
Source:
https://dzone.com/articles/chat-history-ai-applications-azure-cosmos-db-go-sdk