์ด ํ์ด์ง๋ Apigee ๋ฐ Apigee Hybrid์ ์ ์ฉ๋ฉ๋๋ค.
Apigee Edge ๋ฌธ์ ๋ณด๊ธฐ
์ด ํ์ด์ง์์๋ Apigee ์๋งจํฑ ์บ์ฑ ์ ์ฑ ์ ๊ตฌ์ฑํ๊ณ ์ฌ์ฉํ์ฌ ์๋งจํฑ ์ ์ฌ์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์ง๋ฅํ ์๋ต ์ฌ์ฌ์ฉ์ ์ง์ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค. Apigee API ํ๋ก์์์ ์ด๋ฌํ ์ ์ฑ ์ ์ฌ์ฉํ๋ฉด ์ค๋ณต ๋ฐฑ์๋ API ํธ์ถ์ ์ต์ํํ๊ณ ์ง์ฐ ์๊ฐ์ ์ค์ด๋ฉฐ ์ด์ ๋น์ฉ์ ์ ๊ฐํ ์ ์์ต๋๋ค.
์์ํ๊ธฐ ์ ์
์์ํ๊ธฐ ์ ์ ๋ค์ ์์ ์ ์๋ฃํด์ผ ํฉ๋๋ค.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, AI Platform, and Cloud Storage APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, AI Platform, and Cloud Storage APIs.
- Google Cloud ํ๋ก์ ํธ ๋ด์์ Vertex AI ํ ์คํธ ์๋ฒ ๋ฉ API ๋ฐ ๋ฒกํฐ ๊ฒ์์ ์ค์ ํ๊ณ ๊ตฌ์ฑํฉ๋๋ค.
- Apigee ์ธ์คํด์ค์์ ์ข ํฉ ํ๊ฒฝ์ ์ฌ์ฉํ ์ ์๋์ง ํ์ธํฉ๋๋ค. ์๋งจํฑ ์บ์ฑ ์ ์ฑ ์ ์ข ํฉ ํ๊ฒฝ์๋ง ๋ฐฐํฌํ ์ ์์ต๋๋ค.
PROJECT_ID
: Apigee ์ธ์คํด์ค๊ฐ ์๋ ํ๋ก์ ํธ์ IDREGION
: Apigee ์ธ์คํด์ค์ Google Cloud ๋ฆฌ์ RUNTIME_HOSTNAME
: Apigee ๋ฐํ์์ ํธ์คํธ ์ด๋ฆ- ๋ฒกํฐ ๊ฒ์ ์์ธ์ ์๋น์ค ๊ณ์ ๊ตฌ์ฑํ๊ธฐ
- ๋ฒกํฐ ๊ฒ์ ์์ธ ๋ง๋ค๊ธฐ ๋ฐ ๋ฐฐํฌ
- ์๋งจํฑ ์บ์ฑ์ ์ฌ์ฉ ์ค์ ํ๋ API ํ๋ก์ ๋ง๋ค๊ธฐ
- ์๋งจํฑ ์บ์ฑ ์ ์ฑ ๊ตฌ์ฑํ๊ธฐ
- ์๋งจํฑ ์บ์ฑ ์ ์ฑ ํ ์คํธ
- ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค ๊ณ์ ์ ๋ง๋ญ๋๋ค.
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \ --description="DESCRIPTION" \ --display-name="SERVICE_ACCOUNT_DISPLAY_NAME"
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
SERVICE_ACCOUNT_NAME
: ์๋น์ค ๊ณ์ ์ ์ด๋ฆDESCRIPTION
: ์๋น์ค ๊ณ์ ์ ๋ํ ์ค๋ชSERVICE_ACCOUNT_DISPLAY_NAME
: ์๋น์ค ๊ณ์ ์ ํ์ ์ด๋ฆ
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
gcloud iam service-accounts create ai-client \ --description="semantic cache client" \ --display-name="ai-client"
- ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค ๊ณ์ ์
AI Platform User
์ญํ ์ ๋ถ์ฌํฉ๋๋ค.gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/aiplatform.user"
์ฌ๊ธฐ์
SERVICE_ACCOUNT_NAME
์ ์ด์ ๋จ๊ณ์์ ๋ง๋ ์๋น์ค ๊ณ์ ์ ์ด๋ฆ์ ๋๋ค. - ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค ๊ณ์ ์ IAM
Service Account User
์ญํ ์ ํ ๋นํฉ๋๋ค.gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/iam.serviceAccountUser"
์ฌ๊ธฐ์
SERVICE_ACCOUNT_NAME
์ ์ด์ ๋จ๊ณ์์ ๋ง๋ ์๋น์ค ๊ณ์ ์ ์ด๋ฆ์ ๋๋ค. - ์คํธ๋ฆฌ๋ฐ ์
๋ฐ์ดํธ๋ฅผ ํ์ฉํ๋ ๋ฒกํฐ ๊ฒ์ ์์ธ์ ๋ง๋ญ๋๋ค.
ACCESS_TOKEN=$(gcloud auth print-access-token) && curl --location --request POST \ "https://$REGION-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/indexes" \ --header "Authorization: Bearer $ACCESS_TOKEN" \ --header 'Content-Type: application/json' \ --data-raw \ '{ "displayName": "semantic-cache-index", "description": "semantic-cache-index", "metadata": { "config": { "dimensions": "768", "approximateNeighborsCount": 150, "distanceMeasureType": "DOT_PRODUCT_DISTANCE", "featureNormType": "NONE", "algorithmConfig": { "treeAhConfig": { "leafNodeEmbeddingCount": "10000", "fractionLeafNodesToSearch": 0.05 } }, "shardSize": "SHARD_SIZE_MEDIUM" }, }, "indexUpdateMethod": "STREAM_UPDATE" }'
$REGION์ ๋ฒกํฐ ๊ฒ์ ์์ธ์ด ๋ฐฐํฌ๋ ๋ฆฌ์ ์ ์ ์ํฉ๋๋ค. Apigee ์ธ์คํด์ค์ ๋์ผํ ๋ฆฌ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด ํ๊ฒฝ ๋ณ์๋ ์ด์ ๋จ๊ณ์์ ์ค์ ๋์์ต๋๋ค.
์ด ์์ ์ด ์๋ฃ๋๋ฉด ๋ค์๊ณผ ๋น์ทํ ์๋ต์ด ํ์๋ฉ๋๋ค.
{ "name": "projects/976063410430/locations/us-west1/indexes/5695338290484346880/operations/9084564741162008576", "metadata": { "@type": "type.googleapis.com/google.cloud.aiplatform.v1.CreateIndexOperationMetadata", "genericMetadata": { "createTime": "2025-04-25T18:45:27.996136Z", "updateTime": "2025-04-25T18:45:27.996136Z" } } }
๋ฒกํฐ ๊ฒ์ ์์ธ ์์ฑ์ ๊ดํ ์์ธํ ๋ด์ฉ์ ์์ธ ๋ง๋ค๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
- ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ
IndexEndpoint
๋ฅผ ๋ง๋ญ๋๋ค.gcloud ai index-endpoints create \ --display-name=semantic-cache-index-endpoint \ --public-endpoint-enabled \ --region=$REGION \ --project=$PROJECT_ID
์ด ๋จ๊ณ๋ฅผ ์๋ฃํ๋ ๋ฐ ๋ช ๋ถ ์ ๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ์๋ฃ๋๋ฉด ๋ค์๊ณผ ๋น์ทํ ์๋ต์ด ํ์๋ฉ๋๋ค.
Waiting for operation [8278420407862689792]...done. Created Vertex AI index endpoint: projects/976063410430/locations/us-west1/indexEndpoints/7953875911424606208.
IndexEndpoint
๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์IndexEndpoint
๋ง๋ค๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์. - ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์์ธ์ ์๋ํฌ์ธํธ์ ๋ฐฐํฌํฉ๋๋ค.
INDEX_ENDPOINT_ID=$(gcloud ai index-endpoints list \ --project=$PROJECT_ID \ --region=$REGION \ --format="json" | jq -c -r \ '.[] | select(.displayName=="semantic-cache-index-endpoint") | .name | split("/") | .[5]' \ ) && INDEX_ID=$(gcloud ai indexes list \ --project=$PROJECT_ID \ --region=$REGION \ --format="json" | jq -c -r \ '.[] | select(.displayName=="semantic-cache-index") | .name | split("/") | .[5]' \ ) && gcloud ai index-endpoints deploy-index \ $INDEX_ENDPOINT_ID \ --deployed-index-id=semantic_cache \ --display-name=semantic-cache \ --index=$INDEX_ID \ --region=$REGION \ --project=$PROJECT_ID
- Google Cloud ์ฝ์์ API ํ๋ก์ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
- + ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํ์ฌ API ํ๋ก์ ๋ง๋ค๊ธฐ ์ฐฝ์ ์ฝ๋๋ค.
- ํ๋ก์ ํ ํ๋ฆฟ ์์์์ ์๋งจํฑ ์บ์๊ฐ ์๋ ํ๋ก์๋ฅผ ์ ํํฉ๋๋ค.
- ๋ค์ ์ธ๋ถ์ ๋ณด๋ฅผ ์
๋ ฅํฉ๋๋ค.
- ํ๋ก์ ์ด๋ฆ: ํ๋ก์ ์ด๋ฆ์ ์ ๋ ฅํฉ๋๋ค.
- ์ค๋ช : (์ ํ์ฌํญ) ํ๋ก์์ ๋ํ ์ค๋ช ์ ์ ๋ ฅํฉ๋๋ค.
- ๋์(๊ธฐ์กด API): ํ๋ก์๊ฐ ํธ์ถํ๋ ๋ฐฑ์๋ ์๋น์ค์ URL์ ์
๋ ฅํฉ๋๋ค. ์ฝํ
์ธ ๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ LLM ๋ชจ๋ธ ์๋ํฌ์ธํธ์
๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ ๋์(๊ธฐ์กด API)์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ ์ ์์ต๋๋ค.
REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/REGION/publishers/google/models/gemini-2.0-flash-001:generateContent
- ๋ค์ ์๋งจํฑ ์บ์ URL์ ์
๋ ฅํฉ๋๋ค.
- ์๋ฒ ๋ฉ ์์ฑ URL: ์ด Vertex AI ์๋น์ค๋ ํ
์คํธ ์
๋ ฅ์ ์๋งจํฑ ๋ถ์์ ์ํ ์ซ์ ํ์์ผ๋ก ๋ณํํฉ๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ ์ด URL์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ ์ ์์ต๋๋ค.
REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/REGION/publishers/google/models/text-embedding-004:predict
- ์ต๊ทผ์ ์ด์ ์ฟผ๋ฆฌ URL: ์ด Vertex AI ์๋น์ค๋ ์ฌ์ฒ๋ฆฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฒกํฐ ๊ฒ์ ์์ธ์์ ์ด์ ์์ฒญ์ ์ ์ฌํ ํ
์คํธ ์
๋ ฅ์ ๊ฒ์ํฉ๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ ์ด URL์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ ์ ์์ต๋๋ค.
PUBLIC_DOMAIN_NAME/v1/projects/PROJECT_ID/locations/REGION/indexEndpoints/INDEX_ENDPOINT_ID:findNeighbors
PUBLIC_DOMAIN_NAME
๋ฐINDEX_ENDPOINT_ID
๊ฐ์ ์ด์ ๋จ๊ณ์์ ์ค์ ๋์์ต๋๋ค. ์ด๋ฌํ ๊ฐ์ ์ป์ผ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.echo $PUBLIC_DOMAIN_NAME
echo $INDEX_ENDPOINT_ID
- ์์ธ ์ฝ์
/์
๋ฐ์ดํธ URL: ์ด Vertex AI ์๋น์ค๋ ์ ๊ท ๋๋ ์์ ๋ ํญ๋ชฉ์ผ๋ก ์์ธ์ ์
๋ฐ์ดํธํฉ๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ ์ด URL์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ ์ ์์ต๋๋ค.
REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/REGION/indexes/INDEX_ID:upsertDatapoints
- ์๋ฒ ๋ฉ ์์ฑ URL: ์ด Vertex AI ์๋น์ค๋ ํ
์คํธ ์
๋ ฅ์ ์๋งจํฑ ๋ถ์์ ์ํ ์ซ์ ํ์์ผ๋ก ๋ณํํฉ๋๋ค.
- ๋ค์์ ํด๋ฆญํฉ๋๋ค.
- ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
- SemanticCacheLookup ์ ์ฑ
:
- ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋ ค๋ฉด
<UserPromptSource>
์์๋ฅผ ์ญ์ ํ์ธ์. semantic_cache
๊ฐ์ ์ฌ์ฉํ๋๋ก<DeployedIndexId>
์์๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.- ๋ ํ๋กฌํํธ๊ฐ ์ผ์นํ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ ์์ ์ ๊ฒฐ์ ํ๋๋ก ์๋งจํฑ ์ ์ฌ์ฑ
<Threshold>
๊ฐ์ ๊ตฌ์ฑํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 0.9์ด์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฏผ๊ฐ๋์ ๋ฐ๋ผ ์ด ๊ฐ์ ์กฐ์ ํ ์ ์์ต๋๋ค. ์ซ์๊ฐ ํด์๋ก ํ๋กฌํํธ๊ฐ ์บ์ ์ ์ค์ผ๋ก ๊ฐ์ฃผ๋๋ ค๋ฉด ๋ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋์ด์ผ ํฉ๋๋ค. ์ด ํํ ๋ฆฌ์ผ์์๋ ์ด ๊ฐ์ 0.95๋ก ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. - ์ ์ฅ์ ํด๋ฆญํฉ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋ ค๋ฉด
- SemanticCachePopulate ์ ์ฑ
:
<TTLInSeconds>
์์๋ฅผ ์ค์ ํ์ฌ ์บ์๊ฐ ๋ง๋ฃ๋ ๋๊น์ง์ ์๊ฐ(์ด)์ ์ง์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 60์ด์ ๋๋ค. Apigee๋ LLM ๋ชจ๋ธ์์ ์์ ํ cache-control ํค๋๋ฅผ ๋ฌด์ํฉ๋๋ค.- ์ ์ฅ์ ํด๋ฆญํฉ๋๋ค.
- ๊ฐ๋ฐ ํญ์ ๋์ ์๋ํฌ์ธํธ ํด๋์์ ๊ธฐ๋ณธ๊ฐ์ ํด๋ฆญํฉ๋๋ค. ์ฝ๋ ๋ทฐ์ <TargetEndpoint> ์์์ XML ๊ตฌ์ฑ์ด ํ์๋ฉ๋๋ค.
- XML์ ์์ ํ์ฌ <HTTPTargetConnection> ์๋์ ๋ค์ ๊ตฌ์ฑ์ ์ถ๊ฐํฉ๋๋ค.
<Authentication> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scope> </Scopes> </GoogleAccessToken> </Authentication>
- ์ ์ฅ์ ํด๋ฆญํฉ๋๋ค.
- ๋ฐฐํฌ๋ฅผ ํด๋ฆญํ์ฌ API ํ๋ก์ ๋ฐฐํฌ ์ฐฝ์ ์ฝ๋๋ค.
- ๋ฒ์ ํ๋๊ฐ 1๋ก ์ค์ ๋์ด ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ 1์ ํด๋ฆญํ์ฌ ์ ํํฉ๋๋ค.
- ํ๊ฒฝ ๋ชฉ๋ก์์ ํ๋ก์๋ฅผ ๋ฐฐํฌํ ํ๊ฒฝ์ ์ ํํฉ๋๋ค. ํ๊ฒฝ์ ์ข ํฉ ํ๊ฒฝ์ด์ด์ผ ํฉ๋๋ค.
- ์ด์ ๋จ๊ณ์์ ๋ง๋ ์๋น์ค ๊ณ์ ์ ์ ๋ ฅํฉ๋๋ค.
- ๋ฐฐํฌ๋ฅผ ํด๋ฆญํฉ๋๋ค.
- ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์์ ์์ฒญ์ ์ ์กํฉ๋๋ค.
curl https://$RUNTIME_HOSTNAME/PROXY_NAME -H 'Content-Type: application/json' --data '{ "contents": [ { "role": "user", "parts": [ { "text": "Why is the sky blue?" } ] } ] }'
์ฌ๊ธฐ์
PROXY_NAME
์ ์ด์ ๋จ๊ณ์์ ๋ฐฐํฌํ API ํ๋ก์์ ๊ธฐ๋ณธ ๊ฒฝ๋ก์ ๋๋ค.
ํ๋กฌํํธ ๋ฌธ์์ด์ ๋ค์๊ณผ ๊ฐ์ด ์๋ฏธ์ ์ ์ฌํ ํ๋กฌํํธ ๋ฌธ์์ด๋ก ๋์ฒดํ์ฌ API ํธ์ถ์ ๋ฐ๋ณตํฉ๋๋ค.
- ํ๋์ ์ ํ๋๊ฐ์?
- ํ๋์ด ํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
- ํ๋์ ์ ํ๋์์ธ๊ฐ์?
- ํ๋์ด ํ๋ ์ด์ ๋ฅผ ์ค๋ช ํด ์ค ์ ์์ด?
- ์ ํ๋์ ํ๋์์ธ๊ฐ์?
- ์ ์ฌํ ํ๋กฌํํธ๊ฐ ์บ์๋ ํ ๊ฐ ํธ์ถ์ ์๋ต ์๊ฐ์ ๋น๊ตํฉ๋๋ค.
- Model Armor๋ก ๋ฏผ๊ฐํ ๋ฐ์ดํฐ์ ์บ์ฑ์ ๋ฐฉ์งํ์ธ์.
๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ์บ์๋์ง ์๋๋ก ํ๋ ค๋ฉด ์ฝํ ์ธ ํํฐ๋ง์ Model Armor๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. Model Armor๋ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๊ฐ์งํ๋ฉด ์๋ต์ ์บ์ ๋ถ๊ฐ๋ฅ ํ๋๊ทธ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ Model Armor ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
- Vertex AI ๋ฐ์ดํฐ ํฌ์ธํธ ๋ฌดํจํ ๋ฐ TTL(์๋ช
)๋ก ๋ฐ์ดํฐ ์
๋ฐ์ดํธ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
์บ์๋ ์๋ต์ด ์ต์ ์ํ์ด๊ณ ๋ฐฑ์๋ ์์คํ ์ ์ต์ ์ ๋ณด๋ฅผ ๋ฐ์ํ๋๋ก ์ ์ ํ ๋ฐ์ดํฐ ํฌ์ธํธ ๋ฌดํจํ ์ ๋ต์ ๊ตฌํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ํ์ฑ ์์ธ ์ ๋ฐ์ดํธ ๋ฐ ์ฌ๋น๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋ฐ์ดํฐ์ ๋ณ๋์ฑ๊ณผ ์ ๋ฐ์ดํธ ๋น๋์ ๋ฐ๋ผ ์บ์๋ ์๋ต์ TTL์ ์กฐ์ ํ ์๋ ์์ต๋๋ค. SemanticCachePopulate ์ ์ฑ ์์ TTL์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ดํ ์์ธํ ๋ด์ฉ์ <TTLInSeconds>๋ฅผ ์ฐธ๊ณ ํ์ธ์.
- ์ฌ์ ์ ์๋ ์บ์ฑ ์ ๋ต์ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ์ ํํ ์๋ต ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฅํฉ๋๋ค.
๋ค์๊ณผ ์ ์ฌํ ์ฌ์ ์ ์๋ ์บ์ฑ ์ ๋ต์ ๊ตฌํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ์ผ๋ฐ AI ์๋ต: ์ฌ์ฉ์๋ณ์ด ์๋ ์๋ต์๋ ๊ธด TTL(์: 1์๊ฐ)์ ๊ตฌ์ฑํฉ๋๋ค.
- ์ฌ์ฉ์๋ณ ์๋ต: ์ฌ์ฉ์๋ณ ์ ๋ณด๊ฐ ํฌํจ๋ ์๋ต์๋ ์บ์ฑ์ ๊ตฌํํ๊ฑฐ๋ ์งง์ TTL(์: 5๋ถ)์ ์ค์ ํ์ง ๋ง์ธ์.
- ์๊ฐ์ ๋ฏผ๊ฐํ ์๋ต: ์ค์๊ฐ ๋๋ ๋น๋ฒํ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ์๋ต์๋ ์งง์ TTL(์: 5๋ถ)์ ๊ตฌ์ฑํฉ๋๋ค.
- ์บ์ ๊ฐ๋ฅํ ์ต๋ ํ ์คํธ ํฌ๊ธฐ๋ 256KB์ ๋๋ค. ์์ธํ ๋ด์ฉ์ Apigee ํ๋ ํ์ด์ง์ ์บ์ ๊ฐ ํฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
- Apigee๋ LLM ๋ชจ๋ธ์์ ์์ ํ ๋ชจ๋ cache-control ํค๋๋ฅผ ๋ฌด์ํฉ๋๋ค.
- ์บ์๊ฐ ์ ๋๋ก ๋ฌดํจํ๋์ง ์๊ฑฐ๋ ์๋งจํฑ ์ ์ฌ์ฑ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ฏธ๊ฐ ๋งค์ฐ ์ ์ฌํ ์ ๋ ฅ์ ๊ตฌ๋ถํ ๋งํผ ์ ํํ์ง ์์ผ๋ฉด ๋๋ต์ ์ค๋๋์๊ฑฐ๋ ์๋ชป๋ ์ ๋ณด๊ฐ ๋ฐํ๋ ์ ์์ต๋๋ค.
- ๋ฒกํฐ ๊ฒ์ ๊ธฐ๋ฅ์ ์ผ๋ถ ์ง์ญ์์ ์ง์๋์ง ์์ต๋๋ค. ์ง์๋๋ ๋ฆฌ์ ๋ชฉ๋ก์ Vertex AI ์์น ํ์ด์ง์ ๊ธฐ๋ฅ ๊ฐ์ฉ์ฑ ์น์ ์ ์ฐธ๊ณ ํ์ธ์. Apigee ์กฐ์ง์ด ์ง์๋์ง ์๋ ๋ฆฌ์ ์ ์๋ ๊ฒฝ์ฐ Apigee ์กฐ์ง๊ณผ ๋ค๋ฅธ ๋ฆฌ์ ์์ ์์ธ ์๋ํฌ์ธํธ๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
- ์๋ฒ ์ ์ก ์ด๋ฒคํธ(SSE)์ ์ฐ์ ์๋ต ์คํธ๋ฆฌ๋ฐ์ ์ํด EventFlow๋ฅผ ์ฌ์ฉํ๋ API ํ๋ก์์๋ ์๋งจํฑ ์บ์ฑ ์ ์ฑ ์ด ์ง์๋์ง ์์ต๋๋ค.
- <UserPromptSource> ๋ด์ JsonPath ํจ์๋
ignoreUnresolvedVariables
๊ธฐ๋ฅ์ ์ง์ํ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก null ๋๋ ๋น ๊ฐ์ ๋ฉ์์ง ํ ํ๋ฆฟ ์ ์ฉ ์ค์ ๋ฌด์๋ฉ๋๋ค.
ํ์ํ ์ญํ
์๋งจํฑ ์บ์ฑ ์ ์ฑ
์ ๋ง๋ค๊ณ ์ฌ์ฉํ๋ ๋ฐ ํ์ํ ๊ถํ์ ์ป์ผ๋ ค๋ฉด Apigee ํ๋ก์ ๋ฐฐํฌ์ ์ฌ์ฉํ๋ ์๋น์ค ๊ณ์ ์ ๋ํ AI ํ๋ซํผ ์ฌ์ฉ์ (roles/aiplatform.user
) IAM ์ญํ ์ ๋ถ์ฌํด ๋ฌ๋ผ๊ณ ๊ด๋ฆฌ์์๊ฒ ์์ฒญํ์ธ์.
์ญํ ๋ถ์ฌ์ ๋ํ ์์ธํ ๋ด์ฉ์ ํ๋ก์ ํธ, ํด๋, ์กฐ์ง์ ๋ํ ์ก์ธ์ค ๊ด๋ฆฌ๋ฅผ ์ฐธ์กฐํ์ธ์.
์ปค์คํ ์ญํ ์ด๋ ๋ค๋ฅธ ์ฌ์ ์ ์๋ ์ญํ ์ ํตํด ํ์ํ ๊ถํ์ ์ป์ ์๋ ์์ต๋๋ค.
ํ๊ฒฝ ๋ณ์ ์ค์ ํ๊ธฐ
Apigee ์ธ์คํด์ค๊ฐ ํฌํจ๋ Google Cloud ํ๋ก์ ํธ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค.
export PROJECT_ID=PROJECT_ID
export REGION=REGION
export RUNTIME_HOSTNAME=RUNTIME_HOSTNAME
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ๊ฒฝ ๋ณ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์๋์ง ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ณ ์ถ๋ ฅ์ ๊ฒํ ํฉ๋๋ค.
echo $PROJECT_ID $REGION $RUNTIME_HOSTNAME
ํ๋ก์ ํธ ์ค์
๊ฐ๋ฐ ํ๊ฒฝ์์ Google Cloud ํ๋ก์ ํธ๋ฅผ ์ค์ ํฉ๋๋ค.
gcloud auth login
gcloud config set project $PROJECT_ID
๊ฐ์
์๋งจํฑ ์บ์ฑ ์ ์ฑ ์ Apigee ์ฌ์ฉ์๊ฐ LLM ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ๋์ผํ๊ฑฐ๋ ์๋งจํฑ์ด ์ ์ฌํ ํ๋กฌํํธ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ๊ณตํ์ฌ ๋ฐฑ์๋ API ํธ์ถ์ ์ต์ํํ๊ณ ๋ฆฌ์์ค ์๋น๋ฅผ ์ค์ผ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
SemanticCacheLookup ๋ฐ SemanticCachePopulate ์ ์ฑ ์ Apigee API ํ๋ก์์ ์์ฒญ ๋ฐ ์๋ต ํ๋ฆ์ ๊ฐ๊ฐ ์ฐ๊ฒฐ๋ฉ๋๋ค. ํ๋ก์๊ฐ ์์ฒญ์ ์์ ํ๋ฉด SemanticCacheLookup ์ ์ฑ ์ด ์์ฒญ์์ ์ฌ์ฉ์ ํ๋กฌํํธ๋ฅผ ์ถ์ถํ๊ณ Text Embeddings API๋ฅผ ์ฌ์ฉํ์ฌ ํ๋กฌํํธ๋ฅผ ์ซ์ ํํ์ผ๋ก ๋ณํํฉ๋๋ค. ๋ฒกํฐ ๊ฒ์์ ์ฌ์ฉํ์ฌ ์๋งจํฑ ์ ์ฌ์ฑ ๊ฒ์์ ์คํํ์ฌ ์ ์ฌํ ํ๋กฌํํธ๋ฅผ ์ฐพ์ต๋๋ค. ์ ์ฌํ ํ๋กฌํํธ ๋ฐ์ดํฐ ํฌ์ธํธ๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ์บ์ ์กฐํ๊ฐ ์คํ๋ฉ๋๋ค. ์บ์๋ ๋ฐ์ดํฐ๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ์บ์๋ ์๋ต์ด ํด๋ผ์ด์ธํธ์ ๋ฐํ๋ฉ๋๋ค.
์ ์ฌ์ฑ ๊ฒ์์์ ์ ์ฌํ ์ด์ ํ๋กฌํํธ๋ฅผ ๋ฐํํ์ง ์์ผ๋ฉด LLM ๋ชจ๋ธ์ด ์ฌ์ฉ์ ํ๋กฌํํธ์ ๋ํ ์๋ต์ผ๋ก ์ฝํ ์ธ ๋ฅผ ์์ฑํ๊ณ Apigee ์บ์๊ฐ ์๋ต์ผ๋ก ์ฑ์์ง๋๋ค. ํฅํ ์์ฒญ์ ๋๋นํ์ฌ ๋ฒกํฐ ๊ฒ์ ์์ธ ํญ๋ชฉ์ ์ ๋ฐ์ดํธํ๊ธฐ ์ํ ํผ๋๋ฐฑ ๋ฃจํ๊ฐ ์์ฑ๋ฉ๋๋ค.
๋ค์ ์น์ ์์๋ ์๋งจํฑ ์บ์ฑ ์ ์ฑ ์ ๋ง๋ค๊ณ ๊ตฌ์ฑํ๋ ๋ฐ ํ์ํ ๋จ๊ณ๋ฅผ ์ค๋ช ํฉ๋๋ค.
๋ฒกํฐ ๊ฒ์ ์์ธ์ ์๋น์ค ๊ณ์ ๊ตฌ์ฑํ๊ธฐ
๋ฒกํฐ ๊ฒ์ ์์ธ์ ์๋น์ค ๊ณ์ ์ ๊ตฌ์ฑํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ธ์.
๋ฒกํฐ ๊ฒ์ ์์ธ ๋ง๋ค๊ธฐ ๋ฐ ๋ฐฐํฌ
๋ฒกํฐ ๊ฒ์ ์์ธ์ ๋ง๋ค์ด ๋ฐฐํฌํ๋ ค๋ฉด
์์ธ์ ์๋ํฌ์ธํธ์ ์ฒ์ ๋ฐฐํฌํ๋ ๋ฐ 20~30๋ถ ์ ๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ์์ ์ํ๋ฅผ ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
gcloud ai operations describe OPERATION_ID \ --project=$PROJECT_ID \ --region=$REGION
์์ธ์ด ๋ฐฐํฌ๋์๋์ง ํ์ธํฉ๋๋ค.
gcloud ai operations describe OPERATION_ID \ --index-endpoint=$INDEX_ENDPOINT_ID --region=$REGION --project=$PROJECT_ID
์ด ๋ช
๋ น์ด๋ $ done: true
๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
์๋งจํฑ ์บ์ฑ์ ์ฌ์ฉ ์ค์ ํ๋ API ํ๋ก์ ๋ง๋ค๊ธฐ
์ด ๋จ๊ณ์์๋ (์์ง ๋ง๋ค์ง ์์ ๊ฒฝ์ฐ) ์๋งจํฑ ์บ์๊ฐ ์๋ ํ๋ก์ ํ ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ ์ API ํ๋ก์๋ฅผ ๋ง๋ญ๋๋ค.
API ํ๋ก์๋ฅผ ๋ง๋ค๊ธฐ ์ ์ ๋ค์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค.
export PUBLIC_DOMAIN_NAME=$(gcloud ai index-endpoints describe $INDEX_ENDPOINT_ID --region=$REGION --project=$PROJECT_ID | grep "publicEndpointDomainName" | awk '{print $2}')
์๋งจํฑ ์บ์ฑ์ ์ฌ์ฉํ ํ๋ก์๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
API ํ๋ก์์ XML ๊ตฌ์ฑ์ ๊ฐ๋ฐ ํญ์์ ํ์ธํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ด ํฌํจ๋ SemanticCacheLookup ๋ฐ SemanticCachePopulate ์ ์ฑ ์ด ์ด๋ฏธ ํ๋ก์ ์์ฒญ ๋ฐ ์๋ต ํ๋ฆ์ ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค.
์๋งจํฑ ์บ์ฑ ์ ์ฑ ๊ตฌ์ฑํ๊ธฐ
API ํ๋ก์์ ๊ฐ๋ฐ ํญ์ ์๋ ์ธ๋ถ์ ๋ณด ๋ทฐ์์ ์ ์ฑ ์ด๋ฆ์ ํด๋ฆญํ๋ฉด ๊ฐ ์ ์ฑ ์ XML ๊ตฌ์ฑ์ ๋ณผ ์ ์์ต๋๋ค. ์ ์ฑ XML์ ๊ฐ๋ฐ ํญ์ ์ฝ๋ ๋ทฐ์์ ์ง์ ์์ ํ ์ ์์ต๋๋ค.
์ ์ฑ ์์ :
API ํ๋ก์์ Google ์ธ์ฆ ์ถ๊ฐ
๋์์ ๋ํ ํ๋ก์ ํธ์ถ์ ์ฌ์ฉ ์ค์ ํ๋ ค๋ฉด API ํ๋ก์์ ๋์ ์๋ํฌ์ธํธ์ Google ์ธ์ฆ๋ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
Google ์ก์ธ์ค ํ ํฐ์ ์ถ๊ฐํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
API ํ๋ก์ ๋ฐฐํฌ
API ํ๋ก์๋ฅผ ๋ฐฐํฌํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
์๋งจํฑ ์บ์ฑ ์ ์ฑ ํ ์คํธ
์๋งจํฑ ์บ์ฑ ์ ์ฑ ์ ํ ์คํธํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
ํธ์ถ์ด ์บ์์์ ์ ๊ณต๋๋์ง ํ์ธํ๋ ค๋ฉด ์๋ต ํค๋๋ฅผ ํ์ธํ์ธ์. Cached-Content: true
ํค๋๊ฐ ์ฒจ๋ถ๋์ด์ผ ํฉ๋๋ค.
๊ถ์ฅ์ฌํญ
์๋งจํฑ ์บ์ฑ ์ ์ฑ ์ ์ฌ์ฉํ ๋๋ ๋ค์ ๊ถ์ฅ์ฌํญ์ API ๊ด๋ฆฌ ํ๋ก๊ทธ๋จ์ ํตํฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ ํ์ฌํญ
์๋งจํฑ ์บ์ฑ ์ ์ฑ ์๋ ๋ค์๊ณผ ๊ฐ์ ์ ํ์ฌํญ์ด ์ ์ฉ๋ฉ๋๋ค.
๋ค์ ๋จ๊ณ
Model Armor ์ ์ฑ ์ ์์ํ๋ ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ