문서 메뉴
문서 홈
/
MongoDB 아틀라스
/ /

시맨틱 커널 C# 통합 시작하기

이 페이지의 내용

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

참고

이 튜토리얼에서는 시맨틱 커널 C# 라이브러리 를 사용합니다. . Python 라이브러리를 사용하는 튜토리얼은 시맨틱 커널 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를 시맨틱 커널과 통합하면 Atlas를 벡터 데이터베이스로 사용하고 Atlas Vector Search를 사용하여 데이터에서 의미적으로 유사한 문서를 검색하여 RAG 를 구현할 수 있습니다. RAG 에 대해 자세히 알아보려면 Atlas Vector Search를 사용한 검색-증강 생성(RAG)을 참조하세요.

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

  • MongoDB 버전 6 을(를) 실행하는 Atlas 클러스터입니다.0.11, 7.0.2 이상( RC 포함). 사용자의 IP 주소 가 Atlas 프로젝트의 액세스 목록에 포함되어 있는지 확인하세요.

  • OpenAI API 키입니다. API 요청에 사용할 수 있는 크레딧이 있는 유료 OpenAI 계정이 있어야 합니다.

  • .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 cluster의 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 cluster에 로드합니다.

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

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

  • 시맨틱 커널 및 모든 필수 패키지를 가져옵니다.

  • 환경에서 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 이상의 액세스 권한이 있어야 합니다.

노트북에서 다음 코드를 실행하여 Atlas cluster에 연결하고 vectorSearch 유형의 인덱스를 생성합니다. 이 인덱스 정의는 다음 필드의 인덱싱을 지정합니다.

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

인덱스를 빌드하는 데 약 1분 정도 걸립니다. 빌드되는 동안 인덱스는 초기 동기화 상태입니다. 빌드가 완료되면 컬렉션의 데이터 쿼리를 시작할 수 있습니다.

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 및 시맨틱 커널을 사용한 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

다음

시맨틱 커널