Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

123 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Publium

PubMed ๋…ผ๋ฌธ์„ ์ฐพ๊ณ , ๋ชจ์œผ๊ณ , ์ฝ๊ณ , ๊ทผ๊ฑฐ๋ฅผ ํ™•์ธํ•˜๋ฉฐ AI์™€ ๋Œ€ํ™”ํ•˜๋Š” ์—ฐ๊ตฌ ์›Œํฌ์ŠคํŽ˜์ด์Šค

์„œ๋น„์Šค ๋ฐ”๋กœ๊ฐ€๊ธฐ ยท ๋ฐฐํฌ ๊ฐ€์ด๋“œ ยท ๋ฆฌ๋‰ด์–ผ ์•„ํ‚คํ…์ฒ˜

Publium์€ ์—ฌ๋Ÿฌ ์‚ฌ์ดํŠธ์™€ PDF๋ฅผ ์˜ค๊ฐ€๋ฉฐ ๋…ผ๋ฌธ์„ ์ •๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. PubMed ๋…ผ๋ฌธ ๊ฒ€์ƒ‰๋ถ€ํ„ฐ ์ดˆ๋กยท๊ณต๊ฐœ ์ „๋ฌธ ์ˆ˜์ง‘, ๋…ผ๋ฌธ๋ณ„ ์ฑ„ํŒ…๋ฐฉ, ์—ฌ๋Ÿฌ ๋…ผ๋ฌธ ์ข…ํ•ฉ ๋ถ„์„, ๊ด€๊ณ„ ์ค‘์‹ฌ์˜ Graph RAG ํƒ์ƒ‰๊นŒ์ง€ ํ•œ ํ™”๋ฉด์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

AI๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ผ๋ฐ˜ ์ง€์‹์—๋งŒ ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ ํƒํ•œ ๋…ผ๋ฌธ์˜ ์ดˆ๋ก์ด๋‚˜ ์ „๋ฌธ์—์„œ ๊ด€๋ จ ๊ทผ๊ฑฐ๋ฅผ ์ฐพ์•„ ๋‹ต๋ณ€ํ•˜๋Š” ๋…ผ๋ฌธ ๊ธฐ๋ฐ˜ RAG ์ฑ—๋ด‡์ž…๋‹ˆ๋‹ค.

Publium ๊ฐœ์š” ํ™”๋ฉด

ํ”„๋กœ์ ํŠธ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ

๊ตฌ๋ถ„ ๋‚ด์šฉ
ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ ๋…ผ๋ฌธ ๊ฒ€์ƒ‰, ์›๋ฌธ ํ™•์ธ, ๋ฉ”๋ชจ์™€ AI ๋Œ€ํ™”๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋„๊ตฌ์— ํฉ์–ด์ง€๋Š” ๋ฌธ์ œ
ํ•ต์‹ฌ ํ๋ฆ„ PubMed ๊ฒ€์ƒ‰ โ†’ ์ดˆ๋กยท์ „๋ฌธ ์ €์žฅ โ†’ ๋…ผ๋ฌธ ์„ ํƒ โ†’ ๊ทผ๊ฑฐ ๊ฒ€์ƒ‰ โ†’ AI ๋Œ€ํ™”
์ฐจ๋ณ„์  ๋‹ต๋ณ€๊ณผ ์›๋ฌธ์„ ํ•จ๊ป˜ ๋ณด๊ณ , ์‹ค์ œ ๊ทผ๊ฑฐ ๋ฌธ์žฅ์„ ํ™•์ธํ•˜๋ฉฐ, ๋…ผ๋ฌธ ๊ด€๊ณ„๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ํƒ์ƒ‰
๊ตฌํ˜„ ๋ฒ”์œ„ ๊ธฐํš, UI, React ํ”„๋ก ํŠธ์—”๋“œ, Express API, DBยทRLS, RAG, Vercel ๋ฐฐํฌ
์šด์˜ ์ฃผ์†Œ https://team-pubmed.vercel.app/
๋ฐฐํฌ ๋ฐฉ์‹ deploy_vercel ๋ธŒ๋žœ์น˜์— ๋ฐ˜์˜๋  ๋•Œ๋งŒ Vercel Production ๋ฐฐํฌ

ํ•ต์‹ฌ ๊ตฌํ˜„ ํฌ์ธํŠธ

  • ๊ฒ€์ƒ‰ํ•œ ๋…ผ๋ฌธ์˜ ์ดˆ๋ก์„ ์ฆ‰์‹œ ์ €์žฅํ•ด ๊ฐ™์€ ์ž๋ฃŒ๋ฅผ ๋งค ์งˆ๋ฌธ๋งˆ๋‹ค ๋‹ค์‹œ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ณต๊ฐœ ์ „๋ฌธ๊ณผ ์‚ฌ์šฉ์ž PDF๋ฅผ ์ฒญํ‚นยท์ž„๋ฒ ๋”ฉํ•˜๊ณ  pgvector์—์„œ ๊ด€๋ จ ๋ฌธ๋‹จ๋งŒ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  • Paper Reader์—์„œ ์›๋ฌธ๊ณผ ์ฑ„ํŒ…์„ ๋‚˜๋ž€ํžˆ ์—ด๊ณ  ๋‹ต๋ณ€์˜ ๊ทผ๊ฑฐ ๋ฒ”์œ„๋ฅผ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ๋…ผ๋ฌธ์„ ํ•œ ์ฑ„ํŒ…๋ฐฉ์— ์—ฐ๊ฒฐํ•ด ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์„ ํ•จ๊ป˜ ์งˆ๋ฌธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Research Galaxy๋Š” ๋…ผ๋ฌธยท์ฃผ์ œยทํ•ต์‹ฌ ๊ฐœ๋…ยท๋‚ด์šฉ ์œ ์‚ฌ๋„๋ฅผ 2Dยท3D ๊ทธ๋ž˜ํ”„๋กœ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ปฌ๋ ‰์…˜ยท์ฑ„ํŒ…ยท์—…๋กœ๋“œ PDF๋Š” user_id, RLS, ์„œ๋ฒ„ ๊ฒ€์ฆ์œผ๋กœ ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์‚ฌ๋žŒ์—๊ฒŒ ํ•„์š”ํ•œ๊ฐ€์š”?

  • ๊ด€์‹ฌ ์ฃผ์ œ์˜ ์ตœ์‹  PubMed ๋…ผ๋ฌธ์„ ๋น ๋ฅด๊ฒŒ ๋ชจ์œผ๊ณ  ์‹ถ์€ ์—ฐ๊ตฌ์ž
  • ์—ฌ๋Ÿฌ ๋…ผ๋ฌธ์˜ ์—ฐ๊ตฌ ๋ชฉ์ ยท๋ฐฉ๋ฒ•ยท๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•˜๊ณ  ์‹ถ์€ ํ•™์ƒ
  • ๊ธด ๋…ผ๋ฌธ์—์„œ ์งˆ๋ฌธ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ๋‹จ์„ ๋ฐ”๋กœ ์ฐพ๊ณ  ์‹ถ์€ ์‚ฌ์šฉ์ž
  • ๋‹ต๋ณ€๋งŒ ๋ณด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ ๊ทผ๊ฑฐ ๋ฌธ์žฅ๊นŒ์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์€ ์‚ฌ์šฉ์ž

Publium์€ ๋…ผ๋ฌธ ํƒ์ƒ‰๊ณผ ์—ฐ๊ตฌ ๋ณด์กฐ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธ์˜ ์ฆ์ƒ์„ ์ง„๋‹จํ•˜๊ฑฐ๋‚˜ ์•ฝ๋ฌผยท๋ณต์šฉ๋ฒ•์„ ์•ˆ๋‚ดํ•˜๋Š” ์˜๋ฃŒ ์กฐ์–ธ ์„œ๋น„์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

๊ธฐ๋Šฅ ์„ค๋ช…
PubMed ๊ฒ€์ƒ‰ยท์ˆ˜์ง‘ ํ‚ค์›Œ๋“œ, ์‹œ์ž‘ยท์ข…๋ฃŒ ์—ฐ๋„, ์ตœ๋Œ€ ๊ฑด์ˆ˜๋ฅผ ์ง€์ •ํ•ด ๋…ผ๋ฌธ์„ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.
์ดˆ๋ก ์ž๋™ ์ €์žฅ ๊ฒ€์ƒ‰ํ•œ ๋…ผ๋ฌธ์˜ ์ œ๋ชฉ, ์ €์ž, ์ €๋„, ์ดˆ๋ก, DOI, PMCID๋ฅผ DB์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
์ˆ˜์ง‘ ํ˜„ํ™ฉ ๋ถ„์„ ์—ฐ๋„๋ณ„ ๋…ผ๋ฌธ ์ˆ˜์™€ ๋งŽ์ด ๋“ฑ์žฅํ•œ ์ €๋„์„ ๊ทธ๋ž˜ํ”„๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
๋…ผ๋ฌธ ๋ชฉ๋ก ๊ด€๋ฆฌ ์ œ๋ชฉยท์ดˆ๋กยท๊ฒ€์ƒ‰์–ดยท์—ฐ๋„ยท์ €๋„๋กœ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ „๋ฌธ ์—ฌ๋ถ€์™€ ์ •๋ ฌ ๊ธฐ์ค€์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
๊ณต๊ฐœ ์ „๋ฌธ ํƒ์ƒ‰ PMC OA, PMC Open Data, BioC, Unpaywall, Crossref์—์„œ ์›๋ฌธ ํ›„๋ณด๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
PDF ์—…๋กœ๋“œ ์ž๋™์œผ๋กœ ๊ตฌํ•˜์ง€ ๋ชปํ•œ ๋…ผ๋ฌธ์€ ์‚ฌ์šฉ์ž๊ฐ€ PDF๋ฅผ ์˜ฌ๋ ค ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ ๋…ผ๋ฌธ ๋ถ„์„ ์ตœ๋Œ€ 5ํŽธ์„ ํ•œ ์ฑ„ํŒ…๋ฐฉ์— ๋„ฃ๊ณ  ๊ณตํ†ต์ ยท์ฐจ์ด์ ยท์ข…ํ•ฉ ๊ฒฐ๋ก ์„ ์งˆ๋ฌธํ•ฉ๋‹ˆ๋‹ค.
Paper Reader ๋…ผ๋ฌธ ์›๋ฌธ๊ณผ ์ฑ„ํŒ…์„ 50:50์œผ๋กœ ์—ด์–ด ํ•จ๊ป˜ ์ฝ์Šต๋‹ˆ๋‹ค.
๊ทผ๊ฑฐ ํ•˜์ด๋ผ์ดํŠธ ๋‹ต๋ณ€์— ์‚ฌ์šฉ๋œ ์ถœ์ฒ˜ ๋ฌธ์žฅ์„ ํ‘œ์‹œํ•˜๊ณ  ์›๋ฌธ ์œ„์น˜๋ฅผ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค.
Research Galaxy ์‹ค์ œ PubMed ๋…ผ๋ฌธ 148ํŽธ์˜ ์ฃผ์ œยทํ•ต์‹ฌ ๊ฐœ๋…ยท์œ ์‚ฌ ์—ฐ๊ตฌ ๊ด€๊ณ„์™€ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ๋ฅผ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
์ŠคํŠธ๋ฆฌ๋ฐ ๋‹ต๋ณ€ AI ๋‹ต๋ณ€์„ ์™„์„ฑ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž๋ณ„ ๊ณต๊ฐ„ Google ๋กœ๊ทธ์ธ, Supabase RLS๋กœ ๋…ผ๋ฌธ ๋ชฉ๋ก๊ณผ ์ฑ„ํŒ…์„ ์‚ฌ์šฉ์ž๋ณ„๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

1. ๊ด€์‹ฌ ๋…ผ๋ฌธ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค

์™ผ์ชฝ ๊ฒ€์ƒ‰ ์˜์—ญ์—์„œ ํ‚ค์›Œ๋“œ์™€ ์—ฐ๋„ ๋ฒ”์œ„๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. PubMed ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ์ดˆ๋ก์€ ๊ฒ€์ƒ‰ ์‹œ์ ์— ์ €์žฅ๋˜๋ฏ€๋กœ, ์ดํ›„ ์งˆ๋ฌธํ•  ๋•Œ PubMed์—์„œ ๊ฐ™์€ ์ดˆ๋ก์„ ๋งค๋ฒˆ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐœ์š” ํ™”๋ฉด์—์„œ๋Š” ๋‹ค์Œ ์ •๋ณด๋ฅผ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ˜„์žฌ ์ €์žฅ๋œ ์ „์ฒด ๋…ผ๋ฌธ ์ˆ˜
  • ์ด๋ฒˆ ๊ฒ€์ƒ‰์—์„œ ์ƒˆ๋กœ ๋“ค์–ด์˜จ ๋…ผ๋ฌธ๊ณผ ์ค‘๋ณต์œผ๋กœ ๊ฑด๋„ˆ๋›ด ๋…ผ๋ฌธ ์ˆ˜
  • ๊ฒ€์ƒ‰ ๊ธฐ๊ฐ„ ์ „์ฒด์˜ ์—ฐ๋„๋ณ„ ๋…ผ๋ฌธ ๋ถ„ํฌ
  • ์ˆ˜์ง‘ ๋…ผ๋ฌธ์—์„œ ๋งŽ์ด ๋“ฑ์žฅํ•œ ์ €๋„

2. ๋…ผ๋ฌธ ๋ชฉ๋ก์—์„œ ๋ถ„์„ ๋Œ€์ƒ์„ ๊ณ ๋ฆ…๋‹ˆ๋‹ค

๋…ผ๋ฌธ ์นด๋“œ์—์„œ ์ดˆ๋ก, ์ €์ž, ์ €๋„, ์ถœํŒ ์—ฐ๋„, PMID๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PubMedยท์ถœํŒ์‚ฌ ์›๋ฌธ์œผ๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜ PDF๋ฅผ ์ง์ ‘ ์—…๋กœ๋“œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Publium ๋…ผ๋ฌธ ๋ชฉ๋ก

๋ชฉ๋ก์—์„œ๋Š” ๋‹ค์Œ ์กฐ๊ฑด์„ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ œ๋ชฉยท์ดˆ๋กยท์ˆ˜์ง‘ ๊ฒ€์ƒ‰์–ด
  • ์‹œ์ž‘ยท์ข…๋ฃŒ ์—ฐ๋„
  • ์ €๋„๋ช…
  • ์ „์ฒด ๋…ผ๋ฌธ / ์ „๋ฌธ ๋ถ„์„ ๊ฐ€๋Šฅ / ์ดˆ๋ก ๊ธฐ๋ฐ˜
  • ์ตœ์‹ ์ˆœ / ์˜ค๋ž˜๋œ์ˆœ / ์ตœ๊ทผ ์ˆ˜์ง‘์ˆœ / ์ œ๋ชฉ์ˆœ

๋ถ„์„ํ•  ๋…ผ๋ฌธ์€ ์ตœ๋Œ€ 5ํŽธ๊นŒ์ง€ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒํ•œ ๋…ผ๋ฌธ์„ ์ฑ—๋ด‡์œผ๋กœ ๋ณด๋‚ด๋ฉด ํ•ด๋‹น ๋…ผ๋ฌธ ์กฐํ•ฉ์„ ์œ„ํ•œ ๋ณ„๋„์˜ ์ฑ„ํŒ…๋ฐฉ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

3. ์„ ํƒํ•œ ๋…ผ๋ฌธ์— ๋Œ€ํ•ด ์งˆ๋ฌธํ•ฉ๋‹ˆ๋‹ค

์ฑ—๋ด‡์€ ์ฑ„ํŒ…๋ฐฉ์— ์—ฐ๊ฒฐ๋œ ๋…ผ๋ฌธ๋งŒ ๊ทผ๊ฑฐ๋กœ ๋‹ต๋ณ€ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋…ผ๋ฌธ์„ ์„ ํƒํ–ˆ๋‹ค๋ฉด ๊ฐ ๋…ผ๋ฌธ์˜ ๊ฐœ์š”์™€ ๊ด€๋ จ ๋ฌธ๋‹จ์„ ํ•จ๊ป˜ ๊ฒ€์ƒ‰ํ•ด ์ข…ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์งˆ๋ฌธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด ๋…ผ๋ฌธ์˜ ์—ฐ๊ตฌ ๋ชฉ์ ๊ณผ ๊ฒฐ๋ก ์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด์ค˜.
  • ์—ฐ๊ตฌ ๋Œ€์ƒ๊ณผ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ด์ค˜.
  • ์„ ํƒํ•œ ์„ธ ๋…ผ๋ฌธ์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์„ ๋น„๊ตํ•ด์ค˜.
  • ๊ฒฐ๊ณผ๋ฅผ ๋’ท๋ฐ›์นจํ•˜๋Š” ์‹ค์ œ ๊ทผ๊ฑฐ ๋ฌธ์žฅ์„ ๋ณด์—ฌ์ค˜.
  • ์—ฐ๊ตฌ์˜ ํ•œ๊ณ„์™€ ํ›„์† ์—ฐ๊ตฌ ์•„์ด๋””์–ด๋ฅผ ์ •๋ฆฌํ•ด์ค˜.

Publium ๋…ผ๋ฌธ ๊ธฐ๋ฐ˜ AI ์ฑ„ํŒ…

๋…ผ๋ฌธ ์—†์ด ์ผ๋ฐ˜ ์ฑ„ํŒ…๋ฐฉ์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋…ผ๋ฌธ ๊ทผ๊ฑฐ๊ฐ€ ํ•„์š”ํ•œ ์งˆ๋ฌธ์€ ๋ฐ˜๋“œ์‹œ ๋…ผ๋ฌธ์„ ์—ฐ๊ฒฐํ•œ ์ฑ„ํŒ…๋ฐฉ์—์„œ ์ง„ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4. ์›๋ฌธ๊ณผ ๋‹ต๋ณ€์„ ํ•จ๊ป˜ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค

์›๋ฌธ ๋ณด๊ธฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด Paper Reader๊ฐ€ ์™ผ์ชฝ, ์ฑ„ํŒ…์ด ์˜ค๋ฅธ์ชฝ์— ์—ด๋ฆฝ๋‹ˆ๋‹ค. PDF์™€ ์ถ”์ถœ ๋ณธ๋ฌธ์„ ์ „ํ™˜ํ•˜๋ฉด์„œ ๋‹ต๋ณ€์— ์‚ฌ์šฉ๋œ ๊ทผ๊ฑฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Publium Paper Reader์™€ AI ์ฑ„ํŒ…

์™ธ๋ถ€ ์›๋ฌธ์€ PMCยทDOIยท์ถœํŒ์‚ฌ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ ์ฐฝ์œผ๋กœ ์—ฝ๋‹ˆ๋‹ค. ์™ธ๋ถ€ ํŽ˜์ด์ง€๋Š” ์„œ๋น„์Šค๊ฐ€ ์ œ์–ดํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ Publium์˜ ๊ทผ๊ฑฐ ํ•˜์ด๋ผ์ดํŠธ๋Š” Paper Reader์— ์ €์žฅ๋œ ๋ณธ๋ฌธ์—์„œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

5. Research Galaxy์—์„œ ์—ฐ๊ตฌ ๊ด€๊ณ„๋ฅผ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค

์ง€์‹ ๊ทธ๋ž˜ํ”„ ๋ฉ”๋‰ด๋Š” ๋…๋ฆฝ๋œ ์ „์ฒด ํ™”๋ฉด์—์„œ ์‹ค์ œ PubMed ๋…ผ๋ฌธ 148ํŽธ์˜ ๊ด€๊ณ„๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์•” ์ •๋ฐ€์˜๋ฃŒ, ์‹ฌํ˜ˆ๊ด€ ๊ฑด๊ฐ•, ๋‡Œยท์‹ ๊ฒฝ๊ณผํ•™, ๋Œ€์‚ฌยท๋‹น๋‡จ, ์ •์‹ ๊ฑด๊ฐ•, ๊ณต์ค‘๋ณด๊ฑด์˜ ์—ฌ์„ฏ ๋ถ„์•ผ๋กœ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

Publium Research Galaxy Graph RAG

๊ทธ๋ž˜ํ”„์—๋Š” ๋ฌด์—‡์ด ํ‘œ์‹œ๋˜๋‚˜์š”?

๊ตฌ์„ฑ ์š”์†Œ ์˜๋ฏธ
์—ฐ๊ตฌ ์ฃผ์ œ ๋…ธ๋“œ ์•” ์ •๋ฐ€์˜๋ฃŒ, ์‹ฌํ˜ˆ๊ด€ ๊ฑด๊ฐ• ๋“ฑ 6๊ฐœ ์—ฐ๊ตฌ ๋ถ„์•ผ์˜ ์ค‘์‹ฌ์ 
๋…ผ๋ฌธ ๋…ธ๋“œ ์‹ค์ œ PubMed ๋…ผ๋ฌธ 148ํŽธ. ํ™”๋ฉด์—๋Š” P001 ๊ฐ™์€ ์‹๋ณ„์ž๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œ์‹œ
ํ•ต์‹ฌ ๊ฐœ๋… ๋…ธ๋“œ ์งˆํ™˜, ์น˜๋ฃŒ๋ฒ•, ๋ฐ”์ด์˜ค๋งˆ์ปค, ์—ฐ๊ตฌ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๋…ผ๋ฌธ์—์„œ ๋ฐ˜๋ณต๋˜๋Š” ๊ฐœ๋…
์ฃผ์ œ ์—ฐ๊ฒฐ ๋…ผ๋ฌธ์ด ์–ด๋–ค ์—ฐ๊ตฌ ๋ถ„์•ผ์— ์†ํ•˜๋Š”์ง€ ํ‘œ์‹œ
๊ฐœ๋… ์—ฐ๊ฒฐ ์ œ๋ชฉ๊ณผ ์ดˆ๋ก์—์„œ ๋ฐœ๊ฒฌํ•œ ํ•ต์‹ฌ ๊ฐœ๋…์ด ์–ด๋–ค ๋…ผ๋ฌธ๊ณผ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ํ‘œ์‹œ
์œ ์‚ฌ ๋…ผ๋ฌธ ์—ฐ๊ฒฐ ๊ฐ™์€ ๋ถ„์•ผ์—์„œ ์ œ๋ชฉยท์ดˆ๋ก์˜ ์ฃผ์š” ์šฉ์–ด๊ฐ€ ๊ฐ€๊นŒ์šด ๋…ผ๋ฌธ์„ ์—ฐ๊ฒฐ

์งˆ๋ฌธ์ด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ๋˜๋Š” ๊ณผ์ •

  1. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์šด๋ฐ ๊ฒ€์ƒ‰์ฐฝ์— ์ž์—ฐ์–ด ์—ฐ๊ตฌ ์งˆ๋ฌธ์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  2. ์งˆ๋ฌธ์˜ ์ฃผ์š” ์šฉ์–ด๋ฅผ ๋…ผ๋ฌธ ์ œ๋ชฉยท์ดˆ๋กยทํ•œ๊ตญ์–ด ์š”์•ฝ๊ณผ ๋น„๊ตํ•ด ๊ด€๋ จ ๋…ผ๋ฌธ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
  3. ๊ฒ€์ƒ‰๋œ ๋…ผ๋ฌธ๋ฟ ์•„๋‹ˆ๋ผ ์—ฐ๊ฒฐ๋œ ์—ฐ๊ตฌ ์ฃผ์ œ์™€ ํ•ต์‹ฌ ๊ฐœ๋…, ์œ ์‚ฌ ๋…ผ๋ฌธ ์ด์›ƒ๊นŒ์ง€ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ด€๋ จ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ์„ ์„ ๊ฐ•์กฐํ•˜๊ณ  ์™ผ์ชฝ ํŒจ๋„์— ๊ด€๋ จ ๋…ผ๋ฌธ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  5. ๋…ผ๋ฌธ์„ ์„ ํƒํ•˜๋ฉด ์˜ค๋ฅธ์ชฝ ํŒจ๋„์—์„œ ์›๋ฌธ ์ œ๋ชฉ, ์ €์ž, ์ €๋„, PMID, ์ดˆ๋ก ๊ธฐ๋ฐ˜ ์š”์•ฝ๊ณผ ์—ฐ๊ฒฐ ์ด์œ ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  6. ๋‘ ๋…ผ๋ฌธ์„ ์ง€์ •ํ•˜๋ฉด ์ค‘๊ฐ„์˜ ์ฃผ์ œยท๊ฐœ๋… ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•œ ์ตœ๋‹จ ์—ฐ๊ฒฐ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

์ง€์‹ ๊ทธ๋ž˜ํ”„ ํƒญ์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ

  • ๋…ผ๋ฌธ, ์—ฐ๊ตฌ ์ฃผ์ œ, ์งˆํ™˜ยท์น˜๋ฃŒยท์—ฐ๊ตฌ ๋ฐฉ๋ฒ•ยท๋ฐ”์ด์˜ค๋งˆ์ปค ๊ฐœ๋…์„ ์„œ๋กœ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ํ‘œ์‹œ
  • ํ—ค๋”์˜ 2D / 3D ๋ฒ„ํŠผ์œผ๋กœ ํ‰๋ฉด ํƒ์ƒ‰๊ณผ ํšŒ์ „ ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„ ๊ทธ๋ž˜ํ”„๋ฅผ ์ „ํ™˜
  • ์™ผ์ชฝ ๋…ผ๋ฌธ ๋…ธ๋“œ ์ฐพ๊ธฐ์—์„œ ๊ทธ๋ž˜ํ”„ ์‹๋ณ„์ž, PMID, ์›๋ฌธ ์ œ๋ชฉ, ์ €์ž, ์ €๋„๋กœ ํŠน์ • ๋…ผ๋ฌธ์„ ๋ฐ”๋กœ ์„ ํƒ
  • ๊ฐ™์€ ๋ถ„์•ผ์—์„œ ์ œ๋ชฉยท์ดˆ๋ก ์šฉ์–ด๊ฐ€ ์œ ์‚ฌํ•œ ๋…ผ๋ฌธ ์—ฐ๊ฒฐ
  • ์ „์ฒดยท๋…ผ๋ฌธ ์ค‘์‹ฌยท์ „๋ฌธ ๊ฐ€๋Šฅยท๊ทผ๊ฑฐ ๊ฒฝ๋กœ ๋ Œ์ฆˆ
  • ์€ํ•˜ํ˜•ยทํด๋Ÿฌ์Šคํ„ฐํ˜• ๋ฐฐ์น˜ ์ „ํ™˜
  • ๋ฌผ๋ฆฌ ๊ธฐ๋ฐ˜ ๋…ธ๋“œ ์›€์ง์ž„๊ณผ ์ฃผ๋ณ€ ๊ด€๊ณ„๊ฐ€ ํ•จ๊ป˜ ๋ฐ˜์‘ํ•˜๋Š” ๋“œ๋ž˜๊ทธ
  • ํ™•๋Œ€ยท์ถ•์†Œยท์ด๋™, ์›€์ง์ž„ ์ผ์‹œ์ •์ง€์™€ 1ยท2๋‹จ๊ณ„ ๊ด€๊ณ„ ๊ฐ•์กฐ
  • ๋‘ ๋…ผ๋ฌธ ์‚ฌ์ด์˜ ์ตœ๋‹จ ์—ฐ๊ฒฐ ๊ฒฝ๋กœ ํƒ์ƒ‰
  • ์ž์—ฐ์–ด ์งˆ๋ฌธ์˜ ๊ด€๋ จ ๋…ผ๋ฌธ์„ ์ฐพ๊ณ  ์ฃผ์ œยทํ•ต์‹ฌ ๊ฐœ๋…ยท์œ ์‚ฌ ์—ฐ๊ตฌ ์ด์›ƒ๊นŒ์ง€ ํ™•์žฅ
  • ๊ทธ๋ž˜ํ”„์˜ ๋…ผ๋ฌธ ๋…ธ๋“œ๋Š” P001 ๊ฐ™์€ ์งง์€ ์‹๋ณ„์ž๋กœ ํ‘œ์‹œํ•˜๊ณ , ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ์›๋ฌธ ์ œ๋ชฉยท์—ฐ๋„ยท์—ฐ๊ตฌ ๋ถ„์•ผยท๊ฐ€์žฅ ๊ฐ•ํ•œ ์—ฐ๊ฒฐ ๊ทผ๊ฑฐ ์ œ๊ณต
  • ์ขŒ์šฐ ํŒจ๋„์—์„œ๋Š” ๋…ผ๋ฌธ ์ œ๋ชฉ์„ ์›๋ฌธ ๊ทธ๋Œ€๋กœ ๋ชจ๋‘ ํ‘œ์‹œ
  • ์„ ํƒ ๋…ผ๋ฌธ์˜ ํ•œ์ค„ ์š”์•ฝ, ์—ฐ๊ตฌ ๋ชฉ์ ยท๋ฐฉ๋ฒ•ยท๊ฒฐ๊ณผ๋Š” ์ดˆ๋ก์„ ๊ทผ๊ฑฐ๋กœ ํ•œ๊ตญ์–ด๋กœ ์ œ๊ณตํ•˜๊ณ  ๊ด€๋ จ ๋…ผ๋ฌธ๋ณ„ ์—ฐ๊ฒฐ ์ด์œ ๋„ ํ•จ๊ป˜ ํ‘œ์‹œ

์ด๊ฒƒ๋„ RAG์ธ๊ฐ€์š”?

ํ˜„์žฌ ๊ตฌํ˜„์€ Graph Retrieval + Visualization ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์งˆ๋ฌธ๊ณผ ๊ด€๋ จ๋œ ๋…ผ๋ฌธ์„ ๊ฒ€์ƒ‰ํ•œ ๋’ค ๊ทธ๋ž˜ํ”„ ์ด์›ƒ์„ ํ™•์žฅํ•ด ๊ทผ๊ฑฐ๊ฐ€ ์–ด๋–ค ์—ฐ๊ตฌ ์ฃผ์ œ์™€ ๊ฐœ๋…์„ ํ†ตํ•ด ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋ฏ€๋กœ Graph RAG์˜ ๊ฒ€์ƒ‰ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋งŒ ์ผ๋ฐ˜์ ์ธ Graph RAG์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์ฒ˜๋Ÿผ ๊ฒ€์ƒ‰๋œ ์„œ๋ธŒ๊ทธ๋ž˜ํ”„๋ฅผ LLM์— ์ „๋‹ฌํ•ด ์ƒˆ๋กœ์šด ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. AI ์ฑ—๋ด‡ ํƒญ์€ ์šด์˜ DB์™€ pgvector๋ฅผ ์ด์šฉํ•œ ๋ฒกํ„ฐ RAG์ด๊ณ , ์ง€์‹ ๊ทธ๋ž˜ํ”„ ํƒญ์€ ๋ณ„๋„์˜ ๊ณ ์ • ์ฝ”ํผ์Šค๋กœ ๊ด€๊ณ„์™€ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ง€์‹ ๊ทธ๋ž˜ํ”„ ํƒญ
์งˆ๋ฌธ โ†’ ๊ด€๋ จ ๋…ผ๋ฌธ ๊ฒ€์ƒ‰ โ†’ ์ฃผ์ œยท๊ฐœ๋…ยท์œ ์‚ฌ ๋…ผ๋ฌธ ํ™•์žฅ โ†’ ๊ด€๊ณ„ ๊ฒฝ๋กœ ์‹œ๊ฐํ™”

AI ์ฑ—๋ด‡ ํƒญ
์งˆ๋ฌธ โ†’ ์ž„๋ฒ ๋”ฉ ์ƒ์„ฑ โ†’ pgvector ์ฒญํฌ ๊ฒ€์ƒ‰ โ†’ ๊ด€๋ จ ๋ฌธ๋‹จ์„ LLM์— ์ „๋‹ฌ โ†’ ๋‹ต๋ณ€ ์ƒ์„ฑ

์ด ๊ตฌ์กฐ๋ฅผ ๋ถ„๋ฆฌํ•œ ์ด์œ ๋Š” ํฌํŠธํด๋ฆฌ์˜ค์šฉ ๊ทธ๋ž˜ํ”„ ์ฝ”ํผ์Šค๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ธ ๋…ผ๋ฌธ, ์ฑ„ํŒ…, ์—…๋กœ๋“œ PDF์™€ ์„ž์ด์ง€ ์•Š๊ฒŒ ํ•˜๊ณ  ๊ธฐ๋Šฅ๋ณ„ ๋™์ž‘์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค. ์ดํ›„์—๋Š” ์„ ํƒํ•œ ์„œ๋ธŒ๊ทธ๋ž˜ํ”„์™€ ์—ฐ๊ฒฐ ์ด์œ ๋ฅผ ์ฑ—๋ด‡ ์ปจํ…์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์™„์ „ํ•œ Graph RAG ๋‹ต๋ณ€ ์ƒ์„ฑ ๋‹จ๊ณ„๊นŒ์ง€ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ผ๋ฌธ ์ „๋ฌธ์€ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ์˜ค๋‚˜์š”?

Publium์€ ๊ถŒ๋ฆฌ๊ฐ€ ํ™•์ธ๋˜์ง€ ์•Š์€ ์œ ๋ฃŒ ์ถœํŒ์‚ฌ ๋ณธ๋ฌธ์„ ๋ฌด๋‹จ์œผ๋กœ ํฌ๋กค๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๋ถ„์„์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ณธ๋ฌธ์„ ๋‹ค์Œ ์ˆœ์„œ๋กœ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.

๊ฒฝ๋กœ ์—ญํ•  ์ž๋™ ๋ถ„์„ ์—ฌ๋ถ€
PMC Open Data ๊ณต๊ฐœ JATS XMLยทPDFยทํ…์ŠคํŠธ ํƒ์ƒ‰ ๊ณต๊ฐœ ๋ผ์ด์„ ์Šค ํ™•์ธ ํ›„ ๋ถ„์„
NCBI EFetch PMCID๋กœ PMC XML ์š”์ฒญ ๊ณต๊ฐœ ๋ผ์ด์„ ์Šค ํ™•์ธ ํ›„ ๋ถ„์„
BioC PMC ๋ณธ๋ฌธ์„ ๊ตฌ์กฐํ™”๋œ JSON์œผ๋กœ ์š”์ฒญ PMC ๋ผ์ด์„ ์Šค ํ™•์ธ ํ›„ ๋ถ„์„
Unpaywall DOI์˜ ํ•ฉ๋ฒ•์ ์ธ ๊ณต๊ฐœ ์›๋ฌธ ์œ„์น˜ ํƒ์ƒ‰ ๋งํฌยทPDF ํ›„๋ณด ์ €์žฅ
Crossref DOIยท์ถœํŒ์‚ฌ ์›๋ฌธ ํ›„๋ณด ํƒ์ƒ‰ ๋งํฌ ํ›„๋ณด๋งŒ ์ €์žฅ
์‚ฌ์šฉ์ž PDF ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด์œ ํ•œ PDF ์—…๋กœ๋“œ ์‚ฌ์šฉ์ž ์ „์šฉ์œผ๋กœ ๋ถ„์„
PubMed ์ดˆ๋ก ์ „๋ฌธ์„ ๊ตฌํ•˜์ง€ ๋ชปํ–ˆ์„ ๋•Œ์˜ ๋งˆ์ง€๋ง‰ ๊ทผ๊ฑฐ ์ดˆ๋ก ๋ฒ”์œ„์—์„œ ๋‹ต๋ณ€

์‹ค์ œ ๊ทผ๊ฑฐ ์šฐ์„ ์ˆœ์œ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์—…๋กœ๋“œ PDF
  โ†’ DB์— ์ €์žฅ๋œ PMC ๊ณต๊ฐœ ์ „๋ฌธ
  โ†’ PMC XML
  โ†’ BioC ๋ณธ๋ฌธ
  โ†’ PubMed ์ดˆ๋ก

์ค‘์š”ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์›๋ฌธ ๋งํฌ ๋ฐœ๊ฒฌ: ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์™ธ๋ถ€ ์œ„์น˜๋ฅผ ์ฐพ์€ ์ƒํƒœ
  • ์ „๋ฌธ ๋ถ„์„ ์™„๋ฃŒ: ๋ณธ๋ฌธ์„ ์ถ”์ถœํ•˜๊ณ  ์ฒญํ‚นยท์ž„๋ฒ ๋”ฉํ•˜์—ฌ DB์— ์ €์žฅํ•œ ์ƒํƒœ

Unpaywall์ด๋‚˜ Crossref์—์„œ ๋งํฌ๋ฅผ ์ฐพ์•˜๋‹ค๋Š” ์ด์œ ๋งŒ์œผ๋กœ ๊ทธ PDF๋ฅผ ์ž๋™ ๋‹ค์šด๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์ž„๋ฒ ๋”ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. PMC XMLยทBioC ๋ณธ๋ฌธ ๋˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œํ•œ PDF์ฒ˜๋Ÿผ ์‹ค์ œ ํ…์ŠคํŠธ๋ฅผ ํ™•๋ณดํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ „๋ฌธ RAG๊ฐ€ ์ค€๋น„๋ฉ๋‹ˆ๋‹ค.

PDF ์—…๋กœ๋“œ ์ œํ•œ

  • ํŒŒ์ผ ํ˜•์‹: PDF
  • ์ตœ๋Œ€ ํฌ๊ธฐ: 25MB
  • ์ตœ๋Œ€ ํŽ˜์ด์ง€: 2,000ํŽ˜์ด์ง€
  • ์ตœ๋Œ€ ์ถ”์ถœ ํ…์ŠคํŠธ: 3,500,000์ž
  • ์ €์žฅ ์œ„์น˜: Supabase ๋น„๊ณต๊ฐœ paper-pdfs bucket
  • ์ ‘๊ทผ ๋ฒ”์œ„: ์—…๋กœ๋“œํ•œ ์‚ฌ์šฉ์ž ๋ณธ์ธ

ํ˜„์žฌ OCR์€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธ€์ž๋ฅผ ๋“œ๋ž˜๊ทธํ•  ์ˆ˜ ์—†๋Š” ์Šค์บ” ์ด๋ฏธ์ง€ PDF๋Š” ํ…์ŠคํŠธ๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์—†์–ด ๋ถ„์„ ๋Œ€์ƒ์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

RAG๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜์š”?

RAG๋Š” AI๊ฐ€ ๋…ผ๋ฌธ ์ „์ฒด๋ฅผ ์™ธ์šฐ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์ด ์•„๋‹™๋‹ˆ๋‹ค. ์งˆ๋ฌธ์ด ๋“ค์–ด์˜ฌ ๋•Œ DB์—์„œ ๊ด€๋ จ ๋ฌธ๋‹จ์„ ์ฐพ์•„ AI์—๊ฒŒ ์ฐธ๊ณ  ์ž๋ฃŒ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋…ผ๋ฌธ ์ „๋ฌธ ํ™•๋ณด
  โ†’ ์„น์…˜๋ณ„ ๋ณธ๋ฌธ ์ •๋ฆฌ
  โ†’ ์ž‘์€ ์ฒญํฌ๋กœ ๋ถ„๋ฆฌ
  โ†’ ์ฒญํฌ ์ž„๋ฒ ๋”ฉ ์ƒ์„ฑ
  โ†’ PostgreSQL + pgvector ์ €์žฅ

์‚ฌ์šฉ์ž ์งˆ๋ฌธ
  โ†’ ์งˆ๋ฌธ ์ž„๋ฒ ๋”ฉ ์ƒ์„ฑ
  โ†’ ์˜๋ฏธ๊ฐ€ ๊ฐ€๊นŒ์šด ๋…ผ๋ฌธ ์ฒญํฌ ๊ฒ€์ƒ‰
  โ†’ ๋…ผ๋ฌธ ๊ฐœ์š” + ๊ฒ€์ƒ‰๋œ ๊ทผ๊ฑฐ๋ฅผ AI์— ์ „๋‹ฌ
  โ†’ LangGraph ์ž…๋ ฅ ๊ฐ€๋“œ โ†’ LangChain ๋‹ต๋ณ€ ์ƒ์„ฑ โ†’ ์ถœ๋ ฅ ๊ฐ€๋“œ
  โ†’ ๊ฒ€์ฆ๋œ ๋‹ต๋ณ€์„ SSE๋กœ ์ „๋‹ฌ
  โ†’ ์ถœ์ฒ˜ ๋ฌธ์žฅ๊ณผ ํ•˜์ด๋ผ์ดํŠธ ํ‘œ์‹œ

์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ๋…ผ๋ฌธ๋งˆ๋‹ค ์˜๋ฏธ ๊ธฐ๋ฐ˜ ์ƒ‰์ธ์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘๊ณ , ์งˆ๋ฌธํ•  ๋•Œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋น ๋ฅด๊ฒŒ ํŽผ์ณ ๋ณด๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์ฒญํ‚น๊ณผ ๋ฒกํ„ฐ ๊ฒ€์ƒ‰ ๊ธฐ์ค€

  • ์ฒญํฌ ํฌ๊ธฐ: ์ตœ๋Œ€ ์•ฝ 4,200์ž
  • ์ฒญํฌ ์ค‘๋ณต: ์•ฝ 400์ž
  • ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ: text-embedding-3-small
  • ๋ฒกํ„ฐ ํฌ๊ธฐ: 1,536์ฐจ์›
  • ๋ฒกํ„ฐ ์ €์žฅ์†Œ: Supabase PostgreSQL์˜ pgvector
  • ๊ฑฐ๋ฆฌ ๊ธฐ์ค€: ์ฝ”์‚ฌ์ธ ๊ฑฐ๋ฆฌ
  • ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค: HNSW
  • ๊ธฐ๋ณธ ๊ฒ€์ƒ‰๋Ÿ‰: ๋…ผ๋ฌธ๋ณ„ ์ตœ๋Œ€ 2๊ฐœ, ์ „์ฒด ์•ฝ 10๊ฐœ ์ฒญํฌ

๋ณ„๋„์˜ Pinecone ๊ฐ™์€ ๋ฒกํ„ฐ DB๋ฅผ ์šด์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. PostgreSQL ์•ˆ์—์„œ ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ์™€ ๋ฒกํ„ฐ๋ฅผ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์„œ ์ข…๋ฅ˜ ์›๋ฌธ ํ…Œ์ด๋ธ” ์ฒญํฌยท๋ฒกํ„ฐ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ๋ฒ”์œ„
PMC ๊ณต๊ฐœ ์ „๋ฌธ paper_documents paper_chunks ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ณต์šฉ ์บ์‹œ
์‚ฌ์šฉ์ž PDF user_paper_documents user_paper_chunks ์—…๋กœ๋“œํ•œ ์‚ฌ์šฉ์ž ์ „์šฉ

์งˆ๋ฌธ์„ ์ž„๋ฒ ๋”ฉํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ pgvector ๊ฒ€์ƒ‰์ด ์‹คํŒจํ•ด๋„ ์ฑ„ํŒ… ์ „์ฒด๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋…ผ๋ฌธ๋ณ„ ์•ž์ชฝ ์ฒญํฌ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฐ์ •์  fallback์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์˜๋ฏธ ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰๋ณด๋‹ค ๊ทผ๊ฑฐ ์„ ํƒ ์ •ํ™•๋„๊ฐ€ ๋‚ฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „๋ฌธ์ด ์—†๋Š” ๋…ผ๋ฌธ์€ ์ œ๋ชฉยท์ €๋„ยท์ถœํŒ ์—ฐ๋„ยท์ดˆ๋ก์„ ๋…ผ๋ฌธ ๊ฐœ์š”๋กœ AI์— ์ง์ ‘ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๋ก์€ ํ˜„์žฌ ์ „๋ฌธ์ฒ˜๋Ÿผ ๋ฒกํ„ฐ ์ฒญํ‚นํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ดˆ๋ก์— ์—†๋Š” ์„ธ๋ถ€ ๋ฐฉ๋ฒ•์ด๋‚˜ ๊ฒฐ๊ณผ๊นŒ์ง€ ๋‹ตํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ „์ฒด ์‹œ์Šคํ…œ ๊ตฌ์กฐ

flowchart LR
    U[์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €] --> F[React / Vite]
    F -->|Google ๋กœ๊ทธ์ธ| A[Supabase Auth]
    F -->|/api| B[Express Vercel Function]
    B --> P[PubMed / PMC / BioC]
    B --> O[Unpaywall / Crossref]
    B --> G[LangGraph Guardrails]
    G --> AI[LangChain / OpenAI Chat]
    B --> AI2[OpenAI Embeddings]
    B --> DB[(Supabase PostgreSQL + pgvector)]
    F --> S[Supabase ๋น„๊ณต๊ฐœ PDF Storage]
    B --> S
Loading
์˜์—ญ ๊ธฐ์ˆ  ์‹คํ–‰ ํ™˜๊ฒฝ
Frontend React 19, Vite Vercel Static Build
Backend Node.js 22, Express Vercel Function
Auth Supabase Auth, Google OAuth Supabase
Database PostgreSQL, pgvector, RLS Supabase
PDF Storage Supabase Storage ๋น„๊ณต๊ฐœ bucket
๋…ผ๋ฌธ ๋ฐ์ดํ„ฐ PubMed E-utilities, PMC, BioC NCBI
์›๋ฌธ ํƒ์ƒ‰ PMC OA, Unpaywall, Crossref ์™ธ๋ถ€ API
AI LangChain.js, LangGraph.js, OpenAI ChatยทEmbeddings, SSE Vercel Function

์ฑ—๋ด‡์€ LangGraph ์ƒํƒœ ๊ทธ๋ž˜ํ”„๋กœ ์ž…๋ ฅ ๊ฒ€์‚ฌ, ์ปจํ…์ŠคํŠธ ์ค€๋น„, LangChain ๋ชจ๋ธ ํ˜ธ์ถœ, ์ถœ๋ ฅ ๊ฒ€์‚ฌ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ ์˜๋ฃŒ ์กฐ์–ธ๊ณผ ํ”„๋กฌํ”„ํŠธ ํƒˆ์ทจ ์š”์ฒญ์€ ๊ฒ€์ƒ‰ยท๋ชจ๋ธ ํ˜ธ์ถœ ์ „์— ์ฐจ๋‹จํ•˜๊ณ , ์ด๋ฉ”์ผยท์ „ํ™”๋ฒˆํ˜ธยทAPI ํ‚คยทํ† ํฐ์€ ๋ชจ๋ธ์— ์ „๋‹ฌํ•˜๊ธฐ ์ „์— ๋งˆ์Šคํ‚นํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ์˜ ์ „์ฒด ๋‹ต๋ณ€๋„ ๋‹ค์‹œ ๊ฒ€์‚ฌํ•œ ๋’ค ์•ˆ์ „ํ•œ ์‘๋‹ต๋งŒ SSE๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ์„ค๊ณ„ ๊ฒฐ์ •

๊ฒฐ์ • ์ด์œ 
PostgreSQL๊ณผ pgvector๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉ ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ์™€ ๋ฒกํ„ฐ๋ฅผ ํ•œ DB์—์„œ ๊ด€๋ฆฌํ•ด ๊ถŒํ•œ๊ณผ ๋ฐฑ์—… ๊ตฌ์กฐ๋ฅผ ๋‹จ์ˆœํ™”
๊ณต๊ฐœ ์ „๋ฌธ๊ณผ ์‚ฌ์šฉ์ž PDF ๋ถ„๋ฆฌ PMC ๊ณต๊ฐœ ๋ฌธ์„œ๋Š” ๊ณต์šฉ ์บ์‹œ๋กœ ์žฌ์‚ฌ์šฉํ•˜๊ณ , ์—…๋กœ๋“œ PDF๋Š” ์†Œ์œ ์ž๋งŒ ์ ‘๊ทผ
์ดˆ๋ก์„ ๊ฒ€์ƒ‰ ์‹œ์ ์— ์ €์žฅ PubMed ์žฌํ˜ธ์ถœ์„ ์ค„์ด๊ณ  ์ „๋ฌธ์ด ์—†์„ ๋•Œ๋„ ์ตœ์†Œํ•œ์˜ ๋…ผ๋ฌธ ๊ทผ๊ฑฐ๋ฅผ ์œ ์ง€
๋ฌธ์„œ ์ „์ฒด ๋Œ€์‹  ๊ด€๋ จ ์ฒญํฌ ์ „๋‹ฌ ์งˆ๋ฌธ๋งˆ๋‹ค ๊ธด ์›๋ฌธ์„ ๋‹ค์‹œ ์ฝ๋Š” ๋น„์šฉ์„ ์ค„์ด๊ณ  ๊ทผ๊ฑฐ ์œ„์น˜๋ฅผ ์ถ”์ 
๊ฒ€์ฆ ํ›„ SSE ์‘๋‹ต ์ „์ฒด ๋‹ต๋ณ€์˜ ์•ˆ์ „์„ฑ์„ ๊ฒ€์‚ฌํ•œ ๋’ค ๊ธฐ์กด SSE ๊ณ„์•ฝ์œผ๋กœ ํ™”๋ฉด์— ์ „๋‹ฌ
is_del ์†Œํ”„ํŠธ ์‚ญ์ œ ์‚ฌ์šฉ์ž ์ดˆ๊ธฐํ™”์™€ ์ฑ„ํŒ… ์‚ญ์ œ ๊ธฐ๋ก์„ ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ๋ณด์กด
Graph RAG ์ฝ”ํผ์Šค ๋ถ„๋ฆฌ ์šด์˜ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ์™€ ์‹œ์—ฐ์šฉ ์—ฐ๊ตฌ ๊ทธ๋ž˜ํ”„๋ฅผ ์„ž์ง€ ์•Š๊ณ  ์•ˆ์ •์ ์œผ๋กœ ์ œ๊ณต
Vercel same-origin API ํ”„๋ก ํŠธ์—”๋“œ์™€ API๋ฅผ ํ•œ ๋„๋ฉ”์ธ์—์„œ ์ œ๊ณตํ•ด CORS์™€ ๋ฐฐํฌ ๊ตฌ์„ฑ์„ ๋‹จ์ˆœํ™”

Research Galaxy๋Š” ํ˜„์žฌ ๊ณ ์ • ์ฝ”ํผ์Šค์˜ ๊ด€๊ณ„ ํƒ์ƒ‰๊ณผ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ ์‹œ๊ฐํ™”์— ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๋…ผ๋ฌธ ์ฑ„ํŒ…์€ ์šด์˜ DB์˜ ๋ฒกํ„ฐ RAG๊ฐ€ ๋‹ด๋‹นํ•˜๋ฉฐ, ๊ทธ๋ž˜ํ”„์—์„œ ์ฐพ์€ ๊ด€๊ณ„๋ฅผ LLM ๋‹ต๋ณ€ ์ƒ์„ฑ์— ์ง์ ‘ ์ฃผ์ž…ํ•˜๋Š” ๋‹จ๊ณ„๋Š” ์•„์ง ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

team-pubmed/
โ”œโ”€โ”€ api/
โ”‚   โ””โ”€โ”€ index.js              # Vercel Function ์ง„์ž…์ 
โ”œโ”€โ”€ client/
โ”‚   โ”œโ”€โ”€ src/                  # React ํ™”๋ฉด, Research Galaxy, API ํด๋ผ์ด์–ธํŠธ
โ”‚   โ”‚   โ””โ”€โ”€ data/             # Graph RAG ๋ฐ๋ชจ์šฉ PubMed ์ฝ”ํผ์Šค
โ”‚   โ”œโ”€โ”€ public/               # ์ •์  ์ž์‚ฐ
โ”‚   โ””โ”€โ”€ .env.example          # ๋ธŒ๋ผ์šฐ์ € ๊ณต๊ฐœ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์˜ˆ์‹œ
โ”œโ”€โ”€ server/
โ”‚   โ”œโ”€โ”€ src/                  # Express, ์ธ์ฆ, PubMed, RAG, OpenAI
โ”‚   โ”œโ”€โ”€ test/                 # Node ๋‹จ์œ„ยทAPI ํ…Œ์ŠคํŠธ
โ”‚   โ””โ”€โ”€ .env.example          # ์„œ๋ฒ„ ์ „์šฉ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์˜ˆ์‹œ
โ”œโ”€โ”€ supabase/
โ”‚   โ””โ”€โ”€ schema.sql            # ํ…Œ์ด๋ธ”, RLS, pgvector, Storage ์ •์ฑ…
โ”œโ”€โ”€ docs/
โ”‚   โ”œโ”€โ”€ images/               # README ํ™”๋ฉด ์บก์ฒ˜
โ”‚   โ”œโ”€โ”€ renewal-architecture.md
โ”‚   โ””โ”€โ”€ deployment-renewal.md
โ”œโ”€โ”€ scripts/                  # DB ์ ์šฉยท๊ฒ€์ฆยท๊ทธ๋ž˜ํ”„ ์ฝ”ํผ์Šค ์ƒ์„ฑ ์Šคํฌ๋ฆฝํŠธ
โ”œโ”€โ”€ templates/                # ๊ธฐ์กด Jinja ํ™”๋ฉด ๋น„๊ต ๊ธฐ์ค€
โ”œโ”€โ”€ static/                   # ๊ธฐ์กด CSSยทJavaScript ๋น„๊ต ๊ธฐ์ค€
โ”œโ”€โ”€ tests/                    # ๊ธฐ์กด FastAPI ํšŒ๊ท€ ํ…Œ์ŠคํŠธ
โ”œโ”€โ”€ package.json              # npm workspace์™€ ๊ณตํ†ต ๋ช…๋ น
โ””โ”€โ”€ vercel.json               # Vercel ๋นŒ๋“œยท๋ผ์šฐํŒ…ยท๋ฐฐํฌ ๋ธŒ๋žœ์น˜

๊ธฐ์กด FastAPI/Jinja ๊ตฌํ˜„์€ ๋””์ž์ธ๊ณผ ๋™์ž‘ ๋น„๊ต ๊ธฐ์ค€์œผ๋กœ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ Vercel ๋ฐฐํฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ client/, server/, api/๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜๊ธฐ

์‚ฌ์ „ ์ค€๋น„

  • Node.js 22
  • npm
  • Supabase ํ”„๋กœ์ ํŠธ
  • OpenAI API key

์ €์žฅ์†Œ๋ฅผ ๋ฐ›์€ ๋’ค ๋ฃจํŠธ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

npm install
Copy-Item client\.env.example client\.env
Copy-Item server\.env.example server\.env

๋ฃจํŠธ .env.example์€ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฒฝ๊ณ„๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์•ˆ๋‚ด ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ client/.env์™€ server/.env๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

Supabase ์Šคํ‚ค๋งˆ ์ ์šฉ

Supabase Dashboard์˜ SQL Editor์—์„œ supabase/schema.sql์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํ•ญ๋ชฉ์ด ํ•จ๊ป˜ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ํ”„๋กœํ•„๊ณผ ๊ฒ€์ƒ‰ยท๋…ผ๋ฌธ ์ปฌ๋ ‰์…˜
  • ๋…ผ๋ฌธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐยท์ดˆ๋ก
  • PMC ๊ณต์šฉ ๋ฌธ์„œ์™€ ๋ฒกํ„ฐ ์ฒญํฌ
  • ์‚ฌ์šฉ์ž PDF ๋ฌธ์„œ์™€ ๋ฒกํ„ฐ ์ฒญํฌ
  • ์ฑ„ํŒ…๋ฐฉยท๋ฉ”์‹œ์ง€ยท๋…ผ๋ฌธ ์—ฐ๊ฒฐ
  • pgvector์™€ HNSW ์ธ๋ฑ์Šค
  • ์‚ฌ์šฉ์ž๋ณ„ RLS ์ •์ฑ…
  • ๋น„๊ณต๊ฐœ paper-pdfs Storage bucket ์ •์ฑ…

ํด๋ผ์ด์–ธํŠธ ํ™˜๊ฒฝ๋ณ€์ˆ˜

client/.env.example์„ ๋ณต์‚ฌํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

VITE_API_URL=
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_ANON_KEY=your-anon-or-publishable-key

VITE_API_URL์€ ๋กœ์ปฌ๊ณผ Vercel์—์„œ ๋น„์›Œ ๋‘๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ž…๋‹ˆ๋‹ค.

  • ๋กœ์ปฌ: Vite proxy๊ฐ€ /api๋ฅผ http://127.0.0.1:4000์œผ๋กœ ์ „๋‹ฌ
  • Vercel: ๊ฐ™์€ ๋ฐฐํฌ์˜ /api Function ํ˜ธ์ถœ

VITE_* ๊ฐ’์€ ๋ธŒ๋ผ์šฐ์ € ๋ฒˆ๋“ค์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. service-role key, DB ๋น„๋ฐ€๋ฒˆํ˜ธ, OpenAI key ๊ฐ™์€ ๋น„๋ฐ€๊ฐ’์„ ๋„ฃ์œผ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„ ํ™˜๊ฒฝ๋ณ€์ˆ˜

server/.env.example์„ ๋ณต์‚ฌํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ํ•„์ˆ˜ ์„ค๋ช…
NODE_ENV ์˜ˆ ๋กœ์ปฌ์€ development, ์šด์˜์€ Vercel ์„ค์ • ์‚ฌ์šฉ
PORT ์˜ˆ ๋กœ์ปฌ Express ํฌํŠธ, ๊ธฐ๋ณธ๊ฐ’ 4000
CLIENT_ORIGIN ์˜ˆ ํ—ˆ์šฉํ•  ๋ธŒ๋ผ์šฐ์ € origin, ์—ฌ๋Ÿฌ ๊ฐœ๋ฉด ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„
DATABASE_URL ์˜ˆ Supabase PostgreSQL ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด
DATABASE_SSL ์˜ˆ Supabase ์—ฐ๊ฒฐ ์‹œ true
SUPABASE_URL ์˜ˆ Supabase Project URL
SUPABASE_SERVICE_ROLE_KEY ์˜ˆ ์„œ๋ฒ„ ์ „์šฉ service-role/secret key
OPENAI_API_KEY AI ์‚ฌ์šฉ ์‹œ ์ฑ„ํŒ…๊ณผ ์ž„๋ฒ ๋”ฉ ํ˜ธ์ถœ์šฉ
OPENAI_CHAT_MODEL ์˜ˆ ์ฑ„ํŒ… ๋ชจ๋ธ
OPENAI_EMBEDDING_MODEL ์˜ˆ ๊ธฐ๋ณธ๊ฐ’ text-embedding-3-small
NCBI_EMAIL ๊ถŒ์žฅ NCBI ์š”์ฒญ ์‹๋ณ„์šฉ ์ด๋ฉ”์ผ
NCBI_API_KEY ์„ ํƒ NCBI ํ˜ธ์ถœ ํ•œ๋„ ํ™•์žฅ
NCBI_TOOL ์˜ˆ NCBI ์š”์ฒญ ๋„๊ตฌ๋ช…, ๊ธฐ๋ณธ๊ฐ’ publium
UNPAYWALL_EMAIL ๊ถŒ์žฅ Unpaywall API ์—ฐ๋ฝ ์ด๋ฉ”์ผ
DEV_USER_ID ๋กœ์ปฌ ์„ ํƒ Google ๋กœ๊ทธ์ธ ์—†๋Š” ์ „์šฉ ๋กœ์ปฌ ํ…Œ์ŠคํŠธ ๊ณ„์ • UUID

Vercel์—์„œ๋Š” ์—ฐ๊ฒฐ ์ˆ˜๊ฐ€ ์ œํ•œ๋œ direct DB ์ฃผ์†Œ๋ณด๋‹ค Supabase transaction pooler URL์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. DB ๋น„๋ฐ€๋ฒˆํ˜ธ์— ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ์žˆ์œผ๋ฉด URL encoding๋œ ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰

npm run dev

์ •์ƒ์ด๋ผ๋ฉด health endpoint๊ฐ€ ๋‹ค์Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

{"status":"ok"}

Google ๋กœ๊ทธ์ธ ์—†์ด ๋กœ์ปฌ ํ…Œ์ŠคํŠธ

  1. Supabase Authentication์— local-dev@publium.local ์‚ฌ์šฉ์ž๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. ์ƒ์„ฑ๋œ ์‚ฌ์šฉ์ž UUID๋ฅผ server/.env์˜ DEV_USER_ID์— ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  3. ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  4. http://localhost:5173/?dev=1๋กœ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ์ธ์ฆ ์šฐํšŒ๋Š” NODE_ENV=development์ด๋ฉด์„œ Vercel์ด ์•„๋‹ ๋•Œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์šด์˜ ๊ณ„์ • UUID๋ฅผ DEV_USER_ID๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

Google OAuth ์„ค์ •

Supabase์—์„œ Google provider๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์•„๋ž˜ URL์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

Supabase Site URL:
https://<VERCEL_PRODUCTION_DOMAIN>

Supabase Redirect URLs:
http://localhost:5173/**
https://<VERCEL_PRODUCTION_DOMAIN>/**

Google OAuth Authorized redirect URI:
https://<SUPABASE_PROJECT_REF>.supabase.co/auth/v1/callback

Google Cloud์—๋Š” Vercel ์ฃผ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ Supabase callback URL์„ Authorized redirect URI๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ ์™„๋ฃŒ ํ›„ ์‚ฌ์šฉ์ž๋ฅผ ๋Œ๋ ค๋ณด๋‚ผ ์ตœ์ข… ์ฃผ์†Œ๋Š” Supabase์˜ Site URL๊ณผ Redirect URLs์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น

๋ช…๋ น ์—ญํ• 
npm run dev ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋™์‹œ ์‹คํ–‰
npm run dev:client Vite ํด๋ผ์ด์–ธํŠธ๋งŒ ์‹คํ–‰
npm run dev:server Express ์„œ๋ฒ„๋งŒ ์‹คํ–‰
npm run build React ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ
npm run test ์„œ๋ฒ„ ํ…Œ์ŠคํŠธ
npm run check ์„œ๋ฒ„ ํ…Œ์ŠคํŠธ์™€ ํด๋ผ์ด์–ธํŠธ ๋นŒ๋“œ ์ „์ฒด ๊ฒ€์ฆ
npm run start Express ์„œ๋ฒ„ ์‹คํ–‰
node scripts/generate-research-graph.mjs PubMed์—์„œ Research Galaxy ๋ฐ๋ชจ ์ฝ”ํผ์Šค ์žฌ์ƒ์„ฑ
node scripts/generate-research-graph-summaries.mjs ์ฝ”ํผ์Šค ์ดˆ๋ก์„ ๊ทผ๊ฑฐ๋กœ Research Galaxy ํ•œ๊ตญ์–ด ์š”์•ฝ ์ƒ์„ฑ

๋ฐ์ดํ„ฐ์™€ ๋ณด์•ˆ ์›์น™

  • ์‚ฌ์šฉ์ž๋ณ„ ๋…ผ๋ฌธ ์ปฌ๋ ‰์…˜ยท์ฑ„ํŒ…ยท์—…๋กœ๋“œ PDF๋ฅผ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ID๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
  • Supabase RLS๋กœ ๋ธŒ๋ผ์šฐ์ €์˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • PDF ์›๋ณธ์€ ๊ณต๊ฐœ URL์ด ์•„๋‹Œ ๋งŒ๋ฃŒ๋˜๋Š” signed URL๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ๋น„๋ฐ€๊ฐ’์€ Vercel Function์—์„œ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • DATABASE_URL, SUPABASE_SERVICE_ROLE_KEY, OPENAI_API_KEY, NCBI_API_KEY์—๋Š” ์ ˆ๋Œ€๋กœ VITE_ ์ ‘๋‘์–ด๋ฅผ ๋ถ™์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์žยท์—…๋ฌด ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™”๋Š” is_del ๊ธฐ๋ฐ˜ ์†Œํ”„ํŠธ ์‚ญ์ œ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ผ์ด์„ ์Šค๊ฐ€ ํ™•์ธ๋˜์ง€ ์•Š์€ ์ถœํŒ์‚ฌ ๋ณธ๋ฌธ์€ ์„œ๋ฒ„์— ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ œํ•œ ์‚ฌํ•ญ

  • ์Šค์บ” ์ด๋ฏธ์ง€ PDF OCR ๋ฏธ์ง€์›
  • ์œ ๋ฃŒ ์ถœํŒ์‚ฌ PDF ์ž๋™ ๋‹ค์šด๋กœ๋“œ ๋ฏธ์ง€์›
  • UnpaywallยทCrossref PDF ํ›„๋ณด์˜ ์ž๋™ ํŒŒ์‹ฑยท์ž„๋ฒ ๋”ฉ ๋ฏธ์ง€์›
  • ์ดˆ๋ก ๊ธฐ๋ฐ˜ ๋…ผ๋ฌธ์€ ์ดˆ๋ก์— ์—†๋Š” ์„ธ๋ถ€ ๋‚ด์šฉ์„ ๋‹ตํ•  ์ˆ˜ ์—†์Œ
  • ์™ธ๋ถ€ ์›๋ฌธ ํŽ˜์ด์ง€ ์•ˆ์˜ ์ง์ ‘ ํ•˜์ด๋ผ์ดํŠธ ๋ฏธ์ง€์›
  • Research Galaxy๋Š” ๊ณ ์ •๋œ 148ํŽธ์˜ ์‹œ์—ฐ ์ฝ”ํผ์Šค์ด๋ฉฐ ์šด์˜ ๋…ผ๋ฌธ ์ „์ฒด๋ฅผ ๋ฐ˜์˜ํ•˜์ง€ ์•Š์Œ
  • Research Galaxy๋Š” ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ ์‹œ๊ฐํ™” ๋‹จ๊ณ„์ด๋ฉฐ ๊ทธ๋ž˜ํ”„ ๊ธฐ๋ฐ˜ LLM ๋‹ต๋ณ€ ์ƒ์„ฑ์€ ๋ฏธ์—ฐ๊ฒฐ
  • AI ๋‹ต๋ณ€์€ ๋…ผ๋ฌธ ํ•ด์„ ๋ณด์กฐ์šฉ์ด๋ฉฐ ์—ฐ๊ตฌ์ž์˜ ์›๋ฌธ ๊ฒ€ํ† ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Œ

๊ฒ€์ฆ

npm run check

ํ˜„์žฌ ๊ฒ€์ฆ ํ•ญ๋ชฉ์—๋Š” ๋‹ค์Œ ๋‚ด์šฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ์ธ์ฆ๊ณผ ๋กœ์ปฌ ํ…Œ์ŠคํŠธ ๊ณ„์ • ์ œํ•œ
  • CORS์™€ Vercel same-origin ์š”์ฒญ
  • PubMed XML ํŒŒ์‹ฑ
  • PMC/BioC ๋ณธ๋ฌธ ํŒŒ์‹ฑ
  • ์ฒญํ‚น๊ณผ ์—ฌ๋Ÿฌ ๋…ผ๋ฌธ์˜ ๊ทผ๊ฑฐ ๊ท ํ˜•
  • ์ถœ์ฒ˜ ๋ฌธ์žฅ ์„ ํƒ๊ณผ ํ•˜์ด๋ผ์ดํŠธ ๋ฒ”์œ„
  • LangGraph ์ž…๋ ฅยท์ถœ๋ ฅ ๊ฐ€๋“œ์™€ ๋ฏผ๊ฐ์ •๋ณด ๋งˆ์Šคํ‚น
  • ์‚ฌ์šฉ์ž๋ณ„ ์ดˆ๊ธฐํ™”์™€ ์†Œํ”„ํŠธ ์‚ญ์ œ
  • React ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ

Vercel ๋ฐฐํฌ

์„ค์ • ๊ฐ’
Framework Preset Vite
Root Directory .
Install Command npm install
Build Command npm run build
Output Directory client/dist
Production Branch deploy_vercel
Function entry api/index.js
Node.js 22.x

๋ธŒ๋žœ์น˜ ํ๋ฆ„:

renewal โ†’ main โ†’ deploy_vercel โ†’ Vercel Production

vercel.json์—์„œ deploy_vercel ์ด์™ธ ๋ธŒ๋žœ์น˜์˜ Git ์ž๋™ ๋ฐฐํฌ๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ renewal๊ณผ main์— ํ‘ธ์‹œํ•ด๋„ ์šด์˜ ๋ฐฐํฌ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฒ€์ฆ๋œ main์„ deploy_vercel์— ๋ฐ˜์˜ํ•  ๋•Œ๋งŒ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ๋ณ€์ˆ˜, OAuth, ๋ฐฐํฌ ํ™•์ธ๊ณผ ๋กค๋ฐฑ ์ ˆ์ฐจ๋Š” docs/deployment-renewal.md๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

About

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages