SLAM Engineer

๐ŸŒˆ arXiv ์ตœ์‹ ๋…ผ๋ฌธ ํŠธ๋ž˜ํ‚น ์ž๋™ํ™” ๋ฐ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ ๊ตฌ์ถ•ํ•˜๊ณ  ๋ฐฐํฌํ•˜๊ธฐ


์ตœ์‹  ๋…ผ๋ฌธ์„ ์ข€ ๋” ์Šค๋งˆํŠธํ•˜๊ฒŒ ํŠธ๋ž˜ํ‚นํ•ด๋ณด์ž

  • ChatGPT ์•ผ ๋„์™€์ค˜!

๋จผ์ €, ๋ฐ๋ชจ

ํ•„์š”์„ฑ

  • arxiv ๋…ผ๋ฌธ์„ ์›๋ž˜ ๋‹ค์Œ ๋ฐฉ๋ฒ•์œผ๋กœ ํŒ”๋กœ์—…ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค: RSS (e.g., http://export.arxiv.org/rss/cs/RO)๋ฅผ slack์ด๋‚˜ jandi ๊ฐ™์€ ๋ฉ”์‹ ์ €์•ฑ์— ๋ฌผ๋ ค์„œ ๋ณธ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ฒ€์ƒ‰์ด ๋Š๋ฆฌ๊ฑฐ๋‚˜ ์šฉ์ดํ•˜์ง€ ์•Š์•„์„œ (๋ฉ€ํ‹ฐ ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰ ๋“ฑ) ์ง์ ‘ ๋งŒ๋“ค์–ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.
  • ๋Œ€์ถฉ ์ด๋ ‡๊ฒŒ ์ €๋ ‡๊ฒŒ ํ•˜๊ณ  ์‹ถ์–ด ๋ผ๊ณ  ์„ค๋ช…ํ•˜๋‹ˆ๊นŒ ChatGPT๊ฐ€ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค. ์ด ํฌ์ŠคํŠธ๋Š” ๊ทธ ๊ณผ์ •์— ๋Œ€ํ•œ ๊ธฐ๋ก!

๊ตฌ์ถ• ๊ณผ์ •

๋‹จ๊ณ„ 1: RSS ํŒŒ์‹ฑํ•ด์„œ DB์— ์ €์žฅํ•˜๊ธฐ

  • ํŒŒ์ด์ฌ์˜ sqlite3 API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด db ์™€ ์†Œํ†ตํ•  ๋•Œ python์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณ„๋„์˜ ๋ฌธ๋ฒ•์ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ  SQL ๊ตฌ๋ฌธ์„ ๊ทธ๋ƒฅ execute ํ•ด์ฃผ๋Š” ๊ตฌ์กฐ์ด๋‹ค.
  • ์˜ˆ์‹œ code

  • ํŒŒ์‹ฑํ•œ ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์ผ ๊ธฐ๋ฐ˜์˜ DB์ธ sqlite๋กœ ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํ˜„์žฌ๋Š” github repository ์—์„œ db ๋ฅผ ํŒŒ์ผ๋กœ ์ง์ ‘ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ตฌ์กฐ์ด๋‹ค.

๋‹จ๊ณ„ 2: ์ด ๊ณผ์ •์„ Github Action์ด ์ž๋™์œผ๋กœ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๊ธฐ

  • ํ•„์š”์„ฑ: RSS๋Š” ๋งค์ผ ์Œ“์ด๋Š”๋ฐ, ๋งค์ผ ๋‚ด๊ฐ€ ์ง์ ‘ python3 arxiv_saver_to_db.py ํ•˜๊ณ  ๋‹ค์‹œ commit ํ•˜๊ณ  โ€ฆ ์ด ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ํ”ผ๊ณคํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊นŒ๋จน๊ณ  ๋ฉฐ์น  ๋™์•ˆ ๋ชปํ• ์ˆ˜๋„ ์žˆ๊ณ . ๊ทธ๋ž˜์„œ ์ด ์ž‘์—…์ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋˜๋„๋ก ํ•˜๊ฒŒ ํ•˜์ž.
  • GitHub Action์„ ํ™œ์šฉํ•˜์˜€๋‹ค. .github/workflows ์„ ๋งŒ๋“ค๊ณ  ๊ทธ ์•„๋ž˜์— yml ํŒŒ์ผ ๊ทœ๊ฒฉ์— ๋”ฐ๋ผ์„œ ํ•„์š”ํ•œ ์ ˆ์ฐจ๋ฅผ ๊ธฐ๋กํ•ด๋‘๋ฉด ๋œ๋‹ค.
  • ์˜ˆ์‹œ code
    • ๊ฐ name ๋“ค์ด ๊ฐ๊ฐ์˜ subtask๋ผ๊ณ  ๋ณด๋ฉด๋œ๋‹ค.
    • cron์€ ์–ผ๋งˆ ์ฃผ๊ธฐ๋กœ ์‹คํ–‰๋  ๊ฒƒ์ธ์ง€ ๊ธฐ์ž…ํ•˜๋Š” ๋ฌธ๋ฒ•์ด๋‹ค. ์ € ๋ฌธ๋ฒ•์„ ๊ตณ์ด ๊ณต๋ถ€ํ•˜๊ธฐ๋Š” ์–ด๋ ค์šฐ๋‹ˆ+์‹ค์ˆ˜ํ• ์—ฌ์ง€๊ฐ€ ์žˆ์œผ๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑํ•ด์ฃผ๋Š” ์‚ฌ์ดํŠธ ๋“ค์—์„œ ์ƒ์„ฑํ•ด์„œ ๊ธฐ์ž…ํ•ด๋‘๋ฉด ๋œ๋‹ค.

    • workflow_dispatch: ๋ฅผ ์ ์–ด๋‘๋ฉด action ์„ ์ง์ ‘ ํŠธ๋ฆฌ๊ฑฐ ํ•ด์„œ ์‹คํ–‰์‹œ์ผœ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  • ์‹ค์ œ๋กœ ์œ„์˜ ๋ฃจํ‹ด์ด ์ˆ˜ํ–‰๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” github-actions bot ์ด ๋‚ด ๋Œ€์‹  pushํ•  ๊ถŒํ•œ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
    • ๊ทธ๋ž˜์„œ Settings/Secrets\ and\ variables/Actions ๋“ฑ์—์„œ ๋น„๋ฒˆ(ํ† ํฐ)์ด ์ ํžŒ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋„ ๋งŒ๋“ค๊ณ , read ๊ถŒํ•œ ์™ธ์— write ๊ถŒํ•œ๋„ ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
      • ์ž์„ธํ•œ ์„ค๋ช…์€ ์ƒ๋žตํ•œ๋‹คโ€ฆ
  • ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๊ณ , ์•Œ๋ฆผ๋„ ๋œฌ๋‹ค.

๋‹จ๊ณ„ 3: ๊ฒ€์ƒ‰์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ

  • ์ด์ œ db๊ฐ€ ์žˆ์œผ๋‹ˆ app์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ํ‚ค์›Œ๋“œ๋ฅผ ๋ฐ›์œผ๋ฉด, DB๋กœ๋ถ€ํ„ฐ ํ•ด๋‹นํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ json์œผ๋กœ ๋Œ๋ ค์ฃผ๋Š” ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
  • fastapi๋ฅผ ์“ธ๊ฑฐ๊ณ , db์—๋Š” ์–ด๋–ค ํ˜•์‹์˜ table๋“ค์ด ์žˆ๊ณ , api route ๋Š” ์–ด๋• ์œผ๋ฉด ์ข‹๊ฒ ์–ด, ๋ผ๊ณ  ํ•˜๋‹ˆ๊นŒ ChatGPT๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๋‹ค.
  • IP:port/{table_name}/keywords/OR/{keywords} ์ด๋Ÿฐ์‹์œผ๋กœ API๋ฅผ ๋ฐ›๋„๋ก ํ•˜์˜€๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด python3 app/search_server.pyํ•ด์„œ ์„œ๋ฒ„๋ฅผ ์ผœ๊ณ , ๋ธŒ๋ผ์šฐ์ €์— ์˜ˆ๋ฅผ ๋“ค์–ด 127.0.0.1:8000/RO/keywords/AND/slam,lidar์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒฐ๊ณผ๊ฐ€ ์ถ”์ถœ๋œ๋‹ค. ํŒŒ์ด์–ดํญ์Šค์—์„œ์˜ ์˜ˆ์‹œ:

    • ps. ํ•œํŽธ, ํฌ๋กฌ์€ raw json text ๋ฅผ ์‹œ๊ฐํ™”ํ•ด์ค˜์„œ, ์ด ์ƒํƒœ๋กœ๋Š” ๋ณด๊ธฐ๊ฐ€ ์ข€ ์–ด๋ ค์› ๋‹ค.

๋‹จ๊ณ„ 4: Web UI ๋งŒ๋“ค๊ธฐ

  • ์•ž์„œ json์„ ๋ฐ”๋กœ ๋ฐ›์œผ๋ฉด ๋ณด๊ธฐ๊ฐ€ ์ข€ ์–ด๋ ค์šฐ๋‹ˆ web UI๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.
  • Streamlit ์„ ์ด์šฉํ•˜์˜€๋‹ค. ์—ญ์‹œ ChatGPT์—๊ฒŒ ํ•ด์ค˜ ๋ผ๊ณ  ํ•˜์˜€๋‹ค. ์ดํ›„ ๋ฆฌํŒฉํ† ๋ง๋งŒ ์ข€ ์ง„ํ–‰ํ•˜์˜€๋‹ค.
  • ์˜ˆ์‹œ code

๋‹จ๊ณ„ 5: ๋ฐฐํฌํ•˜๊ธฐ

  • ์›๋ž˜๋Š” Heroku ๋ฅผ ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ 22๋…„ ํ•˜๋ฐ˜๊ธฐ๋ถ€ํ„ฐ free tier ๊ฐ€ ์‚ฌ๋ผ์ง„ ๋“ฏํ•˜๋‹ค.
  • ๊ทธ๋ž˜์„œ ๋Œ€์ฒด์žฌ๋กœ render.com ์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ๊ทธ ์™ธ์— https://fly.io/, https://www.cyclic.sh/, https://railway.app/ ๋“ฑ๋„ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.
  • ํ•ด๋ณด๋‹ˆ ์˜คํžˆ๋ ค heroku๋ณด๋‹ค ๋”๋”์‰ฌ์› ๋‹ค.
  • requirements.txt ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ  (๊นƒํ—™ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฃจํŠธ์— ์œ„์น˜),
  • ์•„๋ž˜ ์บก์ฒ˜ํ™”๋ฉด์ฒ˜๋Ÿผ ์Šฅ์Šฅ ํ•˜๋ฉด ๋ฐฐํฌ ์ค€๋น„ ๋. ์นธ์„ ๋ช‡๊ฐœ๋งŒ ์ฑ„์šฐ๋ฉด ๋์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ž๋™์œผ๋กœ github ํŠน์ • (์—ฌ๊ธฐ์„œ๋Š” main) branch ๋ฅผ ๋Œ์–ด์™€์„œ, ๊ฑฐ๊ธฐ์— ๊ธฐ์ž…๋œ requirements.txt๋Œ€๋กœ ํ™˜๊ฒฝ์„ ๋นŒ๋“œํ•˜๊ณ , start command ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
    • ์ด ์•ฑ์˜ ๊ฒฝ์šฐ server์™€ web app ๋‘๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋„์›Œ์•ผ ํ•ด์„œ shell ํŒŒ์ผ๋กœ ๊ตฌ์„ฑํ•˜์˜€๊ณ  run_app.sh ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

    • ํ”„๋ฆฌํ‹ฐ์–ด๋Š” ํ•œ๋‹ฌ ๋™์•ˆ 750 ์ธ์Šคํ„ด์Šค ์‹œ๊ฐ„์ด ๋ฌด๋ฃŒ์ด๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ๋Œ๋ฆฌ๋Š” ๊ฒฝ์šฐ, ํ•œ๋‹ฌ ์ „์ฒด free์ด๊ณ , ๋„คํŠธ์›Œํฌ๋Š” 100G๊นŒ์ง€ ๋ฌด๋ฃŒ์ด๋‹ค.
      • ๊ทธ๋ฆฌ๊ณ  15๋ถ„์ด์ƒ ์•ฑ ์‚ฌ์šฉ์ด ์—†์„ ์‹œ์— ์ž ์ž๊ธฐ์— ๋“ค์–ด๊ฐ€๊ณ  ๊ทธ ์ดํ›„์— ์ ‘๊ทผ ์‹œ ์›จ์ดํฌ์—…ํƒ€์ž„์ด 30์ดˆ๊นŒ์ง€๋„ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ฒด๊ฐ์ƒ 30์ดˆ๊นŒ์ง€๋Š” ์•„๋‹ˆ์—ˆ๊ณ  5์ดˆ ์ •๋„ ๊ฑธ๋ฆฌ๋Š” ๋“ฏ ํ–ˆ๋‹ค.

๊ฒฐ๋ก 

  • ์ตœ์‹  ๋…ผ๋ฌธ๋“ค์„ ์ฝ๊ณ  ํ‚ค์›Œ๋“œ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ค„์ด๊ณ  ์ดํ•ด๋ฅผ ๋•๋Š” ํˆด๋“ค์„ ๋งŒ๋“ค์–ด ๋ณด์•˜๋‹ค.

TODO

  • GitHub repository์—์„œ ์—…๋กœ๋“œ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ ํ•˜๋‚˜์˜ ์‚ฌ์ด์ฆˆ ์ƒํ•œ์ด 100MB์ด๋‹ค. ์ดํ›„์— DB์— ๋…ผ๋ฌธ๋“ค ๋‚ด์šฉ์ด ๋งŽ์•„์ ธ์„œ 100MB๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•  ์ง€ ๊ณ ๋ฏผํ•ด๋ณด์ž.
  • arxiv ์™ธ์— ์ €๋„๋“ค์˜ RSS๋„ ์ถ”๊ฐ€ํ•ด๋ณด์ž