임베딩

·3분 읽기

원문: Koog Documentation — embeddings 이 글은 Koog 공식 문서의 embeddings 페이지를 한국어로 옮긴 번역본입니다. 문서 구조와 링크 의미를 유지하되, MkDocs 전용 UI 문법은 블로그에서 읽기 좋도록 정리했습니다.

임베딩

embeddings 모듈은 텍스트와 코드의 임베딩을 생성하고 비교하는 기능을 제공합니다. 임베딩은 의미론적 의미를 포착하는 벡터 표현이므로 효율적인 유사성 비교가 가능합니다.

개요

이 모듈은 두 가지 주요 구성 요소로 구성됩니다.

  1. embeddings-base: 임베딩을 위한 핵심 인터페이스 및 데이터 구조입니다.
  2. embeddings-llm: 로컬 임베딩 생성을 위해 Ollama를 사용하여 구현합니다.

시작하기

다음 섹션에는 다음과 같은 방식으로 임베딩을 사용하는 방법에 대한 기본 예가 포함되어 있습니다.

  • Ollama를 통한 로컬 임베딩 모델 사용
  • OpenAI 임베딩 모델 사용

로컬 임베딩

로컬 모델에 포함 기능을 사용하려면 시스템에 Ollama를 설치하고 실행해야 합니다. 설치 및 실행 지침은 official Ollama GitHub repository을 참조하세요.

1fun main() {2    runBlocking {3        // Create an OllamaClient instance4        val client = OllamaClient()5        // Create an embedder6        val embedder = LLMEmbedder(client, OllamaModels.Embeddings.NOMIC_EMBED_TEXT)7        // Create embeddings8        val embedding = embedder.embed("This is the text to embed")9        // Print embeddings to the output10        println(embedding)11    }12}

Ollama 임베딩 모델을 사용하려면 다음 전제 조건을 충족해야 합니다.

  • Ollama을 설치하고 실행 중이어야 합니다.
  • 다음 명령을 사용하여 임베딩 모델을 로컬 머신에 다운로드합니다.
1ollama pull <ollama-model-id>

<ollama-model-id>을 특정 모델의 Ollama 식별자로 바꿉니다. 사용 가능 여부에 대한 자세한 내용은 임베딩 모델 및 해당 식별자는 Ollama models overview을 참조하세요.

Ollama 모델 개요

다음 표는 사용 가능한 Ollama 임베딩 모델의 개요를 제공합니다.

모델 ID 올라마 아이디 매개변수 치수 컨텍스트 길이 성능 트레이드오프
NOMIC_EMBED_TEXT 노믹 삽입 텍스트 137M 768 8192 의미 검색 및 텍스트 유사성 작업을 위한 고품질 임베딩 품질과 효율성의 균형
ALL_MINILM 모든 최소화 33M 384 512 일반 텍스트 임베딩을 위한 우수한 품질의 빠른 추론 컨텍스트 길이가 감소된 더 작은 모델 크기이지만 매우 효율적입니다.
MULTILINGUAL_E5 zylonai/다국어-e5-large 3억 768 512 100개 이상의 언어에 대한 강력한 성능 모델 크기는 더 크지만 뛰어난 다국어 기능 제공
BGE_LARGE bge-대형 335M 1024 512 영어 텍스트 검색 및 의미 검색에 탁월 모델 크기는 더 크지만 고품질 임베딩을 제공합니다.
MXBAI_EMBED_LARGE mxbai-임베디드-대형 - - - 텍스트 데이터의 고차원 임베딩 고차원 임베딩 생성을 위해 설계됨

이러한 모델에 대한 자세한 내용은 Ollama의 Embedding Models을 참조하세요. 블로그 게시물.

모델 선택

다음은 요구 사항에 따라 선택할 Ollama 임베딩 모델에 대한 몇 가지 일반적인 팁입니다.

  • 일반 텍스트 임베딩의 경우 NOMIC_EMBED_TEXT을 사용하세요.
  • 다국어 지원을 위해서는 MULTILINGUAL_E5을 사용하세요.
  • 최대 품질을 얻으려면(성능을 희생하면서) BGE_LARGE을 사용하십시오.
  • 효율성을 최대화하려면(일부 품질을 희생하면서) ALL_MINILM을 사용하십시오.
  • 고차원 임베딩의 경우 MXBAI_EMBED_LARGE을 사용하세요.

OpenAI 임베딩

OpenAI 임베딩 모델을 사용하여 임베딩을 생성하려면 표시된 대로 OpenAILLMClient 인스턴스의 embed 메서드를 사용하세요. 아래 예에서.

1suspend fun openAIEmbed(text: String) {2    // Get the OpenAI API token from the OPENAI_KEY environment variable3    val token = System.getenv("OPENAI_KEY") ?: error("Environment variable OPENAI_KEY is not set")4    // Create an OpenAILLMClient instance5    val client = OpenAILLMClient(token)6    // Create an embedder7    val embedder = LLMEmbedder(client, OpenAIModels.Embeddings.TextEmbeddingAda002)8    // Create embeddings9    val embedding = embedder.embed(text)10    // Print embeddings to the output11    println(embedding)12}

AWS 기반암 임베딩

AWS Bedrock 임베딩 모델을 사용하여 임베딩을 생성하려면 BedrockLLMClient 인스턴스의 embed 메서드와 선택한 모델을 사용합니다. 예:

1suspend fun bedrockEmbed(text: String) {2    // Get AWS credentials from environment/configuration3    val awsAccessKeyId = System.getenv("AWS_ACCESS_KEY_ID") ?: error("AWS_ACCESS_KEY_ID not set")4    val awsSecretAccessKey = System.getenv("AWS_SECRET_ACCESS_KEY") ?: error("AWS_SECRET_ACCESS_KEY not set")5    // (Optional) AWS_SESSION_TOKEN for temporary credentials6    val awsSessionToken = System.getenv("AWS_SESSION_TOKEN")7    // Create a BedrockLLMClient instance8    val client = BedrockLLMClient(9        identityProvider = StaticCredentialsProvider {10            this.accessKeyId = awsAccessKeyId11            this.secretAccessKey = awsSecretAccessKey12            awsSessionToken?.let { this.sessionToken = it }13        },14        settings = BedrockClientSettings()15    )16    // Create an embedder17    val embedder = LLMEmbedder(client, BedrockModels.Embeddings.AmazonTitanEmbedText)18    // Create embeddings19    val embedding = embedder.embed(text)20    // Print embeddings to the output21    println(embedding)22}

지원되는 AWS Bedrock 임베딩 모델

공급자 모델명 모델 ID 입력 산출 치수 컨텍스트 길이 메모
아마존 Titan 임베딩 G1 - 텍스트 amazon.titan-embed-text-v1 텍스트 임베딩 1,536 8192 검색, 의미 유사성, 클러스터링에 최적화된 25개 이상의 언어; 검색을 위해 긴 문서를 분할합니다.
아마존 Titan 텍스트 임베딩 V2 amazon.titan-embed-text-v2:0 텍스트 임베딩 1,024 8192 높은 정확성, 유연한 치수, 다국어(100개 이상); 밝기가 작을수록 저장 공간이 절약되고 출력이 정규화됩니다.
코히어 Cohere Embed 영어 v3 cohere.embed-english-v3 텍스트 임베딩 1,024 8192 검색, 검색 및 텍스트 뉘앙스 이해를 위한 SOTA 영어 텍스트 임베딩입니다.
코히어 Cohere Embed 다국어 v3 cohere.embed-multilingual-v3 텍스트 임베딩 1,024 8192 다국어 임베딩, 언어 간 검색 및 의미론적 이해를 위한 SOTA.

최신 모델 지원은 AWS Bedrock supported models documentation을 참조하세요.

다음 예에서는 임베딩을 사용하여 코드를 텍스트 또는 기타 코드 조각과 비교하는 방법을 보여줍니다.

코드-텍스트 비교

코드 조각을 자연어 설명과 비교하여 의미론적으로 일치하는 항목을 찾습니다.

1suspend fun compareCodeToText(embedder: Embedder) { // Embedder type2    // Code snippet3    val code = """4        fun factorial(n: Int): Int {5            return if (n <= 1) 1 else n * factorial(n - 1)6        }7    """.trimIndent()89    // Text descriptions10    val description1 = "A recursive function that calculates the factorial of a number"11    val description2 = "A function that sorts an array of integers"1213    // Generate embeddings14    val codeEmbedding = embedder.embed(code)15    val desc1Embedding = embedder.embed(description1)16    val desc2Embedding = embedder.embed(description2)1718    // Calculate differences (lower value means more similar)19    val diff1 = embedder.diff(codeEmbedding, desc1Embedding)20    val diff2 = embedder.diff(codeEmbedding, desc2Embedding)2122    println("Difference between code and description 1: $diff1")23    println("Difference between code and description 2: $diff2")2425    // The code should be more similar to description1 than description226    if (diff1 < diff2) {27        println("The code is more similar to: '$description1'")28    } else {29        println("The code is more similar to: '$description2'")30    }31}

코드 간 비교

구문 차이에 관계없이 코드 조각을 비교하여 의미론적 유사성을 찾습니다.

1suspend fun compareCodeToCode(embedder: Embedder) { // Embedder type2    // Two implementations of the same algorithm in different languages3    val kotlinCode = """4        fun fibonacci(n: Int): Int {5            return if (n <= 1) n else fibonacci(n - 1) + fibonacci(n - 2)6        }7    """.trimIndent()89    val pythonCode = """10        def fibonacci(n):11            if n <= 1:12                return n13            else:14                return fibonacci(n-1) + fibonacci(n-2)15    """.trimIndent()1617    val javaCode = """18        public static int bubbleSort(int[] arr) {19            int n = arr.length;20            for (int i = 0; i < n-1; i++) {21                for (int j = 0; j < n-i-1; j++) {22                    if (arr[j] > arr[j+1]) {23                        int temp = arr[j];24                        arr[j] = arr[j+1];25                        arr[j+1] = temp;26                    }27                }28            }29            return arr;30        }31    """.trimIndent()3233    // Generate embeddings34    val kotlinEmbedding = embedder.embed(kotlinCode)35    val pythonEmbedding = embedder.embed(pythonCode)36    val javaEmbedding = embedder.embed(javaCode)3738    // Calculate differences39    val diffKotlinPython = embedder.diff(kotlinEmbedding, pythonEmbedding)40    val diffKotlinJava = embedder.diff(kotlinEmbedding, javaEmbedding)4142    println("Difference between Kotlin and Python implementations: $diffKotlinPython")43    println("Difference between Kotlin and Java implementations: $diffKotlinJava")4445    // The Kotlin and Python implementations should be more similar46    if (diffKotlinPython < diffKotlinJava) {47        println("The Kotlin code is more similar to the Python code")48    } else {49        println("The Kotlin code is more similar to the Java code")50    }51}

API 문서

임베딩과 관련된 전체 API 참조를 보려면 다음 모듈에 대한 참조 문서를 확인하세요.

  • embeddings-base: 텍스트를 표현하고 비교하기 위한 핵심 인터페이스와 데이터 구조를 제공합니다. 그리고 코드 임베딩.
  • embeddings-llm: 로컬 임베딩 모델 작업을 위한 구현을 포함합니다.