tenacity๋ ํจ์ ์ฌ์๋ ๋ก์ง์ ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ ์ธํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๋คํธ์ํฌ ํธ์ถ์ฒ๋ผ ์ผ์์ ์คํจ๊ฐ ์ฆ์ ์ฝ๋์ try/except + for ๋ฃจํ๋ฅผ ์ง์ ์ง๋ ๋์ , ๋ฐ์ฝ๋ ์ดํฐ ํ ์ค๋ก ์ฌ์๋ ์ ๋ต์ ์ค์ ํ ์ ์์ต๋๋ค.ํ ์ค ์์ฝ: tenacity์ @re
logging.basicConfig()๋ Python logging ๋ชจ๋์ ์ ์ญ ๋ก๊ฑฐ๋ฅผ ํ ๋ฒ์ ์ค์ ํ๋ ํจ์์ ๋๋ค. ์ด๋์ logger = logging.getLogger("pipeline")๋ก ๋ก๊ฑฐ๋ฅผ ๊ฐ์ ธ์๋ ์ด ์ค์ ์ด ๊ณตํต ์ ์ฉ๋ฉ๋๋ค.๋ก๊ทธ๋ฅผ ์ด๋์ ์ถ๋ ฅํ ์ง ์ง์ .
argparse๋ Python ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. CLI(์ปค๋งจ๋๋ผ์ธ ์ธํฐํ์ด์ค)์์ ์ธ์๋ฅผ ํ์ฑํ๋ ๋ชจ๋๋ก, python main.py <๊ฒฝ๋ก> --no-summary --json ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
any()๋ Python ๋ด์ฅ ํจ์์ ๋๋ค. ์ดํฐ๋ฌ๋ธ์ ์์ ์ค ํ๋๋ผ๋ ์ฐธ(Truthy)์ด๋ฉด True๋ฅผ ๋ฐํํฉ๋๋ค.
frozenset์ Python ๋ด์ฅ ํ์ ์ ๋๋ค. ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ(immutable) ์งํฉ(set)์ผ๋ก, ์ผ๋ฐ set๊ณผ ๋์ผํ๊ฒ ์ค๋ณต ์ ๊ฑฐยทํฌํจ ์ฌ๋ถ ๊ฒ์ฌ๋ฅผ ์ง์ํ์ง๋ง ์์ฑ ํ ์์ ํ ์ ์์ต๋๋ค.frozenset\[str]์ ํ์ ํํธ๋ก, ์ด ์งํฉ์ด ๋ฌธ์์ด๋ง ๋ด๋๋ค๋
getLogger๋ Python ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ logging ๋ชจ๋์ ํจ์์ ๋๋ค. ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ๋ก๊ฑฐ(Logger) ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์์ฑํฉ๋๋ค.๋ก๊ทธ ๋ ๋ฒจ ์์: DEBUG < INFO < WARNING < ERROR < CRITICALํ ์ค
MarkdownTextSplitter๋ LangChain์ langchain_text_splitters ๋ชจ๋์ ํฌํจ๋ ํด๋์ค์ ๋๋ค. \*\*Markdown ๋ฌธ์๋ฅผ ํค๋(\`chunk_size๋ ๋ฌธ์ ์ ๊ธฐ์ค์ด๋ฉฐ, Markdown ๊ตฌ์กฐ๋ฅผ ์ฐ์ ์ ์ผ๋ก ๊ณ ๋ คํด ๋ถํ ํฉ๋๋ค.์ผ๋ฐ
TypedDict๋ Python ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ typing ๋ชจ๋์ ํฌํจ๋ ํด๋์ค์ ๋๋ค. ๋์ ๋๋ฆฌ์ ํค์ ๊ฐ ํ์ ์ ๋ช ์์ ์ผ๋ก ์ ์ํ ์ ์๊ฒ ํด์ฃผ๋ ํ์ ํํธ ๋๊ตฌ์ ๋๋ค.๋ฐํ์์๋ ์ผ๋ฐ dict์ฒ๋ผ ๋์ํ๊ณ , ํ์ ์ฒด์ปค(mypy, pyright)๊ฐ ๊ตฌ์กฐ๋ฅผ ๊ฒ์ฆํด์ค๋๋ค
Counter๋ Python ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ collections ๋ชจ๋์ ํฌํจ๋ ํด๋์ค์ ๋๋ค. ๋ฆฌ์คํธ๋ ์ดํฐ๋ฌ๋ธ์์ ๊ฐ ํญ๋ชฉ์ด ๋ช ๋ฒ ๋ฑ์ฅํ๋์ง ์๋์ผ๋ก ์ธ์ฃผ๋ ๋์ ๋๋ฆฌ์ ๋๋ค.๋์ ๋๋ฆฌ์ฒ๋ผ ํค๋ก ์ ๊ทผํ ์ ์์ต๋๋ค.Counter๊ฐ ์ด๊ฑธ ํ ์ค๋ก ํด๊ฒฐํฉ๋๋ค.ํ ์ค ์์ฝ:
fitz๋ PyMuPDF ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ด๋ถ ๋ชจ๋ ์ด๋ฆ์ ๋๋ค. ์ค์นํ ๋ ์ด๋ฆ๊ณผ importํ ๋ ์ด๋ฆ์ด ๋ฌ๋ผ์ ์ฒ์์ ํท๊ฐ๋ฆฝ๋๋ค.์ด๋ฆ์ด ๋ค๋ฅธ ์ด์ ๋ MuPDF๋ผ๋ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ Python์ผ๋ก ๊ฐ์ผ ๊ฑฐ๋ผ ์ญ์ฌ์ ์ธ ์ด์ ๋ก ์ด๋ฆ์ด ๊ตณ์ด์ก์ต๋๋ค. "pymupdf = fit
os ๋ชจ๋์ ์ด์์ฒด์ (OS)์ ์ํธ์์ฉํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ Python ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ํ์ผ ๊ฒฝ๋ก, ํ๊ฒฝ๋ณ์, ํ๋ก์ธ์ค ์ ๋ณด ๋ฑ OS ์์ค์ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํฉ๋๋ค.ํ์ผ ๊ฒฝ๋ก๋ฅผ OS์ ๋ง๊ฒ ์์ ํ๊ฒ ๋ค๋ฃฐ ๋ ์ฌ์ฉํฉ๋๋ค..env ํ์ผ๊ณผ ํจ๊ป python-do
or์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ผ๋ฆฌ ์ฐ์ฐ์์ ๋๋ค. ๋ ๊ฐ ์ค ํ๋๋ผ๋ True๋ฉด True๋ฅผ ๋ฐํํฉ๋๋ค.if/else๋ก ํ์ด์ฐ๋ฉด ์ด๊ฒ๊ณผ ๋์ผํฉ๋๋ค.๊ฒฐ๊ณผ๋ ๊ฐ์ง๋ง or์ด ํจ์ฌ ๊ฐ๊ฒฐํฉ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ์์ ๊ฐ๋(Guard) ๋ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ ๋๋ง ์ฝ๋๊ฐ ์คํ๋๋๋ก ๋ง์์ฃผ๋ ์ฅ์น์ ๋๋ค. ๊ฒฝ๋น์์ด ์กฐ๊ฑด์ ํ์ธํ๊ณ ํต๊ณผ์ํค๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.์ด ์ฝ๋๊ฐ ๋ํ์ ์ธ ๊ฐ๋ ํจํด์ ๋๋ค. "์ง์ ์คํํ ๋๋ง run()์ ํธ์ถํด๋ผ" ๋ผ๋ ์กฐ๊ฑด์ ๊ฑธ์ด๋๋ ๊ฒ์ ๋๋ค.\_\_
traceback์ Python ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋๋ก, ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋ ํ์ผ์ ๋ช ๋ฒ์งธ ์ค์์ ์ด๋ค ๊ฒฝ๋ก๋ก ์๋ฌ๊ฐ ๋ฌ๋์ง ์์ธํ๊ฒ ์ถ๋ ฅํ ์ ์๊ฒ ํด์ค๋๋ค.Python์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฐ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.์ด๊ฒ์ด ํธ๋ ์ด์ค๋ฐฑ(traceba
time์ Python ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋๋ก, ์๊ฐ๊ณผ ๊ด๋ จ๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ ์ค์์ ์ฝ๋ ์คํ ์๊ฐ์ ์ธก์ ํ ๋ ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ํจ์๋ค์ ์ ๋ฆฌํฉ๋๋ค.1970๋ 1์ 1์ผ 00:00:00(UTC)์ ๊ธฐ์ค์ผ๋ก ํ์ฌ๊น์ง ํ๋ฅธ ์๊ฐ์ ์ด ๋จ์๋ก ๋ฐํํฉ๋๋ค
subprocess๋ Python ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋๋ก, Python ์ฝ๋ ์์์ ํฐ๋ฏธ๋ ๋ช ๋ น์ด๋ฅผ ์คํํ ์ ์๊ฒ ํด์ค๋๋ค.ํฐ๋ฏธ๋์์ ์ง์ ์น๋ ๋ช ๋ น์ด๋ฅผ:Python ์ฝ๋ ์์์ ์ด๋ ๊ฒ ์คํํ ์ ์์ต๋๋ค.subprocess.run()์ subpr
mkdir()์ pathlib์ Path ๊ฐ์ฒด์์ ์ ๊ณตํ๋ ๋ฉ์๋๋ก, ํด๋๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํฉ๋๋ค.parents=True โ ์ค๊ฐ ๊ฒฝ๋ก๊น์ง ์ ๋ถ ์์ฑexist_ok=True โ ์ด๋ฏธ ์กด์ฌํด๋ ์๋ฌ ์์ด ํต๊ณผ์ฒ์ ์คํํ ๋๋, ๋ ๋ฒ์งธ ์คํํ ๋๋ ํญ์ ์์ ํ๊ฒ ๋์ํฉ๋
run_all.py๋ฅผ ํ๋ก์ ํธ ๋ฃจํธ์์ ์คํํ์ ๋ ์ด๋ฐ ์๋ฌ๋ฅผ ๋ง๋ ์ ์์ ๊ฒ์ ๋๋ค.๋ถ๋ช ํ ๊ฐ์ ํด๋์ ํ์ผ์ด ์๋๋ฐ ์ ๋ชป ์ฐพ๋ ๊ฑธ๊น์? ์ด๊ฑธ ์ดํดํ๋ ค๋ฉด Python์ด import๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์์์ผ ํฉ๋๋ค.Python์ import๋ฅผ ๋ง๋๋ฉด sys.path
์ฌ๋ฌ ํ๋ก์ ํธ๋ฅผ ๋์์ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด ํจํค์ง ๋ฒ์ ์ถฉ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.ํ๋์ ํ์ด์ฌ ํ๊ฒฝ์ ๋ ๋ฒ์ ์ ๋์์ ์ค์นํ ์ ์๊ธฐ ๋๋ฌธ์, ํ๋ก์ ํธ๋ง๋ค ๋ ๋ฆฝ๋ ๊ณต๊ฐ์ ๋ง๋ค์ด ๊ฐ๊ฐ์ ํจํค์ง๋ฅผ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ๊ฐ์ ํ๊ฒฝ์ ์ญํ ์ ๋๋ค.ํ์ด์ฌ 3.3๋ถํฐ ๋ด์ฅ ๋ชจ๋
๋๊ธฐ(Synchronous) ๋ ํน์ ์์ ์ด ๋๋์ผ ๋ค์ ์์ ์ ์ฒ๋ฆฌํ๋ ์์ฐจ ์ฒ๋ฆฌ ๋ฐฉ์์ ๋๋ค. ๋ฐ๋ฉด ๋น๋๊ธฐ(Asynchronous) ๋ ์ฌ๋ฌ ์์ ์ ๋์์ ์ฒ๋ฆฌํ๋๋ก ๋งก๊ฒจ๋๊ณ , ์์ ์ด ๋๋๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ ๋ฐฉ์์ ๋๋ค.ํ์ผ ์ฝ๊ธฐ, ๋คํธ์ํฌ ์์ฒญ์ฒ๋ผ I/O ๋๊ธฐ ์๊ฐ์ด ๊ธด