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
Avalie esse Tutorial
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 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 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.
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).
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!
- IDE de sua escolha (este tutorial usa o Google CoLab - consulte-o se quiser executar os comandos diretamente)
Vamos começar!
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.
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 comando
pip
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 que
pymongo
seja baixado nesta lista.Aqui, inclua as informações sobre nossa chave de API OpenAI e nossa connection string.
Vamos configurar as importações necessárias:
1 import openai 2 import semantic_kernel as sk 3 from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion, OpenAITextEmbedding 4 from semantic_kernel.connectors.memory.mongodb_atlas import MongoDBAtlasMemoryStore 5 6 7 8 kernel = sk.Kernel() 9 10 11 openai.api_key = '<your-openai-key' 12 MONGODB_SEARCH_INDEX="defaultRandomFacts" 13 MONGODB_DATABASE="semantic-kernel" 14 MONGODB_COLLECTION="randomFacts" 15 16 17 kernel.add_chat_service("chat-gpt", OpenAIChatCompletion("gpt-3.5-turbo", openai.api_key)) 18 kernel.add_text_embedding_generation_service("ada", OpenAITextEmbedding("text-embedding-ada-002", openai.api_key)) 19 20 21 kernel.register_memory_store(memory_store=MongoDBAtlasMemoryStore(index_name=MONGODB_SEARCH_INDEX, database_name=MONGODB_DATABASE, connection_string="<mongodb-uri>")) 22 kernel.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 classe
MongoDBAtlasMemoryStore
é 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.
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".
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.
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 2 prompt = kernel.create_semantic_function(""" 3 As a friendly AI Copilot, answer the question: Did Albert Einstein like coffee? 4 """) 5 6 7 print(prompt())
A saída recebida é:
1 Yes, 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:
1 prompt = kernel.create_semantic_function(""" 2 As a friendly AI Copilot, answer the question: Did I like coffee? 3 """) 4 5 6 print(prompt())
A saída recebida é:
1 As 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.
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.
1 async def populate_memory(kernel: sk.Kernel) -> None: 2 # Add some documents to the semantic memory 3 await kernel.memory.save_information_async( 4 collection=MONGODB_COLLECTION, id="1", text="We enjoy coffee and Starbucks" 5 ) 6 await kernel.memory.save_information_async( 7 collection=MONGODB_COLLECTION, id="2", text="We are Associate Developer Advocates at MongoDB" 8 ) 9 await kernel.memory.save_information_async( 10 collection=MONGODB_COLLECTION, id="3", text="We have great coworkers and we love our teams!" 11 ) 12 await kernel.memory.save_information_async( 13 collection=MONGODB_COLLECTION, id="4", text="Our names are Anaiya and Tim" 14 ) 15 await kernel.memory.save_information_async( 16 collection=MONGODB_COLLECTION, id="5", text="We have been to New York City and Dublin" 17 )
Aqui, estamos usando a função
populate_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:
1 print("Populating memory...aka adding in documents") 2 await 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.
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.
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 ". Queremos escolher a "Opção JSON Editor" e clicar em "Avançar".
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.
Para consultar seus novos documentos hospedados em seu armazenamento “memory“ do MongoDB cluster, podemos usar a função
memory.search_async
. Execute os seguintes comandos e veja a milagridade acontecer:1 result = await kernel.memory.search_async(MONGODB_COLLECTION, 'What is my job title?') 2 3 4 print(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:
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.