컨텍스트 캐시 사용

REST API 또는 Python SDK를 사용하여 생성형 AI 애플리케이션의 컨텍스트 캐시에 저장된 콘텐츠를 참조할 수 있습니다. 이를 사용하려면 먼저 컨텍스트 캐시를 만들어야 합니다.

코드에서 사용하는 컨텍스트 캐시 객체에는 다음 속성이 포함됩니다.

  • name - 컨텍스트 캐시 리소스 이름입니다. 형식은 projects/PROJECT_NUMBER/locations/LOCATION/cachedContents/CACHE_ID입니다. 컨텍스트 캐시를 만들면 응답에 리소스 이름이 포함된 것을 확인할 수 있습니다. 프로젝트 번호는 프로젝트의 고유 식별자입니다. 캐시 ID는 캐시의 ID입니다. 코드에서 컨텍스트 캐시를 지정할 때는 전체 컨텍스트 캐시 리소스 이름을 사용해야 합니다. 다음은 요청 본문에서 캐시된 콘텐츠 리소스 이름을 지정하는 방법을 보여주는 예입니다.

    "cached_content": "projects/123456789012/locations/us-central1/123456789012345678"
    
  • model - 캐시를 만드는 데 사용된 모델의 리소스 이름입니다. 형식은 projects/PROJECT_NUMBER/locations/LOCATION/publishers/PUBLISHER_NAME/models/MODEL_ID입니다.

  • createTime - 컨텍스트 캐시의 생성 시간을 지정하는 Timestamp입니다.

  • updateTime - 컨텍스트 캐시의 가장 최근 업데이트 시간을 지정하는 Timestamp입니다. 컨텍스트 캐시가 생성된 후 업데이트되기 전에는 createTimeupdateTime이 동일합니다.

  • expireTime - 컨텍스트 캐시가 만료되는 시점을 지정하는 Timestamp입니다. 기본 expireTimecreateTime 후 60분입니다. 새 만료 시간으로 캐시를 업데이트할 수 있습니다. 자세한 내용은 컨텍스트 캐시 업데이트를 참고하세요.
    캐시가 만료되면 삭제 대상으로 표시되며 캐시를 사용하거나 업데이트할 수 있다고 가정해서는 안 됩니다. 만료된 컨텍스트 캐시를 사용해야 하는 경우 적절한 만료 시간으로 다시 만들어야 합니다.

컨텍스트 캐시 사용 제한

컨텍스트 캐시를 만들 때 다음 기능을 지정할 수 있습니다. 요청에서 다음 항목을 다시 지정해서는 안 됩니다.

  • GenerativeModel.system_instructions 속성. 이 속성은 모델이 사용자로부터 안내를 받기 전에 모델에 대한 안내를 지정하는 데 사용됩니다. 자세한 내용은 시스템 안내를 참고하세요.

  • GenerativeModel.tool_config 속성. tool_config 속성은 함수 호출 기능에서 사용하는 도구와 같이 Gemini 모델에서 사용하는 도구를 지정하는 데 사용됩니다.

  • GenerativeModel.tools 속성. GenerativeModel.tools 속성은 함수 호출 애플리케이션을 만드는 함수를 지정하는 데 사용됩니다. 자세한 내용은 함수 호출을 참조하세요.

컨텍스트 캐시 샘플 사용

다음은 컨텍스트 캐시를 사용하는 방법을 보여줍니다. 컨텍스트 캐시를 사용하는 경우 다음 속성을 지정할 수 없습니다.

  • GenerativeModel.system_instructions
  • GenerativeModel.tool_config
  • GenerativeModel.tools

Python

Python용 Vertex AI SDK를 설치하거나 업데이트하는 방법은 Python용 Vertex AI SDK 설치를 참조하세요. 자세한 내용은 Vertex AI SDK for Python API 참고 문서를 참조하세요.

스트리밍 및 비스트리밍 응답

모델이 스트리밍 응답 또는 비스트리밍 응답을 생성하는지 여부를 선택할 수 있습니다. 스트리밍 응답의 경우 출력 토큰이 생성되는 즉시 각 응답이 수신됩니다. 비스트리밍 응답의 경우 모든 출력 토큰이 생성된 후에 모든 응답이 수신됩니다.

스트리밍 응답의 경우 generate_contentstream 매개변수를 사용합니다.

  response = model.generate_content(contents=[...], stream = True)
  

비스트리밍 응답의 경우 매개변수를 삭제하거나 매개변수를 False로 설정합니다.

샘플 코드

import vertexai

from vertexai.preview.generative_models import GenerativeModel
from vertexai.preview import caching

# TODO(developer): Update and un-comment below lines
# PROJECT_ID = "your-project-id"
# cache_id = "your-cache-id"

vertexai.init(project=PROJECT_ID, location="us-central1")

cached_content = caching.CachedContent(cached_content_name=cache_id)

model = GenerativeModel.from_cached_content(cached_content=cached_content)

response = model.generate_content("What are the papers about?")

print(response.text)
# Example response:
# The provided text is about a new family of multimodal models called Gemini, developed by Google.
# ...

Go

이 샘플을 사용해 보기 전에 Vertex AI 빠른 시작의 Go 설정 안내를 따르세요. 자세한 내용은 Gemini용 Vertex AI Go SDK 참고 문서를 참조하세요.

Vertex AI에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

스트리밍 및 비스트리밍 응답

모델이 스트리밍 응답 또는 비스트리밍 응답을 생성하는지 여부를 선택할 수 있습니다. 스트리밍 응답의 경우 출력 토큰이 생성되는 즉시 각 응답이 수신됩니다. 비스트리밍 응답의 경우 모든 출력 토큰이 생성된 후에 모든 응답이 수신됩니다.

스트리밍 응답의 경우 GenerateContentStream 메서드를 사용합니다.

  iter := model.GenerateContentStream(ctx, genai.Text("Tell me a story about a lumberjack and his giant ox. Keep it very short."))
  

비스트리밍 응답의 경우 GenerateContent 메서드를 사용합니다.

  resp, err := model.GenerateContent(ctx, genai.Text("What is the average size of a swallow?"))
  

샘플 코드

import (
	"context"
	"errors"
	"fmt"
	"io"

	"cloud.google.com/go/vertexai/genai"
)

// useContextCache shows how to use an existing cached content, when prompting the model
// contentName is the ID of the cached content
func useContextCache(w io.Writer, contentName string, projectID, location, modelName string) error {
	// location := "us-central1"
	// modelName := "gemini-1.5-pro-001"
	ctx := context.Background()

	client, err := genai.NewClient(ctx, projectID, location)
	if err != nil {
		return fmt.Errorf("unable to create client: %w", err)
	}
	defer client.Close()

	model := client.GenerativeModel(modelName)
	model.CachedContentName = contentName
	prompt := genai.Text("What are the papers about?")

	res, err := model.GenerateContent(ctx, prompt)
	if err != nil {
		return fmt.Errorf("error generating content: %w", err)
	}

	if len(res.Candidates) == 0 ||
		len(res.Candidates[0].Content.Parts) == 0 {
		return errors.New("empty response from model")
	}

	fmt.Fprintf(w, "generated response: %s\n", res.Candidates[0].Content.Parts[0])
	return nil
}

REST

Vertex AI API를 사용하여 게시자 모델 엔드포인트에 POST 요청을 보내면 REST를 사용하여 프롬프트와 함께 컨텍스트 캐시를 사용할 수 있습니다.

요청 데이터를 사용하기 전에 다음을 바꿉니다.

HTTP 메서드 및 URL:

POST https://LOCATION-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/gemini-1.5-pro-002:generateContent

JSON 요청 본문:

{
  "cachedContent": "projects/PROJECT_NUMBER/locations/LOCATION/cachedContents/CACHE_ID",
  "contents": [
      {"role":"user","parts":[{"text":"PROMPT_TEXT"}]}
  ],
  "generationConfig": {
      "maxOutputTokens": 8192,
      "temperature": 1,
      "topP": 0.95,
  },
  "safetySettings": [
      {
          "category": "HARM_CATEGORY_HATE_SPEECH",
          "threshold": "BLOCK_MEDIUM_AND_ABOVE"
      },
      {
          "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
          "threshold": "BLOCK_MEDIUM_AND_ABOVE"
      },
      {
          "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
          "threshold": "BLOCK_MEDIUM_AND_ABOVE"
      },
      {
          "category": "HARM_CATEGORY_HARASSMENT",
          "threshold": "BLOCK_MEDIUM_AND_ABOVE"
      }
  ],
}

요청을 보내려면 다음 옵션 중 하나를 선택합니다.

curl

요청 본문을 request.json 파일에 저장하고 다음 명령어를 실행합니다.

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/gemini-1.5-pro-002:generateContent"

PowerShell

요청 본문을 request.json 파일에 저장하고 다음 명령어를 실행합니다.

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/gemini-1.5-pro-002:generateContent" | Select-Object -Expand Content

다음과 비슷한 JSON 응답이 수신됩니다.

curl 명령어 예시

LOCATION="us-central1"
MODEL_ID="gemini-1.5-pro-002"
PROJECT_ID="test-project"

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_ID}:generateContent" -d \
'{
  "cachedContent": "projects/${PROJECT_NUMBER}/locations/${LOCATION}/cachedContents/${CACHE_ID}",
  "contents": [
      {"role":"user","parts":[{"text":"What are the benefits of exercise?"}]}
  ],
  "generationConfig": {
      "maxOutputTokens": 8192,
      "temperature": 1,
      "topP": 0.95,
  },
  "safetySettings": [
    {
      "category": "HARM_CATEGORY_HATE_SPEECH",
      "threshold": "BLOCK_MEDIUM_AND_ABOVE"
    },
    {
      "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
      "threshold": "BLOCK_MEDIUM_AND_ABOVE"
    },
    {
      "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
      "threshold": "BLOCK_MEDIUM_AND_ABOVE"
    },
    {
      "category": "HARM_CATEGORY_HARASSMENT",
      "threshold": "BLOCK_MEDIUM_AND_ABOVE"
    }
  ],
}'