Docs Menu
Docs Home
/
MongoDB Atlas
/ /

Semantic Kernel C# 통합 시작하기

이 페이지의 내용

  • 배경
  • 전제 조건
  • 환경 설정
  • Atlas에 사용자 지정 데이터 저장
  • Atlas Vector Search 인덱스 만들기
  • Vector Search 쿼리 실행
  • 데이터에 대한 질문에 답변
  • 다음 단계

참고

이 자습서에서는 Semantic Kernel C# 라이브러리를 사용합니다. Python 라이브러리를 사용하는 자습서는 Semantic Kernel Python 통합 시작하기를 참조하세요.

Atlas Vector Search를 Microsoft 시맨틱 커널 과 통합할 수 있습니다. AI 애플리케이션을 구축하고 RAG(검색 강화 생성)를 구현합니다. 이 튜토리얼에서는 시맨틱 커널과 함께 Atlas Vector Search 를 사용하여 데이터에 대해 시맨틱 Atlas Search를 수행하고 RAG 구현을 빌드하는 방법을 보여 줍니다. 구체적으로 다음 조치를 수행합니다.

  1. 환경을 설정합니다.

  2. Atlas에 사용자 지정 데이터를 저장합니다.

  3. 데이터에 Atlas Vector Search 검색 인덱스를 만듭니다.

  4. 데이터에 대해 시맨틱 검색 쿼리를 실행합니다.

  5. Atlas Vector Search을 사용하여 데이터에 대한 질문에 답변하는 RAG를 구현하세요.

시맨틱 커널은 다양한 AI 서비스 및 플러그인을 애플리케이션과 결합할 수 있는 오픈 소스 SDK입니다. 시맨틱 커널은 RAG 를 포함한 다양한 AI 사용 사례에 사용할 수 있습니다.

Atlas Vector Search를 Semantic Kernel과 통합하면 Atlas를 벡터 데이터베이스로 사용하고 Atlas Vector Search를 통해 데이터에서 의미적으로 유사한 문서를 검색하여 RAG를 구현할 수 있습니다. RAG에 대해 자세히 알아보려면 Atlas Vector Search를 사용한 검색 증강 생성(RAG)을 참조하세요.

이 튜토리얼을 완료하려면 다음 조건을 충족해야 합니다.

  • MongoDB 버전 6.0.11, 7.0.2 이상(RC 포함)을 실행 하는 클러스터 가 있는 Atlas 계정. 사용자의 IP 주소 가 Atlas 프로젝트의 액세스 목록에 포함되어 있는지 확인하세요. 학습 내용은 클러스터 생성을 참조하세요.

  • OpenAI API 키. API 요청에 사용할 수 있는 크레딧이 있는 유료 OpenAI 계정이 있어야 합니다. OpenAI 계정 등록에 대한 자세한 내용은 OpenAI API 웹사이트를 참조하세요.

  • .NET 애플리케이션을 실행하기 위한 터미널 및 코드 편집기입니다.

  • C#/.NET 설치됨.

먼저 이 튜토리얼을 진행하려면 환경을 설정해야 합니다. 환경을 설정하려면 다음 단계를 완료하세요.

1

터미널에서 다음 명령을 실행하여 sk-mongodb라는 새 디렉토리를 만들고 애플리케이션을 초기화합니다.

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

터미널에서 다음 명령을 실행하여 이 튜토리얼의 패키지를 설치합니다.

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

터미널에서 다음 명령을 실행하여 Atlas 클러스터의 SRV 연결 문자열과 OpenAI API 키를 환경에 추가합니다.

export OPENAI_API_KEY="<Your OpenAI API Key>"
export ATLAS_CONNECTION_STRING="<Your MongoDB Atlas SRV Connection String>"

참고

연결 문자열은 다음 형식을 사용해야 합니다.

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

이 섹션에서는 커널을 초기화합니다. 이는 애플리케이션의 서비스와 플러그인을 관리하는 데 사용되는 주요 인터페이스입니다. 커널을 통해 AI 서비스를 구성하고, Atlas를 벡터 데이터베이스(메모리 저장소라고도 함)로 인스턴스화하며, 사용자 지정 데이터를 Atlas 클러스터에 로드합니다.

다음 코드를 복사하여 애플리케이션의 Program.cs 파일에 붙여넣습니다.

이 코드는 다음 작업을 수행합니다.

  • Semantic Kernel 및 필요한 모든 패키지를 가져옵니다.

  • 환경에서 SRV 연결 문자열을 검색하여 Atlas 클러스터에 연결합니다.

  • 환경에서 OpenAI API 키를 조회하고 OpenAI text-embedding-ada-002 임베딩 모델의 인스턴스를 생성합니다.

  • 커널을 초기화한 후 다음 AI 서비스를 커널에 추가합니다.

  • Atlas를 메모리 저장소로 인스턴스화하고 다음 매개변수를 지정합니다.

    • semantic_kernel_db.test 를 사용해 문서를 저장하는 컬렉션입니다.

    • vector_index 메모리 저장소를 쿼리하는 데 사용할 인덱스입니다.

  • SemanticTextMemory 클래스를 초기화합니다. 이 클래스는 텍스트를 메모리에 저장하고 조회하는 데 도움이 되는 네이티브 메서드 그룹을 제공합니다.

  • PopulateMemoryAsync 메서드를 호출하여 semantic_kernel_db.test 컬렉션을 샘플 문서로 채웁니다.

// 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);
}
}

파일을 저장한 다음 다음 명령을 실행하여 데이터를 Atlas에 로드합니다.

dotnet run

샘플 코드를 실행한semantic_kernel_db.test cluster의 collection으로 이동 하여 Atlas UI에서 벡터 임베딩을 볼 수 있습니다.

벡터 저장소에서 벡터 검색 쿼리를 활성화하려면 semantic_kernel_db.test 컬렉션에 Atlas Vector Search 인덱스를 생성하세요.

Atlas Vector Search 검색 인덱스를 만들려면 Atlas 프로젝트에 대한 Project Data Access Admin 이상의 액세스 권한이 있어야 합니다.

1
  1. 아직 표시되지 않은 경우 탐색 표시줄의 Organizations 메뉴에서 원하는 프로젝트가 포함된 조직을 선택합니다.

  2. 아직 표시되지 않은 경우 탐색 표시줄의 Projects 메뉴에서 원하는 프로젝트를 선택합니다.

  3. 아직 표시되지 않은 경우 사이드바에서 Clusters를 클릭합니다.

    Clusters(클러스터) 페이지가 표시됩니다.

2

사이드바, Data Explorer 또는 클러스터 세부 정보 페이지에서 Atlas Search 페이지로 이동할 수 있습니다.

  1. 사이드바에서 Services 제목 아래의 Atlas Search를 클릭합니다.

  2. Select data source 드롭다운에서 클러스터를 선택하고 Go to Atlas Search를 클릭합니다.

    Atlas Search 페이지가 표시됩니다.

  1. cluster의 Browse Collections 버튼을 클릭합니다.

  2. 데이터베이스를 확장하고 컬렉션을 선택합니다.

  3. 컬렉션의 Search Indexes 탭을 클릭합니다.

    Atlas Search 페이지가 표시됩니다.

  1. 클러스터 이름을 클릭합니다.

  2. Atlas Search 탭을 클릭합니다.

    Atlas Search 페이지가 표시됩니다.

3
  1. Create Search Index를 클릭합니다.

  2. Atlas Vector Search 아래에서 JSON Editor 을 선택한 다음 Next 를 클릭합니다.

  3. Database and Collection 섹션에서 semantic_kernel_db 데이터베이스를 찾고 test 컬렉션을 선택합니다.

  4. Index Name 필드에 vector_index를 입력합니다.

  5. 기본 정의를 다음 인덱스 정의로 바꾼 다음 Next를 클릭합니다.

    이 인덱스 정의는 VectorSearch 유형의 인덱스에서 다음 필드를 인덱싱하도록 지정합니다.

    • embedding 필드를 벡터 유형으로 지정합니다. embedding 필드에는 OpenAI의 text-embedding-ada-002 임베딩 모델을 사용하여 생성된 임베딩이 포함되어 있습니다. 인덱스 정의는 1536 벡터 차원을 지정하고 cosine 를 사용하여 유사성을 측정합니다.

    1{
    2 "fields": [
    3 {
    4 "type": "vector",
    5 "path": "embedding",
    6 "numDimensions": 1536,
    7 "similarity": "cosine"
    8 }
    9 ]
    10}
4

인덱스가 작성 중임을 보여주는 모달 창이 표시됩니다.

5

인덱스 작성에는 약 1분 정도가 소요됩니다. 작성하는 동안 Status 열은 Initial Sync를 읽습니다. 빌드가 완료되면 Status 열에 Active가 표시됩니다.

Atlas 가 인덱스를 빌드하면 데이터에 대해 벡터 Atlas Search 쿼리를 실행할 수 있습니다.

Program.cs 파일 끝에 다음 코드를 추가하여 What is my job title? 문자열에 대한 기본 시맨틱 검색을 수행합니다. 가장 관련성이 높은 문서와 0에서 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.");

파일을 저장한 후 다음 명령을 실행하여 시맨틱 검색 결과를 확인합니다.

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

이 섹션에서는 Atlas Vector Search 및 Semantic Kernel을 사용한 RAG 구현 예시를 보여줍니다. 이제 Atlas Vector Search를 사용하여 의미상 유사한 문서를 조회했으니, Program.cs 끝에 다음 코드 예시를 붙여넣어 LLM이 해당 문서를 기반으로 질문에 답하도록 유도할 수 있습니다.

이 코드는 다음 작업을 수행합니다.

  • TextMemoryPlugin 클래스의 함수를 커널의 textMemory로 가져옵니다.

  • TextMemoryPlugin 클래스의 recall 함수를 사용하여 커널 textMemory에서 When did I start using MongoDB? 문자열에 대한 시맨틱 검색을 수행하는 프롬프트 템플릿을 빌드합니다.

  • 커널의 CreateFunctionFromPrompt 함수를 사용하여 채팅 프롬프트에서 settings 라는 함수를 생성합니다.

  • 커널의 InvokeAsync 함수를 호출하여 다음 파라미터를 사용하여 채팅 모델에서 응답을 생성합니다.

    • 프롬프트 템플릿과 OpenAIPromptExecutionSettings를 구성하는 settings 함수입니다.

    • When did I start using MongoDB?라는 질문을 프롬프트 템플릿의 {{$input}} 변수에 대한 값으로 설정합니다.

    • semantic_kernel_db.test 정보를 검색할 컬렉션으로 지정합니다.

  • 질문과 생성된 답변을 출력합니다.

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>()}");

파일을 저장한 후 다음 명령을 실행하여 응답을 생성합니다.

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

다른 질문에 대한 응답을 생성하려면 다음 코드 부분을 교체하고 자신의 데이터를 추가할 수 있습니다.

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

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

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

MongoDB는 다음과 같은 개발자 리소스도 제공합니다.

다음도 참조하세요.

돌아가기

LlamaIndex