튜토리얼: Gemini API 시작하기


이 튜토리얼에서는 Go용 Gemini API에 액세스하는 방법을 보여줍니다. Google AI Go SDK를 사용하여 애플리케이션을 빌드할 수 있습니다

이 튜토리얼에서는 다음 작업을 수행하는 방법을 알아봅니다.

또한 이 튜토리얼에는 고급 사용 사례 (예: 임베딩토큰 계산) 및 콘텐츠 생성을 제어하는 방법을 알아봅니다.

기본 요건

이 튜토리얼에서는 Cloud SQL을 사용하여 애플리케이션을 빌드하는 데 익숙하고 출발하세요.

이 튜토리얼을 완료하려면 개발 환경이 다음 요구사항을 충족해야 합니다

  • Go 1.20 이상

프로젝트 설정

Gemini API를 호출하기 전에 다음을 포함한 프로젝트를 설정해야 합니다. API 키 설정, SDK 패키지 설치, 모델 초기화에 대해 알아봅니다.

API 키 설정

Gemini API를 사용하려면 API 키가 필요합니다. 아직 계정이 없는 경우 Google AI Studio에서 키를 만듭니다

API 키 가져오기

API 키 보호

버전에 API 키를 체크인하지 않는 것이 좋습니다. 제어할 수 있습니다 대신 API 키에 보안 비밀 저장소를 사용해야 합니다.

이 튜토리얼의 모든 스니펫은 사용자가 자신의 API 키를 환경 변수입니다

SDK 패키지 설치

자체 애플리케이션에서 Gemini API를 사용하려면 Go SDK를 get해야 합니다. 모듈 디렉터리에 있습니다.

go get github.com/google/generative-ai-go

생성 모델 초기화

API를 호출하려면 먼저 생성 모델입니다.

import "github.com/google/generative-ai-go/genai"
import "google.golang.org/api/option"

ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
  log.Fatal(err)
}
defer client.Close()

// The Gemini 1.5 models are versatile and work with most use cases
model := client.GenerativeModel("gemini-1.5-flash")

모델을 지정할 때는 다음 사항에 유의하세요.

  • 사용 사례에 맞는 모델을 사용하세요 (예: gemini-1.5-flash). 멀티모달 입력용). 본 가이드에 나와 있는 각 각 사용 사례의 추천 모델을 나열합니다.

일반적인 사용 사례 구현

이제 프로젝트가 설정되었으므로 Gemini API를 사용하여 다양한 사용 사례 구현:

고급 사용 사례 섹션에서 Gemini API에 관한 정보를 찾을 수 있습니다. 및 임베딩입니다.

텍스트 전용 입력에서 텍스트 생성

프롬프트 입력에 텍스트만 포함된 경우에는 Gemini 1.5 모델을 사용하거나 generateContent를 사용하여 텍스트 출력을 생성하는 Gemini 1.0 Pro 모델:

ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
  log.Fatal(err)
}
defer client.Close()

// The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
model := client.GenerativeModel("gemini-1.5-flash")
resp, err := model.GenerateContent(ctx, genai.Text("Write a story about a magic backpack."))
if err != nil {
  log.Fatal(err)
}

텍스트 및 이미지 입력에서 텍스트 생성 (멀티모달)

Gemini는 멀티모달 입력을 처리할 수 있는 다양한 모델을 제공합니다. (Gemini 1.5 모델)을 지원하여 텍스트와 이미지를 모두 입력할 수 있습니다. 반드시 자세한 내용은 프롬프트의 이미지 요구사항을 참고하세요.

프롬프트 입력에 텍스트와 이미지가 모두 포함된 경우 Gemini 1.5 모델을 사용합니다. generateContent 메서드를 사용하여 텍스트 출력을 생성합니다.

ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
  log.Fatal(err)
}
defer client.Close()

// The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
model := client.GenerativeModel("gemini-1.5-flash")

imgData1, err := os.ReadFile(pathToImage1)
if err != nil {
  log.Fatal(err)
}

imgData2, err := os.ReadFile(pathToImage1)
if err != nil {
  log.Fatal(err)
}

prompt := []genai.Part{
  genai.ImageData("jpeg", imgData1),
  genai.ImageData("jpeg", imgData2),
  genai.Text("What's different between these two pictures?"),
}
resp, err := model.GenerateContent(ctx, prompt...)

if err != nil {
  log.Fatal(err)
}

멀티턴 대화 빌드 (채팅)

Gemini를 사용하면 여러 차례에 걸쳐 자유 형식의 대화를 구축할 수 있습니다. 이 SDK는 대화 상태를 관리하여 프로세스를 간소화하므로 GenerateContent를 사용하면 대화 기록을 저장할 필요가 없습니다. 확인할 수 있습니다

채팅과 같은 멀티턴 대화를 빌드하려면 Gemini 1.5 모델 또는 Gemini 1.0 Pro 모델을 빌드하고 startChat()를 호출하여 채팅을 초기화합니다. 그런 다음 sendMessage()를 사용하여 새 사용자 메시지를 전송합니다. 이 메시지에는 채팅 기록에 대한 응답을 반환합니다.

role 대화:

  • user: 프롬프트를 제공하는 역할입니다. 이 값은 SendMessage 통화

  • model: 응답을 제공하는 역할입니다. 이 역할은 다음과 같은 경우에 사용할 수 있습니다. 기존 historyStartChat()를 호출합니다.

ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
  log.Fatal(err)
}
defer client.Close()

// The Gemini 1.5 models are versatile and work with multi-turn conversations (like chat)
model := client.GenerativeModel("gemini-1.5-flash")
// Initialize the chat
cs := model.StartChat()
cs.History = []*genai.Content{
  &genai.Content{
    Parts: []genai.Part{
      genai.Text("Hello, I have 2 dogs in my house."),
    },
    Role: "user",
  },
  &genai.Content{
    Parts: []genai.Part{
      genai.Text("Great to meet you. What would you like to know?"),
    },
    Role: "model",
  },
}

resp, err := cs.SendMessage(ctx, genai.Text("How many paws are in my house?"))
if err != nil {
  log.Fatal(err)
}

스트리밍을 사용하여 상호작용 속도 향상

기본적으로 모델은 전체 생성이 완료된 후 응답을 반환합니다. 프로세스입니다 전체 응답을 기다리지 않아도 더 빠르게 상호작용을 할 수 있습니다. 대신 스트리밍을 사용하여 부분 결과를 처리합니다.

다음 예는 텍스트 및 이미지 입력에서 텍스트를 생성하는 GenerateContentStream 메서드 메시지가 표시됩니다.

ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
  log.Fatal(err)
}
defer client.Close()

// The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
model := client.GenerativeModel("gemini-1.5-flash")

imageBytes, err := os.ReadFile(pathToImage)

img := genai.ImageData("jpeg", imageBytes)
prompt := genai.Text("Tell me a story about this animal")
iter := model.GenerateContentStream(ctx, img, prompt)

for {
  resp, err := iter.Next()
  if err == iterator.Done {
    break
  }
  if err != nil {
    log.Fatal(err)
  }

  // ... print resp
}

텍스트 전용 입력 및 채팅 사용 사례에도 유사한 접근 방식을 사용할 수 있습니다.

prompt := genai.Text("Tell me a story about a lumberjack and his giant ox")
iter := model.GenerateContentStream(ctx, prompt)
prompt := genai.Text("And how do you feel about that?")
iter := cs.SendMessageStream(ctx, prompt)

고급 사용 사례 구현

이 튜토리얼의 이전 섹션에 설명된 일반적인 사용 사례는 Gemini API 사용에 익숙해지세요 이 섹션에서는 고급 사용 사례를 살펴보겠습니다

임베딩 사용

임베딩은 정보를 표현하는 데 사용되는 기법 배열의 부동 소수점 숫자 목록으로 표시할 수 있습니다. Gemini를 사용하면 텍스트 (단어, 문장 및 텍스트 블록)를 벡터화된 형태로 임베딩을 더 쉽게 비교하고 대조할 수 있습니다 예를 들어 비슷한 주제나 감정에 비슷한 임베딩을 가져야 합니다. 코사인 유사성과 같은 수학적 비교 기법을 통해 식별됩니다.

embedding-001 모델을 EmbedContent 메서드 (또는 BatchEmbedContent 메서드)를 사용하여 임베딩을 생성합니다. 다음 예를 참고하세요. 는 단일 문자열에 대한 임베딩을 생성합니다.

ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
  log.Fatal(err)
}
defer client.Close()
// For embeddings, use the embedding-001 model
em := client.EmbeddingModel("embedding-001")
res, err := em.EmbedContent(ctx, genai.Text("The quick brown fox jumps over the lazy dog."))

if err != nil {
  panic(err)
}
fmt.Println(res.Embedding.Values)

함수 호출

함수 호출을 통해 구조화된 데이터 출력을 더 쉽게 가져올 수 있음 살펴보겠습니다 그런 다음 이러한 출력을 사용하여 다른 API를 호출하고 모델에 전달합니다. 즉, 함수 호출은 생성 모델을 외부 시스템에 연결하여 생성된 콘텐츠가 가장 정확한 최신 정보가 포함됩니다. 자세히 알아보기: 함수 호출 튜토리얼을 참조하세요.

토큰 수 계산

긴 프롬프트를 사용할 때는 모델에 추가할 수 있습니다. 다음 예는 CountTokens() 사용 방법을 보여줍니다. 다음과 같이 다양한 사용 사례에 활용할 수 있습니다.

// For text-only input
text := "Parrots can be green and live a long time."
resp, err := model.CountTokens(ctx, genai.Text(text))
if err != nil {
  log.Fatal(err)
}
fmt.Println(resp.TotalTokens)
// For text-and-image input (multimodal)
text := "Parrots can be green and live a long time."
imageBytes, err := os.ReadFile(pathToImage)
if err != nil {
  log.Fatal(err)
}

resp, err := model.CountTokens(
    ctx,
    genai.Text(text),
    genai.ImageData("png", imageBytes))
  if err != nil {
    log.Fatal(err)
}
fmt.Println(resp.TotalTokens)

콘텐츠 생성을 제어하는 옵션

모델 매개변수를 구성하고 모델 매개변수를 사용하여 콘텐츠 생성을 제어할 수 있습니다. 안전 설정을 변경할 수 있습니다.

모델 매개변수 구성

모델로 보내는 모든 프롬프트에는 모델이 응답을 생성합니다. 모델은 서로 다른 매개변수 값에 대해 서로 다른 결과를 생성할 수 있습니다. 다음에 대해 자세히 알아보기 모델 매개변수. 구성은 모델 인스턴스의 수명 동안 유지됩니다

// ...

// The Gemini 1.5 models are versatile and work with most use cases
model := client.GenerativeModel("gemini-1.5-flash")

// Configure model parameters by invoking Set* methods on the model.
model.SetTemperature(0.9)
model.SetTopK(1)

// ...

안전 설정 사용

안전 설정을 사용하여 유해할 수 있습니다. 기본적으로 안전 설정은 매체가 포함된 콘텐츠를 차단합니다. 또는 모든 측정기준에서 안전하지 않은 콘텐츠일 가능성이 높음 알아보기 안전 설정에 관해 자세히 알아보세요.

하나의 안전 설정을 지정하는 방법은 다음과 같습니다.

// ...

// The Gemini 1.5 models are versatile and work with most use cases
model := client.GenerativeModel("gemini-1.5-flash")

model.SafetySettings = []*genai.SafetySetting{
  {
    Category:  genai.HarmCategoryHarassment,
    Threshold: genai.HarmBlockOnlyHigh,
  },
}

// ...

둘 이상의 안전 설정을 지정할 수도 있습니다.

// ...

// The Gemini 1.5 models are versatile and work with most use cases
model := client.GenerativeModel("gemini-1.5-flash")

model.SafetySettings = []*genai.SafetySetting{
  {
    Category:  genai.HarmCategoryHarassment,
    Threshold: genai.HarmBlockOnlyHigh,
  },
  {
    Category:  genai.HarmCategoryHateSpeech,
    Threshold: genai.HarmBlockMediumAndAbove,
  },
}

// ...

다음 단계

  • 프롬프트 설계는 언어 모델에서 원하는 응답을 유도하는 프롬프트를 만드는 프로세스입니다. 체계적인 메시지 작성은 언어 모델의 정확하고 고품질 응답을 보장하는 필수 부분입니다. 프롬프트 작성 권장사항에 대해 알아보세요.

  • Gemini는 다양한 용도의 니즈에 맞는 여러 가지 모델 변형을 제공합니다. 입력 유형 및 복잡성, 채팅 또는 기타 대화상자 언어 작업, 크기 제약 조건을 고려해야 합니다. 사용 가능한 Gemini 모델에 대해 알아보세요.