Dieser Blogbeitrag behandelt, wie man eine Chatverlauf-Implementierung mit Azure Cosmos DB für das NoSQL Go SDK und LangChainGo erstellt. Wenn Sie neu im Go SDK sind, dient die im Blog vorgestellte Beispiel-Chatbot-Anwendung als praktische Einführung, die grundlegende Operationen wie Lesen, Upsert usw. abdeckt. Es zeigt auch die Verwendung des auf Linux basierenden Emulators von Azure Cosmos DB (zum Zeitpunkt des Schreibens in der Vorschau) für Integrationstests mit Testcontainern für Go.
Go-Entwickler, die KI-Anwendungen entwickeln möchten, können LangChainGo verwenden, das ein Framework für LLM-gesteuerte Anwendungen ist. Es bietet austauschbare APIs für Komponenten wie Vektorspeicher, Einbettung, Laden von Dokumenten, Ketten (zum Kombinieren mehrerer Operationen), Chatverlauf und mehr.
Bevor wir eintauchen, werfen wir einen Blick zurück, um die Grundlagen zu verstehen.
Was ist Chatverlauf und warum ist er wichtig für moderne KI-Anwendungen?
Eine häufige Anforderung für konversationsbasierte KI-Anwendungen besteht darin, Nachrichten, die im Rahmen von Unterhaltungen ausgetauscht wurden, zu speichern und abzurufen. Dies wird oft als „Chatverlauf“ bezeichnet. Wenn Sie Anwendungen wie ChatGPT verwendet haben (die übrigens auch Azure Cosmos DB verwenden!), sind Sie möglicherweise mit diesem Konzept vertraut.
Wenn sich ein Benutzer anmeldet, kann er mit dem Chatten beginnen, und die im Rahmen des Gesprächs ausgetauschten Nachrichten werden gespeichert. Wenn sie sich erneut anmelden, können sie ihre früheren Unterhaltungen sehen und von dort aus fortfahren.
Der Chatverlauf ist offensichtlich wichtig für die Endbenutzer der Anwendung, aber vergessen wir nicht die LLMs! So clever LLMs auch sein mögen, sie können sich aufgrund eines Mangels an eingebautem Gedächtnis nicht an vergangene Interaktionen erinnern (zumindest im Moment). Durch die Verwendung des Chatverlaufs wird diese Lücke geschlossen, indem frühere Gespräche als zusätzlicher Kontext bereitgestellt werden, was es LLMs ermöglicht, relevantere und qualitativ hochwertigere Antworten zu generieren. Dies verbessert den natürlichen Gesprächsfluss erheblich und steigert die Benutzererfahrung.
Ein einfaches Beispiel verdeutlicht dies: Nehmen wir an, Sie fragen einen LLM über eine API: „Erzählen Sie mir etwas über Azure Cosmos DB,“ und er antwortet mit einem langen Absatz. Wenn Sie dann einen weiteren API-Aufruf tätigen und sagen, „Gliedern Sie dies in Stichpunkte für ein einfacheres Lesen,“ könnte der LLM verwirrt sein, da ihm der Kontext aus der vorherigen Interaktion fehlt.
Wenn Sie jedoch die frühere Nachricht als Teil des Kontexts im zweiten API-Aufruf einschließen, ist es wahrscheinlicher, dass der LLM eine genaue Antwort liefert (wenn auch nicht garantiert, da LLM-Ausgaben grundsätzlich nicht deterministisch sind).
Wie man den Chatbot ausführt
Wie bereits erwähnt, ist die Beispielanwendung ein nützlicher Weg für Sie, um langchaingo
, die Azure Cosmos DB Chatverlaufsimplementierung, sowie das Go SDK zu erkunden.
Bevor Sie sich mit den Implementierungsdetails befassen, ist es eine gute Idee, die Anwendung in Aktion zu sehen. Siehe den README-Abschnitt des GitHub-Repositorys,, der Anweisungen zur Konfiguration, Ausführung und zum Starten der Konversation mit dem Chatbot enthält.
Übersicht über die Anwendung
Die Chat-Anwendung folgt einem einfachen Domänenmodell: Benutzer können mehrere Unterhaltungen starten, und jede Unterhaltung kann mehrere Nachrichten enthalten. Die Anwendung, die in Go entwickelt wurde, umfasst sowohl Backend- als auch Frontend-Komponenten.
Backend
Es besteht aus mehreren Teilen:
- Die Azure Cosmos DB Chatverlaufsimplementierung.
- Kernoperationen wie das Starten eines Chats, Senden/Empfangen von Nachrichten und das Abrufen des Unterhaltungsverlaufs werden über eine REST-API bereitgestellt.
- Die REST-API verwendet eine `langchaingo`-Kette, um Benutzernachrichten zu verarbeiten. Die Kette integriert automatisch den Chatverlauf, um sicherzustellen, dass vergangene Gespräche an den LLM gesendet werden. `langchaingo` übernimmt die gesamte Orchestrierung – LLM-Aufruf, Einbindung des Chatverlaufs und mehr, ohne manuelle Implementierung zu erfordern.
Frontend
Es ist mit JavaScript, HTML und CSS erstellt. Es ist als Teil des Go-Webservers (unter Verwendung des Embed-Pakets) verpackt und ruft die Backend-REST-APIs als Reaktion auf Benutzerinteraktionen auf.
Chatverlaufimplementierung mit Azure Cosmos DB
LangChainGo ist ein anpassbares Framework, das seine Chatverlaufskomponente enthält. Um Azure Cosmos DB zu integrieren, müssen Sie die `schema.ChatMessageHistory`-Schnittstelle implementieren, die Methoden zum Verwalten des Chatverlaufs bereitstellt:
AddMessage
zum Hinzufügen von Nachrichten zu einem Gespräch (oder zum Start eines neuen).Messages
zum Abrufen aller Nachrichten für ein Gespräch.Clear
zum Löschen aller Nachrichten in einem Gespräch.
Während Sie eine CosmosDBChatMessageHistory
-Instanz direkt instanziieren und diese Methoden verwenden können, ist der empfohlene Ansatz, sie in die langchaingo
-Anwendung zu integrieren. Nachfolgend finden Sie ein Beispiel zur Verwendung des Azure Cosmos DB-Chatverlaufs mit einer LLMChain
:
// Erstellen einer Chatverlaufsinstanz
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
}
// Erstellen eines Speichers mit dem Chatverlauf
chatMemory := memory.NewConversationBuffer(
memory.WithMemoryKey("chat_history"),
memory.WithChatHistory(cosmosChatHistory),
)
// Erstellen einer LLM-Kette
chain := chains.LLMChain{
Prompt: promptsTemplate,
LLM: llm,
Memory: chatMemory,
OutputParser: outputparser.NewSimple(),
OutputKey: "text",
}
Von einem Azure Cosmos DB-Standpunkt aus gesehen ist zu beachten, dass die Implementierung in diesem Beispiel nur eine von vielen möglichen Optionen ist. Die hier gezeigte basiert auf einer Kombination aus der Benutzer-ID als Partitionsschlüssel und der Konversations-ID (auch manchmal als Sitzungs-ID bezeichnet) als eindeutiger Schlüssel (id
eines Azure Cosmos DB-Elements).
Dies ermöglicht einer Anwendung:
- Alle Nachrichten für eine Unterhaltung abzurufen. Dies ist ein Punkt-Lesezugriff unter Verwendung der eindeutigen ID (Konversations-ID) und des Partitionsschlüssels (Benutzer-ID).
- Fügen Sie eine neue Nachricht zu einem Gespräch hinzu. Es verwendet eine upsert-Operation (anstelle von erstellen), um die Notwendigkeit für ein lesen vor dem Schreiben zu vermeiden.
- Löschen Sie ein bestimmtes Gespräch. Es verwendet die löschen-Operation, um ein Gespräch (und alle seine Nachrichten) zu entfernen.
Auch wenn die
langchaingo
-Schnittstelle dies nicht freigibt, können Sie beim integrieren als Teil einer Anwendung auch eine separate Abfrage ausführen, um alle Gespräche für einen Benutzer zu erhalten. Dies ist auch effizient, da es auf eine einzelne Partition beschränkt ist.
Vereinfachen Sie das Testen mit dem Azure Cosmos DB-Emulator und Testcontainern.
Die Beispielanwendung enthält grundlegende Testfälle sowohl für die Azure Cosmos DB Chat-Historie als auch für die Hauptanwendung. Es ist erwähnenswert, dass testcontainers-go verwendet wird, um den Azure Cosmos DB Linux-basierten Emulator Docker-Container zu integrieren.
Dies ist ideal für Integrationstests, da die Datenbank lokal verfügbar ist und die Tests viel schneller durchgeführt werden (nicht zu vergessen die Kosteneinsparungen!). Das Beste daran ist, dass Sie nicht manuell den Lebenszyklus des Docker-Containers verwalten müssen. Dies wird als Teil des Testpakets übernommen, dank der testcontainers-go API
, die es bequem macht, den Container vor dem Teststart zu starten und ihn zu beenden, sobald die Tests abgeschlossen sind.
Sie können sich für weitere Details auf die Testfälle in der Beispielanwendung beziehen. Hier ist ein Ausschnitt, wie testcontainers-go
verwendet wird:
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)
}
// Geben Sie dem Emulator etwas mehr Zeit, um vollständig zu initialisieren
time.Sleep(5 * time.Second)
return container, nil
}
Wenn Sie daran interessiert sind, den Azure Cosmos DB Emulator in CI-Pipelines zu verwenden, schauen Sie sich den Blog-Beitrag an.
Zusammenfassung
Die Möglichkeit, Chat-Verlauf zu speichern, ist ein wichtiger Bestandteil von Conversational AI-Apps. Sie können eine großartige Ergänzung zu bestehenden Techniken wie RAG (retrieval-augmented generation) darstellen. Probieren Sie die Chatbot-Anwendung aus und lassen Sie uns wissen, was Sie denken!
Obwohl die Implementierung in der Beispielanwendung relativ einfach ist, hängt die Modellierung der Chat-Verlaufsdaten von den Anforderungen ab. Ein solches Szenario, das präsentiert wurde, ist dieser ausgezeichnete Blog-Beitrag über die Skalierung von Microsoft Copilot auf Millionen von Benutzern mit Azure Cosmos DB.
Einige Ihrer Anforderungen könnten sein:
- Speichern von Metadaten, wie Reaktionen (zusätzlich zu Nachrichten)
- Anzeigen der neuesten N-Nachrichten
- Berücksichtigung der Chat-Verlaufsdaten-Aufbewahrungsfrist (Verwendung von TTL)
- Einbeziehung zusätzlicher Analysen (zu Benutzerinteraktionen) basierend auf den Chat-Verlaufsdaten und mehr.
Unabhängig von der Implementierung stellen Sie immer sicher, bewährte Verfahren für die Datenmodellierung einzubeziehen. Siehe hier für Richtlinien.
Verwenden Sie bereits Azure Cosmos DB für Ihre Go-Anwendungen oder planen Sie dies? Wir würden gerne von Ihnen hören! Senden Sie uns Ihre Fragen und Ihr Feedback.
Source:
https://dzone.com/articles/chat-history-ai-applications-azure-cosmos-db-go-sdk