๐Ÿ“บ ์˜์ƒ ์š”์•ฝ ์•„์นด์ด๋ธŒ
โ† ๋ชฉ๋ก

Connect AI to Billions of Legal Documents โ€” Simon Eskildsen, turbopuffer & Jacob Lauritzen, Legora

AI Engineer ยท 2026-09-17 01:00 ยท 20:36

ํ•œ ์ค„ ํ•ต์‹ฌ

Legora๋Š” ์ˆ˜์‹ญ์–ต ๊ฐœ์˜ ๋ฒ•๋ฅ  ๋ฌธ์„œ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒ€์ƒ‰์„ ์œ„ํ•ด ์ธํ”„๋ผ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฐˆ์•„์—Ž์€ ๋์—, ํ”„๋กœ์ ํŠธ๋ณ„ยท์ง€์—ญ๋ณ„ยท๊ทœ์ œ๋ณ„ ๊ฒฉ๋ฆฌ์™€ ๋‚ฎ์€ ์ง€์—ฐ์‹œ๊ฐ„์„ ๋™์‹œ์— ๋งŒ์กฑํ•˜๋Š” turbopuffer ์ค‘์‹ฌ ๊ตฌ์กฐ๋กœ ์ •์ฐฉํ–ˆ๋‹ค.

์‹œ๊ฐ„๋ณ„ ์š”์•ฝ

  1. 0:00
    Legora๊ฐ€ ํ•˜๋Š” ์ผ๊ณผ ๋‘ ๊ฐ€์ง€ ๋ฒ•๋ฅ  ๊ฒ€์ƒ‰ Legora๋Š” ๊ณ„์•ฝ ๊ฒ€ํ† , ์‹ ๊ทœ ๊ณ„์•ฝ ์ž‘์„ฑ, ๋ฒ•๋ฅ  ๋ฆฌ์„œ์น˜, ํ˜‘์—…์„ ํ•œ ํ”Œ๋žซํผ์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฒ•๋ฅ ์šฉ AI ํ˜‘์—… ๋„๊ตฌ๋‹ค. ๊ฒ€์ƒ‰์€ ํ”„๋กœ์ ํŠธ ๋‹จ์œ„๋กœ ๋‹ซํžŒ ๋ฌธ์„œ ์ง‘ํ•ฉ์„ ์ฐพ๋Š” ๋ฐฉ์‹๊ณผ, ํŒ๋ก€ยท๋ฒ•๋ นยท๊ทœ์ • ์ „์ฒด๋ฅผ ๊ฐ€๋กœ์ง€๋ฅด๋Š” ๊นŠ์€ ๋ฆฌ์„œ์น˜ ๋ฐฉ์‹์˜ ๋‘ ์ถ•์œผ๋กœ ๋‚˜๋‰œ๋‹ค.
  2. 2:32
    ํ•˜๋‚˜์˜ ๊ฒ€์ƒ‰ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ง€์—ญ๋ณ„ ๋ถ„๋ฆฌ๋กœ ์ฒ˜์Œ์—๋Š” ๋ชจ๋“  ๊ฒ€์ƒ‰๊ณผ ์ธ๋ฑ์‹ฑ์„ ๋‹จ์ผ Elasticsearch ํด๋Ÿฌ์Šคํ„ฐ์™€ ๋‹จ์ผ blob ์ €์žฅ์†Œ์— ์˜ฌ๋ ธ๊ณ , ์ดํ›„ ๋ฏธ๊ตญยท์œ ๋Ÿฝยท์•„์‹œ์•„ํƒœํ‰์–‘์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ง€์—ญ ์š”๊ฑด์ด ์ƒ๊ธฐ์ž ์ง€์—ญ๋ณ„๋กœ Elasticsearch๋ฅผ ๋ณต์ œํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๋‹จ์ˆœํ•˜์ง€๋งŒ ์šด์˜ ๋ถ€๋‹ด์ด ์ปค์ง€๊ณ  ์ค‘๋ณต ๊ตฌ์„ฑ์ด ๋Š˜์–ด๋‚˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์—ˆ๋‹ค.
  3. 4:00
    ๊ธฐ์—…์ด ๋งํ•˜๋Š” ๋ฌผ๋ฆฌ์  ๊ฒฉ๋ฆฌ์˜ ์˜๋ฏธ ๋Œ€ํ˜• ์€ํ–‰๊ณผ ์ดˆ๋Œ€ํ˜• ๋กœํŽŒ์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ๋ฌผ๋ฆฌ์  ๊ฒฉ๋ฆฌ์™€ ๊ณ ๊ฐ ๊ด€๋ฆฌํ˜• ์•”ํ˜ธํ™” ํ‚ค๋ฅผ ์š”๊ตฌํ•œ๋‹ค. ์ฆ‰, ๊ฐ ๊ณ ๊ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ„๋„ DB์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•˜๊ณ , ๊ณ ๊ฐ์ด ํ‚ค๋ฅผ ํšŒ์ˆ˜ํ•˜๋ฉด ๋ณตํ˜ธํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.
  4. 4:48
    ๊ฒ€์ƒ‰์„ ์ด๋ฏธ ์“ฐ๋˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ด๋™ ๊ธฐ์กด์— OLTP์šฉ์œผ๋กœ ์“ฐ๋˜ Postgress์— ๊ฒ€์ƒ‰๊นŒ์ง€ ์–น๊ธฐ ์œ„ํ•ด PG vector์™€ disk ๊ธฐ๋ฐ˜์˜ TS vector๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ , ๋ฌธ์„œ ์ฒญํฌ ํ…Œ์ด๋ธ”์„ 4,000๊ฐœ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๊ทน๋‹จ์ ์œผ๋กœ ๋ถ„ํ• ํ•ด ํ”„๋กœ์ ํŠธ ํ‚ค๋ฅผ ๋ถ„์‚ฐํ–ˆ๋‹ค. ์šด์˜ ์‹œ์Šคํ…œ์„ ํ•˜๋‚˜๋กœ ์ค„์ธ ์žฅ์ ์€ ์žˆ์—ˆ์ง€๋งŒ, ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ๊ณผ ๋น„์šฉ ์ธก๋ฉด์˜ ํ•œ๊ณ„๊ฐ€ ๊ณง ๋“œ๋Ÿฌ๋‚ฌ๋‹ค.
  5. 5:38
    ๋œจ๊ฑฐ์šด ํ”„๋กœ์ ํŠธ์™€ ์ฐจ๊ฐ€์šด ํ”„๋กœ์ ํŠธ๊ฐ€ ์บ์‹œ๋ฅผ ํ”๋“  ๋ฌธ์ œ ์ž์ฃผ ์กฐํšŒ๋˜๋Š” ํ”„๋กœ์ ํŠธ์™€ ๊ฑฐ์˜ ์กฐํšŒ๋˜์ง€ ์•Š๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ฐ™์€ ํŒŒํ‹ฐ์…˜์— ์„ž์ด๋ฉด์„œ ํŒŒํ‹ฐ์…˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๊ณ , ์กฐํšŒ ๋•Œ๋งˆ๋‹ค Postgress ์บ์‹œ๊ฐ€ ๊ณ„์† ๋ฐ€๋ ค๋‚ฌ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ๊ฒ€์ƒ‰๊ณผ ์ ์žฌ์˜ P99๊ฐ€ 100 milliseconds ์ˆ˜์ค€์—์„œ 20 seconds๊นŒ์ง€ ์น˜์†Ÿ์•„ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํฌ๊ฒŒ ์•…ํ™”๋๋‹ค.
  6. 6:40
    ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค namespace๋ฅผ ๋‘๋ฉฐ ํ•ด๊ฒฐํ•œ ๊ฒƒ turbopuffer๋กœ ์˜ฎ๊ธด ๋’ค์—๋Š” ํ”„๋กœ์ ํŠธ๋ณ„๋กœ ํ•˜๋‚˜์˜ namespace๋ฅผ ๋‘๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊ฟจ๊ณ , ๊ทธ ๊ฒฐ๊ณผ BM25 ๊ธฐ๋ฐ˜์˜ ๊ฒ€์ƒ‰ ํ’ˆ์งˆ๊ณผ ์‘๋‹ต ์ง€์—ฐ์ด ํฌ๊ฒŒ ๊ฐœ์„ ๋๋‹ค. ํ•˜๋‚˜์˜ turbopuffer ํด๋Ÿฌ์Šคํ„ฐ๋งŒ ์šด์˜ํ•˜๋ฉด ๋˜์–ด ๊ด€๋ฆฌ๊ฐ€ ๋‹จ์ˆœํ•ด์กŒ๊ณ , ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ”„๋กœ์ ํŠธ๋Š” blob์— ๋‘” ์ฑ„๋กœ ๋‘˜ ์ˆ˜ ์žˆ์–ด ๋น„์šฉ๋„ ์ค„์—ˆ๋‹ค.
  7. 7:56
    ๊ฐ์ฒด ์ €์žฅ์†Œ๋กœ ์ง์ ‘ ์“ฐ๊ธฐ turbopuffer๋Š” ์“ฐ๊ธฐ ์‹œ ๋””์Šคํฌ ๋ณต์ œ๋‚˜ Paxos ์—†์ด ๋ฐ”๋กœ S3 ๊ฐ™์€ object storage์— ๊ธฐ๋กํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ํƒํ•œ๋‹ค. ๋Œ€์‹  ์ฝ๊ธฐ ์„ฑ๋Šฅ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด write-ahead log์™€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ธ๋ฑ์‹ฑ์„ ์‚ฌ์šฉํ•˜๊ณ , ์กฐํšŒ๋Š” memory cache, NVME SSD cache, object storage ์ˆœ์œผ๋กœ ์ตœ์†Œ ์™•๋ณต ํšŸ์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  8. 9:58
    ์•”ํ˜ธํ™”์˜ ๋‹จ์œ„๋ฅผ namespace๋กœ ๋‘๋Š” ์ด์œ  namespace๋ฅผ ๋ถ„๋ฆฌ ๋‹จ์œ„๋กœ ์‚ผ์œผ๋ฉด ํ…Œ์ด๋ธ”๋งˆ๋‹ค ๋‹ค๋ฅธ ํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•˜๊ณ , ๋ฒ„ํ‚ท๋„ ๊ณ ๊ฐ๋ณ„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด ๊ทœ์ œ ์‚ฐ์—…์˜ ๊ฒฉ๋ฆฌ ์š”๊ตฌ๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งŒ์กฑํ•œ๋‹ค. Legora๋Š” SSD cache๋ฅผ ์•”ํ˜ธํ™”ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์•„์˜ˆ disk cache๋ฅผ ๊บผ๋„ ์„ฑ๋Šฅ์ด ์ถฉ๋ถ„ํžˆ ๋‚˜์™€, ๋ฉ€ํ‹ฐํ…Œ๋„Œ์‹œ์™€ ๋ฐ์ดํ„ฐ ๋ถ„๋ฆฌ๋ฅผ ๋” ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  9. 12:07
    ๋ฒ•๋ฅ  ๋ฆฌ์„œ์น˜์™€ 100์–ต ๊ฐœ ๋ฒกํ„ฐ ๋ฒ•๋ฅ  ๋ฆฌ์„œ์น˜๋Š” ์ˆ˜์‹ญ์–ต~100์–ต ๊ฐœ ๋ฒกํ„ฐ๋ฅผ ํ–ฅํ•ด ๊ฐ€๋Š” ์ดˆ๋Œ€ํ˜• ์ฝ”ํผ์Šค๋ฅผ ๋‹ค๋ฃจ๋ฉฐ, ์งˆ์˜๊ฐ€ fan-out์œผ๋กœ ์—ฌ๋Ÿฌ ํ•˜์œ„ ์งˆ์˜๋กœ ๋Š˜์–ด๋‚˜ QPS๊ฐ€ ๊ธ‰๋“ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฒ•์€ ๊ณ„์ธต์„ฑ, ์‹œ๊ณ„์—ด์  ์œ ํšจ์„ฑ, ์˜ˆ์™ธ ๊ทœ์ •์ด ์–ฝํžŒ ๊ตฌ์กฐ๋ผ์„œ, ๊ด€ํ• ๊ถŒ๋ณ„ namespace ๋ถ„๋ฆฌ์™€ ๋А๋ฆฐ cold blob ์กฐํšŒ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์„ค๊ณ„๊ฐ€ ์ž˜ ๋งž๋Š”๋‹ค.
  10. 14:25
    ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํผ๋œจ๋ฆฌ๋Š” ๋ฐฉ์‹ ์ž์ฃผ ์กฐํšŒ๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ชฝ์—, ๋œ ์ž์ฃผ ์“ฐ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋” ์•„๋ž˜ ๊ณ„์ธต์— ๋‘๋Š” ๊ฒƒ์ด turbopuffer์˜ ํ•ต์‹ฌ ์ฒ ํ•™์ด๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋А ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต์— ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์กฐ์ ˆํ•ด round trip, ์ง€์—ฐ์‹œ๊ฐ„, ๋น„์šฉ์˜ ๊ท ํ˜•์„ ๋งž์ถ˜๋‹ค.
  11. 15:30
    ๊ฐ์ฒด ์ €์žฅ์†Œ์—์„œ ๊ทธ๋ž˜ํ”„๋ณด๋‹ค ํŠธ๋ฆฌ๊ฐ€ ์œ ๋ฆฌํ•œ ์ด์œ  ๋ฒกํ„ฐ ๊ฒ€์ƒ‰์„ graph๋กœ ๊ตฌํ˜„ํ•˜๋ฉด object storage๋‚˜ ๋””์Šคํฌ์ฒ˜๋Ÿผ ๋†’์€ ์ง€์—ฐ์˜ ์ €์žฅ์†Œ์—์„œ ๋…ธ๋“œ ํƒ์ƒ‰๋งˆ๋‹ค ๋น„์šฉ์ด ์ปค์ง„๋‹ค. turbopuffer๋Š” ๋ฒกํ„ฐ๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ฌถ์–ด tree ๊ตฌ์กฐ๋กœ ์กฐ์งํ•จ์œผ๋กœ์จ, ์ƒ์œ„ centroid๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ฐ€๊นŒ์ด์— ๋‘๊ณ  ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” SSD์— ๋‘๋Š” ๋” ์‹ผ ๋ฐฉ์‹์œผ๋กœ ๊ฒ€์ƒ‰ํ•œ๋‹ค.
  12. 17:45
    ํ’€ํ…์ŠคํŠธ ๊ฒ€์ƒ‰์ด ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹ ํ’€ํ…์ŠคํŠธ ๊ฒ€์ƒ‰์€ ๊ฐ ํ† ํฐ์„ ํ•ด์‹œ๋งต ํ‚ค๋กœ ๋‘๊ณ , ๊ทธ ๊ฐ’์— ๋ฌธ์„œ ID ์ง‘ํ•ฉ์„ ์ €์žฅํ•œ ๋’ค ๊ต์ง‘ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ๊ฒ€์ƒ‰ ๋น„์šฉ์˜ ํ•ต์‹ฌ์€ round trip๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ์„ ์ค„์ด๋Š” ๊ฒƒ์ด๋ฉฐ, ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ํ’€ํ…์ŠคํŠธ ๊ฒ€์ƒ‰์€ ๋ฒกํ„ฐ ๊ฒ€์ƒ‰๋ณด๋‹ค ๋” ๋ณต์žกํ•˜๊ณ  ๋น„์‹ธ์งˆ ์ˆ˜ ์žˆ๋‹ค.

์‹ค๋ฌด ์ธ์‚ฌ์ดํŠธ

  • ๋ฒ•๋ฅ ยท๊ธˆ์œต์ฒ˜๋Ÿผ ๊ทœ์ œ๊ฐ€ ๊ฐ•ํ•œ ๋„๋ฉ”์ธ์—์„œ๋Š” ๊ฒ€์ƒ‰ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ฑ๋Šฅ๋ณด๋‹ค ๋จผ์ € ๋ฐ์ดํ„ฐ ๊ฒฉ๋ฆฌ ๋‹จ์œ„๋กœ ์„ค๊ณ„ํ•ด์•ผ ์šด์˜์ด ์˜ค๋ž˜ ๊ฐ„๋‹ค.
  • ํ”„๋กœ์ ํŠธยท๊ด€ํ• ๊ถŒยทํ…Œ๋„ŒํŠธ ๊ฐ™์€ ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฒฝ๊ณ„๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ namespace ๋‹จ์œ„๋กœ ๊ทธ๋Œ€๋กœ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ์ด ์บ์‹œ thrash์™€ ๊ถŒํ•œ ๋ณต์žก๋„๋ฅผ ์ค„์ด๋Š” ๊ฐ€์žฅ ์‹ค์šฉ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ์˜ ๋ณ‘๋ชฉ์€ ๋‹จ์ˆœ ์ธ๋ฑ์‹ฑ๋ณด๋‹ค๋„ ์ €์žฅ ๊ณ„์ธต๋ณ„ round trip๊ณผ ์บ์‹œ ๋ฐฐ์น˜์— ์žˆ์œผ๋ฏ€๋กœ, ์ฝ๊ธฐ ํŒจํ„ด์ด ์„ž์ด๋Š” ๊ตฌ์กฐ๋ฅผ ๋จผ์ € ์˜์‹ฌํ•ด์•ผ ํ•œ๋‹ค.