텍스트 포함 생성을 사용하면 AI 모델을 사용하여 벡터(즉, 포함)를 생성할 수 있습니다. 이러한 벡터는 두 벡터에서 수학 수식을 사용하여 원래 텍스트의 유사성을 비교할 수 있도록 텍스트의 의미 체계 의미를 인코딩합니다.
이는 사용자 쿼리와 관련된 텍스트에 대한 정보 데이터베이스를 검색하려는 RAG(검색 보강 생성)와 같은 시나리오에 유용합니다.
그러면 일치하는 모든 정보를 채팅 완성에 대한 입력으로 제공할 수 있으므로 AI 모델은 사용자 쿼리에 응답할 때 더 많은 컨텍스트를 갖습니다.
포함 모델을 선택할 때 다음을 고려해야 합니다.
- 모델이 생성하는 벡터의 크기는 얼마이며, 구성 가능합니까? 이는 벡터 저장 비용에 영향을 미칠 수 있습니다.
- 생성된 벡터에 포함되는 요소 유형(예: float32, float16 등)은 벡터 스토리지 비용에 영향을 줍니다.
- 벡터는 얼마나 빨리 생성하나요?
- 생성 비용은 얼마인가요?
로컬 환경 설정
일부 AI 서비스는 로컬로 호스팅될 수 있으며 일부 설정이 필요할 수 있습니다. 다음은 이를 지원하는 사용자에 대한 지침입니다.
docker를 사용하여 Ollama를 로컬로 실행하려면 다음 명령을 사용하여 CPU를 사용하여 컨테이너를 시작합니다.
docker run -d -v "c:\temp\ollama:/root/.ollama" -p 11434:11434 --name ollama ollama/ollama
docker를 사용하여 로컬로 Ollama를 실행하려면 다음 명령을 사용하여 GPU를 사용하여 컨테이너를 시작합니다.
docker run -d --gpus=all -v "c:\temp\ollama:/root/.ollama" -p 11434:11434 --name ollama ollama/ollama
컨테이너가 시작된 후 docker 컨테이너에 대한 터미널 창을 시작합니다(예: docker 데스크톱을 사용하는 경우 작업에서 Open in Terminal 선택).
이 터미널에서 필요한 모델을 다운로드합니다. 예를 들어 여기서는 mxbai-embed-large embedding 모델을 다운로드합니다.
ollama pull mxbai-embed-large
사용하려는 ONNX 모델이 포함된 리포지토리를 복제합니다.
git clone https://huggingface.co/TaylorAI/bge-micro-v2
필요한 패키지 설치
커널에 포함 생성을 추가하기 전에 필요한 패키지를 설치해야 합니다. 다음은 각 AI 서비스 공급자에 대해 설치해야 하는 패키지입니다.
dotnet add package Microsoft.SemanticKernel.Connectors.AzureOpenAI
dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI
dotnet add package Microsoft.SemanticKernel.Connectors.MistralAI --prerelease
dotnet add package Microsoft.SemanticKernel.Connectors.Google --prerelease
dotnet add package Microsoft.SemanticKernel.Connectors.HuggingFace --prerelease
dotnet add package Microsoft.SemanticKernel.Connectors.Ollama --prerelease
dotnet add package Microsoft.SemanticKernel.Connectors.Onnx --prerelease
텍스트 임베딩 생성 서비스 구축
이제 필요한 패키지를 설치했으므로 텍스트 포함 생성 서비스를 만들 수 있습니다. 다음은 의미 체계 커널을 사용하여 포함 생성 서비스를 텍스트로 만들 수 있는 몇 가지 방법입니다.
커널에 직접 추가
텍스트 포함 생성 서비스를 추가하려면 다음 코드를 사용하여 커널의 내부 서비스 공급자에 추가할 수 있습니다.
중요하다
Azure OpenAI 임베딩 생성 커넥터는 현재 실험적입니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0010추가해야 합니다.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0010
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddAzureOpenAITextEmbeddingGeneration(
deploymentName: "NAME_OF_YOUR_DEPLOYMENT", // Name of deployment, e.g. "text-embedding-ada-002".
endpoint: "YOUR_AZURE_ENDPOINT", // Name of Azure OpenAI service endpoint, e.g. https://myaiservice.openai.azure.com.
apiKey: "YOUR_API_KEY",
modelId: "MODEL_ID", // Optional name of the underlying model if the deployment name doesn't match the model name, e.g. text-embedding-ada-002.
serviceId: "YOUR_SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel.
httpClient: new HttpClient(), // Optional; if not provided, the HttpClient from the kernel will be used.
dimensions: 1536 // Optional number of dimensions to generate embeddings with.
);
Kernel kernel = kernelBuilder.Build();
중요하다
OpenAI 임베딩 생성 커넥터는 현재 실험 단계에 있습니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0010추가해야 합니다.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0010
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAITextEmbeddingGeneration(
modelId: "MODEL_ID", // Name of the embedding model, e.g. "text-embedding-ada-002".
apiKey: "YOUR_API_KEY",
orgId: "YOUR_ORG_ID", // Optional organization id.
serviceId: "YOUR_SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
httpClient: new HttpClient(), // Optional; if not provided, the HttpClient from the kernel will be used
dimensions: 1536 // Optional number of dimensions to generate embeddings with.
);
Kernel kernel = kernelBuilder.Build();
중요하다
Mistral 임베딩 생성 커넥터는 현재 실험 단계에 있습니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0070추가해야 합니다.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0070
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddMistralTextEmbeddingGeneration(
modelId: "NAME_OF_MODEL", // Name of the embedding model, e.g. "mistral-embed".
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional uri endpoint including the port where MistralAI server is hosted. Default is https://api.mistral.ai.
serviceId: "SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
Kernel kernel = kernelBuilder.Build();
중요하다
Google 임베딩 생성 커넥터는 현재 실험적입니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0070추가해야 합니다.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.Google;
#pragma warning disable SKEXP0070
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddGoogleAIEmbeddingGeneration(
modelId: "NAME_OF_MODEL", // Name of the embedding model, e.g. "models/text-embedding-004".
apiKey: "API_KEY",
apiVersion: GoogleAIVersion.V1, // Optional
serviceId: "SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
Kernel kernel = kernelBuilder.Build();
중요하다
Hugging Face 임베딩 생성 커넥터는 현재 실험적인 상태입니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0070추가해야 합니다.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0070
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddHuggingFaceTextEmbeddingGeneration(
model: "NAME_OF_MODEL", // Name of the embedding model.
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional
serviceId: "SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
Kernel kernel = kernelBuilder.Build();
중요하다
Ollama 임베딩 생성 커넥터는 현재 실험적입니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0070추가해야 합니다.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0070
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOllamaTextEmbeddingGeneration(
modelId: "NAME_OF_MODEL", // E.g. "mxbai-embed-large" if mxbai-embed-large was downloaded as described above.
endpoint: new Uri("YOUR_ENDPOINT"), // E.g. "http://localhost:11434" if Ollama has been started in docker as described above.
serviceId: "SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
Kernel kernel = kernelBuilder.Build();
중요하다
ONNX 임베딩 생성 커넥터는 현재 실험 단계에 있습니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0070추가해야 합니다.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0070
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddBertOnnxTextEmbeddingGeneration(
onnxModelPath: "PATH_ON_DISK", // Path to the model on disk e.g. C:\Repos\huggingface\microsoft\TaylorAI\bge-micro-v2\onnx\model.onnx
vocabPath: "VOCABULARY_PATH_ON_DISK",// Path to the vocabulary file on disk, e.g. C:\Repos\huggingface\TailorAI\bge-micro-v2\vocab.txt
serviceId: "SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
Kernel kernel = kernelBuilder.Build();
종속성 주입 사용
종속성 주입을 사용하는 경우, 서비스 공급자에 텍스트 임베딩 생성 서비스를 직접 추가하는 것이 좋습니다. 이는 포함 세대 서비스의 싱글톤을 만들고 임시 커널에서 다시 사용하려는 경우에 유용합니다.
중요하다
Azure OpenAI 임베딩 생성 커넥터는 현재 실험 단계입니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0010추가해야 합니다.
using Microsoft.SemanticKernel;
var builder = Host.CreateApplicationBuilder(args);
#pragma warning disable SKEXP0010
builder.Services.AddAzureOpenAITextEmbeddingGeneration(
deploymentName: "NAME_OF_YOUR_DEPLOYMENT", // Name of deployment, e.g. "text-embedding-ada-002".
endpoint: "YOUR_AZURE_ENDPOINT", // Name of Azure OpenAI service endpoint, e.g. https://myaiservice.openai.azure.com.
apiKey: "YOUR_API_KEY",
modelId: "MODEL_ID", // Optional name of the underlying model if the deployment name doesn't match the model name, e.g. text-embedding-ada-002.
serviceId: "YOUR_SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel.
dimensions: 1536 // Optional number of dimensions to generate embeddings with.
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
중요하다
OpenAI 임베딩 생성 커넥터는 현재 실험적입니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0010추가해야 합니다.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0010
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddOpenAITextEmbeddingGeneration(
modelId: "MODEL_ID", // Name of the embedding model, e.g. "text-embedding-ada-002".
apiKey: "YOUR_API_KEY",
orgId: "YOUR_ORG_ID", // Optional organization id.
serviceId: "YOUR_SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
dimensions: 1536 // Optional number of dimensions to generate embeddings with.
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
중요하다
Mistral 임베딩 생성 커넥터는 현재 실험 단계에 있습니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0070추가해야 합니다.
using Microsoft.SemanticKernel;
var builder = Host.CreateApplicationBuilder(args);
#pragma warning disable SKEXP0070
builder.Services.AddMistralTextEmbeddingGeneration(
modelId: "NAME_OF_MODEL", // Name of the embedding model, e.g. "mistral-embed".
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional uri endpoint including the port where MistralAI server is hosted. Default is https://api.mistral.ai.
serviceId: "SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
중요하다
Google 임베딩 생성 커넥터는 현재 실험 단계에 있습니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0070추가해야 합니다.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.Google;
var builder = Host.CreateApplicationBuilder(args);
#pragma warning disable SKEXP0070
builder.Services.AddGoogleAIEmbeddingGeneration(
modelId: "NAME_OF_MODEL", // Name of the embedding model, e.g. "models/text-embedding-004".
apiKey: "API_KEY",
apiVersion: GoogleAIVersion.V1, // Optional
serviceId: "SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
중요하다
Hugging Face 임베딩 생성 커넥터는 현재 실험적입니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0070추가해야 합니다.
using Microsoft.SemanticKernel;
var builder = Host.CreateApplicationBuilder(args);
#pragma warning disable SKEXP0070
builder.Services.AddHuggingFaceTextEmbeddingGeneration(
model: "NAME_OF_MODEL", // Name of the embedding model.
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional
serviceId: "SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
중요하다
Ollama 임베딩 생성 커넥터는 현재 실험적 상태입니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0070추가해야 합니다.
using Microsoft.SemanticKernel;
var builder = Host.CreateApplicationBuilder(args);
#pragma warning disable SKEXP0070
builder.Services.AddOllamaTextEmbeddingGeneration(
modelId: "NAME_OF_MODEL", // E.g. "mxbai-embed-large" if mxbai-embed-large was downloaded as described above.
endpoint: new Uri("YOUR_ENDPOINT"), // E.g. "http://localhost:11434" if Ollama has been started in docker as described above.
serviceId: "SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
중요하다
ONNX 임베딩 생성 커넥터는 현재 실험적입니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0070추가해야 합니다.
using Microsoft.SemanticKernel;
var builder = Host.CreateApplicationBuilder(args);
#pragma warning disable SKEXP0070
builder.Services.AddBertOnnxTextEmbeddingGeneration(
onnxModelPath: "PATH_ON_DISK", // Path to the model on disk e.g. C:\Repos\huggingface\microsoft\TaylorAI\bge-micro-v2\onnx\model.onnx
vocabPath: "VOCABULARY_PATH_ON_DISK",// Path to the vocabulary file on disk, e.g. C:\Repos\huggingface\TailorAI\bge-micro-v2\vocab.txt
serviceId: "SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
독립 실행형 인스턴스 만들기
마지막으로 나중에 커널에 추가하거나 커널 또는 서비스 공급자에 삽입하지 않고 코드에서 직접 사용할 수 있도록 서비스의 인스턴스를 직접 만들 수 있습니다.
중요하다
Azure OpenAI 임베딩 생성 커넥터는 현재는 실험 단계에 있습니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0010추가해야 합니다.
using Microsoft.SemanticKernel.Connectors.AzureOpenAI;
#pragma warning disable SKEXP0010
AzureOpenAITextEmbeddingGenerationService textEmbeddingGenerationService = new (
deploymentName: "NAME_OF_YOUR_DEPLOYMENT", // Name of deployment, e.g. "text-embedding-ada-002".
endpoint: "YOUR_AZURE_ENDPOINT", // Name of Azure OpenAI service endpoint, e.g. https://myaiservice.openai.azure.com.
apiKey: "YOUR_API_KEY",
modelId: "MODEL_ID", // Optional name of the underlying model if the deployment name doesn't match the model name, e.g. text-embedding-ada-002.
httpClient: new HttpClient(), // Optional; if not provided, the HttpClient from the kernel will be used.
dimensions: 1536 // Optional number of dimensions to generate embeddings with.
);
중요하다
OpenAI 임베딩 생성 커넥터는 현재 실험적입니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0010추가해야 합니다.
#pragma warning disable SKEXP0010
using Microsoft.SemanticKernel.Connectors.OpenAI;
OpenAITextEmbeddingGenerationService textEmbeddingGenerationService = new (
modelId: "MODEL_ID", // Name of the embedding model, e.g. "text-embedding-ada-002".
apiKey: "YOUR_API_KEY",
organization: "YOUR_ORG_ID", // Optional organization id.
httpClient: new HttpClient(), // Optional; if not provided, the HttpClient from the kernel will be used
dimensions: 1536 // Optional number of dimensions to generate embeddings with.
);
중요하다
Mistral 임베딩 생성용 커넥터는 현재 실험적입니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0070추가해야 합니다.
using Microsoft.SemanticKernel.Connectors.MistralAI;
#pragma warning disable SKEXP0070
MistralAITextEmbeddingGenerationService textEmbeddingGenerationService = new (
modelId: "NAME_OF_MODEL", // Name of the embedding model, e.g. "mistral-embed".
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional uri endpoint including the port where MistralAI server is hosted. Default is https://api.mistral.ai.
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
중요하다
Google 임베딩 생성 커넥터는 현재 실험적입니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0070추가해야 합니다.
using Microsoft.SemanticKernel.Connectors.Google;
#pragma warning disable SKEXP0070
GoogleAITextEmbeddingGenerationService textEmbeddingGenerationService = new (
modelId: "NAME_OF_MODEL", // Name of the embedding model, e.g. "models/text-embedding-004".
apiKey: "API_KEY",
apiVersion: GoogleAIVersion.V1, // Optional
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
중요하다
Hugging Face 임베딩 생성 커넥터는 현재 실험적입니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0070추가해야 합니다.
using Microsoft.SemanticKernel.Connectors.HuggingFace;
#pragma warning disable SKEXP0070
HuggingFaceTextEmbeddingGenerationService textEmbeddingGenerationService = new (
model: "NAME_OF_MODEL", // Name of the embedding model.
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
중요하다
Ollama 임베딩 생성 커넥터는 현재 실험 중입니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0070추가해야 합니다.
using Microsoft.SemanticKernel.Embeddings;
using OllamaSharp;
#pragma warning disable SKEXP0070
using var ollamaClient = new OllamaApiClient(
uriString: "YOUR_ENDPOINT" // E.g. "http://localhost:11434" if Ollama has been started in docker as described above.
defaultModel: "NAME_OF_MODEL" // E.g. "mxbai-embed-large" if mxbai-embed-large was downloaded as described above.
);
ITextEmbeddingGenerationService textEmbeddingGenerationService = ollamaClient.AsTextEmbeddingGenerationService();
중요하다
ONNX 임베딩 생성 커넥터는 현재 실험 단계입니다. 이 기능을 사용하려면 #pragma warning disable SKEXP0070추가해야 합니다.
using Microsoft.SemanticKernel.Connectors.Onnx;
#pragma warning disable SKEXP0070
BertOnnxTextEmbeddingGenerationService textEmbeddingGenerationService = await BertOnnxTextEmbeddingGenerationService.CreateAsync(
onnxModelPath: "PATH_ON_DISK", // Path to the model on disk e.g. C:\Repos\huggingface\microsoft\TaylorAI\bge-micro-v2\onnx\model.onnx
vocabPath: "VOCABULARY_PATH_ON_DISK" // Path to the vocabulary file on disk, e.g. C:\Repos\huggingface\TailorAI\bge-micro-v2\vocab.txt
);
텍스트 임베딩 생성 서비스 사용
모든 텍스트 임베딩 생성 서비스는 단일 메서드 GenerateEmbeddingsAsync을 갖춘 ITextEmbeddingGenerationService을 구현하며, 이는 제공된 string 값에서 ReadOnlyMemory<float> 벡터를 생성할 수 있습니다.
GenerateEmbeddingAsync 확장 메서드는 동일한 작업의 단일 값 버전에도 사용할 수 있습니다.
다음은 여러 값으로 서비스를 호출하는 방법의 예입니다.
IList<ReadOnlyMemory<float>> embeddings =
await textEmbeddingGenerationService.GenerateEmbeddingsAsync(
[
"sample text 1",
"sample text 2"
]);
다음은 단일 값으로 서비스를 호출하는 방법의 예입니다.
using Microsoft.SemanticKernel.Embeddings;
ReadOnlyMemory<float> embedding =
await textEmbeddingGenerationService.GenerateEmbeddingAsync("sample text");
곧 출시 예정
자세한 내용은 곧 제공될 예정입니다.
곧 출시 예정
자세한 내용은 곧 제공될 예정입니다.