Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Junte-se a nós no Amazon Web Services re:Invent 2024! Saiba como usar o MongoDB para casos de uso de AI .
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
Atlaschevron-right

Criando aplicações de IA com o Microsoft Semantic Kernel e o MongoDB Atlas Vector Search

Anaiya Raisinghani, Prakul Agarwal, Tim Kelly8 min read • Published Nov 27, 2023 • Updated Nov 27, 2023
Atlas
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Estamos muito satisfeitos em anunciar o suporte nativo para o MongoDB Atlas Vector Search no Microsoft Semantic Kernel. Com essa integração, os usuários podem trazer o poder dos LLMs (modelos de linguagem grandes) para seus dados proprietários com segurança e construir aplicativos de IA generativos usando RAG (geração aumentada de recuperação) com linguagens de programação como Python e C#. O tutorial que acompanha irá orientá-lo através de um exemplo.

O que é o kernel semântico?

O Semantic Kernel é um SDK poliglota de código aberto que permite aos usuários combinar vários serviços de AI com seus aplicativos. O Semantic Kernel usa conectores para permitir que você troque serviços de AI sem reescrever o código. Os componentes do Semantic Kernel incluem:
  • Serviços de AI: oferece suporte a serviços de AI como OpenAI, Azure OpenAI e Abraçando a face.
  • Linguagens de programação: suporta linguagens de programação convencionais, como C# Python e Java.
  • Prompts de LLM: suporta o que há de mais recente em prompts de AI de LLM, com recursos de modelagem, encadeamento e planejamento de prompts.
  • Memória: Fornece diferentes armazenamentos vetorizados para armazenar dados, incluindo MongoDB.

O que é o Atlas Vector Search do MongoDB?

O MongoDB Atlas Vector Search é um serviço totalmente gerenciado que simplifica o processo de indexação eficaz de dados de incorporação de vetores de alta dimensão no MongoDB e a capacidade de realizar pesquisas rápidas de semelhança vetorial.
A incorporação se refere à representação de palavras, frases ou outras entidades como vetores densos em um espaço vetorial contínuo. Ele foi projetado para garantir que palavras com significados semelhantes sejam agrupadas mais próximas. Esse método ajuda os modelos de computador a entender e processar melhor a linguagem, reconhecendo padrões e relações entre palavras, e é o que nos permite pesquisar por significado semântico.
Quando os dados são convertidos em incorporações vetoriais numéricas usando modelos de codificação, essas incorporações podem ser armazenadas diretamente junto com seus respectivos dados de origem no MongoDB database. Essa co-localização de incorporações vetoriais e dos dados originais não apenas aumenta a eficiência das consultas, mas também elimina possíveis problemas de sincronização. Ao evitar a necessidade de manter bancos de dados separados ou processos de sincronização para os dados de origem e suas incorporações, o MongoDB fornece uma experiência de recuperação de dados perfeita e integrada.
Essa abordagem consolidada simplifica o gerenciamento do banco de dados e permite pesquisas semânticas intuitivas e sofisticadas, facilitando a integração de experiências baseadas em IA.

Microsoft Semantic Kernel e MongoDB

Essa combinação permite que os desenvolvedores criem aplicativos inteligentes baseados em IA usando o MongoDB Atlas Vector Search e grandes modelos de linguagem de fornecedores como OpenAI, Azure OpenAI e Hugging Face.
Apesar de todos os seus recursos incríveis, os LLMs têm uma data de limite de conhecimento e, muitas vezes, precisam ser ampliados com informações exclusivas e atualizadas para o negócio específico para o qual um aplicativo está sendo criado. Esse recurso de “long-term memory for LLM” para aplicativos inteligentes habilitados para AInormalmente é abastecido pelo uso de incorporações vetoriais. O Semantic Kernel permite armazenar e recuperar esse contexto vetorial para aplicativos de AI usando o plugin -in de memória (que agora tem suporte para o MongoDB Atlas Vector Search).

Tutorial

Atlas Vector Search está integrado neste tutorial para fornecer uma maneira de interagir com nosso armazenamento de memória que foi criado por meio de nosso connectorMongoDB e Semantic Kernel.
Este tutorial mostra como usar o Microsoft Semantic Kernel para carregar e incorporar corretamente documentos em seu cluster MongoDB Atlas e, em seguida, realizar queries usando o Microsoft Semantic Kernel também, tudo em Python!

Pré-requisitos

Vamos começar!

Configurando nosso cluster do Atlas

Visite o dashboard doMongoDB Atlas e configure seu cluster. Para aproveitar o operador$vectorSearch em um pipeline de agregação, você precisa executar o MongoDB Atlas 6.0.11 ou superior. Este tutorial pode ser criado usando um cluster gratuito.
Quando estiver configurando a implementação, será solicitado que você configure um usuário de banco de dados e regras para sua conexão de rede. Certifique-se de salvar seu nome de usuário e senha em algum lugar seguro e de ter as regras de endereço IP corretas em vigor para que seu cluster possa se conectar corretamente.
Se precisar de mais ajuda para começar, confira nosso tutorial no MongoDB Atlas.

Instalando a versão mais recente do Semantic Kernel

Para sermos bem-sucedidos com nosso tutorial, vamos garantir que tenhamos a versão mais atualizada do Semantic Kernel instalada em nosso IDE. A partir da criação deste tutorial, a versão mais recente é 0.3.14. Execute este comandopip em seu IDE para começar:
1!python -m pip install semantic-kernel==0.3.14.dev
Depois de executar com sucesso, você verá vários pacotes sendo baixados. Certifique -se de quepymongo seja baixado nesta lista.

Configurando nossas importações

Aqui, inclua as informações sobre nossa chave de API OpenAI e nossa connection string.
Vamos configurar as importações necessárias:
1import openai
2import semantic_kernel as sk
3from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion, OpenAITextEmbedding
4from semantic_kernel.connectors.memory.mongodb_atlas import MongoDBAtlasMemoryStore
5
6
7
8kernel = sk.Kernel()
9
10
11openai.api_key = '<your-openai-key'
12MONGODB_SEARCH_INDEX="defaultRandomFacts"
13MONGODB_DATABASE="semantic-kernel"
14MONGODB_COLLECTION="randomFacts"
15
16
17kernel.add_chat_service("chat-gpt", OpenAIChatCompletion("gpt-3.5-turbo", openai.api_key))
18kernel.add_text_embedding_generation_service("ada", OpenAITextEmbedding("text-embedding-ada-002", openai.api_key))
19
20
21kernel.register_memory_store(memory_store=MongoDBAtlasMemoryStore(index_name=MONGODB_SEARCH_INDEX, database_name=MONGODB_DATABASE, connection_string="<mongodb-uri>"))
22kernel.import_skill(sk.core_skills.TextMemorySkill())
A importação para o OpenAI é crucial porque estamos usando seu modelo de dados para incorporar não apenas nossos documentos, mas também nossas queries. Também queremos importar sua biblioteca de incorporação de texto pelo mesmo motivo. Para este tutorial, estamos usando o modelo de incorporação ada-002, mas verifique se você está usando um modelo compatível com sua chave de API OpenAI.
Nossa classeMongoDBAtlasMemoryStore é muito importante, pois é a parte que nos permite usar o MongoDB como nosso armazenamento de memória. Isso significa que podemos nos conectar ao Semantic Kernel e ter nossos documentos salvos e formatados corretamente em nosso cluster. Para obter mais informações sobre esta classe, consulte o repositório.
É aqui que você também precisará incorporar sua chave de API OpenAI junto com sua connection string do MongoDBe outras variáveis importantes que usaremos. As opções acima são apenas uma sugestão, mas se forem alteradas durante a tentativa de tutorial, certifique-se de que sejam consistentes por toda parte. Para obter ajuda para acessar sua chave OpenAI, leia a seção abaixo.

Gere sua chave OpenAI

Para gerar nossos embeddings, usaremos a API da OpenAI. Primeiro, precisaremos de uma chave secreta. Para criar sua chave OpenAI, você precisará criar uma conta. Depois disso, acesse a API da OpenAI e você verá uma tela como a mostrada abaixo. Clique no ícone do seu perfil no canto superior direito da tela para acessar o menu suspenso e selecione "View API keys". onde encontrar sua chave API no OpenAI
Aqui, você pode gerar sua própria chave de API clicando no botão “Create new secret key”. Dê um nome a ele e armazene-o em algum lugar seguro. Isso é tudo o que você precisa da OpenAI para usar sua API para gerar suas incorporações.
Como criar uma nova chave de API

A necessidade de geração aumentada de recuperação (RAG)

A Regeneração Aumentada por Recuperação, também conhecida como RAG, é uma técnica de NLP que pode ajudar a melhorar a qualidade de modelos de linguagem grandes (LLMs). É uma estrutura de inteligência artificial para obter dados de uma fonte de conhecimento externa. O armazenamento de memória que estamos criando usando o Microsoft Semantic Kernel é um exemplo disso. Mas por que o RAG é necessário? Vamos dar uma olhada em um exemplo.
LLMs como OpenAI GPT-3.5 exibem uma variedade expressiva e ampla de habilidades. Eles são formados nos dados disponíveis na internet sobre uma ampla variedade de tópicos e podem responder a queries com precisão. Usando o Semantic Kernel, vamos perguntar ao LLM da OpenAI se dobrar a porta o café:
1# Wrap your prompt in a function
2prompt = kernel.create_semantic_function("""
3As a friendly AI Copilot, answer the question: Did Albert Einstein like coffee?
4""")
5
6
7print(prompt())
A saída recebida é:
1Yes, Albert Einstein was known to enjoy coffee. He was often seen with a cup of coffee in his hand and would frequently visit cafes to discuss scientific ideas with his colleagues over a cup of coffee.
Como essas informações estavam disponíveis na Internet pública, o LLM conseguiu fornecer a resposta correta.
Mas os LLMs têm suas limitações: eles têm um limite de conhecimento (setembro 2021, no caso da OpenAI) e não conhecem dados proprietários e pessoais. Eles também tendem a ter alucinações, ou seja, podem inventar fatos com confiança e fornecer respostas que podem parecer precisas, mas na verdade estão incorretas. Aqui está um exemplo para demonstrar esta lacuna de conhecimento:
1prompt = kernel.create_semantic_function("""
2As a friendly AI Copilot, answer the question: Did I like coffee?
3""")
4
5
6print(prompt())
A saída recebida é:
1As an AI, I don't have personal preferences or experiences, so I can't say whether "I" liked coffee or not. However, coffee is a popular beverage enjoyed by many people around the world. It has a distinct taste and aroma that some people find appealing, while others may not enjoy it as much. Ultimately, whether someone likes coffee or not is a subjective matter and varies from person to person.
Como você pode ver, há uma lacuna de conhecimento aqui porque não temos nossos dados pessoais carregados no OpenAI que nossa query possa acessar. Então, vamos mudar isso. Continue com o tutorial para saber como aumentar a base de conhecimento do LLM com dados proprietários.

Adicione alguns documentos ao nosso cluster do MongoDB

Depois de incorporar nossa cadeia de conexão do MongoDB e nossa chave de API OpenAI, estamos prontos para adicionar alguns documentos ao nosso cluster MongoDB.
Certifique-se de que esteja especificando a variável de coleta adequada abaixo que configuramos acima.
1async def populate_memory(kernel: sk.Kernel) -> None:
2# Add some documents to the semantic memory
3await kernel.memory.save_information_async(
4collection=MONGODB_COLLECTION, id="1", text="We enjoy coffee and Starbucks"
5)
6await kernel.memory.save_information_async(
7collection=MONGODB_COLLECTION, id="2", text="We are Associate Developer Advocates at MongoDB"
8)
9await kernel.memory.save_information_async(
10collection=MONGODB_COLLECTION, id="3", text="We have great coworkers and we love our teams!"
11)
12await kernel.memory.save_information_async(
13collection=MONGODB_COLLECTION, id="4", text="Our names are Anaiya and Tim"
14)
15await kernel.memory.save_information_async(
16collection=MONGODB_COLLECTION, id="5", text="We have been to New York City and Dublin"
17)
Aqui, estamos usando a funçãopopulate_memory para definir cinco documentos com vários dados sobre Anaiya e Tim. Como você pode ver, o nome da nossa coleção é chamado "randomFacts ", especificamos o ID para cada documento (certifique-se de que cada ID seja exclusivo, caso contrário você receberá um erro) e, em seguida, incluímos uma frase de texto queremos incorporar.
Depois de preencher suas informações com sucesso e executar esse comando, vamos adicioná-las ao nosso cluster, ou seja, vamos preencher nossa memória! Para fazer isso, execute o comando:
1print("Populating memory...aka adding in documents")
2await populate_memory(kernel)
Depois que esse comando tiver sido executado com sucesso, você deverá ver o banco de dados, a collection, os documentos e suas incorporações preenchidos no Atlas cluster. A captura de tela abaixo mostra como o primeiro documento fica depois de executar esses comandos.
captura de tela do nosso primeiro documento com a incorporação de texto
Depois que os documentos adicionados à nossa memória tiverem suas incorporações, vamos configurar nosso índice de pesquisa e garantir que possamos gerar incorporações para nossas consultas.

Crie um índice de pesquisa de vetores no MongoDB

Para usar o operador$vectorSearch em nossos dados, precisamos configurar um índice de pesquisa apropriado. Faremos isso na UI do Atlas. Selecione o "Search" tab on your cluster and click “Create Search Index ". onde criar um índice de pesquisa vetorial
Queremos escolher a "Opção JSON Editor" e clicar em "Avançar".
Detalhes para criar um índice de pesquisa
Nesta página, vamos selecionar nosso banco de dados de destino, semantic-kernel, e collection, randomFacts.
Para este tutorial, estamos nomeando nosso índice defaultRandomFacts. O índice ficará assim:
1{
2 "mappings": {
3 "dynamic": true,
4 "fields": {
5 "embedding": {
6 "dimensions": 1536,
7 "similarity": "dotProduct",
8 "type": "knnVector"
9 }
10 }
11 }
12}
Os campos especificam o nome do campo de incorporação em nossos documentos, embedding, as dimensões do modelo usado para incorporar, 1536, e a função de similaridade a ser usada para encontrar os K-vizinhos mais próximos, dotProduct. É muito importante que as dimensões no índice correspondam às do modelo usado para incorporação. Esses dados foram incorporados usando o mesmo modelo que usaremos, mas outros modelos estão disponíveis e podem usar dimensões diferentes.
Confira nossa documentação do Vector Search para obter mais informações sobre as definições de configuração do índice.

Consultar documentos usando o Microsoft Semantic Kernel

Para consultar seus novos documentos hospedados em seu armazenamento “memory“ do MongoDB cluster, podemos usar a funçãomemory.search_async. Execute os seguintes comandos e veja a milagridade acontecer:
1result = await kernel.memory.search_async(MONGODB_COLLECTION, 'What is my job title?')
2
3
4print(f"Retrieved document: {result[0].text}, {result[0].relevance}")
Agora você pode fazer qualquer pergunta e obter uma resposta precisa!
Exemplos de perguntas feitas e resultados: o resultado da pergunta: Qual é o meu título do trabalho?
o resultado da pergunta: eu gostaria de café?
o resultado da pergunta: onde no mundo eu visitei?

Conclusão

Neste tutorial, você aprendeu muitos conceitos muito úteis:
  • O que é o Microsoft Semantic Kernel e por que ele é importante.
  • Como conectar o Microsoft Semantic Kernel a um cluster do MongoDB Atlas.
  • Como adicionar documentos ao armazenamento de memória do MongoDB (e incorporá-los, no processo, por meio do Microsoft Semantic Kernel).
  • Como executar query de seus novos documentos no armazenamento de memória usando o Microsoft Semantic Kernel.
Para obter mais informações sobre o MongoDB Vector Search, visite a documentaçãoe, para obter mais informações sobre o Microsoft Semantic Kernel, visite seu repositório e recursos.
Se você tiver alguma dúvida, visite nosso Fórum da Comunidade de Desenvolvedores do MongoDB.

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Pesquisa semântica com Jina Embeddings v2 e MongoDB Atlas


Dec 05, 2023 | 12 min read
Início rápido

Building AI Multi-Agents with BuildShip and MongoDB


Nov 18, 2024 | 3 min read
exemplo de código

Blogue


Sep 11, 2024 | 1 min read
Tutorial

Introdução ao Atlas Stream Processing: como criar seu primeiro processador de fluxo


Aug 13, 2024 | 4 min read
Sumário