๋ฒกํ„ฐ ์ž„๋ฒ ๋”ฉ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ

์ด ํŽ˜์ด์ง€์—์„œ๋Š” ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฒกํ„ฐ ์ž„๋ฒ ๋”ฉ์„ ์ƒ์„ฑํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud SQL์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ˜• AI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Cloud SQL์„ ์‚ฌ์šฉํ•˜๋ฉด Vertex AI์—์„œ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ ๋ฌธ์ž์—ด์„ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž„๋ฒ ๋”ฉ์€ ์ง€์ •๋œ ํ…์ŠคํŠธ์˜ ์˜๋ฏธ๋ก ์  ์˜๋ฏธ๋ฅผ ์ˆซ์ž ๋ฒกํ„ฐ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๋ชจ๋ธ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค.

Cloud SQL์€ ์ž„๋ฒ ๋”ฉ์„ real ๊ฐ’ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ์ž„๋ฒ ๋”ฉ์„ pgvector ํ™•์žฅ ํ•จ์ˆ˜์˜ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ผ๋ถ€ ์š”๊ตฌ์‚ฌํ•ญ์€ Cloud SQL์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž„๋ฒ ๋”ฉ์„ ์ƒ์„ฑํ• ์ง€ ๋˜๋Š” ๋‹ค๋ฅธ ์†Œ์Šค์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ์ž„๋ฒ ๋”ฉ์œผ๋กœ๋งŒ ์ž‘์—…ํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๋ฆฌ์ „๋ณ„ ์ œํ•œ์‚ฌํ•ญ

Cloud SQL๋กœ Vertex AI ์ž„๋ฒ ๋”ฉ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑํ˜• AI ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์ด ์ง€์›๋˜๋Š” ๋ฆฌ์ „์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Cloud SQL์ด ์ž„๋ฒ ๋”ฉ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Vertex AI ๋ชจ๋ธ์ธ text-embedding ๋ฐ textembedding-gecko๋Š” ์ด ๋ฆฌ์ „์— ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์ˆ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ

์ž„๋ฒ ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Cloud SQL ์ธ์Šคํ„ด์Šค์— google_ml_integration ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. Vertex AI ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ ๋ฒ„์ „ 1.2 ์ด์ƒ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋“œ ํŒŒํ‹ฐ ๋˜๋Š” ๋งž์ถค ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ ๋ฒ„์ „ 1.4.2 ์ด์ƒ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์ž„๋ฒ ๋”ฉ์„ ์ €์žฅํ•˜๊ณ  ์ž„๋ฒ ๋”ฉ๊ณผ ํ•จ๊ป˜ ๋ฒกํ„ฐ ํ•จ์ˆ˜์™€ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด pgvector ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Cloud SQL์—๋Š” ์ด๋Ÿฌํ•œ ๋‘ ๊ฐ€์ง€ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ด ๋ชจ๋‘ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ PostgreSQL ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ชจ๋ธ ์•ก์„ธ์Šค ์„ค์ •

Cloud SQL ์ธ์Šคํ„ด์Šค์—์„œ ์ž„๋ฒ ๋”ฉ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋จผ์ € ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋„๋ก Cloud SQL์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ text-embedding ๋˜๋Š” textembedding-gecko ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Cloud SQL์„ Vertex AI์™€ ํ†ตํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž์—๊ฒŒ ์ž„๋ฒ ๋”ฉ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž์—๊ฒŒ embedding ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ธก์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

  1. psql ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ์˜ ์„ค๋ช…๋Œ€๋กœ psql ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ธฐ๋ณธ ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  2. psql ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ  ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

    \c DB_NAME
    
    GRANT EXECUTE ON FUNCTION embedding TO USER_NAME;
    

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

    • DB_NAME: ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ฆ„

    • USER_NAME: ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„

์ž„๋ฒ ๋”ฉ ์ƒ์„ฑ

Cloud SQL์€ ํ…์ŠคํŠธ๋ฅผ ๋ฒกํ„ฐ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ž„๋ฒ ๋”ฉ์„ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ณ  ์„ ํƒ์ ์œผ๋กœ pgvector ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž„๋ฒ ๋”ฉ ์ƒ์„ฑ

Cloud SQL์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž„๋ฒ ๋”ฉ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด google_ml_integration ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ œ๊ณตํ•˜๋Š” embedding ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

SELECT embedding( 'MODEL_IDVERSION_TAG', 'TEXT');

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

  • MODEL_ID: ์ฟผ๋ฆฌํ•  ๋ชจ๋ธ์˜ ID.

    Vertex AI Model Garden์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ text-embedding-004 ๋˜๋Š”
    text-multilingual-embedding-002๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. Cloud SQL์—์„œ ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  • VERSION_TAG(์„ ํƒ์‚ฌํ•ญ): ์ฟผ๋ฆฌํ•  ๋ชจ๋ธ์˜ ๋ฒ„์ „ ํƒœ๊ทธ. text-embedding-004 ๋˜๋Š” text-multilingual-embedding-002 ์ด์ „ ๋ฒ„์ „์˜ textembedding-gecko์˜ ๊ฒฝ์šฐ ํƒœ๊ทธ ์•ž์— @๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    Vertex AI์—์„œ textembedding-gecko ๋ชจ๋ธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋ธ ๋ฒ„์ „์— ๋‚˜์—ด๋œ ๋ฒ„์ „ ํƒœ๊ทธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • TEXT: ๋ฒกํ„ฐ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ๋ณ€ํ™˜ํ•  ํ…์ŠคํŠธ.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” text-embedding-004 ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๊ณต๋œ ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ์ž์—ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž„๋ฒ ๋”ฉ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

SELECT embedding( 'text-embedding-004', 'Cloud SQL is a managed, cloud-hosted SQL database service.');

์ƒ์„ฑ๋œ ์ž„๋ฒ ๋”ฉ ์ €์žฅ

embedding() ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ real ๊ฐ’ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๋ ค๋ฉด real[] ์—ด์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ALTER TABLE TABLE ADD COLUMN EMBEDDING_COLUMN real[DIMENSIONS];

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

  • TABLE: ํ…Œ์ด๋ธ” ์ด๋ฆ„

  • EMBEDDING_COLUMN: ์ƒˆ ์ž„๋ฒ ๋”ฉ ์—ด์˜ ์ด๋ฆ„

  • DIMENSIONS: ๋ชจ๋ธ์—์„œ ์ง€์›ํ•˜๋Š” ์ฐจ์› ์ˆ˜

    Vertex AI์—์„œ text-embedding ๋˜๋Š” textembedding-gecko ๋ชจ๋ธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ 768์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๊ฒฝ์šฐ pgvector ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ–ˆ์œผ๋ฉด ์ž„๋ฒ ๋”ฉ์„ vector ๊ฐ’์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ALTER TABLE TABLE ADD COLUMN EMBEDDING_COLUMN vector(DIMENSIONS);

์ž„๋ฒ ๋”ฉ์„ ์ €์žฅํ•  ์—ด์„ ๋งŒ๋“  ํ›„ ๊ฐ™์€ ํ…Œ์ด๋ธ”์˜ ๋‹ค๋ฅธ ์—ด์— ์ด๋ฏธ ์ €์žฅ๋œ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์—ด์„ ์ฑ„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

UPDATE TABLE SET EMBEDDING_COLUMN = embedding('MODEL_IDVERSION_TAG', SOURCE_TEXT_COLUMN);

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

  • TABLE: ํ…Œ์ด๋ธ” ์ด๋ฆ„

  • EMBEDDING_COLUMN: ์ž„๋ฒ ๋”ฉ ์—ด ์ด๋ฆ„

  • MODEL_ID: ์ฟผ๋ฆฌํ•  ๋ชจ๋ธ์˜ ID.

    Vertex AI Model Garden์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ text-embedding-004 ๋˜๋Š”
    text-multilingual-embedding-002๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. Cloud SQL์—์„œ ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  • VERSION_TAG(์„ ํƒ์‚ฌํ•ญ): ์ฟผ๋ฆฌํ•  ๋ชจ๋ธ์˜ ๋ฒ„์ „ ํƒœ๊ทธ. text-embedding-004 ๋˜๋Š” text-multilingual-embedding-002 ์ด์ „์˜ textembedding-gecko ๋ฒ„์ „์˜ ๊ฒฝ์šฐ Prepend the tag with@๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    Vertex AI์—์„œ textembedding-gecko ๋ชจ๋ธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋ธ ๋ฒ„์ „์— ๋‚˜์—ด๋œ ๋ฒ„์ „ ํƒœ๊ทธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • SOURCE_TEXT_COLUMN: ํ…์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ์—ด์˜ ์ด๋ฆ„. ์ด ํ…์ŠคํŠธ๋ฅผ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์œ„ ๋ช…๋ น์–ด๋Š” real[] ๋ฐ vector ์ž„๋ฒ ๋”ฉ ์—ด ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ž„๋ฒ ๋”ฉ ์—ด์ด vector ์œ ํ˜•์ด๋ฉด Cloud SQL์—์„œ ์•”์‹œ์ ์œผ๋กœ real ๋ฐฐ์—ด์˜ embedding() ๋ฐ˜ํ™˜ ๊ฐ’์„ vector ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” text-embedding-004 ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ messages.message ์—ด์˜ ์ฝ˜ํ…์ธ ์— ๋”ฐ๋ผ messages.message_vector ์—ด์„ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ์ฑ„์›๋‹ˆ๋‹ค.

UPDATE messages SET message_vector = embedding( 'text-embedding-004', message);

pgvector์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž„๋ฒ ๋”ฉ ์ฟผ๋ฆฌ ๋ฐ ์ƒ‰์ธ ์ƒ์„ฑ

pgvector PostgreSQL ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ์„ ์ €์žฅ, ์ƒ‰์ธ ์ƒ์„ฑ, ์ฟผ๋ฆฌํ•  ๋•Œ ๋ฒกํ„ฐ๋ณ„ ์—ฐ์‚ฐ์ž์™€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Cloud SQL๋Š” pgvector๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž์ฒด์ ์œผ๋กœ ์ตœ์ ํ™”๋˜๋ฏ€๋กœ ์ž„๋ฒ ๋”ฉ์„ ํฌํ•จํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๊ฐ€์†ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ‰์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ๊ทผ์ ‘ ์ด์›ƒ ์ƒ‰์ธ ๋งŒ๋“ค๊ธฐ

pgvector๋Š” ์ƒ‰์ธ ์ƒ์„ฑ์„ ํ†ตํ•œ ๊ทผ์‚ฌ ์ตœ๊ทผ์ ‘ ์ด์›ƒ(ANN) ๊ฒ€์ƒ‰์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

HNSW ์ƒ‰์ธ์„ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ ์˜ˆ์‹œ์™€ ๊ฐ™์ด hnsw ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

CREATE INDEX ON TABLE
  USING hnsw (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (m = M, ef_construction = EF_CONSTRUCTION);

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

  • TABLE: ์ƒ‰์ธ์„ ์ถ”๊ฐ€ํ•  ํ…Œ์ด๋ธ”

  • EMBEDDING_COLUMN: vector ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์—ด

  • DISTANCE_FUNCTION: ์ด ์ƒ‰์ธ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฑฐ๋ฆฌ ํ•จ์ˆ˜. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    • L2 ๊ฑฐ๋ฆฌ: vector_l2_ops

    • ๋‚ด๋ถ€ ์ œํ’ˆ: vector_ip_ops

    • ์ฝ”์‚ฌ์ธ ๊ฑฐ๋ฆฌ: vector_cosine_ops

  • M (์„ ํƒ์‚ฌํ•ญ): ๊ทธ๋ž˜ํ”„์—์„œ ์ธ์ ‘ํ•œ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ์™€์˜ ์ตœ๋Œ€ ์—ฐ๊ฒฐ ์ˆ˜. 5~48์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 16์ž…๋‹ˆ๋‹ค.

  • EF_CONSTRUCTION (์„ ํƒ์‚ฌํ•ญ): ์ƒ‰์ธ์„ ๋นŒ๋“œํ•  ๋•Œ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์ค‘์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ›„๋ณด๋ฅผ ๋ณด์œ ํ•˜๋Š” ๋ชฉ๋ก์˜ ํฌ๊ธฐ. ๊ฐ’์ด ํด์ˆ˜๋ก ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋” ๋งŽ์€ ํ›„๋ณด๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๋” ๋‚˜์€ ์ƒ‰์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํฌ๊ธฐ๋Š” 64์ž…๋‹ˆ๋‹ค.

vector ๋Œ€์‹  real[] ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ์ž„๋ฒ ๋”ฉ ์—ด์— ์ด ์ƒ‰์ธ์„ ๋งŒ๋“ค๋ ค๋ฉด ์—ด์„ vector ๋ฐ์ดํ„ฐ ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

CREATE INDEX ON TABLE
  USING hnsw ((CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS))) DISTANCE_FUNCTION)
  WITH (m = M, ef_construction = EF_CONSTRUCTION);

DIMENSIONS๋ฅผ ์ž„๋ฒ ๋”ฉ ์—ด์˜ ์ฐจ์› ๋„ˆ๋น„๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ƒ‰์ธ ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ง€์ •๋œ ํ…์ŠคํŠธ๋กœ ์ตœ๊ทผ์ ‘ ์ด์›ƒ ์ฟผ๋ฆฌ ์ž‘์„ฑ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ž„๋ฒ ๋”ฉ์„ ์ €์žฅํ•˜๊ณ  ์ƒ‰์ธ์„ ์ƒ์„ฑํ•˜๋ฉด pgvector ์ฟผ๋ฆฌ ๊ธฐ๋Šฅ์˜ ๋ชจ๋“  ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…์ŠคํŠธ์—์„œ ์˜๋ฏธ๋ก ์ ์œผ๋กœ ์ตœ๊ทผ์ ‘ ์ด์›ƒ์„ ์ฐพ์œผ๋ ค๋ฉด embedding() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ๋ฅผ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ์ฟผ๋ฆฌ์—์„œ ์ด ๋ฒกํ„ฐ๋ฅผ pgvector ์ตœ๊ทผ์ ‘ ์ด์›ƒ ์—ฐ์‚ฐ์ž์ธ <->์— ์ ์šฉํ•˜์—ฌ ์˜๋ฏธ์ƒ ๊ฐ€์žฅ ์œ ์‚ฌํ•œ ์ž„๋ฒ ๋”ฉ์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ–‰์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

embedding()์—์„œ real ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ pgvector ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ด๋Ÿฌํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด embedding() ํ˜ธ์ถœ์„ vector์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  SELECT RESULT_COLUMNS FROM TABLE
    ORDER BY EMBEDDING_COLUMN
    <-> embedding('MODEL_IDVERSION_TAG', 'TEXT')::vector
    LIMIT ROW_COUNT

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

  • RESULT_COLUMNS: ์˜๋ฏธ๋ก ์ ์œผ๋กœ ์œ ์‚ฌํ•œ ํ–‰์—์„œ ํ‘œ์‹œํ•  ์—ด์ž…๋‹ˆ๋‹ค.

  • TABLE: ํ…์ŠคํŠธ๋ฅผ ๋น„๊ตํ•  ์ž„๋ฒ ๋”ฉ์ด ํฌํ•จ๋œ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค.

  • EMBEDDING_COLUMN: ์ €์žฅ๋œ ์ž„๋ฒ ๋”ฉ์ด ํฌํ•จ๋œ ์—ด์ž…๋‹ˆ๋‹ค.

  • MODEL_ID: ์ฟผ๋ฆฌํ•  ๋ชจ๋ธ์˜ ID.

    Vertex AI Model Garden์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ text-embedding-004 ๋˜๋Š”
    text-embedding-multilingual-002๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. Cloud SQL์—์„œ ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  • VERSION_TAG(์„ ํƒ์‚ฌํ•ญ): ์ฟผ๋ฆฌํ•  ๋ชจ๋ธ์˜ ๋ฒ„์ „ ํƒœ๊ทธ. ํƒœ๊ทธ ์•ž์— @๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    Vertex AI์—์„œ textembedding-gecko ๋ชจ๋ธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋ธ ๋ฒ„์ „์— ๋‚˜์—ด๋œ ๋ฒ„์ „ ํƒœ๊ทธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • TEXT: ์˜๋ฏธ๋ก ์ ์œผ๋กœ ์ตœ๊ทผ์ ‘์œผ๋กœ ์ €์žฅ๋œ ์ด์›ƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ํ…์ŠคํŠธ

  • ROW_COUNT: ๋ฐ˜ํ™˜ํ•  ํ–‰์˜ ๊ฐœ์ˆ˜. ๊ฐ€์žฅ ์ผ์น˜ํ•˜๋Š” ๊ฐ’์„ ํ•˜๋‚˜๋งŒ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ 1์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

real[] ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ์ €์žฅ๋œ ์ž„๋ฒ ๋”ฉ ์—ด๋กœ ์ด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด vector ๋Œ€์‹  ์—ด์„ vector ๋ฐ์ดํ„ฐ ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  SELECT RESULT_COLUMNS FROM TABLE
    ORDER BY EMBEDDING_COLUMN::vector
    <-> embedding('MODEL_IDVERSION_TAG', 'TEXT')::vector
    LIMIT ROW_COUNT

๋ชจ๋ธ ๋ฒ„์ „ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜ ๋ฐฉ์ง€

Cloud SQL์—์„œ๋Š” ํ•ญ์ƒ ์„ ํƒํ•œ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ์˜ ์•ˆ์ •ํ™” ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋ธ์—์„œ ๋ฒ„์ „ ํƒœ๊ทธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ์˜ ๋ฒ„์ „ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  embedding() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ตฌ๋ฌธ์ ์œผ๋กœ๋Š” ์œ ํšจํ•˜์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

Vertex AI Model Garden์—์„œ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฒ„์ „ ํƒœ๊ทธ๋ฅผ ์ƒ๋žตํ•˜๋ฉด Vertex AI์—์„œ ๋ชจ๋ธ ์ตœ์‹  ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฒ„์ „์€ ์ตœ์‹  ์•ˆ์ •ํ™” ๋ฒ„์ „์ด ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Vertex AI ๋ชจ๋ธ ๋ฒ„์ „์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ชจ๋ธ ๋ฒ„์ „์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ง€์ •๋œ Vertex AI ๋ชจ๋ธ ๋ฒ„์ „์€ ๋™์ผํ•œ embedding() ์‘๋‹ต์„ ํ•ญ์ƒ ์ง€์ •๋œ ํ…์ŠคํŠธ ์ž…๋ ฅ์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ž„๋ฒ ๋”ฉ ํ˜ธ์ถœ์—์„œ ๋ชจ๋ธ ๋ฒ„์ „์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ ๊ฒŒ์‹œ๋œ ๋ชจ๋ธ ๋ฒ„์ „์—์„œ ์ง€์ •๋œ ์ž…๋ ฅ์— ๋ฐ˜ํ™˜๋œ ๋ฒกํ„ฐ๋ฅผ ๊ฐ‘์ž๊ธฐ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์˜ค๋ฅ˜๋‚˜ ๊ธฐํƒ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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