Der Kampf um die KI-Vorherrschaft
Dieser Beitrag wurde ursprünglich auf The Sequence veröffentlicht.
Was ist LangChain
Large Language Models (LLMs) sind die neue Technologiewelle. Die Giganten Google und Microsoft betreten das Kolosseum, um im KI-Kampf anzutreten und die Krone der Suche zu erobern. Dieser kolossale Kampf ist erst der Beginn des LLM-Durchbruchs, und LangChain ist hier, um dabei zu helfen, ihn noch weiter voranzutreiben. LLMs allein bieten gute Konversationsfähigkeiten mit begrenztem Gedächtnis und einer Neigung, in ihren Antworten zu halluzinieren. Ein Beispiel für diese Halluzination ist, wenn Sie ChatGPT fragen: „What are the difficulty levels in Read Dead Redemption“; ChatGPT wird antworten, dass es keine Schwierigkeitsgrade gibt. Diese Antwort ist falsch, da RDR 3 festgelegte Schwierigkeitsgrade hat. Da das LLM Antworten mithilfe seiner Gewichte generiert, ist es unmöglich, Informationen zu verifizieren oder Quellen bereitzustellen.
Was, wenn wir möchten, dass LLMs Fragen beantworten und unsere Daten zusammenfassen?
Was, wenn wir die Möglichkeit haben möchten, Quellen für Antworten bereitzustellen?
Was, wenn wir möchten, dass LLMs sich an frühere Gespräche erinnern, die außerhalb des Token-Limits liegen?
Hier kommt LangChain ins Spiel. LangChain ist ein Framework, mit dem Sie verschiedene Berechnungen und Wissen mit LLMs verketten können, um den Nutzen von LLMs noch weiter zu steigern. LangChain ermöglicht es Ihnen, domänenspezifische Chatbots, Action Agents für bestimmte Berechnungen usw. zu erstellen.
Welche Rolle Milvus spielt
Wo kommt also Milvus ins Spiel? LLMs können jeweils nur eine bestimmte Menge an Tokens (etwa vier Zeichen) verarbeiten, was bedeutet, dass LLMs kein großes Dokument oder keine Sammlung von Dokumenten analysieren können. Um dies zu umgehen, können wir alle unsere Dokumente in einer Datenbank speichern, nur nach den für die Eingabefrage relevanten Dokumenten suchen und diese Dokumente zur Antwortgenerierung in das LLM einspeisen. Milvus ist dafür perfekt geeignet, da wir semantische Suche nutzen können, um relevantere Dokumente schneller abzurufen. Wir beginnen damit, alle Dokumente, die wir analysieren, zu nehmen und die Texte in Embeddings umzuwandeln. Ein wesentlicher Vorteil ist, dass wir das ursprüngliche LLM verwenden können, um die Embeddings zu generieren, wodurch wir letztendlich den „Denkprozess“ des LLM in unserer Suche beibehalten. Nachdem alle Daten eingebettet sind, können wir das (Embedding und den Originaltext) zusammen mit allen Metadaten in Milvus speichern. Wenn dann eine Abfrage eingeht, können wir den Abfragetext nehmen, ihn mit demselben Modell einbetten, nach den relevanten Texten suchen und sie in unser LLM einspeisen, um Antworten zu generieren. Obwohl diese Pipeline einfach klingt, kann ihre Erstellung viel Arbeit erfordern. Glücklicherweise macht LangChain es einfach, eine solche Pipeline umzusetzen, und bietet den VectorStore-Wrapper für Vektordatenbanken.
Integration
Hier ist die Integration, an der ich zwischen Milvus und LangChain gearbeitet habe.
class VectorStore(ABC):
"""Interface for vector stores."""
@abstractmethod
def add_texts(
self,
texts: Iterable[str],
metadatas: Optional[List[dict]] = None,
**kwargs: Any,
) -> List[str]:
"""Run more texts through the embeddings and add to the vectorstore."""
@abstractmethod
def similarity_search(
self, query: str, k: int = 4, **kwargs: Any
) -> List[Document]:
"""Return docs most similar to query."""
def max_marginal_relevance_search(
self, query: str, k: int = 4, fetch_k: int = 20
) -> List[Document]:
"""Return docs selected using the maximal marginal relevance."""
raise NotImplementedError
@classmethod
@abstractmethod
def from_texts(
cls: Type[VST],
texts: List[str],
embedding: Embeddings,
metadatas: Optional[List[dict]] = None,
**kwargs: Any,
) -> VST:
"""Return VectorStore initialized from texts and embeddings."""
Wie bereits erwähnt, beinhaltet die Integration von Milvus in LangChain die Erweiterung der VectorStore-Klasse. Dafür mussten wir einige zentrale Funktionen implementieren: add_texts(), similarity_search(), max_marginal_relevance_search() und from_text(). Der Milvus VectorStore folgt in den meisten Anwendungsfällen einer einfachen Pipeline. Zunächst erhält er eine Sammlung von Documents. In den meisten LLM-Projekten ist ein Document eine Datenklasse, die den ursprünglichen Text und alle zugehörigen Metadaten enthält. Die Metadaten des Documents basieren in der Regel auf JSON, was eine leichter zugängliche Speicherung innerhalb von Milvus ermöglicht. Sobald der Milvus VectorStore ein Document verarbeitet, bettet er den darin enthaltenen Text mithilfe der ihm bereitgestellten Embedding-Funktion ein. In den meisten Produktionssystemen sind diese Embedding-Funktionen üblicherweise LLM-Dienste von Drittanbietern wie OpenAI, Cohere usw. Es ist jedoch möglich, Ihr eigenes Modell zu verwenden, solange Sie eine Funktion bereitstellen, die eine Texteingabe akzeptiert und einen Vektor zurückgibt. An diesem Punkt in der Pipeline übergibt LangChain die Kontrolle an Milvus selbst. Milvus nimmt das Embedding, den ursprünglichen Text und die Metadaten entgegen und speichert sie in einer Collection. Wenn immer mehr dieser Dokumente in die Collection gelangen, werden Indizes erstellt, um schnellere Suchen über alle gespeicherten Embeddings hinweg zu ermöglichen.
Die letzte Phase dieser Pipeline besteht darin, Suchen nach relevanten Daten durchzuführen. Wenn ein Benutzer eine Frage sendet, werden die Text- und Metadatenfilter an den Milvus VectorStore gesendet. Mit derselben Embedding-Funktion wie zuvor bettet Milvus die Frage ein und führt eine Ähnlichkeitssuche über seine Daten durch. Milvus bietet als VectorStore zwei Arten von Suchen an: eine Standardvariante, die die Objekte in ihrer unveränderten Reihenfolge zurückgibt, und eine, bei der die Max-Marginal-Relevance-Sortierung verwendet wird. Die Max-Marginal-Relevance-Sortierung funktioniert, indem die Beispiele mit den Embeddings gefunden werden, die die größte Kosinusähnlichkeit mit den Eingaben aufweisen, und diese dann iterativ hinzugefügt werden, wobei sie für die Nähe zu bereits ausgewählten Beispielen abgestraft werden.
Die Integration von Milvus in LangChain brachte einige Stolpersteine mit sich, von denen der auffälligste war, dass Milvus nicht mit JSON umgehen kann. Die fehlende JSON-Unterstützung erschwerte die Dinge aufgrund der Art und Weise, wie die Konfigurationen für Milvus erzeugt werden. Derzeit gibt es nur zwei Wege, den Milvus VectorStore zu verwenden: das Erstellen eines VectorStore auf einer bereits bestehenden Milvus Collection oder das Erstellen eines VectorStore basierend auf dem ersten Document, das an Milvus übergeben wird. Wenn die Collection bereits existiert, ist das Schema unveränderlich festgelegt. Alle Daten, die hinzugefügt werden, müssen dem Schema bis aufs „i-Tüpfelchen“ folgen; wenn Daten fehlen oder fehlerhaft formatiert sind, ignoriert das System den gesamten Eintrag.
Ebenso werden zusätzliche Metadaten, die nach dem Erstellen der Collection zu einem Document hinzugefügt werden, ignoriert. Das eignet sich nicht besonders gut für ein sehr anpassungsfähiges System und führt dazu, dass ziemlich viel zusätzliche Arbeit für die Bereinigung von Eingaben sowie zusätzliche Arbeit beim Erstellen einer neuen Collection erforderlich ist. Glücklicherweise wird Milvus in Version 2.3 die Möglichkeit hinzufügen, JSON zu speichern, wodurch diese Integration und alle weiteren vereinfacht werden. Milvus 2.3 befindet sich derzeit in der Beta-Phase, also probieren Sie es gerne aus und geben Sie uns Feedback!
Fazit
Das Ergebnis ist ein funktionierender Arbeitsspeicher und eine Wissensdatenbank für LLMs. Seit die Integration zusammengeführt wurde, hat sich LangChain ein wenig verändert und das Konzept der Retriever eingeführt. Retriever sind eine Möglichkeit, eine Verbindung zu externem Speicher herzustellen, und sie sind der Weg, den LangChain einschlagen wird. Aufgrund der sich schnell entwickelnden Natur dieses Projekts könnte der im Milvus VectorStore vorhandene Code sauberer sein, und die nächsten Schritte werden darin bestehen, ihn aufzuräumen und außerdem diese Retriever-Funktionalität hinzuzufügen. Wie bereits erwähnt, kann Milvus kein dynamisches Schema verarbeiten, was den Umgang mit vorgefertigten Collections und Einfügungen, bei denen Daten fehlen, sehr schwierig macht. Sobald Milvus JSON-Metadaten unterstützt, wird es an der Zeit sein, zurückzukehren und diese Integration neu umzusetzen.
Insgesamt war die Arbeit an diesem Projekt eine großartige Erfahrung. Die Community ist freundlich, und Harrison ist sehr aktiv und hilfsbereit. Ich freue mich darauf zu sehen, welche Höhen das LangChain-Projekt erreicht.
Weiterlesen

Introducing Zilliz MCP Server: Natural Language Access to Your Vector Database
Developers can easily manage and query vector databases with natural language via Zilliz MCP Server in AI-native environments.

How to Use Anthropic MCP Server with Milvus
MCP + Milvus: Streamline AI agent development with standardized data access, eliminating integration hassles while enhancing context and flexibility.

DeepSeek-VL2: Mixture-of-Experts Vision-Language Models for Advanced Multimodal Understanding
Explore DeepSeek-VL2, the open-source MoE vision-language model. Discover its architecture, efficient training pipeline, and top-tier performance.



