๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ ๊ด€๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›๊ฒฉ AI ๋ชจ๋ธ ๋“ฑ๋ก ๋ฐ ํ˜ธ์ถœ

์ด ํŽ˜์ด์ง€์—์„œ๋Š” ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ธก์„ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ž„๋ฒ ๋”ฉ์„ ์ƒ์„ฑํ•œ ํ›„ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ ๊ด€๋ฆฌ์— ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

google_ml.create_model() ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ ๊ด€๋ฆฌ ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

  • ๋ชจ๋ธ ๊ณต๊ธ‰์ž๋ณ„๋กœ ์ธ์ฆ์„ ์„ค์ •ํ•˜์„ธ์š”.
  • postgres ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์šฉ ์„ค์ •

  1. ์ธ์Šคํ„ด์Šค์˜ google_ml_integration.enable_model_support ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ”Œ๋ž˜๊ทธ๋ฅผ on์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ”Œ๋ž˜๊ทธ ์„ค์ •์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ”Œ๋ž˜๊ทธ ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  2. psql ํด๋ผ์ด์–ธํŠธ ๋˜๋Š” Cloud SQL Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  3. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ google_ml_integration ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ด ๋ฒ„์ „ 1.4.2๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

        ALTER EXTENSION google_ml_integration UPDATE TO '1.4.2'
    
  4. psql์„ ์‚ฌ์šฉํ•˜์—ฌ google_ml_integration ๋ฒ„์ „ 1.4.2 ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      CREATE EXTENSION google_ml_integration VERSION '1.4.2';
    
  5. (์„ ํƒ์‚ฌํ•ญ) ๋ชจ๋ธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ์ตœ๊ณ  ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹Œ PostgreSQL ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

      GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA google_ml TO NON_SUPER_USER;
    

    NON_SUPER_USER๋ฅผ ์ตœ๊ณ  ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹Œ PostgreSQL ์‚ฌ์šฉ์ž ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

์ธ์ฆ ์„ค์ •

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Vertex AI ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ ๋˜๋Š” Google Cloud๋‚ด์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ์ธ์ฆ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Vertex AI ์ธ์ฆ ์„ค์ •

Google Vertex AI ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” IAM ๊ธฐ๋ฐ˜ Cloud SQL ์„œ๋น„์Šค ๊ณ„์ •์— Vertex AI ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Vertex AI์™€์˜ ํ†ตํ•ฉ์— ๊ด€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud SQL๊ณผ Vertex AI ํ†ตํ•ฉ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์ปค์Šคํ…€ ํ˜ธ์ŠคํŒ… ๋ชจ๋ธ ์ธ์ฆ ์„ค์ •

์ด ์„น์…˜์—์„œ๋Š” Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ธ์ฆ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. Vertex AI ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ API ํ‚ค๋‚˜ Bearer ํ† ํฐ์„ Secret Manager์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ์—์„œ Secret Manager๋ฅผ ํ†ตํ•œ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ์„น์…˜์€ ์„ ํƒ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ์—์„œ HTTP ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ธ์ฆ์„ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ์„น์…˜์˜ ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•˜์ง€ ๋งˆ์„ธ์š”.

API ํ‚ค ๋˜๋Š” Bearer ํ† ํฐ์„ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•˜์„ธ์š”.

  1. Secret Manager์—์„œ ๋ณด์•ˆ ๋น„๋ฐ€์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณด์•ˆ ๋น„๋ฐ€ ๋งŒ๋“ค๊ธฐ ๋ฐ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „ ์•ก์„ธ์Šค๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    ๋ณด์•ˆ ๋น„๋ฐ€ ์ด๋ฆ„๊ณผ ๋ณด์•ˆ ๋น„๋ฐ€ ๊ฒฝ๋กœ๋Š” google_ml.create_sm_secret() SQL ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  2. Cloud SQL ์ธ์Šคํ„ด์Šค์— ๋ณด์•ˆ ๋น„๋ฐ€์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

      gcloud secrets add-iam-policy-binding SECRET_ID \
          --member="serviceAccount:SERVICE_ACCOUNT_EMAIL" \
          --role="roles/secretmanager.secretAccessor"
    

    ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • SECRET_ID: Secret Manager์˜ ๋ณด์•ˆ ๋น„๋ฐ€ ID
    • SERVICE_ACCOUNT_EMAIL: IAM ๊ธฐ๋ฐ˜ Cloud SQL ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ. ์ด ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์ฐพ์œผ๋ ค๋ฉด gcloud sql instances describe INSTANCE_NAME ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  INSTANCE_NAME์„ ์ธ์Šคํ„ด์Šค ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. serviceAccountEmailAddress ๋งค๊ฐœ๋ณ€์ˆ˜ ์˜†์— ํ‘œ์‹œ๋˜๋Š” ๊ฐ’์€ ์ด๋ฉ”์ผ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ œ๊ณต ์ง€์›์ด ํฌํ•จ๋œ ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ

์ด ์„น์…˜์—์„œ๋Š” ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Vertex AI ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ

๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ ๊ด€๋ฆฌ๋Š” Vertex AI์˜ text-embedding-gecko, text-embedding, gemini-embedding ๋ชจ๋ธ์˜ ๋ชจ๋“  ๋ฒ„์ „์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ •๊ทœํ™”๋œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ๋ฒ„์ „์„ textembedding-gecko@001 ๋˜๋Š” textembedding-gecko@002๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ ๊ด€๋ฆฌ์—์„œ Vertex AI ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ ID๊ฐ€ ์ง€์›๋˜๋ฏ€๋กœ ์ด ID๋ฅผ ๋ชจ๋ธ ID๋กœ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ธฐ๋ณธ ๋ณ€ํ™˜ ํ•จ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฟผ๋ฆฌํ•˜๋Š” Cloud SQL ์ธ์Šคํ„ด์Šค์™€ Vertex AI ๋ชจ๋ธ์ด ๋ชจ๋‘ ๋™์ผํ•œ ๋ฆฌ์ „์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

textembedding-gecko@002 ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋ ค๋ฉด create_model ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

  CALL
    google_ml.create_model(
      model_id => 'textembedding-gecko@002',
      model_provider => 'google',
      model_qualified_name => 'textembedding-gecko@002',
      model_type => 'text_embedding',
      model_auth_type => 'cloudsql_service_agent_iam');

์ปค์Šคํ…€ ํ˜ธ์ŠคํŒ… ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ

์ด ์„น์…˜์—์„œ๋Š” Google Cloud๋‚ด ๋„คํŠธ์›Œํฌ์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” ์ปค์Šคํ…€ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ํ˜ธ์ŠคํŒ… ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋ณ€ํ™˜ ํ•จ์ˆ˜์™€ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ปค์Šคํ…€ HTTP ํ—ค๋”๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ์ปค์Šคํ…€ ํ˜ธ์ŠคํŒ… ์ผ๋ฐ˜ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์„ ํƒ์ ์œผ๋กœ ์ปค์Šคํ…€ HTTP ํ—ค๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ชจ๋ธ ์š”์ฒญ URL์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” Google Cloud๋‚ด์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” Cymbal์—์„œ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” custom-embedding-model ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. cymbal_text_input_transform ๋ฐ cymbal_text_output_transform ๋ณ€ํ™˜ ํ•จ์ˆ˜๋Š” ๋ชจ๋ธ์˜ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ํ˜•์‹์„ ์˜ˆ์ธก ํ•จ์ˆ˜์˜ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ํ˜ธ์ŠคํŒ… ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

  1. Secret Manager์— ์ €์žฅ๋œ ๋ณด์•ˆ ๋น„๋ฐ€์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

    CALL
      google_ml.create_sm_secret(
        secret_id => 'SECRET_ID',
        secret_path => 'projects/project-id/secrets/SECRET_MANAGER_SECRET_ID/versions/VERSION_NUMBER');
    

    ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • SECRET_ID: ์„ค์ •ํ•˜๊ณ  ๋‚˜์ค‘์— ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋“ฑ๋กํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ณด์•ˆ ๋น„๋ฐ€ ID(์˜ˆ: key1)
    • SECRET_MANAGER_SECRET_ID: ๋ณด์•ˆ ๋น„๋ฐ€์„ ๋งŒ๋“ค ๋•Œ Secret Manager์— ์„ค์ •๋œ ๋ณด์•ˆ ๋น„๋ฐ€ ID
    • PROJECT_ID: Google Cloud ํ”„๋กœ์ ํŠธ์˜ ID
    • VERSION_NUMBER: ๋ณด์•ˆ ๋น„๋ฐ€ ID์˜ ๋ฒ„์ „ ๋ฒˆํ˜ธ
  2. ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ์˜ ์˜ˆ์ธก ํ•จ์ˆ˜์— ๊ด€ํ•œ ๋‹ค์Œ ์„œ๋ช…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ๋ณ€ํ™˜ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณ€ํ™˜ ํ•จ์ˆ˜ ์˜ˆ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

    ๋‹ค์Œ์€ custom-embedding-model ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ์— ๊ด€๋ จ๋œ ๋ณ€ํ™˜ ํ•จ์ˆ˜์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

    -- Input Transform Function corresponding to the custom model endpoint
    CREATE OR REPLACE FUNCTION cymbal_text_input_transform(model_id VARCHAR(100), input_text TEXT)
    RETURNS JSON
    LANGUAGE plpgsql
    AS $$
    DECLARE
      transformed_input JSON;
      model_qualified_name TEXT;
    BEGIN
      SELECT json_build_object('prompt', json_build_array(input_text))::JSON INTO transformed_input;
      RETURN transformed_input;
    END;
    $$;
    -- Output Transform Function corresponding to the custom model endpoint
    CREATE OR REPLACE FUNCTION cymbal_text_output_transform(model_id VARCHAR(100), response_json JSON)
    RETURNS REAL[]
    LANGUAGE plpgsql
    AS $$
    DECLARE
      transformed_output REAL[];
    BEGIN
      SELECT ARRAY(SELECT json_array_elements_text(response_json->0)) INTO transformed_output;
      RETURN transformed_output;
    END;
    $$;
    
  3. create model ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋งž์ถค ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋“ฑ๋กํ•˜์„ธ์š”.

  CALL
    google_ml.create_model(
      model_id => 'MODEL_ID',
      model_request_url => 'REQUEST_URL',
      model_provider => 'custom',
      model_type => 'text_embedding',
      model_auth_type => 'secret_manager',
      model_auth_id => 'SECRET_ID',
      model_qualified_name => 'MODEL_QUALIFIED_NAME',
      model_in_transform_fn => 'cymbal_text_input_transform',
      model_out_transform_fn => 'cymbal_text_output_transform');

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • MODEL_ID: ํ•„์ˆ˜ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ์ •์˜ํ•œ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ์˜ ๊ณ ์œ  ID(์˜ˆ: custom-embedding-model). ์ด ๋ชจ๋ธ ID๋Š” ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์ž„๋ฒ ๋”ฉ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์˜ˆ์ธก์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ฐธ์กฐ๋ฉ๋‹ˆ๋‹ค.
  • REQUEST_URL: ํ•„์ˆ˜ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ๋งž์ถค ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ ๋ฐ ์ผ๋ฐ˜ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ์˜ ๋ชจ๋ธ๋ณ„ ์—”๋“œํฌ์ธํŠธ(์˜ˆ: https://cymbal.com/models/text/embeddings/v1). ๋‚ด๋ถ€ IP ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ ๊ด€๋ฆฌ๋Š” ์™ธ๋ถ€ IP ์ฃผ์†Œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • MODEL_QUALIFIED_NAME: ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ์—์„œ ์ •๊ทœํ™”๋œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ์— ๋ฒ„์ „์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ •๊ทœํ™”๋œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • SECRET_ID: ์•ž์„  google_ml.create_sm_secret() ์ ˆ์ฐจ์—์„œ ์‚ฌ์šฉํ•œ ๋ณด์•ˆ ๋น„๋ฐ€ ID

์ผ๋ฐ˜ ๋ชจ๋ธ

์ด ์„น์…˜์—์„œ๋Š” Vertex AI Model Garden์—์„œ ๊ธฐ๋ณธ ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ์ผ๋ฐ˜ gemini-pro ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. Google Cloud๋‚ด์— ํ˜ธ์ŠคํŒ…๋˜๋Š” ๋ชจ๋“  ์ผ๋ฐ˜ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Cloud SQL์€ Vertex AI Model Garden์„ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ์™€ Google Cloud๋‚ด ๋„คํŠธ์›Œํฌ์— ํ˜ธ์ŠคํŒ…๋œ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Gemini ๋ชจ๋ธ

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” Vertex AI Model Garden์—์„œ gemini-1.0-pro ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

gemini-1.0-pro ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋ ค๋ฉด create model ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

    CALL
      google_ml.create_model(
        model_id => 'MODEL_ID',
        model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/publishers/google/models/gemini-1.0-pro:streamGenerateContent',
        model_provider => 'google',
        model_auth_type => 'cloudsql_service_agent_iam');

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • MODEL_ID: ์ •์˜ํ•œ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ์˜ ๊ณ ์œ  ID(์˜ˆ:
    gemini-1). ์ด ๋ชจ๋ธ ID๋Š” ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์ž„๋ฒ ๋”ฉ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์˜ˆ์ธก์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ฐธ์กฐ๋ฉ๋‹ˆ๋‹ค.
  • PROJECT_ID: Google Cloud ํ”„๋กœ์ ํŠธ์˜ ID์ž…๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ผ๋ฐ˜ ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ์˜ ์˜ˆ์ธก ํ˜ธ์ถœ ๋ฐฉ๋ฒ•์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ๋‹จ๊ณ„