A Luta pela Supremacia da IA
Este post foi originalmente publicado em The Sequence.
O que é LangChain
Large Language Models (LLMs) são a nova onda tecnológica. Os gigantes, Google e Microsoft, estão entrando no Coliseu para lutar na batalha da IA e conquistar a coroa das buscas. Essa luta colossal é apenas o começo do avanço dos LLMs, e LangChain está aqui para ajudar a impulsioná-lo ainda mais. LLMs sozinhos oferecem boas capacidades conversacionais com memória limitada e uma tendência a alucinar em suas respostas. Um exemplo dessa alucinação é quando você pergunta ao ChatGPT: "Quais são os níveis de dificuldade em Read Dead Redemption"; o ChatGPT responderá afirmando que não há configurações de dificuldade. Essa resposta está incorreta, pois RDR tem 3 níveis de dificuldade definidos. Como o LLM gera respostas usando seus pesos, é impossível verificar informações ou fornecer fontes.
E se quisermos que LLMs respondam a perguntas e resumam nossos dados?
E se quisermos a capacidade de fornecer fontes das respostas?
E se quisermos que LLMs se lembrem de conversas anteriores que estão fora do limite de tokens?
É aqui que o LangChain entra. LangChain é um framework que permite encadear diferentes computações e conhecimentos com LLMs para levar a utilidade dos LLMs ainda mais longe. LangChain permite criar chatbots específicos de domínio, agentes de ação para computação específica etc.
Qual papel o Milvus desempenha
Então, onde Milvus entra em cena? LLMs só conseguem processar uma certa quantidade de tokens (cerca de quatro caracteres) por vez, o que significa que LLMs não conseguem analisar um documento grande ou uma coleção de documentos. Para contornar isso, podemos armazenar todos os nossos documentos em um banco de dados, buscar apenas os documentos relevantes para a pergunta de entrada e alimentar esses documentos no LLM para a geração da resposta. Milvus é perfeito para isso, pois podemos aproveitar a busca semântica para recuperar documentos mais relevantes mais rapidamente. Começamos pegando todos os documentos que analisamos e convertendo os textos em embeddings. Um benefício significativo é que podemos usar o LLM original para gerar os embeddings, mantendo, em última análise, o "processo de pensamento" do LLM em nossa busca. Com todos os dados incorporados, podemos armazenar o (embedding e texto original) junto com quaisquer metadados no Milvus. Então, quando uma consulta chega, podemos pegar o texto da consulta, incorporá-lo usando o mesmo modelo, buscar os textos relevantes e alimentá-los em nosso LLM para gerar respostas. Embora esse pipeline pareça simples, criá-lo pode dar bastante trabalho. Felizmente, LangChain facilita a criação de tal pipeline e oferece o wrapper VectorStore para bancos de dados vetoriais.
Integração
Aqui está a integração em que trabalhei entre 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."""
Como mencionado anteriormente, integrar o Milvus ao LangChain envolve estender a classe VectorStore. Para fazer isso, precisamos implementar algumas funções-chave: add_texts(), similarity_search(), max_marginal_relevance_search() e from_text(). O Milvus VectorStore segue um pipeline simples na maioria dos casos de uso. Ele começa recebendo uma coleção de Documents. Na maioria dos projetos de LLM, um Document é uma classe de dados que contém o texto original e todos os metadados que vêm com ele. Os metadados do Document geralmente são baseados em JSON, permitindo um armazenamento mais acessível dentro do Milvus. Depois que o Milvus VectorStore consome um Document, ele incorpora o texto encontrado nele usando a função de embedding fornecida a ele. Na maioria dos sistemas de produção, essas funções de embedding geralmente são serviços de LLM de terceiros, como OpenAI, Cohere etc. No entanto, é possível usar seu modelo, desde que você forneça uma função que aceite uma entrada de texto e retorne um vetor. Nesta etapa do pipeline, o LangChain transfere o controle para o próprio Milvus. O Milvus recebe o embedding, o texto original e os metadados e os armazena em uma coleção. À medida que mais e mais desses documentos entram na coleção, índices são criados para buscas mais rápidas em todos os embeddings armazenados.
A última etapa desse pipeline é realizar buscas por dados relevantes. Quando um usuário envia uma pergunta, o texto e os filtros de metadados são enviados para o Milvus VectorStore. Usando a mesma função de embedding de antes, o Milvus incorpora a pergunta e realiza uma busca por similaridade em seus dados. O Milvus oferece dois tipos de busca como um VectorStore: uma padrão, que retorna os objetos em sua ordem não modificada, e outra em que a ordenação por relevância marginal máxima é usada. A ordenação por relevância marginal máxima funciona encontrando os exemplos com os embeddings que têm a maior similaridade de cosseno com as entradas e, em seguida, adicionando-os iterativamente enquanto os penaliza pela proximidade com exemplos já selecionados.
Integrar o Milvus ao LangChain trouxe alguns contratempos, o mais proeminente sendo que o Milvus não consegue lidar com JSON. A falta de suporte a JSON dificultou as coisas devido à natureza de como as configurações são geradas para o Milvus. Atualmente, há apenas dois caminhos para usar o Milvus VectorStore: criar um VectorStore em uma coleção Milvus já existente ou criar um VectorStore com base no primeiro documento passado para o Milvus. Se a Collection já existir, o schema fica definido de forma definitiva. Todos os dados adicionados precisam seguir o schema à risca; se algum dado estiver ausente ou malformado, o sistema ignorará a entrada inteira.
Da mesma forma, se qualquer metadado extra for adicionado a um Document depois que a Collection for criada, esse metadado extra será ignorado. Isso não favorece um sistema muito adaptável e resulta na necessidade de bastante trabalho extra para limpar entradas e trabalho extra para criar uma nova coleção. Felizmente, na versão 2.3, o Milvus adicionará a capacidade de armazenar JSON, simplificando esta integração e quaisquer outras futuras. Milvus 2.3 está atualmente em beta, então sinta-se à vontade para conferir e nos fornecer qualquer feedback!
Conclusão
O resultado é uma memória de trabalho e uma base de conhecimento para LLMs. Desde que a integração foi mesclada, o LangChain mudou um pouco, trazendo a ideia de Retrievers. Retrievers são uma forma de se conectar ao armazenamento externo e são o caminho que o LangChain seguirá. Devido à natureza acelerada deste projeto, o código encontrado no Milvus VectorStore poderia ser mais limpo, e os próximos passos serão limpá-lo e também adicionar essa funcionalidade de retriever. Como mencionado anteriormente, o Milvus não consegue lidar com um esquema dinâmico, tornando muito difícil lidar com coleções pré-criadas e inserções com dados ausentes. Quando o Milvus oferecer suporte a metadados JSON, será hora de voltar e refazer esta integração.
No geral, trabalhar neste projeto tem sido uma ótima experiência. A comunidade é amigável, e Harrison é muito ativo e prestativo. Estou ansioso para ver os patamares que o projeto LangChain alcançará.
Continue lendo

Why Teams Are Migrating from Weaviate to Zilliz Cloud — and How to Do It Seamlessly
Explore how Milvus scales for large datasets and complex queries with advanced features, and discover how to migrate from Weaviate to Zilliz Cloud.

Zilliz Cloud Now Available in Azure North Europe: Bringing AI-Powered Vector Search Closer to European Customers
The addition of the Azure North Europe (Ireland) region further expands our global footprint to better serve our European customers.

Why Deepseek is Waking up AI Giants Like OpenAI And Why You Should Care
Discover how DeepSeek R1's open-source AI model with superior reasoning capabilities and lower costs is disrupting the AI landscape and challenging tech giants like OpenAI.



