Pular para o conteúdo principal

Tutorial do Chroma DB: Um guia passo a passo

Com o Chroma DB, você pode gerenciar facilmente documentos de texto, converter texto em embeddings e fazer pesquisas de similaridade.
24 de abr. de 2024  · 10 min de leitura

 

Com o surgimento dos modelos de linguagem grande (LLMs) e seus aplicativos, observamos um aumento na popularidade de ferramentas de integração, estruturas LLMOps e bancos de dados vetoriais. Isso ocorre porque trabalhar com LLMs requer uma abordagem diferente dos modelos tradicionais de aprendizado de máquina.

Uma das principais tecnologias de capacitação para LLMs é a incorporação de vetores. Embora os computadores não consigam entender diretamente o texto, os embeddings representam o texto numericamente. Todo o texto fornecido pelo usuário é convertido em embeddings, que são usados para gerar respostas.

A conversão de texto em incorporação é um processo demorado. Para evitar isso, temos bancos de dados de vetores projetados explicitamente para o armazenamento e a recuperação eficientes de embeddings de vetores.

Neste tutorial, aprenderemos sobre armazenamentos de vetores e o Chroma DB, um banco de dados de código aberto para armazenar e gerenciar embeddings. Além disso, aprenderemos a adicionar e remover documentos, realizar pesquisas de similaridade e converter nosso texto em embeddings.

Imagem do autor

O que são lojas de vetores?

Os armazenamentos de vetores são bancos de dados projetados explicitamente para armazenar e recuperar incorporação de vetores de forma eficiente. Eles são necessários porque os bancos de dados tradicionais, como o SQL, não são otimizados para armazenar e consultar dados vetoriais grandes.

Os embeddings representam dados (geralmente dados não estruturados, como texto) em formatos de vetores numéricos em um espaço de alta dimensão. Os bancos de dados relacionais tradicionais não são adequados para armazenar e pesquisar essas representações vetoriais.

Os armazenamentos de vetores podem indexar e pesquisar rapidamente vetores semelhantes usando algoritmos de similaridade. Ele permite que os aplicativos encontrem vetores relacionados a partir de uma consulta de vetor de destino.

No caso de um chatbot personalizado, o usuário insere um prompt para o modelo de IA generativo. Em seguida, o modelo procura textos semelhantes em uma coleção de documentos usando um algoritmo de pesquisa de similaridade. As informações resultantes são então usadas para gerar uma resposta altamente personalizada e precisa. Isso é possível por meio da incorporação e da indexação de vetores em armazenamentos de vetores.

O que é o Chroma DB?

O Chroma DB é um armazenamento de vetores de código aberto usado para armazenar e recuperar embeddings de vetores. Seu principal uso é salvar embeddings junto com metadados para serem usados posteriormente por grandes modelos de linguagem. Além disso, ele também pode ser usado para mecanismos de pesquisa semântica em dados de texto.

Principais recursos do Chroma DB:

  • Oferece suporte a diferentes opções de armazenamento subjacente, como DuckDB para autônomo ou ClickHouse para escalabilidade.
  • Fornece SDKs para Python e JavaScript/TypeScript.
  • Concentra-se na simplicidade, na velocidade e na análise de habilitação.

O Chroma DB oferece uma opção de servidor auto-hospedado. Se você precisar de uma plataforma de banco de dados vetorial gerenciada, consulte o Pinecone Guide for Mastering Vector Databases.

Imagem do Chroma

Imagem do Chroma

Como o Chroma DB funciona?

  1. Primeiro, você precisa criar uma coleção semelhante às tabelas no banco de dados de relações. Por padrão, o Chroma converte o texto em embeddings usando all-MiniLM-L6-v2, mas você pode modificar a coleção para usar outro modelo de embedding.
  2. Adicione documentos de texto à coleção recém-criada com metadados e um ID exclusivo. Quando sua coleção recebe o texto, ela o converte automaticamente em incorporação.
  3. Consulte a coleção por texto ou incorporação para receber documentos semelhantes. Você também pode filtrar os resultados com base em metadados.

Na próxima parte, usaremos o Chroma e a API OpenAI para criar nosso próprio banco de dados vetorial.

Primeiros passos com o Chroma DB

Nesta seção, criaremos um banco de dados vetorial, adicionaremos coleções, adicionaremos texto à coleção e realizaremos uma pesquisa de consulta.

Primeiro, instalaremos o chromadb para o banco de dados de vetores e o openai para obter um modelo de incorporação melhor. Certifique-se de que você configurou a chave da API da OpenAI.

Observação: O Chroma requer o SQLite versão 3.35 ou superior. Se você tiver problemas, atualize para o Python 3.11 ou instale uma versão mais antiga do chromadb.

!pip install chromadb openai 

Você pode criar um banco de dados na memória para testes, criando um cliente Chroma DB sem configurações.

No nosso caso, criaremos um banco de dados persistente que será armazenado no diretório "db/" e usaremos o DuckDB no backend.

import chromadb
from chromadb.config import Settings


client = chromadb.Client(Settings(chroma_db_impl="duckdb+parquet",
                                    persist_directory="db/"
                                ))

Depois disso, criaremos um objeto de coleção usando o cliente. É semelhante à criação de uma tabela em um banco de dados tradicional.

collection = client.create_collection(name="Students")

Para adicionar texto à nossa coleção, precisamos gerar um texto aleatório sobre um aluno, um clube e uma universidade. Você pode gerar texto aleatório usando o ChatGPT. É muito simples.

student_info = """
Alexandra Thompson, a 19-year-old computer science sophomore with a 3.7 GPA,
is a member of the programming and chess clubs who enjoys pizza, swimming, and hiking
in her free time in hopes of working at a tech company after graduating from the University of Washington.
"""

club_info = """
The university chess club provides an outlet for students to come together and enjoy playing
the classic strategy game of chess. Members of all skill levels are welcome, from beginners learning
the rules to experienced tournament players. The club typically meets a few times per week to play casual games,
participate in tournaments, analyze famous chess matches, and improve members' skills.
"""

university_info = """
The University of Washington, founded in 1861 in Seattle, is a public research university
with over 45,000 students across three campuses in Seattle, Tacoma, and Bothell.
As the flagship institution of the six public universities in Washington state,
UW encompasses over 500 buildings and 20 million square feet of space,
including one of the largest library systems in the world.

Agora, usaremos a função add para adicionar dados de texto com metadados e IDs exclusivos. Depois disso, o Chroma fará o download automático do modelo all-MiniLM-L6-v2 para converter o texto em embeddings e armazená-lo na coleção "Students".

collection.add(
    documents = [student_info, club_info, university_info],
    metadatas = [{"source": "student info"},{"source": "club info"},{'source':'university info'}],
    ids = ["id1", "id2", "id3"]
)

Para executar uma pesquisa de similaridade, você pode usar a função query e fazer perguntas em linguagem natural. Ele converterá a consulta em incorporação e usará algoritmos de similaridade para chegar a resultados semelhantes. No nosso caso, ele está retornando dois resultados semelhantes.

results = collection.query(
    query_texts=["What is the student name?"],
    n_results=2
)

results

Embeddings

Você pode usar qualquer modelo de incorporação de alto desempenho da lista de incorporação. Você pode até mesmo criar suas funções de incorporação personalizadas.

Nesta seção, usaremos o modelo de incorporação da linha OpenAI chamado "text-embedding-ada-002" para converter texto em incorporação.

Depois de criar a função de incorporação do OpenAI, você pode adicionar a lista de documentos de texto para gerar incorporações.

Descubra como usar a API OpenAI para Text Embeddings e criar classificadores de texto, sistemas de recuperação de informações e detectores de similaridade semântica.

from chromadb.utils import embedding_functions
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
                model_name="text-embedding-ada-002"
            )
students_embeddings = openai_ef([student_info, club_info, university_info])
print(students_embeddings)
[[-0.01015068031847477, 0.0070903063751757145, 0.010579396970570087, -0.04118313640356064, 0.0011583581799641252, 0.026857420802116394,....],]

Em vez de usar o modelo de incorporação padrão, carregaremos as incorporações já criadas diretamente nas coleções.

  1. Usaremos a função get_or_create_collection para criar uma nova coleção chamada "Students2". Essa função é diferente de create_collection. Ele obterá uma coleção ou a criará se ela ainda não existir.
  2. Agora, adicionaremos incorporação, documentos de texto, metadados e IDs à nossa coleção recém-criada.
collection2 = client.get_or_create_collection(name="Students2")

collection2.add(
    embeddings = students_embeddings,
    documents = [student_info, club_info, university_info],
    metadatas = [{"source": "student info"},{"source": "club info"},{'source':'university info'}],
    ids = ["id1", "id2", "id3"]
)

Há também outro método mais direto. Você pode adicionar uma função de incorporação do OpenAI ao criar ou acessar a coleção. Além da OpenAI, você pode usar os modelos Cohere, Google PaLM, HuggingFace e Instructor.

No nosso caso, a adição de novos documentos de texto executará uma função de incorporação da OpenAI em vez do modelo padrão para converter texto em incorporações.

collection2 = client.get_or_create_collection(name="Students2",embedding_function=openai_ef)

collection2.add(
    documents = [student_info, club_info, university_info],
    metadatas = [{"source": "student info"},{"source": "club info"},{'source':'university info'}],
    ids = ["id1", "id2", "id3"]
)

Vamos ver a diferença executando uma consulta semelhante na nova coleção.

results = collection2.query(
    query_texts=["What is the student name?"],
    n_results=2
)

results

Nossos resultados melhoraram. A pesquisa de similaridade agora retorna informações sobre a universidade em vez de um clube. Além disso, a distância entre os vetores é menor do que a do modelo de incorporação padrão, o que é bom.

image2.png

Atualização e remoção de dados

Assim como nos bancos de dados relacionais, você pode atualizar ou remover os valores das coleções. Para atualizar o texto e os metadados, forneceremos o ID específico para o registro e o novo texto.

collection2.update(
    ids=["id1"],
    documents=["Kristiane Carina, a 19-year-old computer science sophomore with a 3.7 GPA"],
    metadatas=[{"source": "student info"}],
)

Execute uma consulta simples para verificar se as alterações foram feitas com sucesso.

results = collection2.query(
    query_texts=["What is the student name?"],
    n_results=2
)

results

Como podemos ver, em vez de Alexandra, temos Kristiane.

image3.png

Para remover um registro da coleção, usaremos a função `delete` e especificaremos um ID exclusivo.

collection2.delete(ids = ['id1'])


results = collection2.query(
    query_texts=["What is the student name?"],
    n_results=2
)

results

O texto com as informações do aluno foi removido; em vez disso, obtemos os melhores resultados seguintes.

image7.png

Gerenciamento de coleções

Nesta seção, aprenderemos sobre a função de utilidade de coleta que facilitará muito nossa vida.

Criaremos uma nova coleção chamada "vectordb" e adicionaremos as informações sobre a folha de dicas do Chroma DB, a documentação e a API JS com metadados.

vector_collections = client.create_collection("vectordb")


vector_collections.add(
    documents=["This is Chroma DB CheatSheet",
               "This is Chroma DB Documentation",
               "This document Chroma JS API Docs"],
    metadatas=[{"source": "Chroma Cheatsheet"},
    {"source": "Chroma Doc"},
    {'source':'JS API Doc'}],
    ids=["id1", "id2", "id3"]
)

Usaremos a função count() para verificar quantos registros a coleção tem.

vector_collections.count()
3

Para visualizar todos os registros da coleção, use a função .get().

vector_collections.get()
{'ids': ['id1', 'id2', 'id3'],
 'embeddings': None,
 'documents': ['This is Chroma DB CheatSheet',
  'This is Chroma DB Documentation',
  'This document Chroma JS API Docs'],
 'metadatas': [{'source': 'Chroma Cheatsheet'},
  {'source': 'Chroma Doc'},
  {'source': 'JS API Doc'}]}

Para alterar o nome da coleção, use a função modify(). Para visualizar todos os nomes de coleções, use list_collections().

vector_collections.modify(name="chroma_info")

# list all collections
client.list_collections()

Parece que, na verdade, renomeamos "vectordb" como "chroma_info".

[Collection(name=Students),
 Collection(name=Students2),
 Collection(name=chroma_info)]

Para acessar qualquer nova coleção, você pode usar get_collection com o nome da coleção.

vector_collections_new = client.get_collection(name="chroma_info")

Podemos excluir uma coleção usando a função de cliente delete_collection e especificar o nome da coleção.

client.delete_collection(name="chroma_info")
client.list_collections()
[Collection(name=Students), Collection(name=Students2)]

Podemos excluir toda a coleção do banco de dados usando client.reset(). No entanto, isso não é recomendado, pois não há como restaurar os dados após a exclusão.

client.reset()
client.list_collections()
[]

Conclusão

Os armazenamentos de vetores, como o Chroma DB, estão se tornando componentes essenciais de grandes sistemas de modelos de linguagem. Ao fornecer armazenamento especializado e recuperação eficiente de embeddings de vetores, eles permitem o acesso rápido a informações semânticas relevantes para potencializar os LLMs.

Neste tutorial do Chroma DB, abordamos os conceitos básicos de criação de uma coleção, adição de documentos, conversão de texto em embeddings, consulta de similaridade semântica e gerenciamento de coleções.

A próxima etapa do processo de aprendizado é integrar bancos de dados vetoriais ao seu aplicativo de IA generativa. Você pode facilmente ingerir, gerenciar e recuperar dados privados e específicos do domínio para seu aplicativo de IA seguindo o tutorial do LlamaIndex, que é uma estrutura de dados para aplicativos baseados em LLM (Large Language Model). Além disso, você pode seguir o tutorial How to Build LLM Applications with LangChain para mergulhar no mundo dos LLMOps.

Temas
Relacionado

blog

Uma introdução ao DuckDB: O que é e por que você deve usá-lo?

Explore o DuckDB, o banco de dados analítico rápido e fácil de usar para Python e R. Conheça seus principais recursos, casos de uso e como ele otimiza as tarefas de análise de dados.
Kurtis Pykes 's photo

Kurtis Pykes

7 min

blog

O que é um banco de dados gráfico? Um guia para iniciantes

Explore o intrincado mundo dos bancos de dados gráficos com nosso guia para iniciantes. Entenda as relações entre os dados, aprofunde-se na comparação entre bancos de dados relacionais e gráficos e explore casos de uso práticos.
Kurtis Pykes 's photo

Kurtis Pykes

11 min

tutorial

Tutorial do MySQL: Um guia abrangente para iniciantes

Descubra o que é o MySQL e como começar a usar um dos sistemas de gerenciamento de banco de dados mais populares.

tutorial

Tutorial do SQL Server: Desbloqueie o poder do gerenciamento de dados

Explore o gerenciamento de dados com nosso tutorial do SQL Server. Do básico ao uso avançado, aprimore suas habilidades e navegue no SQL Server com confiança.

Kevin Babitz

13 min

tutorial

Tutorial de visão geral do banco de dados SQL

Neste tutorial, você aprenderá sobre bancos de dados em SQL.
DataCamp Team's photo

DataCamp Team

3 min

tutorial

Tutorial do GitHub e do Git para iniciantes

Um tutorial para iniciantes que demonstra como funciona o controle de versão do Git e por que ele é crucial para projetos de ciência de dados.
Abid Ali Awan's photo

Abid Ali Awan

17 min

See MoreSee More