์ด ํ์ด์ง์์๋ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์์ธก์ ํธ์ถํ๊ฑฐ๋ ์๋ฒ ๋ฉ์ ์์ฑํ ํ ๋ชจ๋ธ ์๋ํฌ์ธํธ๋ฅผ ๋ชจ๋ธ ์๋ํฌ์ธํธ ๊ด๋ฆฌ์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
google_ml.create_model()
ํจ์์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ชจ๋ธ ์๋ํฌ์ธํธ ๊ด๋ฆฌ ์ฐธ์กฐ๋ฅผ ํ์ธํ์ธ์.
์์ํ๊ธฐ ์ ์
- ๋ชจ๋ธ ์๋ํฌ์ธํธ์ ์ธ์ฆ์ด ํ์ํ ๊ฒฝ์ฐ
google_ml_integration
ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ ์ค์ ํฉ๋๋ค.
- ๋ชจ๋ธ ๊ณต๊ธ์๋ณ๋ก ์ธ์ฆ์ ์ค์ ํ์ธ์.
postgres
๊ธฐ๋ณธ ์ฌ์ฉ์ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ก์ธ์คํด์ผ ํฉ๋๋ค.
ํ์ฅ ํ๋ก๊ทธ๋จ ์ฌ์ฉ ์ค์
์ธ์คํด์ค์
google_ml_integration.enable_model_support
๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๋๊ทธ๋ฅผon
์ผ๋ก ์ค์ ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๋๊ทธ ์ค์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๋๊ทธ ๊ตฌ์ฑ์ ์ฐธ์กฐํ์ธ์.psql
ํด๋ผ์ด์ธํธ ๋๋ Cloud SQL Studio๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ์ธ์คํด์ค์ ์ฐ๊ฒฐํฉ๋๋ค.๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ
google_ml_integration
ํ์ฅ ํ๋ก๊ทธ๋จ์ด ๋ฒ์ 1.4.2๋ก ์ ๋ฐ์ดํธ๋์๋์ง ํ์ธํฉ๋๋ค.ALTER EXTENSION google_ml_integration UPDATE TO '1.4.2'
psql
์ ์ฌ์ฉํ์ฌgoogle_ml_integration
๋ฒ์ 1.4.2 ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ถ๊ฐํฉ๋๋ค.CREATE EXTENSION google_ml_integration VERSION '1.4.2';
(์ ํ์ฌํญ) ๋ชจ๋ธ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ๊ถํ์ ์ต๊ณ ๊ด๋ฆฌ์๊ฐ ์๋ 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 ํ ํฐ์ ๋ง๋ค๊ณ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ธ์.
Secret Manager์์ ๋ณด์ ๋น๋ฐ์ ๋ง๋ญ๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ณด์ ๋น๋ฐ ๋ง๋ค๊ธฐ ๋ฐ ๋ณด์ ๋น๋ฐ ๋ฒ์ ์ก์ธ์ค๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ณด์ ๋น๋ฐ ์ด๋ฆ๊ณผ ๋ณด์ ๋น๋ฐ ๊ฒฝ๋ก๋
google_ml.create_sm_secret()
SQL ํจ์์์ ์ฌ์ฉ๋ฉ๋๋ค.Cloud SQL ์ธ์คํด์ค์ ๋ณด์ ๋น๋ฐ์ ์ก์ธ์คํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค.
gcloud secrets add-iam-policy-binding SECRET_ID \ --member="serviceAccount:SERVICE_ACCOUNT_EMAIL" \ --role="roles/secretmanager.secretAccessor"
๋ค์์ ๋ฐ๊ฟ๋๋ค.
SECRET_ID
: Secret Manager์ ๋ณด์ ๋น๋ฐ IDSERVICE_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
๋ณํ ํจ์๋ ๋ชจ๋ธ์ ์
๋ ฅ ๋ฐ ์ถ๋ ฅ ํ์์ ์์ธก ํจ์์ ์
๋ ฅ ๋ฐ ์ถ๋ ฅ ํ์์ผ๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ปค์คํ ํธ์คํ ํ ์คํธ ์๋ฒ ๋ฉ ๋ชจ๋ธ ์๋ํฌ์ธํธ๋ฅผ ๋ฑ๋กํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํฉ๋๋ค.
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์ ์ค์ ๋ ๋ณด์ ๋น๋ฐ IDPROJECT_ID
: Google Cloud ํ๋ก์ ํธ์ IDVERSION_NUMBER
: ๋ณด์ ๋น๋ฐ ID์ ๋ฒ์ ๋ฒํธ
ํ ์คํธ ์๋ฒ ๋ฉ ๋ชจ๋ธ ์๋ํฌ์ธํธ์ ์์ธก ํจ์์ ๊ดํ ๋ค์ ์๋ช ์ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ๋ณํ ํจ์๋ฅผ ๋ง๋ญ๋๋ค. ๋ณํ ํจ์๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๊ดํ ์์ธํ ๋ด์ฉ์ ๋ณํ ํจ์ ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋ค์์
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; $$;
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์ ๋๋ค.
์์ธํ ๋ด์ฉ์ ์ผ๋ฐ ๋ชจ๋ธ ์๋ํฌ์ธํธ์ ์์ธก ํธ์ถ ๋ฐฉ๋ฒ์ ์ฐธ์กฐํ์ธ์.
๋ค์ ๋จ๊ณ
- ๋ชจ๋ธ ์๋ํฌ์ธํธ ๊ด๋ฆฌ ์ฐธ์กฐ์ ๋ํด ์์๋ณด๊ธฐ