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

Introdução à integração C# do Semantic Kernel

Nesta página

  • Plano de fundo
  • Pré-requisitos
  • Configurar o ambiente
  • Armazenar dados personalizados no Atlas
  • Criar o índice Atlas Vector Search Index
  • Executar queries no Vector Search
  • Responda a perguntas sobre seus dados
  • Próximos passos

Observação

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

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:

  1. Configure o ambiente.

  2. Armazene dados personalizados no Atlas.

  3. Crie um índice de pesquisa do Atlas Vector Search em seus dados.

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

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

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 Retrieval-Augmented Geração (RAG) com Atlas Vector Search.

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

  • Um Atlas 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 acessodo seu projeto Atlas.

  • Uma chave de API OpenAI. Você deve ter uma conta OpenAI paga com créditos disponíveis para solicitações de API.

  • Um editor de terminal e código para executar seu aplicativo .NET.

  • C#/.NET instalado.

Você deve primeiro configurar o ambiente para este tutorial. Para configurar seu ambiente, conclua as etapas a seguir.

1

Execute os seguintes comandos no seu terminal para criar um novo diretório denominado sk-mongodb e inicializar seu aplicativo:

mkdir sk-mongodb
cd sk-mongodb
dotnet new console
2

No seu terminal, execute os seguintes comandos para instalar os pacotes deste tutorial.

dotnet add package Microsoft.SemanticKernel
dotnet add package Microsoft.SemanticKernel.Connectors.MongoDB --prerelease
dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI
dotnet add package Microsoft.SemanticKernel.Memory
dotnet add package Microsoft.SemanticKernel.Plugins.Memory --prerelease
3

Em seu terminal, execute os seguintes comandos para adicionar a connection string SRVdo Atlas cluster e a chave de API OpenAI ao seu ambiente.

export OPENAI_API_KEY="<Your OpenAI API Key>"
export ATLAS_CONNECTION_STRING="<Your 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

Nesta seção, você inicializa o kernel, que é a principal interface 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 Atlas como um banco de dados vetorial (também chamado de armazenamento de memória) e carrega dados personalizados em seu Atlas cluster.

Copie e cole o seguinte código no arquivo Program.cs do seu aplicativo.

Este código executa as seguintes ações:

  • Importa o kernel semantic e todos os pacotes necessários.

  • Conecta-se ao seu Atlas cluster recuperando sua connection string SRVdo ambiente.

  • Recupera sua chave de API OpenAI do ambiente e cria uma instância do modelo de incorporação text-embedding-ada-002 do OpenAI.

  • Inicializa o Kernel e adiciona o seguinte serviço de IA ao Kernel:

  • Instancia o Atlas como um armazenamento de memória e especifica os seguintes parâmetros:

    • semantic_kernel_db.test como a coleção para armazenar os documentos.

    • vector_index como o índice a ser usado para consultar o armazenamento de memória.

  • Inicializa uma classe chamada SemanticTextMemory, que fornece um grupo de métodos nativos para ajudá-lo a armazenar e recuperar texto na memória.

  • Preenche a coleção semantic_kernel_db.test com documentos de amostra chamando o método PopulateMemoryAsync .

// Import Packages
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.MongoDB;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Microsoft.SemanticKernel.Memory;
using Microsoft.SemanticKernel.Plugins.Memory;
# pragma warning disable SKEXP0010, SKEXP0020, SKEXP0001, SKEXP0050
class Program {
static async Task Main(string[] args) {
// Get connection string and OpenAI API Key
var connectionString = Environment.GetEnvironmentVariable("ATLAS_CONNECTION_STRING");
if (connectionString == null)
{
Console.WriteLine("You must set your 'ATLAS_CONNECTION_STRING' environment variable.");
Environment.Exit(0);
}
var openAIKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY");
if (openAIKey == null)
{
Console.WriteLine("You must set your 'OPENAPI_KEY' environment variable.");
Environment.Exit(0);
}
// Create new OpenAI API Embedding Model
var embeddingGenerator = new OpenAITextEmbeddingGenerationService("text-embedding-ada-002", openAIKey);
// Initialize Kernel
IKernelBuilder builder = Kernel.CreateBuilder();
// Add OpenAI Chat Completion to Kernel
builder.AddOpenAIChatCompletion(
modelId: "gpt-3.5-turbo",
apiKey: openAIKey
);
Kernel kernel = builder.Build();
// Instantiate Atlas as a memory store.
MongoDBMemoryStore memoryStore = new(connectionString, "semantic_kernel_db", indexName: "vector_index");
SemanticTextMemory textMemory = new(memoryStore, embeddingGenerator);
// Populate memory with sample data
async Task PopulateMemoryAsync(Kernel kernel) {
await textMemory.SaveInformationAsync(collection: "test", text: "I am a developer", id: "1");
await textMemory.SaveInformationAsync(collection: "test", text: "I started using MongoDB two years ago", id: "2");
await textMemory.SaveInformationAsync(collection: "test", text: "I'm using MongoDB Vector Search with Semantic Kernel to implement RAG", id: "3");
await textMemory.SaveInformationAsync(collection: "test", text: "I like coffee", id: "4");
}
await PopulateMemoryAsync(kernel);
}
}

Salve o arquivo e execute o seguinte comando para carregar seus dados no Atlas:

dotnet run

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.

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 .

Para criar um Atlas Vector Search índice de pesquisa, você deve ter acesso Project Data Access Admin ou superior ao Atlas projeto.

Em seu bloco de anotações, execute o seguinte código para conectar ao seu Atlas cluster e criar um índice do tipo vectorSearch . Esta definição de índice especifica a indexação dos seguintes campos:

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

# Connect to your Atlas cluster and specify the collection
client = MongoClient(ATLAS_CONNECTION_STRING)
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)

O índice deve levar cerca de um minuto para ser criado. Enquanto constrói, o índice está em um estado de sincronização inicial . Quando terminar de ser criado, você poderá começar a consultar os dados em sua coleção.

Depois que o Atlas criar seu índice, você poderá executar consultas vetoriais do Atlas Search em seus dados.

No final do arquivo Program.cs , adicione o seguinte código para executar uma pesquisa semântica básica para a string What is my job title?. Imprime o documento mais relevante e uma pontuação de relevância entre 0 e 1.

1var results = textMemory.SearchAsync(collection: "test", query: "What is my job title?");
2
3await foreach (var result in results) {
4 Console.WriteLine($"Answer: {result?.Metadata.Text}, {result?.Relevance}");
5}
6Console.WriteLine("Search completed.");

Salve o arquivo e execute o seguinte comando para ver os resultados da pesquisa semântica:

dotnet run
Answer: I am a developer, 0.8913083076477051
Search completed.

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, cole o seguinte exemplo de código no final do seu Program.cs para solicitar que o LLM responda às perguntas com base nesses documentos.

Este código executa as seguintes ações:

  • Importa as funções da classe TextMemoryPlugin para o textMemory do kernel .

  • Constrói um modelo de prompt que usa a função recall da classe TextMemoryPlugin para executar uma pesquisa semântica no textMemory do kernel para a string When did I start using MongoDB?.

  • Cria uma função denominada settings a partir do prompt do chat usando a função CreateFunctionFromPrompt do kernel.

  • Chama a função InvokeAsync do kernel para gerar uma resposta a partir do modelo de chat usando os seguintes parâmetros:

    • A função settings que configura o modelo de prompt e OpenAIPromptExecutionSettings.

    • A pergunta When did I start using MongoDB? como o valor para a variável {{$input}} no modelo de prompt.

    • semantic_kernel_db.test como a collection da qual recuperar informações.

  • Imprime a pergunta e a resposta gerada.

1 kernel.ImportPluginFromObject(new TextMemoryPlugin(textMemory));
2 const string promptTemplate = @"
3 Answer the following question based on the given context.
4 Question: {{$input}}
5 Context: {{recall 'When did I start using MongoDB?'}}
6 ";
7
8 // Create and Invoke function from the prompt template
9 var settings = kernel.CreateFunctionFromPrompt(promptTemplate, new OpenAIPromptExecutionSettings());
10 var ragResults = await kernel.InvokeAsync(settings, new()
11 {
12 [TextMemoryPlugin.InputParam] = "When did I start using MongoDB?",
13 [TextMemoryPlugin.CollectionParam] = "test"
14 });
15
16 // Print RAG Search Results
17 Console.WriteLine("Question: When did I start using MongoDB?");
18 Console.WriteLine($"Answer: {ragResults.GetValue<string>()}");

Salve o arquivo e execute o seguinte comando para gerar uma resposta:

dotnet run
Question: When did I start using MongoDB?
Answer: You started using MongoDB two years ago.

Dica

Você pode adicionar seus próprios dados e substituir as seguintes partes do código para gerar respostas em uma pergunta diferente:

  • {{recall '<question>'}} ,

  • [TextMemory.InputParam] = "<question>" ,

  • Console.WriteLine("Question: <question>") .

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

Dica

Veja também:

Voltar

LlamaIndex

Próximo

Kernel semântico