Comece a usar a integração Semantic Kernel Python
Nesta página
Observação
Este tutorial usa a biblioteca Python da Semantic Kernel . Para um tutorial que usa a biblioteca C#, consulte Introdução à integração do Semantic Kernel C#.
Você pode integrar Atlas Vector Search o com Microsoft Semantic Kernel para criar AI aplicativos de e implementar geração aumentada por recuperação (RAG). Este tutorial demonstra como começar a usar o Atlas Vector Search com o Semantic Kernel para executar o Atlas Search semântica em seus dados e criar uma implementação deRAG . Especificamente, você executa as seguintes ações:
Configure o ambiente.
Armazene dados personalizados no Atlas.
Crie um índice de pesquisa do Atlas Vector Search em seus dados.
Execute uma consulta de pesquisa semântica em seus dados.
Implemente a RAG usando o Atlas Vector Search para responder a perguntas sobre seus dados.
Plano de fundo
O Semantic Kernel é um SDK de código aberto que permite combinar vários serviços e plug-ins de AI com seus aplicativos. Você pode usar o Semantic Kernel para uma variedade de casos de uso de AI , incluindo RAG.
Ao integrar o Atlas Vector Search com o Semantic Kernel, você pode usar o Atlas como um banco de dados vetorial e usar o Atlas Vector Search para implementar o RAG recuperando documentos semanticamente semelhantes de seus dados. Para saber mais sobre RAG, consulte Geração aumentada de recuperação (RAG) com Atlas Vector Search.
Pré-requisitos
Para concluir este tutorial, você deve ter o seguinte:
Uma conta do Atlas com um cluster executando o MongoDB versão 6.0.11, 7.0.2 ou posterior (incluindo RCs). Garanta que seu endereço IP esteja incluído na lista de acesso do seu projeto Atlas . Para saber mais, consulte Criar um cluster.
Uma chave de API OpenAI. Você deve ter uma conta paga do OpenAI com créditos disponíveis para solicitações de API. Para saber mais sobre como registrar uma conta OpenAI, consulte o site da API OpenAI.
Um ambiente para executar notebooks Python interativos, como o Colab.
Observação
Se estiver usando o Colab, certifique-se de que o endereço IP da sessão do notebook esteja incluído na lista de acesso do projeto Atlas.
Configurar o ambiente
Configure o ambiente para este tutorial. Crie um bloco de anotações Python interativo salvando um arquivo com a extensão .ipynb
. Este bloco de anotações permite que você execute trechos de código Python individualmente, e você o usará para executar o código neste tutorial.
Para configurar seu ambiente de bloco de anotações:
Instalar e importar dependências.
Execute o seguinte comando no seu bloco de anotações para instalar o kernel semântica no seu ambiente.
pip install --quiet --upgrade semantic-kernel openai motor Execute o seguinte código para importar os pacotes necessários:
import getpass, openai import semantic_kernel as sk from semantic_kernel.connectors.ai.open_ai import (OpenAIChatCompletion, OpenAITextEmbedding) from semantic_kernel.connectors.memory.mongodb_atlas import MongoDBAtlasMemoryStore from semantic_kernel.core_plugins.text_memory_plugin import TextMemoryPlugin from semantic_kernel.memory.semantic_text_memory import SemanticTextMemory from semantic_kernel.prompt_template.input_variable import InputVariable from semantic_kernel.prompt_template.prompt_template_config import PromptTemplateConfig from pymongo import MongoClient from pymongo.operations import SearchIndexModel
Definir variáveis ambientais.
Execute o código a seguir e forneça o seguinte quando solicitado:
Sua chave de API da OpenAI.
A connection string SRVdo seu Atlas cluster.
OPENAI_API_KEY = getpass.getpass("OpenAI API Key:") ATLAS_CONNECTION_STRING = getpass.getpass("MongoDB Atlas SRV Connection String:")
Observação
Sua string de conexão deve usar o seguinte formato:
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
Armazenar dados personalizados no Atlas
Nesta seção, você inicializa o kernel, que é a interface principal usada para gerenciar os serviços e os plugins do seu aplicativo. Por meio do kernel, você configura seus serviços de IA, instancia o Atlas como um banco de dados vetorial (também chamado de armazenamento de memória) e carrega dados personalizados no cluster do Atlas.
Para armazenar dados personalizados no Atlas, cole e execute os seguintes trechos de código em seu bloco de anotações:
Adicione os serviços de IA ao kernel.
Execute o código a seguir para configurar o modelo de incorporação OpenAI e o modelo de chat usados neste tutorial e adicionar esses serviços ao kernel. Este código especifica o seguinte:
text-embedding-ada-002
da OpenAI como o modelo de incorporação usado para converter texto em incorporações vetoriais.gpt-3.5-turbo
do OpenAI como o modelo de chat usado para gerar respostas.
chat_service = OpenAIChatCompletion( service_id="chat", ai_model_id="gpt-3.5-turbo", api_key=OPENAI_API_KEY ) embedding_service = OpenAITextEmbedding( ai_model_id="text-embedding-ada-002", api_key=OPENAI_API_KEY ) kernel.add_service(chat_service) kernel.add_service(embedding_service)
Instanciar o Atlas como um armazenamento de memória.
Execute o seguinte código para instanciar o Atlas como um armazenamento de memória e adicioná-lo ao kernel. Este código estabelece uma conexão com seu cluster Atlas e especifica o seguinte:
semantic_kernel_db
como o banco de dados Atlas usado para armazenar os documentos.vector_index
como o índice usado para executar queries semânticas Atlas Search .
Ele também importa um plugin chamado TextMemoryPlugin
, que fornece um grupo de funções nativas para ajudá-lo a armazenar e recuperar texto na memória.
mongodb_atlas_memory_store = MongoDBAtlasMemoryStore( connection_string=ATLAS_CONNECTION_STRING, database_name="semantic_kernel_db", index_name="vector_index" ) memory = SemanticTextMemory( storage=mongodb_atlas_memory_store, embeddings_generator=embedding_service ) kernel.add_plugin(TextMemoryPlugin(memory), "TextMemoryPlugin")
Carregue dados de amostra em seu cluster Atlas.
Este código define e executa uma função para preencher a coleção semantic_kernel_db.test
com alguns documentos de amostra. Esses documentos contêm dados personalizados aos quais o LLM originalmente não tinha acesso.
async def populate_memory(kernel: sk.Kernel) -> None: await memory.save_information( collection="test", id="1", text="I am a developer" ) await memory.save_information( collection="test", id="2", text="I started using MongoDB two years ago" ) await memory.save_information( collection="test", id="3", text="I'm using MongoDB Vector Search with Semantic Kernel to implement RAG" ) await memory.save_information( collection="test", id="4", text="I like coffee" ) print("Populating memory...") await populate_memory(kernel) print(kernel)
Populating memory... plugins=KernelPluginCollection(plugins={'TextMemoryPlugin': KernelPlugin(name='TextMemoryPlugin', description=None, functions={'recall': KernelFunctionFromMethod(metadata=KernelFunctionMetadata(name='recall', plugin_name='TextMemoryPlugin', description='Recall a fact from the long term memory', parameters=[KernelParameterMetadata(name='ask', description='The information to retrieve', default_value=None, type_='str', is_required=True, type_object=<class 'str'>), KernelParameterMetadata(name='collection', description='The collection to search for information.', default_value='generic', type_='str', is_required=False, type_object=<class 'str'>), KernelParameterMetadata(name='relevance', description='The relevance score, from 0.0 to 1.0; 1.0 means perfect match', default_value=0.75, type_='float', is_required=False, type_object=<class 'float'>), KernelParameterMetadata(name='limit', description='The maximum number of relevant memories to recall.', default_value=1, type_='int', is_required=False, type_object=<class 'int'>)], is_prompt=False, is_asynchronous=True, return_parameter=KernelParameterMetadata(name='return', description='', default_value=None, type_='str', is_required=True, type_object=None)), method=<bound method TextMemoryPlugin.recall of TextMemoryPlugin(memory=SemanticTextMemory())>, stream_method=None), 'save': KernelFunctionFromMethod(metadata=KernelFunctionMetadata(name='save', plugin_name='TextMemoryPlugin', description='Save information to semantic memory', parameters=[KernelParameterMetadata(name='text', description='The information to save.', default_value=None, type_='str', is_required=True, type_object=<class 'str'>), KernelParameterMetadata(name='key', description='The unique key to associate with the information.', default_value=None, type_='str', is_required=True, type_object=<class 'str'>), KernelParameterMetadata(name='collection', description='The collection to save the information.', default_value='generic', type_='str', is_required=False, type_object=<class 'str'>)], is_prompt=False, is_asynchronous=True, return_parameter=KernelParameterMetadata(name='return', description='', default_value=None, type_='', is_required=True, type_object=None)), method=<bound method TextMemoryPlugin.save of TextMemoryPlugin(memory=SemanticTextMemory())>, stream_method=None)})}) services={'chat': OpenAIChatCompletion(ai_model_id='gpt-3.5-turbo', service_id='chat', client=<openai.AsyncOpenAI object at 0x7999971c8fa0>, ai_model_type=<OpenAIModelTypes.CHAT: 'chat'>, prompt_tokens=0, completion_tokens=0, total_tokens=0), 'text-embedding-ada-002': OpenAITextEmbedding(ai_model_id='text-embedding-ada-002', service_id='text-embedding-ada-002', client=<openai.AsyncOpenAI object at 0x7999971c8fd0>, ai_model_type=<OpenAIModelTypes.EMBEDDING: 'embedding'>, prompt_tokens=32, completion_tokens=0, total_tokens=32)} ai_service_selector=<semantic_kernel.services.ai_service_selector.AIServiceSelector object at 0x7999971cad70> retry_mechanism=PassThroughWithoutRetry() function_invoking_handlers={} function_invoked_handlers={}
Dica
Depois de executar o código de amostra, você pode visualizar suas incorporações vetoriais na Atlas navegando até a collection semantic_kernel_db.test
no seu cluster.
Criar o índice Atlas Vector Search Index
Observação
Para criar um Atlas Vector Search índice de pesquisa, você deve ter acesso Project Data Access Admin
ou superior ao Atlas projeto.
Para habilitar consultas de pesquisa de vetor no seu armazenamento de vetor, crie um índice do Atlas Vector Search na coleção semantic_kernel_db.test
.
No Atlas, VáGo para a Clusters página do seu projeto.
Se ainda não tiver sido exibido, selecione a organização que contém seu projeto no menu Organizations na barra de navegação.
Se ainda não estiver exibido, selecione o projeto desejado no menu Projects na barra de navegação.
Se ainda não estiver exibido, clique em Clusters na barra lateral.
A página Clusters é exibida.
Acesse a página do Atlas Search do seu cluster.
Você pode acessar a página do Atlas Search pela barra lateral, pelo Data Explorer ou pela página de detalhes do cluster.
Na barra lateral, clique em Atlas Search sob o título Services.
No menu suspenso Select data source, selecione seu cluster e clique em Go to Atlas Search.
A página Atlas Search é exibida.
Clique no botão Browse Collections para o seu cluster.
Expanda o banco de dados e selecione a coleção.
Clique na guia Search Indexes da coleção.
A página Atlas Search é exibida.
Clique no nome do seu cluster.
Clique na aba Atlas Search.
A página Atlas Search é exibida.
Defina o índice do Atlas Vector Search.
Clique em Create Search Index.
Em Atlas Vector Search, selecione JSON Editor e clique em Next.
Na seção Database and Collection, localize o banco de dados
semantic_kernel_db
e selecione a coleçãotest
.No campo Index Name, digite
vector_index
.Substitua a definição padrão pela seguinte definição de índice e clique em Next.
Essa definição de índice especifica a indexação dos seguintes campos em um índice do tipo vectorSearch:
embedding
campo como o tipo de vetor . O campoembedding
contém as incorporações criadas utilizando o modelo de incorporaçãotext-embedding-ada-002
do OpenAI. A definição de índice especifica1536
dimensões vetoriais e mede a similaridade usandocosine
.
1 { 2 "fields": [ 3 { 4 "type": "vector", 5 "path": "embedding", 6 "numDimensions": 1536, 7 "similarity": "cosine" 8 } 9 ] 10 }
Executar queries no Vector Search
Depois que o Atlas criar seu índice, você poderá executar consultas vetoriais do Atlas Search em seus dados.
Em seu notebook, execute o código a seguir para realizar uma busca semântica básica pela string What is my job title?
. Ele imprime o documento mais relevante e uma pontuação de relevância entre 0
e 1
.
result = await memory.search("test", "What is my job title?") print(f"Retrieved document: {result[0].text}, {result[0].relevance}")
Retrieved document: I am a developer, 0.8991971015930176
Responda a perguntas sobre seus dados
Esta seção mostra um exemplo de implementação de RAG com Atlas Vector Search e Semantic Kernel. Agora que você usou o Atlas Vector Search para recuperar documentos semanticamente semelhantes, execute o seguinte exemplo de código para solicitar que o LLM responda a perguntas com base nesses documentos.
O código a seguir define um prompt para instruir o LLM a usar o documento recuperado como contexto para sua query. Neste exemplo, você solicita ao LLM a consulta de amostra When did I start using MongoDB?
. Como você aumentou a base de conhecimento do LLM com dados personalizados, o modelo de chat é capaz de gerar uma resposta mais precisa e com reconhecimento de contexto.
service_id = "chat" settings = kernel.get_service(service_id).instantiate_prompt_execution_settings( service_id=service_id ) prompt_template = """ Answer the following question based on the given context. Question: {{$input}} Context: {{$context}} """ chat_prompt_template_config = PromptTemplateConfig( execution_settings=settings, input_variables=[ InputVariable(name="input"), InputVariable(name="context") ], template=prompt_template ) prompt = kernel.add_function( function_name="RAG", plugin_name="TextMemoryPlugin", prompt_template_config=chat_prompt_template_config, ) question = "When did I start using MongoDB?" results = await memory.search("test", question) retrieved_document = results[0].text answer = await prompt.invoke( kernel=kernel, input=question, context=retrieved_document ) print(answer)
You started using MongoDB two years ago.
Próximos passos
O MongoDB também fornece os seguintes recursos para desenvolvedores: