Menu Docs
Página inicial do Docs
/
Atlas
/ / /

Comece a usar a integração Semantic Kernel Python

Observação

Este tutorial usa a biblioteca Python do Semantic Kernel . Para obter um tutorial que usa a biblioteca C#, consulte Introdução à integração com o C# do Semantic Kernel.

Você pode integrar a Vector Search do MongoDB ao Microsoft Semantic Kernel para criar aplicativos de IA e implementar a geração aumentada de recuperação (RAG). Este tutorial demonstra como começar a usar o MongoDB Vector Search com o Semantic Kernel para realizar a pesquisa semântica em seus dados e criar uma implementação de RAG. Especificamente, você executa as seguintes ações:

  1. Configure o ambiente.

  2. Armazene dados personalizados no MongoDB.

  3. Crie um índice do MongoDB Vector Search em seus dados.

  4. Execute uma consulta de pesquisa semântica em seus dados.

  5. Implemente o RAG usando o MongoDB Vector Search para responder a perguntas sobre seus dados.

Trabalhe com uma versão executável deste tutorial como um notebook Python.

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 MongoDB Vector Search com o Semantic Kernel, você pode usar o MongoDB como um banco de dados vetorial e usar o MongoDB 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 MongoDB.

Para concluir este tutorial, você deve ter o seguinte:

  • Uma das seguintes opções:

  • Uma chave de API da OpenAI. Você deve ter uma conta da OpenAI com créditos disponíveis para solicitações de API. Para aprender mais sobre como registrar uma conta OpenAI, consulte o website de API OpenAI.

  • Um ambiente para executar blocos de anotações interativos do Python, como o CoLab.

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:

1
  1. 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
  2. Execute o seguinte código para importar os pacotes necessários:

    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
2

Execute o código a seguir, substituindo os espaços reservados pelos seguintes valores:

  • Sua chave de API da OpenAI.

  • A string de conexão do cluster MongoDB .

Observação

Substitua <connection-string> pela string de conexão para seu Atlas cluster ou sistema local do Atlas .

Sua string de conexão deve usar o seguinte formato:

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

Para saber mais, consulte Conectar a um cluster via drivers.

Sua string de conexão deve usar o seguinte formato:

mongodb://localhost:<port-number>/?directConnection=true

Para saber mais, consulte Connection strings.

Nesta seção, você inicializa o kernel, que é a interface principal usada para gerenciar os serviços e plug-ins do seu aplicativo. Por meio do kernel, você configura seus serviços de IA, instancia o MongoDB como um banco de dados vetorial (também chamado de armazenamento de memória) e carrega dados personalizados em seu cluster MongoDB .

Para armazenar dados personalizados no MongoDB, cole e execute os seguintes trechos de código em seu bloco de anotações:

1

Execute o seguinte código para inicializar o kernel.

kernel = sk.Kernel()
2

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)
3

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=MONGODB_URI,
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")
4

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, se estiver usando o Atlas, poderá verificar suas incorporações vetoriais navegando até o namespace semantic_kernel_db.test na interface do usuário do Atlas.

Para habilitar queries de pesquisa vetorial em seu armazenamento de vetores, execute o seguinte código em seu bloco de anotações para criar um índice do MongoDB Vector Search na coleção semantic_kernel_db.test .

# Connect to your MongoDB cluster and specify the collection
client = MongoClient(MONGODB_URI)
collection = client["semantic_kernel_db"]["test"]
# Create your index model, then create the search index
search_index_model = SearchIndexModel(
definition={
"fields": [
{
"type": "vector",
"path": "embedding",
"numDimensions": 1536,
"similarity": "cosine"
}
]
},
name="vector_index",
type="vectorSearch"
)
collection.create_search_index(model=search_index_model)

A definição do índice indexa o campo embedding como o tipo vetor. O campo embedding contém as incorporações criadas utilizando o modelo de incorporação text-embedding-ada-002 da OpenAI. A definição de índice especifica 1536 dimensões vetoriais e mede a similaridade usando cosine.

Depois que o MongoDB criar seu índice, você poderá executar consultas de pesquisa vetorial 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

Esta seção mostra um exemplo de implementação de RAG com o MongoDB Vector Search e o semantic kernel. Agora que você usou a Vector Search do MongoDB para recuperar documentos semanticamente semelhantes, execute o exemplo de código a seguir 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 com a query 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.

O MongoDB também fornece os seguintes recursos para desenvolvedores:

Voltar

LlamaIndex

Nesta página