🚀 Testen Sie Zilliz Cloud, die vollständig verwaltete Milvus, kostenlos – erleben Sie 10x schnellere Leistung! Jetzt testen>>

milvus-logo
LFAI

HomeBlogsKonversationsspeicher in LangChain

Konversationsspeicher in LangChain

  • Engineering
June 06, 2023
Yujian Tang

LangChain ist ein robuster Rahmen für die Erstellung von LLM-Anwendungen. Mit dieser Leistung kommt jedoch auch ein gewisses Maß an Komplexität. LangChain bietet viele Möglichkeiten, einen LLM aufzufordern und wesentliche Funktionen wie den Konversationsspeicher. Der Konversationsspeicher bietet dem LLM einen Kontext, um sich an Ihren Chat zu erinnern.

In diesem Beitrag sehen wir uns an, wie man den Gesprächsspeicher mit LangChain und Milvus verwendet. Dazu müssen Sie auf pip vier Bibliotheken und einen OpenAI-API-Schlüssel installieren. Die vier Bibliotheken, die Sie benötigen, können Sie installieren, indem Sie pip install langchain milvus pymilvus python-dotenv ausführen. Oder führen Sie den ersten Block im CoLab Notebook für diesen Artikel aus.

In diesem Beitrag erfahren wir mehr über:

  • Konversationsspeicher mit LangChain
  • Einrichten des Konversationskontextes
  • Das Gesprächsgedächtnis mit LangChain auffordern
  • LangChain Gesprächsgedächtnis Zusammenfassung

Konversationsspeicher mit LangChain

In der Standardeinstellung interagieren Sie mit einem LLM durch einzelne Prompts. Das Hinzufügen eines Kontextspeichers oder "Konversationsspeichers" bedeutet, dass Sie nicht mehr alles über einen Prompt senden müssen. LangChain bietet die Möglichkeit, die Konversation zu speichern, die Sie bereits mit einem LLM geführt haben, um diese Informationen später abzurufen.

Um ein persistentes Gesprächsgedächtnis mit einem Vektorspeicher einzurichten, benötigen wir sechs Module von LangChain. Zuerst müssen wir den OpenAIEmbeddings und den OpenAI LLM besorgen. Außerdem benötigen wir VectorStoreRetrieverMemory und die LangChain-Version von Milvus, um ein Vektorspeicher-Backend zu verwenden. Dann brauchen wir ConversationChain und PromptTemplate, um unsere Konversation zu speichern und sie abzufragen.

Die Bibliotheken os, dotenv und openai sind hauptsächlich für operative Zwecke gedacht. Wir verwenden sie, um den OpenAI-API-Schlüssel zu laden und zu verwenden. Der letzte Einrichtungsschritt besteht darin, eine lokale Milvus-Lite-Instanz einzurichten. Dazu verwenden wir die default_server aus dem Milvus-Python-Paket.

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.llms import OpenAI
from langchain.memory import VectorStoreRetrieverMemory
from langchain.chains import ConversationChain
from langchain.prompts import PromptTemplate
from langchain.vectorstores import Milvus
embeddings = OpenAIEmbeddings()


import os
from dotenv import load_dotenv
import openai
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")


from milvus import default_server
default_server.start()

Einrichten des Konversationskontextes

Nachdem wir nun alle Voraussetzungen geschaffen haben, können wir mit der Erstellung unseres Gesprächsspeichers fortfahren. Unser erster Schritt besteht darin, mit LangChain eine Verbindung zum Milvus-Server herzustellen. Als nächstes verwenden wir ein leeres Wörterbuch, um unsere LangChain-Milvus-Sammlung zu erstellen. Außerdem geben wir die oben erstellten Einbettungen und die Verbindungsdetails für den Milvus-Lite-Server an.

Um die Vektordatenbank für den Konversationsspeicher zu verwenden, müssen wir sie als Retriever instanziieren. Wir rufen in diesem Fall nur das Top-1-Ergebnis ab und setzen k=1. Der letzte Schritt bei der Einrichtung des Konversationsspeichers ist die Verwendung des Objekts VectorStoreRetrieverMemory als Konversationsspeicher über die soeben eingerichtete Verbindung zwischen Retriever und Vektordatenbank.

Um unseren Konversationsspeicher zu verwenden, muss er einen Kontext enthalten. Geben wir dem Speicher also etwas Kontext. Für dieses Beispiel geben wir fünf Informationen an. Wir speichern meinen Lieblingssnack (Schokolade), Sport (Schwimmen), Bier (Guinness), Nachtisch (Käsekuchen) und Musiker (Taylor Swift). Jeder Eintrag wird über die Funktion save_context im Speicher abgelegt.

vectordb = Milvus.from_documents(
   {},
   embeddings,
   connection_args={"host": "127.0.0.1", "port": default_server.listen_port})
retriever = Milvus.as_retriever(vectordb, search_kwargs=dict(k=1))
memory = VectorStoreRetrieverMemory(retriever=retriever)
about_me = [
   {"input": "My favorite snack is chocolate",
    "output": "Nice"},
   {"input": "My favorite sport is swimming",
    "output": "Cool"},
   {"input": "My favorite beer is Guinness",
    "output": "Great"},
   {"input": "My favorite dessert is cheesecake",
    "output": "Good to know"},
   {"input": "My favorite musician is Taylor Swift",
    "output": "Same"}
]
for example in about_me:
   memory.save_context({"input": example["input"]}, {"output": example["output"]})

Prompting des Gesprächsspeichers mit LangChain

Es ist an der Zeit, sich anzusehen, wie wir unser Gesprächsgedächtnis nutzen können. Beginnen wir mit der Verbindung zum OpenAI LLM über LangChain. Wir verwenden eine Temperatur von 0, um anzuzeigen, dass wir nicht wollen, dass unser LLM kreativ ist.

Als nächstes erstellen wir eine Vorlage. Wir teilen dem LLM mit, dass er sich in einem freundlichen Gespräch mit einem Menschen befindet und fügen zwei Variablen ein. Die Variable history liefert den Kontext aus dem Gesprächsspeicher. Die Variable input liefert die aktuelle Eingabe. Wir verwenden das Objekt PromptTemplate, um diese Variablen einzufügen.

Wir verwenden das Objekt ConversationChain, um unsere Eingabeaufforderung, das LLM und den Speicher zu kombinieren. Nun sind wir bereit, das Gedächtnis unserer Konversation zu überprüfen, indem wir ihr einige Prompts geben. Wir beginnen damit, dem LLM mitzuteilen, dass unser Name Gary ist, der Hauptkonkurrent in der Pokemon-Serie (alles andere im Gesprächsspeicher ist eine Tatsache über mich).

llm = OpenAI(temperature=0) # Can be any valid LLM
_DEFAULT_TEMPLATE = """The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.


Relevant pieces of previous conversation:
{history}


(You do not need to use these pieces of information if not relevant)


Current conversation:
Human: {input}
AI:"""
PROMPT = PromptTemplate(
   input_variables=["history", "input"], template=_DEFAULT_TEMPLATE
)
conversation_with_summary = ConversationChain(
   llm=llm,
   prompt=PROMPT,
   memory=memory,
   verbose=True
)
conversation_with_summary.predict(input="Hi, my name is Gary, what's up?")

Das Bild unten zeigt, wie eine erwartete Antwort des LLM aussehen könnte. In diesem Beispiel hat es geantwortet, indem es sagte, sein Name sei "AI".

Nun wollen wir das Gedächtnis testen. Wir verwenden das Objekt ConversationChain, das wir zuvor erstellt haben, und fragen nach meinem Lieblingsmusiker.

conversation_with_summary.predict(input="who is my favorite musician?")

Das Bild unten zeigt eine erwartete Antwort der Conversation Chain. Da wir die ausführliche Option verwendet haben, wird uns auch die entsprechende Unterhaltung angezeigt. Wir sehen, dass die Antwort wie erwartet lautet, dass meine Lieblingskünstlerin Taylor Swift ist.

Als nächstes wollen wir nach meinem Lieblingsdessert - Käsekuchen - suchen.

conversation_with_summary.predict(input="Whats my favorite dessert?")

Bei der Abfrage nach meinem Lieblingsdessert können wir sehen, dass die Conversation Chain wieder die richtigen Informationen von Milvus auswählt. Sie stellt fest, dass mein Lieblingsdessert Käsekuchen ist, wie ich es bereits gesagt habe.

Nachdem wir nun bestätigt haben, dass wir die Informationen abfragen können, die wir zuvor gegeben haben, wollen wir noch eine weitere Sache überprüfen - die Informationen, die wir zu Beginn unserer Unterhaltung gegeben haben. Wir haben unser Gespräch begonnen, indem wir der KI gesagt haben, dass unser Name Gary ist.

conversation_with_summary.predict(input="What's my name?")

Unsere abschließende Prüfung ergibt, dass die Konversationskette das Bit über unseren Namen in unserem Vektorspeicher für Konversationen gespeichert hat. Sie gibt zurück, dass wir gesagt haben, unser Name sei Gary.

LangChain Konversationsspeicher Zusammenfassung

In diesem Tutorial haben wir gelernt, wie man den Konversationsspeicher in LangChain verwendet. LangChain bietet Zugang zu Vektorspeicher-Backends wie Milvus für persistenten Konversationsspeicher. Wir können den Konversationsspeicher nutzen, indem wir einen Verlauf in unsere Prompts einfügen und den historischen Kontext im ConversationChain Objekt speichern.

Für dieses Beispiel-Tutorial haben wir der Konversationskette fünf Fakten über mich gegeben und so getan, als wäre ich der Hauptkonkurrent in Pokemon, Gary. Dann haben wir die Gesprächskette mit Fragen zu dem von uns gespeicherten Vorwissen - mein Lieblingsmusiker und mein Lieblingsdessert - gelöchert. Sie beantwortete beide Fragen richtig und zeigte die entsprechenden Einträge an. Schließlich fragten wir nach unserem Namen, den wir zu Beginn des Gesprächs angegeben hatten, und es wurde korrekt zurückgegeben, dass wir gesagt hatten, unser Name sei "Gary".

Like the article? Spread the word

Weiterlesen