AI 모델로 콘텐츠 생성

생성형 AI의 핵심은 AI 모델입니다. 현재 생성형 모델의 두 가지 대표적인 예시는 대규모 언어 모델(LLM)과 이미지 생성 모델입니다. 이러한 모델은 프롬프트(일반적으로 텍스트, 이미지 또는 두 가지의 조합)라는 입력을 받아 텍스트, 이미지, 오디오 또는 동영상을 출력으로 생성합니다.

이러한 모델의 출력은 놀라울 정도로 설득력이 있습니다. LLM은 사람이 작성한 것처럼 보이는 텍스트를 생성하고 이미지 생성 모델은 실제 사진이나 사람이 만든 예술작품과 매우 유사한 이미지를 생성할 수 있습니다.

또한 LLM은 단순한 텍스트 생성 외에도 다음과 같은 작업을 할 수 있는 것으로 입증되었습니다.

  • 컴퓨터 프로그램 작성
  • 대규모 작업을 완료하는 데 필요한 하위 작업 계획
  • 정리되지 않은 데이터 정리
  • 텍스트 코퍼스에서 정보 데이터 이해 및 추출
  • 활동의 텍스트 설명을 기반으로 자동 활동을 따르고 수행

여러 공급업체에서 제공하는 다양한 모델을 사용할 수 있습니다. 각 모델에는 고유한 장단점이 있으며 한 모델은 특정 작업에 능숙하지만 다른 작업에는 능숙하지 않을 수 있습니다. 생성형 AI를 사용하는 앱은 당면한 작업에 따라 여러 모델을 사용하는 것이 좋습니다.

앱 개발자는 일반적으로 생성형 AI 모델과 직접 상호작용하지 않고 웹 API로 제공되는 서비스를 통해 상호작용합니다. 이러한 서비스는 기능이 비슷한 경우가 많지만 모두 호환되지 않는 서로 다른 API를 통해 기능을 제공합니다. 여러 모델 서비스를 사용하려면 서로 호환되지 않을 수 있는 각 독점 SDK를 사용해야 합니다. 또한 한 모델에서 가장 성능이 높은 최신 모델로 업그레이드하려면 통합을 다시 빌드해야 할 수도 있습니다.

Genkit는 이미 사용 가능한 여러 사전 빌드된 구현과 함께 잠재적으로 모든 생성형 AI 모델 서비스에 액세스하는 세부정보를 추상화하는 단일 인터페이스를 제공하여 이 문제를 해결합니다. Genkit를 중심으로 AI 기반 앱을 빌드하면 첫 번째 생성형 AI 호출을 간소화할 수 있으며, 새 모델이 등장할 때 여러 모델을 결합하거나 한 모델을 다른 모델로 교체하는 것도 마찬가지로 간편합니다.

시작하기 전에

이 페이지의 코드 예시를 실행하려면 먼저 시작하기 가이드의 단계를 완료하세요. 모든 예시에서는 이미 프로젝트에 Genkit를 종속 항목으로 설치했다고 가정합니다.

Genkit에서 지원하는 모델

Genkit는 잠재적으로 모든 생성형 AI 모델 서비스를 사용할 수 있을 만큼 유연하게 설계되었습니다. 핵심 라이브러리는 모델을 사용하는 공통 인터페이스를 정의하고 모델 플러그인은 특정 모델과 API를 사용하는 구현 세부정보를 정의합니다.

Genkit팀은 Vertex AI, Google 생성형 AI, Ollama에서 제공하는 모델을 사용하는 플러그인을 유지 관리합니다.

모델 플러그인 로드 및 구성

Genkit를 사용하여 콘텐츠 생성을 시작하려면 먼저 모델 플러그인을 로드하고 구성해야 합니다. 시작하기 가이드에서 이 페이지로 이동한 경우 이미 이 단계를 완료했습니다. 그렇지 않으면 시작하기 가이드 또는 개별 플러그인의 문서를 참고하고 계속하기 전에 안내된 단계를 따르세요.

genkit.Generate() 함수

Genkit에서 생성형 AI 모델과 상호작용하는 기본 인터페이스는 genkit.Generate() 함수입니다.

가장 간단한 genkit.Generate() 호출은 사용할 모델과 텍스트 프롬프트를 지정합니다.

import (
    "context"
    "log"

    "github.com/firebase/genkit/go/ai"
    "github.com/firebase/genkit/go/genkit"
    "github.com/firebase/genkit/go/plugins/googlegenai"
)

func main() {
    ctx := context.Background()

    g, err := genkit.Init(ctx,
        genkit.WithPlugins(&googlegenai.GoogleAI{}),
        genkit.WithDefaultModel("googleai/gemini-2.0-flash"),
    )
    if err != nil {
        log.Fatal(err)
    }

    resp, err := genkit.Generate(ctx, g,
        ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
    )
    if err != nil {
        log.Fatal(err)
    }

    log.Println(resp.Text())
}

이 간단한 예시를 실행하면 디버깅 정보와 genkit.Generate() 호출의 출력이 출력되며, 일반적으로 다음 예시와 같이 마크다운 텍스트입니다.

## The Blackheart's Bounty

**A hearty stew of slow-cooked beef, spiced with rum and molasses, served in a
hollowed-out cannonball with a side of crusty bread and a dollop of tangy
pineapple salsa.**

**Description:** This dish is a tribute to the hearty meals enjoyed by pirates
on the high seas. The beef is tender and flavorful, infused with the warm spices
of rum and molasses. The pineapple salsa adds a touch of sweetness and acidity,
balancing the richness of the stew. The cannonball serving vessel adds a fun and
thematic touch, making this dish a perfect choice for any pirate-themed
adventure.

스크립트를 다시 실행하면 다른 출력이 표시됩니다.

위의 코드 샘플은 Genkit 인스턴스를 구성할 때 지정한 기본 모델에 생성 요청을 전송했습니다.

단일 genkit.Generate() 호출에 모델을 지정할 수도 있습니다.

resp, err := genkit.Generate(ctx, g,
    ai.WithModelName("googleai/gemini-2.5-pro"),
    ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)

모델 문자열 식별자는 providerid/modelid와 같이 표시되며 여기서 제공업체 ID(이 경우 googleai)는 플러그인을 식별하고 모델 ID는 특정 버전의 모델에 대한 플러그인별 문자열 식별자입니다.

또한 이러한 예시는 중요한 점을 보여줍니다. genkit.Generate()를 사용하여 생성형 AI 모델을 호출할 때 사용하려는 모델을 변경하는 것은 모델 파라미터에 다른 값을 전달하는 것뿐입니다. 네이티브 모델 SDK 대신 genkit.Generate()를 사용하면 앱에서 여러 모델을 더 쉽게 사용하고 나중에 모델을 변경할 수 있는 유연성을 얻을 수 있습니다.

지금까지는 가장 간단한 genkit.Generate() 호출의 예시만 보았습니다. 그러나 genkit.Generate()는 생성형 모델과의 고급 상호작용을 위한 인터페이스도 제공합니다. 이는 다음 섹션에서 확인할 수 있습니다.

시스템 프롬프트

일부 모델은 시스템 프롬프트를 제공하는 것을 지원합니다. 이는 모델에 사용자의 메시지에 응답하는 방법을 지시합니다. 시스템 프롬프트를 사용하여 모델이 채택할 페르소나, 응답의 어조, 응답 형식 등을 지정할 수 있습니다.

사용 중인 모델이 시스템 프롬프트를 지원하는 경우 WithSystem() 옵션으로 프롬프트를 제공할 수 있습니다.

resp, err := genkit.Generate(ctx, g,
    ai.WithSystem("You are a food industry marketing consultant."),
    ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)

시스템 메시지를 지원하지 않는 모델의 경우 WithSystem()은 요청을 수정하여 시스템 메시지처럼 표시되도록 시뮬레이션합니다.

모델 매개변수

genkit.Generate() 함수는 WithConfig() 옵션을 사용합니다. 이 옵션을 통해 모델이 콘텐츠를 생성하는 방식을 제어하는 선택적 설정을 지정할 수 있습니다.

resp, err := genkit.Generate(ctx, g,
    ai.WithModelName("googleai/gemini-2.0-flash"),
    ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
    ai.WithConfig(&googlegenai.GeminiConfig{
        MaxOutputTokens: 500,
        StopSequences:   ["<end>", "<fin>"],
        Temperature:     0.5,
        TopP:            0.4,
        TopK:            50,
    }),
)

지원되는 정확한 파라미터는 개별 모델 및 모델 API에 따라 다릅니다. 하지만 이전 예시의 파라미터는 거의 모든 모델에 공통적으로 적용됩니다. 다음은 이러한 파라미터에 대한 설명입니다.

출력 길이를 제어하는 파라미터

MaxOutputTokens

LLM은 토큰이라는 단위로 작동합니다. 토큰은 일반적으로 특정 문자 시퀀스에 매핑되지만 반드시 매핑되는 것은 아닙니다. 프롬프트를 모델에 전달하면 가장 먼저 프롬프트 문자열을 토큰 시퀀스로 토큰화합니다. 그런 다음 LLM은 토큰화된 입력에서 토큰 시퀀스를 생성합니다. 마지막으로 토큰 시퀀스가 텍스트로 다시 변환되어 출력됩니다.

최대 출력 토큰 파라미터는 LLM을 사용하여 생성할 토큰 수에 제한을 설정하기만 합니다. 모든 모델은 서로 다른 토크나이저를 사용할 수 있지만, 일반적으로 단일 영어 단어는 2~4개의 토큰으로 구성된다고 생각하면 됩니다.

앞에서 언급한 것처럼 일부 토큰은 문자 시퀀스에 매핑되지 않을 수 있습니다. 이러한 예시 중 하나는 시퀀스의 끝을 나타내는 토큰이 종종 있다는 것입니다. LLM이 이 토큰을 생성하면 더 이상 생성하지 않습니다. 따라서 LLM이 '중지' 토큰을 생성했기 때문에 최대 개수보다 적은 토큰을 생성하는 경우가 많습니다.

StopSequences

이 파라미터를 사용하여 생성 시 LLM 출력의 끝을 나타내는 토큰 또는 토큰 시퀀스를 설정할 수 있습니다. 여기서 사용할 올바른 값은 일반적으로 모델이 학습된 방식에 따라 다르며 보통 모델 플러그인에서 설정합니다. 하지만 모델에 다른 중지 시퀀스를 생성하도록 지시한 경우 여기에서 지정할 수 있습니다.

토큰 자체가 아닌 문자 시퀀스를 지정합니다. 대부분의 경우 모델의 토크나이저가 단일 토큰에 매핑하는 문자 시퀀스를 지정합니다.

'창의성'을 제어하는 파라미터

temperature, top-p, top-k 파라미터를 함께 사용하면 모델의 '창의성'을 제어할 수 있습니다. 다음은 이러한 파라미터의 의미에 관한 간단한 설명이지만, 더 중요한 점은 이러한 파라미터가 LLM 출력의 특성을 조정하는 데 사용된다는 것입니다. 최적의 값은 목표와 선호도에 따라 다르며 실험을 통해서만 찾을 수 있습니다.

온도

LLM은 기본적으로 토큰을 예측하는 머신입니다. 주어진 토큰 시퀀스(예: 프롬프트)에 대해 LLM은 어휘의 각 토큰에 대해 토큰이 시퀀스에서 다음에 올 가능성을 예측합니다. 온도는 이러한 예측을 나눈 후 0과 1 사이의 확률로 정규화하는 확장 계수입니다.

낮은 온도 값(0.0~1.0)은 토큰 간의 가능성 차이를 증폭시켜 모델이 이미 가능성 낮다고 평가한 토큰을 생성할 가능성이 더욱 낮아집니다. 이는 종종 창의성이 떨어지는 결과물로 인식됩니다. 0.0은 기술적으로 유효한 값이 아니지만 많은 모델은 이를 모델이 결정론적으로 작동해야 함을 나타내며 가장 가능성이 높은 단일 토큰만 고려해야 함을 나타내는 것으로 간주합니다.

높은 온도 값(1.0보다 큼)은 토큰 간의 가능성 차이가 압축되어 이전에 가능성 낮다고 평가한 토큰을 모델에서 생성할 가능성이 높아집니다. 이는 종종 더 창의적인 결과물로 인식됩니다. 일부 모델 API는 최대 온도(일반적으로 2.0)를 적용합니다.

TopP

Top-p는 0.0과 1.0 사이의 값으로, 토큰의 누적 확률을 지정하여 모델에서 고려할 수 있는 토큰 수를 제어합니다. 예를 들어 값이 1.0이면 가능한 모든 토큰을 고려하되 각 토큰의 확률은 고려한다는 의미입니다. 값이 0.4이면 확률의 합계가 0.4인 가장 가능성이 높은 토큰만 고려하고 나머지 토큰은 고려에서 제외한다는 의미입니다.

TopK

Top-k는 모델에서 고려할 수 있는 토큰 수를 제어하는 정수 값이지만, 이번에는 최대 토큰 수를 명시적으로 지정합니다. 값 1을 지정하면 모델이 결정론적으로 동작해야 함을 의미합니다.

모델 파라미터 실험

개발자 UI를 사용하여 이러한 파라미터가 다양한 모델 및 프롬프트 조합으로 생성된 출력에 미치는 영향을 실험할 수 있습니다. genkit start 명령어로 개발자 UI를 시작하면 프로젝트에 구성된 플러그인에 의해 정의된 모든 모델이 자동으로 로드됩니다. 코드에서 이러한 변경사항을 반복적으로 적용하지 않고도 다양한 프롬프트와 구성 값을 빠르게 시도할 수 있습니다.

모델을 구성과 페어링

각 제공업체 또는 특정 모델에 자체 구성 스키마가 있거나 특정 설정이 보장될 수 있다는 점을 고려하면 WithModelName()WithConfig()를 사용하여 별도의 옵션을 설정하면 오류가 발생할 수 있습니다. 후자는 전자에 강력한 유형이 지정되지 않기 때문입니다.

모델을 구성과 페어링하려면 대신 생성 호출에 전달할 수 있는 모델 참조를 만들 수 있습니다.

model := googlegenai.GoogleAIModelRef("gemini-2.0-flash", &googlegenai.GeminiConfig{
    MaxOutputTokens: 500,
    StopSequences:   ["<end>", "<fin>"],
    Temperature:     0.5,
    TopP:            0.4,
    TopK:            50,
})

resp, err := genkit.Generate(ctx, g,
    ai.WithModel(model),
    ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
if err != nil {
    log.Fatal(err)
}

모델 참조의 생성자는 올바른 구성 유형이 제공되도록 적용하므로 불일치가 줄어들 수 있습니다.

구조화된 출력

생성형 AI를 애플리케이션의 구성요소로 사용할 때는 일반 텍스트가 아닌 형식으로 출력하는 것이 좋습니다. 사용자에게 표시할 콘텐츠를 생성하는 것뿐이라도 구조화된 출력을 사용하면 사용자에게 더 매력적으로 콘텐츠를 표시할 수 있습니다. 하지만 모델 출력을 프로그래매틱 방식으로 사용하거나 한 모델의 출력을 다른 모델에 제공하는 등 생성형 AI의 고급 애플리케이션의 경우 구조화된 출력이 필요합니다.

Genkit에서는 genkit.Generate()를 호출할 때 출력 유형을 지정하여 모델에서 구조화된 출력을 요청할 수 있습니다.

type MenuItem struct {
    Name        string   `json:"name"`
    Description string   `json:"description"`
    Calories    int      `json:"calories"`
    Allergens   []string `json:"allergens"`
}

resp, err := genkit.Generate(ctx, g,
    ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
    ai.WithOutputType(MenuItem{}),
)
if err != nil {
  log.Fatal(err) // One possible error is that the response does not conform to the type.
}

모델 출력 유형은 invopop/jsonschema 패키지를 사용하여 JSON 스키마로 지정됩니다. 이렇게 하면 정적 Go 유형과 생성형 AI 모델의 예측할 수 없는 출력 간의 격차를 해소하는 런타임 유형 검사를 제공할 수 있습니다. 이 시스템을 사용하면 생성 호출이 성공하면 항상 Go 유형을 준수하는 출력을 반환한다는 사실에 의존할 수 있는 코드를 작성할 수 있습니다.

genkit.Generate()에서 출력 유형을 지정하면 Genkit는 백그라운드에서 다음과 같은 작업을 실행합니다.

  • 원하는 출력 형식에 관한 추가 안내로 프롬프트를 보강합니다. 이렇게 하면 모델에 정확히 어떤 콘텐츠를 생성할지 지정하는 부작용도 있습니다(예: 메뉴 항목을 제안할 뿐만 아니라 설명, 알레르기 유발 물질 목록 등을 생성).
  • 출력이 스키마를 준수하는지 확인합니다.
  • 모델 출력을 Go 유형으로 마샬링합니다.

생성 호출이 성공하면 구조화된 출력을 가져오려면 다음과 같은 유형의 빈 값을 사용하여 모델 응답에서 Output()을 호출합니다.

var item MenuItem
if err := resp.Output(&item); err != nil {
    log.Fatalf(err)
}

log.Printf("%s (%d calories, %d allergens): %s\n",
    item.Name, item.Calories, len(item.Allergens), item.Description)

또는 더 간결한 호출을 위해 genkit.GenerateData()를 사용할 수 있습니다.

item, resp, err := genkit.GenerateData[MenuItem](ctx, g,
    ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
if err != nil {
  log.Fatal(err)
}

log.Printf("%s (%d calories, %d allergens): %s\n",
    item.Name, item.Calories, len(item.Allergens), item.Description)

이 함수에는 출력 유형 파라미터가 필요하지만 값을 반환하기 전에 WithOutputType() 옵션을 자동으로 설정하고 resp.Output()을 호출합니다.

오류 처리

이전 예시에서 genkit.Generate() 호출로 인해 오류가 발생할 수 있습니다. 모델이 스키마를 준수하는 출력을 생성하지 못할 때 발생할 수 있는 오류가 하나 있습니다. 이러한 오류를 처리하는 가장 좋은 전략은 정확한 사용 사례에 따라 다르지만 다음과 같은 몇 가지 일반적인 힌트가 있습니다.

  • 다른 모델을 사용해 보세요. 구조화된 출력이 성공하려면 모델이 JSON으로 출력을 생성할 수 있어야 합니다. Gemini와 같은 가장 강력한 LLM은 이를 수행할 만큼 다재다능합니다. 하지만 Ollama와 함께 사용할 일부 로컬 모델과 같은 소형 모델은 이를 위해 특별히 학습되지 않는 한 구조화된 출력을 안정적으로 생성하지 못할 수 있습니다.

  • 스키마를 간소화합니다. LLM은 복잡하거나 깊이 중첩된 유형을 생성하는 데 문제가 있을 수 있습니다. 구조화된 데이터를 안정적으로 생성할 수 없는 경우 명확한 이름, 더 적은 필드 또는 평면화된 구조를 사용해 보세요.

  • genkit.Generate() 호출을 다시 시도해 보세요. 선택한 모델이 규정을 준수하는 출력을 생성하지 못하는 경우가 드물다면 이 오류를 네트워크 오류를 처리하는 것처럼 처리하고 일종의 증분 백오프 전략을 사용하여 요청을 다시 시도하면 됩니다.

스트리밍

대량의 텍스트를 생성할 때는 출력이 생성되는 대로 표시하여 사용자 환경을 개선할 수 있습니다(출력 스트리밍). 스트리밍이 작동하는 익숙한 예시는 대부분의 LLM 채팅 앱에서 확인할 수 있습니다. 사용자는 메시지가 생성되는 동안 모델의 응답을 읽을 수 있으므로 애플리케이션의 인지된 반응성이 개선되고 지능적인 상대와 채팅하는 듯한 효과를 강화할 수 있습니다.

Genkit에서는 WithStreaming() 옵션을 사용하여 출력을 스트리밍할 수 있습니다.

resp, err := genkit.Generate(ctx, g,
    ai.WithPrompt("Suggest a complete menu for a pirate themed restaurant."),
    ai.WithStreaming(func(ctx context.Context, chunk *ai.ModelResponseChunk) error {
        // Do something with the chunk...
        log.Println(chunk.Text())
        return nil
    }),
)
if err != nil {
    log.Fatal(err)
}

log.Println(resp.Text())

멀티모달 입력

지금까지 본 예시에서는 텍스트 문자열을 모델 프롬프트로 사용했습니다. 이는 생성형 AI 모델에 프롬프트를 제공하는 가장 일반적인 방법이지만 많은 모델에서 다른 미디어를 프롬프트로 허용할 수도 있습니다. 미디어 프롬프트는 모델에 이미지에 캡션을 추가하거나 오디오 녹음 파일의 스크립트를 작성하는 등 미디어에 관한 작업을 수행하도록 지시하는 텍스트 프롬프트와 함께 가장 자주 사용됩니다.

미디어 입력을 수락하는 기능과 사용할 수 있는 미디어 유형은 모델과 API에 전적으로 종속됩니다. 예를 들어 Gemini 2.0 모델 시리즈는 이미지, 동영상, 오디오를 프롬프트로 허용할 수 있습니다.

이를 지원하는 모델에 미디어 프롬프트를 제공하려면 genkit.Generate()에 간단한 텍스트 프롬프트를 전달하는 대신 미디어 부분과 텍스트 부분으로 구성된 배열을 전달합니다.

resp, err := genkit.Generate(ctx, g,
    ai.WithModelName("googleai/gemini-2.0-flash"),
    ai.WithMessages(
        NewUserMessage(
            NewMediaPart("image/jpeg", "https://example.com/photo.jpg"),
            NewTextPart("Compose a poem about this image."),
        ),
    ),
)

위 예시에서는 공개적으로 액세스 가능한 HTTPS URL을 사용하여 이미지를 지정했습니다. 미디어 데이터를 데이터 URL로 인코딩하여 직접 전달할 수도 있습니다. 예를 들면 다음과 같습니다.

image, err := ioutil.ReadFile("photo.jpg")
if err != nil {
    log.Fatal(err)
}

resp, err := genkit.Generate(ctx, g,
    ai.WithModelName("googleai/gemini-2.0-flash"),
    ai.WithMessages(
        NewUserMessage(
            NewMediaPart("image/jpeg", "data:image/jpeg;base64," + base64.StdEncoding.EncodeToString(image)),
            NewTextPart("Compose a poem about this image."),
        ),
    ),
)

미디어 입력을 지원하는 모든 모델은 데이터 URL과 HTTPS URL을 모두 지원합니다. 일부 모델 플러그인은 다른 미디어 소스에 대한 지원을 추가합니다. 예를 들어 Vertex AI 플러그인을 사용하면 Cloud Storage(gs://) URL도 사용할 수 있습니다.

다음 단계

Genkit 자세히 알아보기

  • 앱 개발자가 생성형 AI 모델의 출력에 영향을 주는 기본적인 방법은 프롬프트를 입력하는 것입니다. Dotprompt를 사용한 프롬프트 관리를 읽고 Genkit를 사용하여 효과적인 프롬프트를 개발하고 코드베이스에서 관리하는 방법을 알아보세요.
  • genkit.Generate()는 모든 생성형 AI 기반 애플리케이션의 핵심이지만 실제 애플리케이션에서는 일반적으로 생성형 AI 모델을 호출하기 전후에 추가 작업이 필요합니다. 이를 반영하기 위해 Genkit에서는 함수처럼 정의되지만 모니터링 가능성 및 간소화된 배포와 같은 추가 기능을 추가하는 플로우 개념을 도입합니다. 자세한 내용은 AI 워크플로 정의를 참고하세요.

고급 LLM 사용

  • LLM의 기능을 개선하는 한 가지 방법은 LLM에 추가 정보를 요청하거나 사용자에게 특정 작업을 수행하도록 요청할 수 있는 방법 목록을 표시하는 것입니다. 이를 도구 호출 또는 함수 호출이라고 합니다. 이 기능을 지원하도록 학습된 모델은 특수 형식의 응답으로 프롬프트에 응답할 수 있습니다. 이는 호출 애플리케이션에 특정 작업을 수행하고 결과를 원래 프롬프트와 함께 LLM에 다시 전송해야 함을 나타냅니다. Genkit에는 도구 호출 구현의 프롬프트 생성과 호출-응답 루프 요소를 모두 자동화하는 라이브러리 함수가 있습니다. 자세한 내용은 도구 호출을 참고하세요.
  • 검색 증강 생성(RAG)은 모델의 출력에 도메인별 정보를 도입하는 데 사용되는 기법입니다. 이는 관련 정보를 프롬프트에 삽입한 후 언어 모델에 전달하는 방식으로 이루어집니다. 완전한 RAG 구현을 위해서는 텍스트 임베딩 생성 모델, 벡터 데이터베이스, 대규모 언어 모델 등 여러 기술을 통합해야 합니다. Genkit가 이러한 다양한 요소를 조정하는 프로세스를 간소화하는 방법을 알아보려면 검색 증강 생성(RAG)을 참고하세요.