La lotta per la supremazia dell'IA
Questo post è stato originariamente pubblicato su The Sequence.
Cos'è LangChain
I Large Language Models (LLM) sono la nuova ondata tecnologica. I giganti, Google e Microsoft, stanno entrando nel Colosseo per combattere la battaglia dell'IA e conquistare la corona della ricerca. Questo scontro colossale è solo l'inizio della svolta degli LLM, e LangChain è qui per contribuire a spingerla ancora oltre. Da soli, gli LLM offrono buone capacità conversazionali con memoria limitata e una tendenza ad avere allucinazioni nelle loro risposte. Un esempio di questa allucinazione è quando chiedi a ChatGPT: "Quali sono i livelli di difficoltà in Read Dead Redemption"; ChatGPT risponderà affermando che non ci sono impostazioni di difficoltà. Questa risposta è errata, poiché RDR ha 3 livelli di difficoltà impostati. Poiché l'LLM genera risposte usando i suoi pesi, verificare le informazioni o fornire fonti è impossibile.
E se volessimo che gli LLM rispondessero a domande e riassumessero i nostri dati?
E se volessimo la possibilità di fornire le fonti delle risposte?
E se volessimo che gli LLM ricordassero conversazioni precedenti che sono al di fuori del limite di token?
È qui che entra in gioco LangChain. LangChain è un framework che ti consente di concatenare diverse computazioni e conoscenze con gli LLM per spingere l'utilità degli LLM ancora oltre. LangChain ti permette di creare chatbot specifici per dominio, agenti di azione per computazioni specifiche, ecc.
Quale ruolo svolge Milvus
Quindi dove entra in gioco Milvus? Gli LLM possono elaborare solo una certa quantità di token (circa quattro caratteri) alla volta, il che significa che gli LLM non possono analizzare un documento di grandi dimensioni o una raccolta di documenti. Per aggirare questo problema, possiamo archiviare tutti i nostri documenti in un database, cercare solo i documenti pertinenti alla domanda in input e fornire quei documenti all'LLM per la generazione della risposta. Milvus è perfetto per questo, poiché possiamo sfruttare la ricerca semantica per recuperare documenti più pertinenti più velocemente. Iniziamo prendendo tutti i documenti che analizziamo e convertendo i testi in embedding. Un vantaggio significativo è che possiamo usare l'LLM originale per generare gli embedding, mantenendo in definitiva il "processo di pensiero" dell'LLM nella nostra ricerca. Con tutti i dati incorporati, possiamo archiviare (embedding e testo originale) insieme a eventuali metadati all'interno di Milvus. Poi, quando arriva una query, possiamo prendere il testo della query, incorporarlo usando lo stesso modello, cercare i testi pertinenti e passarli al nostro LLM per generare risposte. Sebbene questa pipeline sembri semplice, crearla può richiedere molto lavoro. Fortunatamente, LangChain rende facile realizzare una pipeline del genere e offre il wrapper VectorStore per i database vettoriali.
Integrazione
Ecco l'integrazione su cui ho lavorato tra Milvus e LangChain.
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."""
Come accennato in precedenza, l'integrazione di Milvus in LangChain implica l'estensione della classe VectorStore. Per farlo, abbiamo dovuto implementare alcune funzioni chiave: add_texts(), similarity_search(), max_marginal_relevance_search() e from_text(). Il VectorStore di Milvus segue una pipeline semplice nella maggior parte dei casi d'uso. Inizia prima ricevendo una raccolta di Documents. Nella maggior parte dei progetti LLM, un Document è una classe di dati che contiene il testo originale e tutti i metadati che lo accompagnano. I metadati del Document sono solitamente basati su JSON, consentendo un'archiviazione più accessibile all'interno di Milvus. Una volta che il VectorStore di Milvus consuma un Document, incorpora il testo contenuto al suo interno utilizzando la funzione di embedding fornita. Nella maggior parte dei sistemi di produzione, queste funzioni di embedding sono solitamente servizi LLM di terze parti come OpenAI, Cohere, ecc. Tuttavia, è possibile utilizzare il proprio modello purché si fornisca una funzione che accetti un input di testo e restituisca un vettore. In questa fase della pipeline, LangChain trasferisce il controllo a Milvus stesso. Milvus riceve l'embedding, il testo originale e i metadati e li archivia in una collection. Man mano che sempre più di questi documenti entrano nella collection, vengono creati indici per ricerche più rapide tra tutti gli embedding archiviati.
L'ultima fase di questa pipeline consiste nell'eseguire ricerche di dati pertinenti. Quando un utente invia una domanda, il testo e i filtri dei metadati vengono inviati al VectorStore di Milvus. Utilizzando la stessa funzione di embedding di prima, Milvus incorpora la domanda ed esegue una ricerca di similarità sui suoi dati. Milvus offre due tipi di ricerche come VectorStore: una predefinita che restituisce gli oggetti nel loro ordine non modificato e una in cui viene utilizzato l'ordinamento per massima rilevanza marginale. L'ordinamento per massima rilevanza marginale funziona trovando gli esempi con gli embedding che hanno la maggiore similarità coseno con gli input e poi aggiungendoli iterativamente, penalizzandoli per la vicinanza agli esempi già selezionati.
L'integrazione di Milvus in LangChain ha comportato alcuni intoppi, il più importante dei quali è che Milvus non può gestire JSON. La mancanza di supporto per JSON ha reso le cose difficili a causa della natura del modo in cui le configurazioni vengono generate per Milvus. Attualmente, ci sono solo due percorsi per utilizzare il VectorStore di Milvus: creare un VectorStore su una collection Milvus già esistente o creare un VectorStore basato sul primo documento passato a Milvus. Se la Collection esiste già, lo schema è immutabile. Tutti i dati che vengono aggiunti devono seguire lo schema alla lettera; se qualche dato manca o è malformato, il sistema ignorerà l'intera voce.
Allo stesso modo, se vengono aggiunti metadati extra a un Document dopo la creazione della Collection, quei metadati extra verranno ignorati. Questo non si presta a un sistema molto adattabile e comporta la necessità di svolgere parecchio lavoro extra per ripulire gli input e altro lavoro extra nella creazione di una nuova collection. Fortunatamente, nella versione 2.3, Milvus aggiungerà la possibilità di archiviare JSON, semplificando questa integrazione e qualsiasi altra futura. Milvus 2.3 è attualmente in beta, quindi sentiti libero di provarlo e di fornirci qualsiasi feedback!
Conclusione
Il risultato è una memoria di lavoro e una base di conoscenza per gli LLM. Da quando l’integrazione è stata unita, LangChain è cambiato un po’, introducendo l’idea dei Retriever. I Retriever sono un modo per connettersi a uno storage esterno e sono la direzione che LangChain seguirà. A causa della natura in rapida evoluzione di questo progetto, il codice presente nel Milvus VectorStore potrebbe essere più pulito, e i prossimi passi saranno ripulirlo e aggiungere anche questa funzionalità di retriever. Come accennato in precedenza, Milvus non può gestire uno schema dinamico, il che rende molto difficile lavorare con raccolte predefinite e inserimenti a cui mancano dati. Una volta che Milvus supporterà i metadati JSON, sarà il momento di tornare e rifare questa integrazione.
Nel complesso, lavorare a questo progetto è stata un’ottima esperienza. La community è cordiale, e Harrison è molto attivo e disponibile. Non vedo l’ora di vedere le vette che il progetto LangChain raggiungerà.
Continua a leggere

Introducing Loon: A New Storage Engine for Vector Data That Never Stops Changing
Loon is a new storage engine for Milvus 3.0 and Zilliz Vector Lakebase, built to manage evolving vector datasets with ColumnGroups, row ID alignment, and Manifests.

Zilliz Cloud Audit Logs Goes GA: Security, Compliance, and Transparency at Scale
Zilliz Cloud Audit Logs are now GA, giving enterprises real-time visibility, compliance-ready trails, and stronger security across AWS, GCP, and Azure.

Build for the Boom: Why AI Agent Startups Should Build Scalable Infrastructure Early
Explore strategies for developing AI agents that can handle rapid growth. Don't let inadequate systems undermine your success during critical breakthrough moments.



