Skip to main content

Sonamu์— ๋ฒกํ„ฐ ๊ฒ€์ƒ‰์ด ํ•„์š”ํ•œ ์ด์œ 

Sonamu๋กœ ์›น ์•ฑ์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด ์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:
  • ์ง€์‹ ๋ฒ ์ด์Šค: โ€œ๋น„์Šทํ•œ ๋ฌธ์„œ ์ฐพ๊ธฐโ€
  • ์ปค๋จธ์Šค: โ€œ์ด ์ƒํ’ˆ๊ณผ ์œ ์‚ฌํ•œ ์ œํ’ˆโ€
  • ์ฝ˜ํ…์ธ : โ€œ๊ด€๋ จ ๊ธ€ ์ถ”์ฒœโ€
  • ๊ณ ๊ฐ ์ง€์›: โ€œ๋น„์Šทํ•œ ์งˆ๋ฌธ ์ฐพ๊ธฐโ€
์ „ํ†ต์ ์ธ ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰(LIKE '%keyword%')์€ ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:
  • โŒ โ€œTypeScript ํ”„๋ ˆ์ž„์›Œํฌโ€ ๊ฒ€์ƒ‰ ์‹œ โ€œNode.js API ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌโ€ ๋ชป ์ฐพ์Œ
  • โŒ ์˜คํƒ€์— ์ทจ์•ฝ (โ€œํƒ€์ž…์Šคํฌ๋ฆฝํŠธโ€ vs โ€œํƒ€์ž…์Šคํฌ๋ฆฝํŠธโ€)
  • โŒ ๋™์˜์–ด ์ฒ˜๋ฆฌ ์•ˆ ๋จ (โ€œํ”„๋ ˆ์ž„์›Œํฌโ€ vs โ€œ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌโ€)
์˜๋ฏธ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ฒกํ„ฐ ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์™œ pgvector์ธ๊ฐ€?

๋ฒกํ„ฐ ๊ฒ€์ƒ‰์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋ฒกํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์„ ํƒ์ง€

Sonamu ํ”„๋กœ์ ํŠธ์—์„œ pgvector๋ฅผ ์ถ”์ฒœํ•˜๋Š” ์ด์œ 

1. ์ด๋ฏธ PostgreSQL์„ ์“ฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค
Sonamu๋Š” PostgreSQL + Knex ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค. ๋ฒกํ„ฐ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด ๋ณ„๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. 2. ๊ธฐ์กด ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
๋ฒกํ„ฐ ๊ฒ€์ƒ‰๊ณผ ์ผ๋ฐ˜ SQL์„ ์„ž์–ด์„œ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๋„ DB๋ฉด ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 3. ์ธํ”„๋ผ๊ฐ€ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค
  • Pinecone: ๋ณ„๋„ API, ๋น„์šฉ, ๋™๊ธฐํ™”
  • pgvector: ํ™•์žฅ๋งŒ ์„ค์น˜, ์ถ”๊ฐ€ ๋น„์šฉ ์—†์Œ
4. Sonamu Model๊ณผ ํ†ตํ•ฉ์ด ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค

pgvector๋ž€?

pgvector๋Š” PostgreSQL์—์„œ ๋ฒกํ„ฐ(์ž„๋ฒ ๋”ฉ) ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ™•์žฅ์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ๊ธฐ๋Šฅ:
  • vector(N) ๋ฐ์ดํ„ฐ ํƒ€์ž… (N์ฐจ์› ๋ฒกํ„ฐ)
  • ์œ ์‚ฌ๋„ ์—ฐ์‚ฐ์ž (<=>, <->, <#>)
  • ์ธ๋ฑ์Šค (IVFFlat, HNSW)

ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ์„ค์น˜

ํŒจํ‚ค์ง€:
  • pgvector: PostgreSQL pgvector ํƒ€์ž… ์ง€์› (Knex์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ)
  • voyageai: Voyage AI ์ž„๋ฒ ๋”ฉ (ํ•œ๊ตญ์–ด ์ถ”์ฒœ)
  • @ai-sdk/openai: OpenAI ์ž„๋ฒ ๋”ฉ (์„ ํƒ)

PostgreSQL ํ™•์žฅ ์„ค์น˜

ํ™˜๊ฒฝ๋ณ„ ์„ค์น˜ ๋ฐฉ๋ฒ•

ํ™•์žฅ ํ™œ์„ฑํ™”

PostgreSQL์— ์ ‘์†ํ•˜์—ฌ ํ™•์žฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค:

Sonamu ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๊ธฐ

1. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •

2. Sonamu Config ํ™•์ธ

Sonamu๋Š” ์ด๋ฏธ PostgreSQL์„ ์“ฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์„ค์ • ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

3. Knex Migration์œผ๋กœ ํ…Œ์ด๋ธ” ์ƒ์„ฑ

Sonamu์˜ Migration์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒกํ„ฐ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค:
์‹คํ–‰:

4. ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฒกํ„ฐ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ

์ƒˆ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ ๋‹ค๋ฉด:

๋ฒกํ„ฐ ์ฐจ์› ์ดํ•ดํ•˜๊ธฐ

์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ๋งˆ๋‹ค ๋ฒกํ„ฐ ์ฐจ์›์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค:
ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹œ ์ฐจ์› ์ˆ˜๋ฅผ ๋งž์ถฐ์•ผ ํ•ฉ๋‹ˆ๋‹ค:

์ธ๋ฑ์Šค - ๋‚˜์ค‘์— ๋งŒ๋“ค๊ธฐ

์ค‘์š”: ์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์Œ“์ธ ํ›„์— ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์™œ ๋‚˜์ค‘์—?

๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ์ตœ์ ํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

HNSW ์ธ๋ฑ์Šค (๊ถŒ์žฅ)

๋ฐ์ดํ„ฐ๊ฐ€ 100๊ฐœ ์ด์ƒ ์Œ“์ธ ํ›„:
ํŒŒ๋ผ๋ฏธํ„ฐ:
  • m = 16: ์—ฐ๊ฒฐ ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’, ๋Œ€๋ถ€๋ถ„ OK)
  • ef_construction = 64: ๊ตฌ์ถ• ์‹œ ํƒ์ƒ‰ ํฌ๊ธฐ

IVFFlat ์ธ๋ฑ์Šค (๋น ๋ฅธ ๊ตฌ์ถ•)

HNSW๊ฐ€ ๋„ˆ๋ฌด ๋А๋ฆฌ๋ฉด:

์‹ค์ „ ์‹œ๋‚˜๋ฆฌ์˜ค

์‹œ๋‚˜๋ฆฌ์˜ค: ์ง€์‹ ๋ฒ ์ด์Šค ๊ตฌ์ถ•

Sonamu๋กœ ์‚ฌ๋‚ด ์ง€์‹ ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 1๋‹จ๊ณ„: ํ…Œ์ด๋ธ” ์„ค๊ณ„
2๋‹จ๊ณ„: ๋ฐ์ดํ„ฐ ์ž…๋ ฅ (๋‚˜์ค‘์—)
3๋‹จ๊ณ„: ์ธ๋ฑ์Šค ์ƒ์„ฑ (๋ฐ์ดํ„ฐ 100๊ฐœ ์ด์ƒ ์Œ“์ธ ํ›„)
4๋‹จ๊ณ„: ๊ฒ€์ƒ‰ API (๋‚˜์ค‘์—)

์ฃผ์˜์‚ฌํ•ญ

pgvector ์„ค์ • ์‹œ ์ฃผ์˜์‚ฌํ•ญ:
  1. ์ฐจ์› ์ˆ˜ ์ผ์น˜: ํ…Œ์ด๋ธ”๊ณผ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ์˜ ์ฐจ์›์ด ๊ฐ™์•„์•ผ ํ•จ
  2. ์ธ๋ฑ์Šค๋Š” ๋‚˜์ค‘์—: ๋ฐ์ดํ„ฐ 100๊ฐœ ์ด์ƒ ํ›„ ์ƒ์„ฑ
  3. NULL ํ—ˆ์šฉ: ๋ชจ๋“  ๋ฌธ์„œ์— ์ฆ‰์‹œ ์ž„๋ฒ ๋”ฉ ๋ชป ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
  4. Migration์œผ๋กœ ๊ด€๋ฆฌ: ์ง์ ‘ SQL๋ณด๋‹ค Migration ์‚ฌ์šฉ
  5. ํ™•์žฅ ๋ฒ„์ „: 0.5.1 ์ด์ƒ ๊ถŒ์žฅ

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

pgvector ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ž„๋ฒ ๋”ฉ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ฒ€์ƒ‰์„ ๊ตฌํ˜„ํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค.

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

Sonamu์—์„œ Voyage AI๋กœ ์ž„๋ฒ ๋”ฉ ๋งŒ๋“ค๊ธฐ

๋ฒกํ„ฐ ๊ฒ€์ƒ‰

Sonamu Model์—์„œ ๊ฒ€์ƒ‰ API ๊ตฌํ˜„ํ•˜๊ธฐ