Spaces:
Running
Running
| [ | |
| { | |
| "id": "docs-q8", | |
| "lesson_id": "docs-ollama-models", | |
| "question_type": "multiple_choice", | |
| "question": "Ollama์์ ๋ชจ๋ธ์ด ๋ก์ปฌ์ ์์ ๋ `ollama run qwen2.5:7b`๋ฅผ ์คํํ๋ฉด?", | |
| "options": [ | |
| "์๋์ผ๋ก ๋ชจ๋ธ์ ๋ค์ด๋ก๋ํ ๋ค ์คํํ๋ค", | |
| "์ค๋ฅ๋ฅผ ์ถ๋ ฅํ๊ณ ์ข ๋ฃํ๋ค", | |
| "์ต์ ๋ชจ๋ธ๋ก ๋์ฒดํด ์คํํ๋ค", | |
| "์๋ฒ๋ง ์์ํ๊ณ ๋๊ธฐํ๋ค" | |
| ], | |
| "answer": "์๋์ผ๋ก ๋ชจ๋ธ์ ๋ค์ด๋ก๋ํ ๋ค ์คํํ๋ค", | |
| "explanation": "`ollama run`์ ๋ชจ๋ธ์ด ์์ผ๋ฉด ์๋์ผ๋ก pullํ ๋ค ๋ํํ ์ธ์ ์ ์์ํฉ๋๋ค. `ollama pull`์ ๋จผ์ ์คํํ ํ์๊ฐ ์์ต๋๋ค.", | |
| "source_id": "official-docs-ollama" | |
| }, | |
| { | |
| "id": "docs-q9", | |
| "lesson_id": "docs-streamlit-secrets", | |
| "question_type": "multiple_choice", | |
| "question": "Streamlit ๋ก์ปฌ ๊ฐ๋ฐ ์ API ํค๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์?", | |
| "options": [ | |
| ".streamlit/secrets.toml์ ์ ์ฅํ๊ณ .gitignore์ ์ถ๊ฐ", | |
| "st.session_state์ ์ ์ฅ", | |
| "์ฝ๋ ์๋จ์ ์์๋ก ์ ์ธ", | |
| "requirements.txt์ ํฌํจ" | |
| ], | |
| "answer": ".streamlit/secrets.toml์ ์ ์ฅํ๊ณ .gitignore์ ์ถ๊ฐ", | |
| "explanation": "๋ฏผ๊ฐ ์ ๋ณด๋ secrets.toml์ ๋ฃ๊ณ , ์ด ํ์ผ์ ๋ฐ๋์ .gitignore์ ์ถ๊ฐํด Git์ ์ปค๋ฐ๋์ง ์๋๋ก ํด์ผ ํฉ๋๋ค.", | |
| "source_id": "official-docs-streamlit" | |
| }, | |
| { | |
| "id": "docs-q10", | |
| "lesson_id": "docs-hf-docker-space", | |
| "question_type": "multiple_choice", | |
| "question": "Hugging Face Docker Space์์ ์ฑ์ด ๋ ธ์ถํด์ผ ํ๋ ๊ธฐ๋ณธ ํฌํธ๋?", | |
| "options": [ | |
| "7860", | |
| "8501", | |
| "11434", | |
| "3000" | |
| ], | |
| "answer": "7860", | |
| "explanation": "Docker Space์ ๊ธฐ๋ณธ ์ฑ ํฌํธ๋ 7860์ ๋๋ค. README ๋ฉํ๋ฐ์ดํฐ์ `app_port`์ Dockerfile์ EXPOSE ํฌํธ๋ฅผ 7860์ผ๋ก ์ผ์น์์ผ์ผ ํฉ๋๋ค.", | |
| "source_id": "official-docs-huggingface" | |
| }, | |
| { | |
| "id": "docs-q11", | |
| "lesson_id": "docs-ollama-models", | |
| "question_type": "command", | |
| "question": "๋ก์ปฌ์ ์๋ Ollama ๋ชจ๋ธ ๋ชฉ๋ก์ ํ์ธํ๋ CLI ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ธ์.", | |
| "options": [], | |
| "answer": "ollama list", | |
| "explanation": "`ollama list`๋ ๋ก์ปฌ์ ๋ค์ด๋ก๋๋ ๋ชจ๋ธ ๋ชฉ๋ก๊ณผ ํฌ๊ธฐ, ์์ ์ผ์ ์ถ๋ ฅํฉ๋๋ค. `ollama pull <๋ชจ๋ธ>`๋ก ์ ๋ชจ๋ธ์ ๋ฐ์ ์ ์์ต๋๋ค.", | |
| "source_id": "official-docs-ollama" | |
| }, | |
| { | |
| "id": "docs-q12", | |
| "lesson_id": "docs-langchain-rag", | |
| "question_type": "multiple_choice", | |
| "question": "LangChain RAG ํ์ดํ๋ผ์ธ์์ ๋ฌธ์๋ฅผ Vector Store์ ๋ฃ๊ธฐ ์ ์ ๋ฐ๋์ ํด์ผ ํ๋ ์์ ์?", | |
| "options": [ | |
| "๋ฌธ์๋ฅผ ์์ ์ฒญํฌ(chunk)๋ก ๋ถํ ํ ์๋ฒ ๋ฉ ์์ฑ", | |
| "๋ฌธ์๋ฅผ PDF๋ก ๋ณํ", | |
| "LLM์ ๋ฌธ์๋ฅผ ์ง์ ์ ๋ฌ", | |
| "API ํค๋ฅผ ํ๊ฒฝ๋ณ์์ ์ ์ฅ" | |
| ], | |
| "answer": "๋ฌธ์๋ฅผ ์์ ์ฒญํฌ(chunk)๋ก ๋ถํ ํ ์๋ฒ ๋ฉ ์์ฑ", | |
| "explanation": "RAG๋ ๋ฌธ์ โ ์ฒญํฌ ๋ถํ (TextSplitter) โ ์๋ฒ ๋ฉ ๋ณํ โ Vector Store ์ ์ฅ ์์ผ๋ก ์ธ๋ฑ์ฑํฉ๋๋ค. ์ฒญํฌ๊ฐ ๋๋ฌด ํฌ๋ฉด ๊ฒ์ ํ์ง์ด ๋จ์ด์ง๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q13", | |
| "lesson_id": "docs-streamlit-state", | |
| "question_type": "multiple_choice", | |
| "question": "Streamlit์์ ๋ฒํผ ํด๋ฆญ ํ์๋ฅผ ํ์ด์ง ์ ํ ํ์๋ ์ ์งํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋๊ฐ?", | |
| "options": [ | |
| "st.session_state์ ์ ์ฅ", | |
| "์ ์ญ ๋ณ์๋ก ์ ์ธ", | |
| "st.cache_data์ ์ ์ฅ", | |
| "ํ์ผ์ ๊ธฐ๋ก" | |
| ], | |
| "answer": "st.session_state์ ์ ์ฅ", | |
| "explanation": "Streamlit์ ๋งค ์ํธ์์ฉ๋ง๋ค ์คํฌ๋ฆฝํธ ์ ์ฒด๋ฅผ ์ฌ์คํํฉ๋๋ค. ์ ์ญ ๋ณ์๋ ์ฌ์คํ ์ ์ด๊ธฐํ๋๋ฏ๋ก ์ธ์ ๊ฐ ๊ฐ์ ์ ์งํ๋ ค๋ฉด `st.session_state`๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.", | |
| "source_id": "official-docs-streamlit" | |
| }, | |
| { | |
| "id": "docs-q14", | |
| "lesson_id": "docs-streamlit-cache", | |
| "question_type": "multiple_choice", | |
| "question": "`st.cache_data`์ `st.cache_resource`์ ์ฃผ๋ ์ฐจ์ด๋?", | |
| "options": [ | |
| "cache_data๋ ๋ฐ์ดํฐ(DataFrame ๋ฑ) ์ง๋ ฌํ ์บ์, cache_resource๋ DB ์ฐ๊ฒฐยท๋ชจ๋ธ ๊ฐ์ ๊ณต์ ๋ฆฌ์์ค ์บ์", | |
| "๋ ๋ฐ์ฝ๋ ์ดํฐ๋ ์์ ํ ๋์ผํ๋ค", | |
| "cache_resource๋ ํ์ผ์ ์บ์ํ๊ณ cache_data๋ ์ฐ๊ฒฐ์ ์บ์ํ๋ค", | |
| "cache_data๊ฐ ํญ์ ๋ ๋น ๋ฅด๋ค" | |
| ], | |
| "answer": "cache_data๋ ๋ฐ์ดํฐ(DataFrame ๋ฑ) ์ง๋ ฌํ ์บ์, cache_resource๋ DB ์ฐ๊ฒฐยท๋ชจ๋ธ ๊ฐ์ ๊ณต์ ๋ฆฌ์์ค ์บ์", | |
| "explanation": "`st.cache_data`๋ ๋ฐํ๊ฐ์ ๋ณต์ฌํด ๊ฐ ์ธ์ ์ ๋ ๋ฆฝ ์ ๊ณตํฉ๋๋ค. `st.cache_resource`๋ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๋ฏ๋ก DB ์ฐ๊ฒฐ, ML ๋ชจ๋ธ์ฒ๋ผ ํ ๋ฒ๋ง ๋ก๋ํด์ผ ํ๋ ๋ฆฌ์์ค์ ์๋๋ค.", | |
| "source_id": "official-docs-streamlit" | |
| }, | |
| { | |
| "id": "docs-q15", | |
| "lesson_id": "docs-hf-spaces", | |
| "question_type": "multiple_choice", | |
| "question": "Hugging Face Spaces์์ Streamlit ์ฑ์ ๋ฐฐํฌํ ๋ README.md์ ๋ฐ๋์ ํฌํจํด์ผ ํ๋ ๋ฉํ๋ฐ์ดํฐ ํ๋๋?", | |
| "options": [ | |
| "sdk: streamlit", | |
| "runtime: python", | |
| "framework: web", | |
| "deploy: auto" | |
| ], | |
| "answer": "sdk: streamlit", | |
| "explanation": "HF Spaces README ์๋จ YAML ๋ฉํ๋ฐ์ดํฐ์์ `sdk: streamlit`์ ์ง์ ํด์ผ Streamlit ์ฑ์ผ๋ก ์ธ์ํฉ๋๋ค. `sdk_version`์ผ๋ก ๋ฒ์ ๋ ๊ณ ์ ํ ์ ์์ต๋๋ค.", | |
| "source_id": "official-docs-huggingface" | |
| }, | |
| { | |
| "id": "docs-q16", | |
| "lesson_id": "docs-vectorstore", | |
| "question_type": "multiple_choice", | |
| "question": "LangChain์์ Retriever์ ์ญํ ์?", | |
| "options": [ | |
| "์ง๋ฌธ๊ณผ ์ ์ฌํ ๋ฌธ์๋ฅผ Vector Store์์ ๊ฒ์ํด ๋ฐํํ๋ค", | |
| "LLM์ ํธ์ถํด ๋ต๋ณ์ ์์ฑํ๋ค", | |
| "ํ๋กฌํํธ ํ ํ๋ฆฟ์ ๊ด๋ฆฌํ๋ค", | |
| "API ํค๋ฅผ ์ ์ฅํ๋ค" | |
| ], | |
| "answer": "์ง๋ฌธ๊ณผ ์ ์ฌํ ๋ฌธ์๋ฅผ Vector Store์์ ๊ฒ์ํด ๋ฐํํ๋ค", | |
| "explanation": "Retriever๋ ์ง๋ฌธ ์๋ฒ ๋ฉ๊ณผ ๊ฐ์ฅ ์ ์ฌํ ๋ฌธ์ ์ฒญํฌ๋ฅผ Vector Store์์ ๊ฐ์ ธ์ต๋๋ค. RAG ์ฒด์ธ์์ `retriever | prompt | llm` ํ์ดํ๋ผ์ธ์ ์ฒซ ๋จ๊ณ์ ๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q17", | |
| "lesson_id": "docs-streamlit-state", | |
| "question_type": "multiple_choice", | |
| "question": "`st.form`์ ์ฌ์ฉํ๋ ์ฃผ๋ ์ด์ ๋?", | |
| "options": [ | |
| "์ฌ๋ฌ ์ ๋ ฅ ์์ ฏ์ ๋ฌถ์ด Submit ๋ฒํผ ํด๋ฆญ ์์๋ง rerun์ด ๋ฐ์ํ๋๋ก ํ๋ค", | |
| "ํผ ๋ด ์์ ฏ์ด ๋ ๋น ๋ฅด๊ฒ ๋ ๋๋ง๋๋ค", | |
| "์ ๋ ฅ๊ฐ์ ์๋์ผ๋ก DB์ ์ ์ฅํ๋ค", | |
| "ํผ์ ๋ชจ๋ฐ์ผ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค" | |
| ], | |
| "answer": "์ฌ๋ฌ ์ ๋ ฅ ์์ ฏ์ ๋ฌถ์ด Submit ๋ฒํผ ํด๋ฆญ ์์๋ง rerun์ด ๋ฐ์ํ๋๋ก ํ๋ค", | |
| "explanation": "์ผ๋ฐ ์์ ฏ์ ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค rerun๋ฉ๋๋ค. `st.form`์ผ๋ก ๋ฌถ์ผ๋ฉด Submit ๋ฒํผ์ ๋๋ฅผ ๋๋ง rerun๋์ด ๋ถํ์ํ ์ฌ์คํ์ ๋ง๊ณ UX๋ฅผ ๊ฐ์ ํฉ๋๋ค.", | |
| "source_id": "official-docs-streamlit" | |
| }, | |
| { | |
| "id": "docs-q18", | |
| "lesson_id": "docs-hf-spaces", | |
| "question_type": "multiple_choice", | |
| "question": "Hugging Face `pipeline()` ํจ์๋ก ๊ฐ์ฑ ๋ถ์ ํ์คํฌ๋ฅผ ์คํํ๋ ค๋ฉด?", | |
| "options": [ | |
| "pipeline('sentiment-analysis')", | |
| "pipeline('classification')", | |
| "pipeline('text-generation')", | |
| "pipeline('translation')" | |
| ], | |
| "answer": "pipeline('sentiment-analysis')", | |
| "explanation": "`from transformers import pipeline; classifier = pipeline('sentiment-analysis')` ๋ก ๊ธฐ๋ณธ ๊ฐ์ฑ ๋ถ์ ๋ชจ๋ธ์ ๋ก๋ํฉ๋๋ค. ๊ฒฐ๊ณผ๋ `[{'label': 'POSITIVE', 'score': 0.99}]` ํ์์ ๋๋ค.", | |
| "source_id": "official-docs-huggingface" | |
| }, | |
| { | |
| "id": "docs-q19", | |
| "lesson_id": "docs-lcel", | |
| "question_type": "multiple_choice", | |
| "question": "LangChain LCEL(LangChain Expression Language)์์ `|` ์ฐ์ฐ์์ ์ญํ ์?", | |
| "options": [ | |
| "์ ๋จ๊ณ์ ์ถ๋ ฅ์ ๋ค์ ๋จ๊ณ์ ์ ๋ ฅ์ผ๋ก ์ฐ๊ฒฐํ๋ ์ฒด์ธ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๋ค", | |
| "๋ ์ฒด์ธ์ ๋ณ๋ ฌ๋ก ์คํํ๋ค", | |
| "์ฒด์ธ์ ์ทจ์ํ๋ค", | |
| "์ถ๋ ฅ์ JSON์ผ๋ก ๋ณํํ๋ค" | |
| ], | |
| "answer": "์ ๋จ๊ณ์ ์ถ๋ ฅ์ ๋ค์ ๋จ๊ณ์ ์ ๋ ฅ์ผ๋ก ์ฐ๊ฒฐํ๋ ์ฒด์ธ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๋ค", | |
| "explanation": "LCEL์ `|`๋ ์ ๋์ค ํ์ดํ์ ๊ฐ์ ๊ฐ๋ ์ ๋๋ค. `chain = retriever | prompt | llm | parser`์ฒ๋ผ ๊ฐ Runnable์ ์ถ๋ ฅ์ด ๋ค์ ์ ๋ ฅ์ด ๋ฉ๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q21", | |
| "lesson_id": "docs-lcel", | |
| "question_type": "multiple_choice", | |
| "question": "LangChain LCEL์์ `RunnableParallel`์ ์ฌ์ฉํ๋ ๋ชฉ์ ์?", | |
| "options": [ | |
| "์ฌ๋ฌ Runnable์ ๋์์ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋์ ๋๋ฆฌ๋ก ํฉ์น๋ค", | |
| "์ฒด์ธ์ ์์ฐจ์ ์ผ๋ก ์คํํ๋ค", | |
| "๊ฒฐ๊ณผ๋ฅผ ์บ์ํ๋ค", | |
| "์๋ฌ๋ฅผ ๋ฌด์ํ๋ค" | |
| ], | |
| "answer": "์ฌ๋ฌ Runnable์ ๋์์ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋์ ๋๋ฆฌ๋ก ํฉ์น๋ค", | |
| "explanation": "`RunnableParallel({'context': retriever, 'question': RunnablePassthrough()})`์ฒ๋ผ ์ฌ๋ฌ ๋ธ๋์น๋ฅผ ๋ณ๋ ฌ ์คํํด dict๋ก ํฉ์นฉ๋๋ค. RAG์์ ์ปจํ ์คํธ ๊ฒ์๊ณผ ์ง๋ฌธ ์ ๋ฌ์ ๋์์ ์ฒ๋ฆฌํ ๋ ์๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q22", | |
| "lesson_id": "docs-vectorstore", | |
| "question_type": "multiple_choice", | |
| "question": "FAISS Vector Store์์ `similarity_search(query, k=4)`์ `k` ํ๋ผ๋ฏธํฐ์ ์๋ฏธ๋?", | |
| "options": [ | |
| "๋ฐํํ ์ ์ฌ ๋ฌธ์ ์ฒญํฌ์ ์ต๋ ์", | |
| "๊ฒ์ ์๋ฒ ๋ฉ ์ฐจ์ ์", | |
| "์ต์ ์ ์ฌ๋ ์ ์", | |
| "์ธ๋ฑ์ค ํ์ผ ๋ฒ์ " | |
| ], | |
| "answer": "๋ฐํํ ์ ์ฌ ๋ฌธ์ ์ฒญํฌ์ ์ต๋ ์", | |
| "explanation": "`k`๋ ๊ฐ์ฅ ์ ์ฌํ ์์ k๊ฐ์ ์ฒญํฌ๋ฅผ ๋ฐํํฉ๋๋ค. k๊ฐ ํฌ๋ฉด ๋ ๋ง์ ์ปจํ ์คํธ๋ฅผ LLM์ ์ ๊ณตํ์ง๋ง ํ๋กฌํํธ ๊ธธ์ด๊ฐ ๋์ด๋ฉ๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q23", | |
| "lesson_id": "docs-streamlit-secrets", | |
| "question_type": "command", | |
| "question": "Streamlit ์ฑ ์ฝ๋์์ secrets.toml์ `OPENAI_API_KEY` ๊ฐ์ ์ฝ๋ ๋ฐฉ๋ฒ์ ์ ๋ ฅํ์ธ์.", | |
| "options": [], | |
| "answer": "st.secrets[\"OPENAI_API_KEY\"]", | |
| "explanation": "`st.secrets[\"ํค์ด๋ฆ\"]` ๋๋ `st.secrets.ํค์ด๋ฆ`์ผ๋ก ์ ๊ทผํฉ๋๋ค. ๋ฐฐํฌ ์ Streamlit Cloud์ Secrets ๊ด๋ฆฌ ํ๋ฉด์์ ๋์ผ ํค๋ก ๋ฑ๋กํ๋ฉด ๋ฉ๋๋ค.", | |
| "source_id": "official-docs-streamlit" | |
| }, | |
| { | |
| "id": "docs-q24", | |
| "lesson_id": "docs-hf-docker-space", | |
| "question_type": "multiple_choice", | |
| "question": "Hugging Face Docker Space์์ ํ๊ฒฝ๋ณ์(API ํค ๋ฑ)๋ฅผ ์์ ํ๊ฒ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์?", | |
| "options": [ | |
| "Space Settings์ Repository Secrets์ ๋ฑ๋กํ๋ฉด ๋น๋/๋ฐํ์ ํ๊ฒฝ๋ณ์๋ก ์ฃผ์ ๋๋ค", | |
| "Dockerfile์ ENV๋ก ํ๋์ฝ๋ฉํ๋ค", | |
| "requirements.txt์ ์ถ๊ฐํ๋ค", | |
| "README ๋ฉํ๋ฐ์ดํฐ์ base64๋ก ์ธ์ฝ๋ฉํด ๋ฃ๋๋ค" | |
| ], | |
| "answer": "Space Settings์ Repository Secrets์ ๋ฑ๋กํ๋ฉด ๋น๋/๋ฐํ์ ํ๊ฒฝ๋ณ์๋ก ์ฃผ์ ๋๋ค", | |
| "explanation": "HF Space์ Repository Secrets๋ Docker ๋น๋์ ์ปจํ ์ด๋ ๋ฐํ์์ ํ๊ฒฝ๋ณ์๋ก ์ฃผ์ ๋ฉ๋๋ค. Dockerfile์ด๋ ์ฝ๋์ ๋น๋ฐ์ ํ๋์ฝ๋ฉํ๋ฉด ๊ณต๊ฐ ์ ์ฅ์์์ ๋ ธ์ถ๋ฉ๋๋ค.", | |
| "source_id": "official-docs-huggingface" | |
| }, | |
| { | |
| "id": "docs-q20", | |
| "lesson_id": "docs-ollama-api", | |
| "question_type": "command", | |
| "question": "Ollama REST API๋ก `llama3.2` ๋ชจ๋ธ์ 'Hello' ํ๋กฌํํธ๋ฅผ ์คํธ๋ฆฌ๋ฐ ์์ด ์์ฒญํ๋ curl ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ธ์.", | |
| "options": [], | |
| "answer": "curl http://localhost:11434/api/generate -d '{\"model\":\"llama3.2\",\"prompt\":\"Hello\",\"stream\":false}'", | |
| "explanation": "Ollama API๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํธ๋ฆฌ๋ฐ ์๋ต์ ๋ฐํํฉ๋๋ค. `\"stream\": false`๋ฅผ ์ถ๊ฐํ๋ฉด ์์ฑ๋ ์๋ต์ ํ ๋ฒ์ ๋ฐ์ ์ ์์ต๋๋ค.", | |
| "source_id": "official-docs-ollama" | |
| }, | |
| { | |
| "id": "docs-q25", | |
| "lesson_id": "docs-fastapi", | |
| "question_type": "multiple_choice", | |
| "question": "FastAPI์์ POST `/ask` ์๋ํฌ์ธํธ๋ฅผ ์ ์ํ ๋ ์์ฒญ ๋ฐ๋๋ฅผ ๊ฒ์ฆํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์?", | |
| "options": [ | |
| "Pydantic BaseModel์ ์์ํ ํด๋์ค๋ฅผ ํ๋ผ๋ฏธํฐ ํ์ ์ผ๋ก ์ง์ ํ๋ค", | |
| "request.body()๋ฅผ ์๋์ผ๋ก ํ์ฑํ๋ค", | |
| "์ ์ญ ๋์ ๋๋ฆฌ์ JSON์ ์ ์ฅํ๋ค", | |
| "Flask์ request.json์ ์ฌ์ฉํ๋ค" | |
| ], | |
| "answer": "Pydantic BaseModel์ ์์ํ ํด๋์ค๋ฅผ ํ๋ผ๋ฏธํฐ ํ์ ์ผ๋ก ์ง์ ํ๋ค", | |
| "explanation": "FastAPI๋ ํจ์ ํ๋ผ๋ฏธํฐ์ Pydantic ๋ชจ๋ธ์ ํ์ ํํธ๋ก ์ง์ ํ๋ฉด ์๋์ผ๋ก JSON ๋ฐ๋๋ฅผ ํ์ฑยท๊ฒ์ฆํฉ๋๋ค. ์๋ชป๋ ์ ๋ ฅ์ 422 ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.", | |
| "source_id": "official-docs-fastapi" | |
| }, | |
| { | |
| "id": "docs-q26", | |
| "lesson_id": "docs-fastapi", | |
| "question_type": "multiple_choice", | |
| "question": "FastAPI ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์๋ ์ฌ์์(reload) ๋ชจ๋๋ก ์คํํ๋ ๋ช ๋ น์ด๋?", | |
| "options": [ | |
| "uvicorn main:app --reload", | |
| "python main.py --dev", | |
| "fastapi run --watch main.py", | |
| "gunicorn main:app --workers 1" | |
| ], | |
| "answer": "uvicorn main:app --reload", | |
| "explanation": "`uvicorn main:app --reload`๋ ํ์ผ ๋ณ๊ฒฝ์ ๊ฐ์งํด ์๋ฒ๋ฅผ ์๋ ์ฌ์์ํฉ๋๋ค. `main`์ ํ์ด์ฌ ํ์ผ๋ช , `app`์ FastAPI ์ธ์คํด์ค ๋ณ์๋ช ์ ๋๋ค.", | |
| "source_id": "official-docs-fastapi" | |
| }, | |
| { | |
| "id": "docs-q27", | |
| "lesson_id": "docs-langsmith", | |
| "question_type": "multiple_choice", | |
| "question": "LangSmith ์ถ์ ์ ํ์ฑํํ๊ธฐ ์ํด ๋ฐ๋์ ์ค์ ํด์ผ ํ๋ ํ๊ฒฝ๋ณ์๊ฐ ์๋ ๊ฒ์?", | |
| "options": [ | |
| "LANGCHAIN_MODEL", | |
| "LANGCHAIN_TRACING_V2", | |
| "LANGCHAIN_API_KEY", | |
| "LANGCHAIN_PROJECT" | |
| ], | |
| "answer": "LANGCHAIN_MODEL", | |
| "explanation": "LangSmith ์ถ์ ์ ํ์ํ ํ๊ฒฝ๋ณ์๋ `LANGCHAIN_TRACING_V2=true`, `LANGCHAIN_API_KEY`, `LANGCHAIN_PROJECT` ์ธ ๊ฐ์ง์ ๋๋ค. ๋ชจ๋ธ๋ช ์ ์ฒด์ธ ์ฝ๋์์ ์ง์ ์ง์ ํฉ๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q28", | |
| "lesson_id": "docs-langsmith", | |
| "question_type": "multiple_choice", | |
| "question": "LangSmith์์ ํ๋ก๋์ ์ค๋ฅ ์ผ์ด์ค๋ฅผ ์์งํด ์๋ํ๋ ํ์ง ํ ์คํธ๋ฅผ ๋ง๋๋ ๊ธฐ๋ฅ์?", | |
| "options": [ | |
| "Dataset + Evaluator๋ก ํ๊ฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๋ค", | |
| "A/B ํ ์คํธ๋ก ๋ชจ๋ธ์ ๋น๊ตํ๋ค", | |
| "ํ๋กฌํํธ๋ฅผ ์๋ ์ต์ ํํ๋ค", | |
| "๋ชจ๋ธ์ ํ์ธํ๋ํ๋ค" | |
| ], | |
| "answer": "Dataset + Evaluator๋ก ํ๊ฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๋ค", | |
| "explanation": "LangSmith์ Dataset์ ํ ์คํธ ์ผ์ด์ค(์ ์ถ๋ ฅ ์)๋ฅผ ์ ์ฅํ๊ณ , Evaluator(LLM-as-judge ๋ฑ)๋ก ์๋ ์ฑ์ ํฉ๋๋ค. CI์ ํตํฉํด ํ๋กฌํํธ ๋ณ๊ฒฝ ์ ํ๊ท ํ ์คํธ๋ฅผ ํ ์ ์์ต๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q29", | |
| "lesson_id": "docs-guardrails", | |
| "question_type": "multiple_choice", | |
| "question": "Guardrails AI์์ LLM ์ถ๋ ฅ์ด ๊ฒ์ฆ ์คํจ ์ ์๋์ผ๋ก LLM์ ์ฌ์์ฒญํ๋ `on_fail` ๋์์?", | |
| "options": [ | |
| "reask", | |
| "exception", | |
| "noop", | |
| "fix" | |
| ], | |
| "answer": "reask", | |
| "explanation": "`on_fail='reask'`๋ ๊ฒ์ฆ ์คํจ ์ LLM์ ์์ ์์ฒญ์ ์๋์ผ๋ก ๋ค์ ๋ณด๋ ๋๋ค. `exception`์ ์์ธ ๋ฐ์, `noop`์ ๊ทธ๋ฅ ํต๊ณผ, `fix`๋ ์๋ ์์ ์ ์๋ํฉ๋๋ค.", | |
| "source_id": "official-docs-guardrails" | |
| }, | |
| { | |
| "id": "docs-q30", | |
| "lesson_id": "docs-guardrails", | |
| "question_type": "multiple_choice", | |
| "question": "Guardrails AI๋ก LLM์ด ํญ์ ์ง์ ํ JSON ์คํค๋ง๋ฅผ ๋ฐํํ๋๋ก ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์?", | |
| "options": [ | |
| "Guard.from_pydantic(OutputModel)์ผ๋ก Guard๋ฅผ ์์ฑํ๋ค", | |
| "LLM ํ๋กฌํํธ์ JSON ์ถ๋ ฅ์ ์์ฒญํ๋ค", | |
| "json.loads()๋ก ์ถ๋ ฅ์ ํ์ฑํ๋ค", | |
| "OpenAI์ function_calling ํ๋ผ๋ฏธํฐ๋ฅผ ์ด๋ค" | |
| ], | |
| "answer": "Guard.from_pydantic(OutputModel)์ผ๋ก Guard๋ฅผ ์์ฑํ๋ค", | |
| "explanation": "`Guard.from_pydantic(OutputModel)`์ Pydantic ๋ชจ๋ธ์ JSON ์คํค๋ง๋ก ๋ณํํด LLM ์ถ๋ ฅ์ด ์ด ์คํค๋ง๋ฅผ ๋ฐ๋ฅด๋๋ก ๊ฐ์ ํฉ๋๋ค. ํ์์ด ๋ง์ง ์์ผ๋ฉด reask ๋๋ exception์ด ๋ฐ์ํฉ๋๋ค.", | |
| "source_id": "official-docs-guardrails" | |
| }, | |
| { | |
| "id": "docs-q31", | |
| "lesson_id": "docs-gradio", | |
| "question_type": "multiple_choice", | |
| "question": "Gradio์์ LLM ์ฑ๋ด UI๋ฅผ ๊ฐ์ฅ ๊ฐ๋จํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์?", | |
| "options": [ | |
| "gr.ChatInterface(fn=chat_function)์ผ๋ก ์ฑํ ํจ์๋ฅผ ๊ฐ์ผ๋ค", | |
| "gr.Interface(fn=chat)์ ํ ์คํธ ์ ์ถ๋ ฅ์ ์ง์ ํ๋ค", | |
| "gr.Blocks()์ gr.Textbox๋ฅผ ์๋์ผ๋ก ๋ฐฐ์นํ๋ค", | |
| "Streamlit์ st.chat_message๋ฅผ ์ํฌํธํด ์ด๋ค" | |
| ], | |
| "answer": "gr.ChatInterface(fn=chat_function)์ผ๋ก ์ฑํ ํจ์๋ฅผ ๊ฐ์ผ๋ค", | |
| "explanation": "`gr.ChatInterface`๋ ์ฑํ UI์ ์ต์ ํ๋ ์ปดํฌ๋ํธ์ ๋๋ค. ํจ์๊ฐ `(message, history) -> str` ์๊ทธ๋์ฒ๋ฅผ ๋ฐ๋ฅด๋ฉด ์๋์ผ๋ก ๋ํ ํ์คํ ๋ฆฌ UI์ Submit ๋ฒํผ์ด ์์ฑ๋ฉ๋๋ค.", | |
| "source_id": "official-docs-gradio" | |
| }, | |
| { | |
| "id": "docs-q32", | |
| "lesson_id": "docs-gradio", | |
| "question_type": "multiple_choice", | |
| "question": "Gradio์์ ๋ณต์กํ ๋ ์ด์์(์ฌ์ด๋๋ฐ, ํญ ๋ฑ)์ ์์ ๋กญ๊ฒ ๊ตฌ์ฑํ๋ ค๋ฉด?", | |
| "options": [ | |
| "gr.Blocks() ์ปจํ ์คํธ ๋งค๋์ ์์์ ์ปดํฌ๋ํธ๋ฅผ ๋ฐฐ์นํ๋ค", | |
| "gr.Interface์ layout ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ ํ๋ค", | |
| "CSS๋ฅผ ์ง์ ์์ ํ๋ค", | |
| "Streamlit ์ปดํฌ๋ํธ๋ฅผ Gradio์ ์๋ฒ ๋ํ๋ค" | |
| ], | |
| "answer": "gr.Blocks() ์ปจํ ์คํธ ๋งค๋์ ์์์ ์ปดํฌ๋ํธ๋ฅผ ๋ฐฐ์นํ๋ค", | |
| "explanation": "`gr.Blocks()`๋ Gradio์ ์ ์์ค ๋ ์ด์์ API์ ๋๋ค. `with gr.Row():`, `with gr.Tab():` ๋ฑ์ ์ค์ฒฉํด ์์ ๋กญ๊ฒ UI๋ฅผ ๊ตฌ์ฑํ๊ณ ์ปดํฌ๋ํธ ๊ฐ ์ด๋ฒคํธ๋ฅผ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.", | |
| "source_id": "official-docs-gradio" | |
| }, | |
| { | |
| "id": "docs-q33", | |
| "lesson_id": "docs-airflow", | |
| "question_type": "multiple_choice", | |
| "question": "Airflow DAG์์ `task_a >> task_b >> task_c`์ ์๋ฏธ๋?", | |
| "options": [ | |
| "task_a โ task_b โ task_c ์์๋ก ์์ฐจ ์คํ๋๋ค", | |
| "์ธ ํ์คํฌ๊ฐ ๋์์ ๋ณ๋ ฌ ์คํ๋๋ค", | |
| "task_c๊ฐ ์คํจํ๋ฉด task_a๋ก ๋กค๋ฐฑ๋๋ค", | |
| "task_b๋ task_a์ task_c์ ์ถ๋ ฅ์ ํฉ์น๋ค" | |
| ], | |
| "answer": "task_a โ task_b โ task_c ์์๋ก ์์ฐจ ์คํ๋๋ค", | |
| "explanation": "`>>` ์ฐ์ฐ์๋ ์คํ ์์กด์ฑ์ ์ ์ํฉ๋๋ค. `task_a >> task_b`๋ task_a๊ฐ ์ฑ๊ณตํ ๋ค์๋ง task_b๊ฐ ์คํ๋๋ค๋ ์๋ฏธ์ ๋๋ค. ๋ณ๋ ฌ ์คํ์ `[task_b, task_c] >> task_d`์ฒ๋ผ ๋ฆฌ์คํธ๋ก ํํํฉ๋๋ค.", | |
| "source_id": "official-docs-airflow" | |
| }, | |
| { | |
| "id": "docs-q34", | |
| "lesson_id": "docs-airflow", | |
| "question_type": "multiple_choice", | |
| "question": "Airflow์์ task ๊ฐ ์๋์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฉ์ปค๋์ฆ์?", | |
| "options": [ | |
| "XCom (Cross-Communication)", | |
| "์ ์ญ ๋ณ์", | |
| "ํ์ผ ์์คํ ์ ์์ ํ์ผ", | |
| "Airflow Variable" | |
| ], | |
| "answer": "XCom (Cross-Communication)", | |
| "explanation": "XCom์ `ti.xcom_push(key, value)`๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๋ค๋ฅธ task์์ `ti.xcom_pull(task_ids, key)`๋ก ๊ฐ์ ธ์ต๋๋ค. ๋์ฉ๋ ๋ฐ์ดํฐ๋ S3/GCS ๊ฒฝ๋ก๋ฅผ XCom์ผ๋ก ์ ๋ฌํ๋ ๋ฐฉ์์ ์๋๋ค.", | |
| "source_id": "official-docs-airflow" | |
| }, | |
| { | |
| "id": "docs-q35", | |
| "lesson_id": "docs-mlflow", | |
| "question_type": "multiple_choice", | |
| "question": "MLflow์์ ์คํ ํ๋ผ๋ฏธํฐ์ ๋ฉํธ๋ฆญ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ธฐ๋กํ๋ ๋ฐฉ๋ฒ์?", | |
| "options": [ | |
| "with mlflow.start_run(): ๋ธ๋ก ์์์ mlflow.log_param()๊ณผ mlflow.log_metric()์ ํธ์ถํ๋ค", | |
| "mlflow.track(params={}, metrics={})๋ฅผ ํ ๋ฒ ํธ์ถํ๋ค", | |
| "print() ์ถ๋ ฅ์ด ์๋์ผ๋ก MLflow์ ๊ธฐ๋ก๋๋ค", | |
| "mlflow.autolog()๋ง ํธ์ถํ๋ฉด ๋ชจ๋ ๊ฒ์ด ๊ธฐ๋ก๋๋ค" | |
| ], | |
| "answer": "with mlflow.start_run(): ๋ธ๋ก ์์์ mlflow.log_param()๊ณผ mlflow.log_metric()์ ํธ์ถํ๋ค", | |
| "explanation": "`with mlflow.start_run():` ์ปจํ ์คํธ ๋งค๋์ ๊ฐ run์ ์์ฑํ๊ณ , ๊ทธ ์์์ `log_param`(ํ๋ผ๋ฏธํฐ), `log_metric`(๋ฉํธ๋ฆญ), `log_artifact`(ํ์ผ)๋ฅผ ํธ์ถํฉ๋๋ค.", | |
| "source_id": "official-docs-mlflow" | |
| }, | |
| { | |
| "id": "docs-q36", | |
| "lesson_id": "docs-mlflow", | |
| "question_type": "multiple_choice", | |
| "question": "MLflow UI๋ฅผ ๋ก์ปฌ์์ ์คํํ๋ ๋ช ๋ น์ด๋?", | |
| "options": [ | |
| "mlflow ui", | |
| "mlflow server --start", | |
| "python -m mlflow.dashboard", | |
| "mlflow run --ui" | |
| ], | |
| "answer": "mlflow ui", | |
| "explanation": "`mlflow ui` ๋ช ๋ น์ผ๋ก localhost:5000์์ ์คํ ๋น๊ต ๋์๋ณด๋๋ฅผ ์คํํฉ๋๋ค. ์คํ ๋ชฉ๋ก, ํ๋ผ๋ฏธํฐยท๋ฉํธ๋ฆญ ๋น๊ต ์ฐจํธ, ์ํฐํฉํธ ๋ธ๋ผ์ฐ์ ๋ฅผ ์น UI๋ก ๋ณผ ์ ์์ต๋๋ค.", | |
| "source_id": "official-docs-mlflow" | |
| }, | |
| { | |
| "id": "docs-q37", | |
| "lesson_id": "docs-mcp", | |
| "question_type": "multiple_choice", | |
| "question": "MCP(Model Context Protocol)์์ `tool`์ ์ญํ ์?", | |
| "options": [ | |
| "LLM์ด ์ง์ ํธ์ถํ ์ ์๋ ํจ์๋ก, ์ ์ถ๋ ฅ ์คํค๋ง๊ฐ ์๋ ์์ฑ๋๋ค", | |
| "LLM์ด ์ฝ๋ ์ ์ ๋ฐ์ดํฐ ์์ค", | |
| "์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋กฌํํธ ํ ํ๋ฆฟ", | |
| "MCP ์๋ฒ์ ์ค์ ํ์ผ" | |
| ], | |
| "answer": "LLM์ด ์ง์ ํธ์ถํ ์ ์๋ ํจ์๋ก, ์ ์ถ๋ ฅ ์คํค๋ง๊ฐ ์๋ ์์ฑ๋๋ค", | |
| "explanation": "MCP `tool`์ LLM์ด ๋ํ ์ค ์ง์ ํธ์ถํ ์ ์๋ ํจ์์ ๋๋ค. FastMCP์ `@mcp.tool()` ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ถ์ด๋ฉด ํจ์ ์๊ทธ๋์ฒ์์ JSON Schema๊ฐ ์๋ ์์ฑ๋ฉ๋๋ค.", | |
| "source_id": "official-docs-mcp" | |
| }, | |
| { | |
| "id": "docs-q51", | |
| "lesson_id": "docs-chroma", | |
| "question_type": "multiple_choice", | |
| "question": "FAISS์ ๋น๊ตํ์ ๋ Chroma์ ๊ฐ์ฅ ํฐ ์ฅ์ ์?", | |
| "options": [ | |
| "persist_directory๋ง ์ง์ ํ๋ฉด ์๋ฒ ์ฌ์์ ํ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ ์ ์ง๋๋ค", | |
| "๊ฒ์ ์๋๊ฐ FAISS๋ณด๋ค 10๋ฐฐ ๋น ๋ฅด๋ค", | |
| "GPU ์์ด ์๋ฒ ๋ฉ์ ์์ฑํ ์ ์๋ค", | |
| "OpenAI API ์์ด ๋์ํ๋ค" | |
| ], | |
| "answer": "persist_directory๋ง ์ง์ ํ๋ฉด ์๋ฒ ์ฌ์์ ํ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ ์ ์ง๋๋ค", | |
| "explanation": "FAISS๋ ์ธ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ผ๋ก `save_local()`์ ์๋ ํธ์ถํด์ผ ํฉ๋๋ค. Chroma๋ `persist_directory`๋ฅผ ์ง์ ํ๋ฉด SQLite ๊ธฐ๋ฐ ๋ก์ปฌ DB์ ์๋ ์ ์ฅ๋์ด ์ฌ์์ ํ์๋ ์ ์ง๋ฉ๋๋ค.", | |
| "source_id": "official-docs-chromadb" | |
| }, | |
| { | |
| "id": "docs-q52", | |
| "lesson_id": "docs-chroma", | |
| "question_type": "multiple_choice", | |
| "question": "๊ธฐ์กด Chroma DB์์ ๋ฉํ๋ฐ์ดํฐ ์กฐ๊ฑด์ผ๋ก ๊ฒ์ ๋ฒ์๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ์?", | |
| "options": [ | |
| "db.similarity_search(query, filter={\"source\": \"file.pdf\"})", | |
| "db.search(query, where={\"source\": \"file.pdf\"})", | |
| "db.similarity_search(query, metadata=\"file.pdf\")", | |
| "Chroma๋ ๋ฉํ๋ฐ์ดํฐ ํํฐ๋ง์ ์ง์ํ์ง ์๋๋ค" | |
| ], | |
| "answer": "db.similarity_search(query, filter={\"source\": \"file.pdf\"})", | |
| "explanation": "`filter` ํ๋ผ๋ฏธํฐ๋ก ๋ฉํ๋ฐ์ดํฐ ์กฐ๊ฑด์ ์ง์ ํ๋ฉด ํด๋น ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฌธ์ ์ค์์๋ง ์ ์ฌ๋ ๊ฒ์์ ํฉ๋๋ค. FAISS์๋ ์๋ ๊ธฐ๋ฅ์ ๋๋ค.", | |
| "source_id": "official-docs-chromadb" | |
| }, | |
| { | |
| "id": "docs-q53", | |
| "lesson_id": "docs-sentence-transformers", | |
| "question_type": "multiple_choice", | |
| "question": "LangChain์์ sentence-transformers ๋ก์ปฌ ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ํด๋์ค๋?", | |
| "options": [ | |
| "HuggingFaceEmbeddings", | |
| "SentenceTransformerEmbeddings", | |
| "LocalEmbeddings", | |
| "OllamaEmbeddings" | |
| ], | |
| "answer": "HuggingFaceEmbeddings", | |
| "explanation": "`from langchain_huggingface import HuggingFaceEmbeddings`๋ก ๊ฐ์ ธ์ `model_name`์ HuggingFace ๋ชจ๋ธ ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค. `sentence-transformers/all-MiniLM-L6-v2`๊ฐ ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ๊ธฐ๋ณธ ๋ชจ๋ธ์ ๋๋ค.", | |
| "source_id": "official-docs-huggingface" | |
| }, | |
| { | |
| "id": "docs-q54", | |
| "lesson_id": "docs-sentence-transformers", | |
| "question_type": "multiple_choice", | |
| "question": "sentence-transformers ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ๊ต์ฒดํ ๋ ๋ฐ๋์ ํด์ผ ํ๋ ์์ ์?", | |
| "options": [ | |
| "๊ธฐ์กด VectorStore ์ ์ฒด๋ฅผ ์ ๋ชจ๋ธ๋ก ์ฌ์ธ๋ฑ์ฑํ๋ค", | |
| "๋ชจ๋ธ ํ์ผ์ ๋ฎ์ด์ฐ๊ธฐ๋ง ํ๋ฉด ๋๋ค", | |
| "VectorStore์ dimension ํ๋ผ๋ฏธํฐ๋ฅผ ์์ ํ๋ค", | |
| "์๋ฒ ๋ฉ ๋ชจ๋ธ์ ์ธ์ ๋ ์์ ๋กญ๊ฒ ๊ต์ฒด ๊ฐ๋ฅํ๋ค" | |
| ], | |
| "answer": "๊ธฐ์กด VectorStore ์ ์ฒด๋ฅผ ์ ๋ชจ๋ธ๋ก ์ฌ์ธ๋ฑ์ฑํ๋ค", | |
| "explanation": "์๋ฒ ๋ฉ ๋ชจ๋ธ์ด ๋ค๋ฅด๋ฉด ๋ฒกํฐ ๊ณต๊ฐ์ด ๋ฌ๋ผ์ง๋๋ค. ๊ธฐ์กด ์ธ๋ฑ์ค์ ๋ฒกํฐ์ ์ ๋ชจ๋ธ๋ก ์์ฑํ ์ฟผ๋ฆฌ ๋ฒกํฐ๊ฐ ํธํ๋์ง ์์ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์ํฐ๋ฆฌ๊ฐ ๋ฉ๋๋ค. ์ ์ฒด ์ฌ์ธ๋ฑ์ฑ์ด ํ์์ ๋๋ค.", | |
| "source_id": "official-docs-huggingface" | |
| }, | |
| { | |
| "id": "docs-q55", | |
| "lesson_id": "docs-ragas", | |
| "question_type": "multiple_choice", | |
| "question": "Ragas์ Faithfulness ๋ฉํธ๋ฆญ์ด ์ธก์ ํ๋ ๊ฒ์?", | |
| "options": [ | |
| "LLM ๋ต๋ณ์ด ๊ฒ์๋ ์ปจํ ์คํธ์ ๊ทผ๊ฑฐํ๋๊ฐ (ํ๊ฐ ํ์ง)", | |
| "๊ฒ์๋ ๋ฌธ์๊ฐ ์ง๋ฌธ๊ณผ ๊ด๋ จ ์๋๊ฐ", | |
| "๋ต๋ณ์ด ground_truth์ ์ผ์นํ๋๊ฐ", | |
| "RAG ํ์ดํ๋ผ์ธ์ ์คํ ์๋" | |
| ], | |
| "answer": "LLM ๋ต๋ณ์ด ๊ฒ์๋ ์ปจํ ์คํธ์ ๊ทผ๊ฑฐํ๋๊ฐ (ํ๊ฐ ํ์ง)", | |
| "explanation": "Faithfulness๋ LLM์ด ๊ฒ์๋ ์ปจํ ์คํธ์ ์๋ ๋ด์ฉ์ ์ง์ด๋ด์ง ์๋์ง ์ธก์ ํฉ๋๋ค. 1.0์ ๊ฐ๊น์ธ์๋ก ํ๊ฐ์ด ์์ต๋๋ค. Answer Relevancy๋ ๋ต๋ณ์ด ์ง๋ฌธ๊ณผ ๊ด๋ จ ์๋์ง, Context Precision์ ๊ด๋ จ ๋ฌธ์๊ฐ ์ ๊ฒ์๋๋์ง์ ๋๋ค.", | |
| "source_id": "official-docs-ragas" | |
| }, | |
| { | |
| "id": "docs-q56", | |
| "lesson_id": "docs-ragas", | |
| "question_type": "multiple_choice", | |
| "question": "Ragas evaluate() ํจ์์ ํ์๋ก ์ ๋ฌํด์ผ ํ๋ ๋ฐ์ดํฐ ํค๊ฐ ์๋ ๊ฒ์?", | |
| "options": [ | |
| "ground_truth (faithfulness๋ง ๊ณ์ฐํ ๊ฒฝ์ฐ)", | |
| "question", | |
| "answer", | |
| "contexts" | |
| ], | |
| "answer": "ground_truth (faithfulness๋ง ๊ณ์ฐํ ๊ฒฝ์ฐ)", | |
| "explanation": "`question`, `answer`, `contexts`๋ ๊ธฐ๋ณธ ๋ฉํธ๋ฆญ์ ํ์์ ๋๋ค. `ground_truth`๋ Answer Correctness ๋ฉํธ๋ฆญ์๋ง ํ์ํ๋ฉฐ, faithfulness์ answer_relevancy๋ง ๊ณ์ฐํ ๊ฒฝ์ฐ ์์ด๋ ๋ฉ๋๋ค.", | |
| "source_id": "official-docs-ragas" | |
| }, | |
| { | |
| "id": "docs-q57", | |
| "lesson_id": "docs-langgraph", | |
| "question_type": "multiple_choice", | |
| "question": "LangGraph์์ ๋ ธ๋์ ์คํ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ค์ ๋ ธ๋๋ฅผ ๋์ ์ผ๋ก ๊ฒฐ์ ํ๋ ๋ฉ์๋๋?", | |
| "options": [ | |
| "graph.add_conditional_edges()", | |
| "graph.add_edge()", | |
| "graph.set_next_node()", | |
| "graph.branch()" | |
| ], | |
| "answer": "graph.add_conditional_edges()", | |
| "explanation": "`graph.add_conditional_edges('node', router_fn, {'yes': 'next_node', 'no': END})`๋ก ๋ ธ๋ ๋ฐํ๊ฐ์ ๋ฐ๋ผ ๋ค์ ๋ ธ๋๋ฅผ ๋์ ์ผ๋ก ๊ฒฐ์ ํฉ๋๋ค. ๊ณ ์ ๋ ๋ค์ ๋ ธ๋๋ `add_edge()`๋ฅผ ์๋๋ค.", | |
| "source_id": "official-docs-langgraph" | |
| }, | |
| { | |
| "id": "docs-q58", | |
| "lesson_id": "docs-langgraph", | |
| "question_type": "multiple_choice", | |
| "question": "LangGraph StateGraph์์ State TypedDict๋ฅผ ์ ์ํ๋ ์ด์ ๋?", | |
| "options": [ | |
| "๋ ธ๋ ๊ฐ ๊ณต์ ๋๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ์ ์์ ํ๊ฒ ์ ์ํ๊ธฐ ์ํด", | |
| "๊ทธ๋ํ ์คํ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด", | |
| "LangChain ์ฒด์ธ๊ณผ ํธํ์ฑ์ ์ํด", | |
| "State๋ ์ ํ ์ฌํญ์ผ๋ก ์ ์ํ์ง ์์๋ ๋๋ค" | |
| ], | |
| "answer": "๋ ธ๋ ๊ฐ ๊ณต์ ๋๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ์ ์์ ํ๊ฒ ์ ์ํ๊ธฐ ์ํด", | |
| "explanation": "State TypedDict๋ ๋ชจ๋ ๋ ธ๋๊ฐ ์ฝ๊ณ ์ฐ๋ ๊ณต์ ์ํ๋ฅผ ์ ์ํฉ๋๋ค. ๊ฐ ๋ ธ๋ ํจ์๋ `state: State`๋ฅผ ๋ฐ์ ์ผ๋ถ ํค๋ฅผ ์ ๋ฐ์ดํธํ ๋์ ๋๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค.", | |
| "source_id": "official-docs-langgraph" | |
| }, | |
| { | |
| "id": "docs-q59", | |
| "lesson_id": "docs-litellm", | |
| "question_type": "multiple_choice", | |
| "question": "LiteLLM์์ Ollama ๋ก์ปฌ ๋ชจ๋ธ์ ํธ์ถํ๋ model ํ๋ผ๋ฏธํฐ ํ์์?", | |
| "options": [ | |
| "\"ollama/llama3.2\"", | |
| "\"local/llama3.2\"", | |
| "\"llama3.2\"", | |
| "\"ollama:llama3.2\"" | |
| ], | |
| "answer": "\"ollama/llama3.2\"", | |
| "explanation": "LiteLLM์ ๋ชจ๋ธ๋ช ํ์์ `\"ํ๋ก๋ฐ์ด๋/๋ชจ๋ธ๋ช \"`์ ๋๋ค. `\"ollama/llama3.2\"`, `\"anthropic/claude-3-5-sonnet-20241022\"`, `\"gpt-4o-mini\"`(OpenAI๋ ์์ธ๋ก ์ ๋์ฌ ์์) ํ์์ ์๋๋ค.", | |
| "source_id": "official-docs-litellm" | |
| }, | |
| { | |
| "id": "docs-q60", | |
| "lesson_id": "docs-litellm", | |
| "question_type": "multiple_choice", | |
| "question": "LiteLLM์ LangChain ์ฒด์ธ์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์?", | |
| "options": [ | |
| "from langchain_community.chat_models import ChatLiteLLM๋ก ๊ฐ์ ธ์ LLM์ผ๋ก ์ฌ์ฉํ๋ค", | |
| "litellm.completion()์ LangChain ์ฒด์ธ์ ์ง์ ๋ฃ๋๋ค", | |
| "LiteLLM์ LangChain๊ณผ ํตํฉ๋์ง ์๋๋ค", | |
| "LangChain์ ChatOpenAI์ litellm=True ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐํ๋ค" | |
| ], | |
| "answer": "from langchain_community.chat_models import ChatLiteLLM๋ก ๊ฐ์ ธ์ LLM์ผ๋ก ์ฌ์ฉํ๋ค", | |
| "explanation": "`ChatLiteLLM`์ LangChain์ ChatModel ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฏ๋ก LCEL ํ์ดํ๋ผ์ธ์ ๋ฐ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค. `chain = prompt | ChatLiteLLM(model='ollama/llama3.2') | parser` ํ์์ผ๋ก ์๋๋ค.", | |
| "source_id": "official-docs-litellm" | |
| }, | |
| { | |
| "id": "docs-q61", | |
| "lesson_id": "docs-chainlit", | |
| "question_type": "multiple_choice", | |
| "question": "Chainlit์์ ์ฌ์ฉ์ ๋ฉ์์ง๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๋ฐ์ฝ๋ ์ดํฐ๋?", | |
| "options": [ | |
| "@cl.on_message", | |
| "@cl.on_input", | |
| "@cl.message_handler", | |
| "@cl.chat" | |
| ], | |
| "answer": "@cl.on_message", | |
| "explanation": "`@cl.on_message`๋ ์ฌ์ฉ์๊ฐ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ๋๋ง๋ค ์๋์ผ๋ก ํธ์ถ๋ฉ๋๋ค. ํจ์ ํ๋ผ๋ฏธํฐ๋ก `message: cl.Message`๋ฅผ ๋ฐ์ `message.content`๋ก ํ ์คํธ์ ์ ๊ทผํฉ๋๋ค.", | |
| "source_id": "official-docs-chainlit" | |
| }, | |
| { | |
| "id": "docs-q62", | |
| "lesson_id": "docs-chainlit", | |
| "question_type": "multiple_choice", | |
| "question": "Chainlit์์ LangChain ์ฒด์ธ์ ํธ์ถํ ๋ ๋๊ธฐ invoke() ๋์ ์จ์ผ ํ๋ ์ด์ ์ ๋์์?", | |
| "options": [ | |
| "invoke()๋ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๋ธ๋กํนํ๋ฏ๋ก ainvoke() ๋๋ astream()์ ์จ์ผ ํ๋ค", | |
| "invoke()๊ฐ ๋ ๋น ๋ฅด๋ฏ๋ก ํญ์ invoke()๋ฅผ ์ด๋ค", | |
| "Chainlit์ LangChain๊ณผ ํธํ๋์ง ์๋๋ค", | |
| "invoke()์ ainvoke()์ ์ฐจ์ด๋ ์๋ค" | |
| ], | |
| "answer": "invoke()๋ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๋ธ๋กํนํ๋ฏ๋ก ainvoke() ๋๋ astream()์ ์จ์ผ ํ๋ค", | |
| "explanation": "Chainlit์ asyncio ๊ธฐ๋ฐ์ ๋๋ค. `invoke()`(๋๊ธฐ)๋ฅผ `async def` ํจ์ ์์์ ํธ์ถํ๋ฉด ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๋ธ๋กํน๋์ด ๋ค๋ฅธ ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌ ๋ชป ํฉ๋๋ค. `await chain.ainvoke()`๋ฅผ ์จ์ผ ํฉ๋๋ค.", | |
| "source_id": "official-docs-chainlit" | |
| }, | |
| { | |
| "id": "docs-q63", | |
| "lesson_id": "docs-redis", | |
| "question_type": "multiple_choice", | |
| "question": "์๋ฒ ์ฌ์์ ํ์๋ ๋ํ ํ์คํ ๋ฆฌ๊ฐ ์ ์ง๋๋๋ก ChatMessageHistory๋ฅผ ๊ต์ฒดํ๋ ํด๋์ค๋?", | |
| "options": [ | |
| "RedisChatMessageHistory", | |
| "PersistentChatMessageHistory", | |
| "SQLChatMessageHistory", | |
| "FileChatMessageHistory" | |
| ], | |
| "answer": "RedisChatMessageHistory", | |
| "explanation": "`RedisChatMessageHistory(session_id, url='redis://localhost:6379')`๋ ๋ํ ํ์คํ ๋ฆฌ๋ฅผ Redis์ ์ ์ฅํฉ๋๋ค. ๊ธฐ์กด `ChatMessageHistory`(์ธ๋ฉ๋ชจ๋ฆฌ)์ ์ธํฐํ์ด์ค๊ฐ ๋์ผํด `get_session_history` ํจ์๋ง ๋ฐ๊พธ๋ฉด ๋ฉ๋๋ค.", | |
| "source_id": "official-docs-redis" | |
| }, | |
| { | |
| "id": "docs-q64", | |
| "lesson_id": "docs-redis", | |
| "question_type": "multiple_choice", | |
| "question": "Redis์์ ๋ํ ํ์คํ ๋ฆฌ๊ฐ ๋ฌดํํ ์์ด์ง ์๋๋ก ์๋ ๋ง๋ฃ๋ฅผ ์ค์ ํ๋ ํ๋ผ๋ฏธํฐ๋?", | |
| "options": [ | |
| "ttl (์ด ๋จ์)", | |
| "expire (๋ถ ๋จ์)", | |
| "max_messages", | |
| "timeout" | |
| ], | |
| "answer": "ttl (์ด ๋จ์)", | |
| "explanation": "`RedisChatMessageHistory(session_id, url, ttl=3600)`์ผ๋ก 1์๊ฐ(3600์ด) ํ ์๋ ๋ง๋ฃ๋ฉ๋๋ค. TTL์ด ์์ผ๋ฉด ํ์คํ ๋ฆฌ๊ฐ ๋ฌดํํ ์์ฌ ํ ํฐ ์ด๊ณผ์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํฉ๋๋ค.", | |
| "source_id": "official-docs-redis" | |
| }, | |
| { | |
| "id": "docs-q65", | |
| "lesson_id": "docs-unstructured", | |
| "question_type": "multiple_choice", | |
| "question": "Unstructured๋ก PDF ํ์ผ์ ๋ก๋ํ๋ ค๋ฉด ์ถ๊ฐ๋ก ์ค์นํด์ผ ํ๋ ํจํค์ง๋?", | |
| "options": [ | |
| "pip install unstructured[pdf]", | |
| "pip install unstructured-pdf", | |
| "pip install pdfminer", | |
| "pip install unstructured๋ง์ผ๋ก ์ถฉ๋ถํ๋ค" | |
| ], | |
| "answer": "pip install unstructured[pdf]", | |
| "explanation": "`pip install unstructured`๋ ๊ธฐ๋ณธ ํจํค์ง๋ง ์ค์นํฉ๋๋ค. PDF ์ฒ๋ฆฌ๋ `unstructured[pdf]`, ์ด๋ฏธ์ง OCR์ `unstructured[local-inference]`์ฒ๋ผ ๋ณ๋ extra๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.", | |
| "source_id": "official-docs-unstructured" | |
| }, | |
| { | |
| "id": "docs-q66", | |
| "lesson_id": "docs-unstructured", | |
| "question_type": "multiple_choice", | |
| "question": "Unstructured๋ฅผ `mode='elements'`๋ก ๋ก๋ํ ๋ ์ป์ ์ ์๋ ์ถ๊ฐ ์ ๋ณด๋?", | |
| "options": [ | |
| "Title, NarrativeText, Table ๋ฑ ์์ ํ์ ์ด metadata์ ์ ์ฅ๋๋ค", | |
| "OCR ์ ํ๋๊ฐ ๋์์ง๋ค", | |
| "์ด๋ฏธ์ง ํ์ผ๋ ํ ์คํธ๋ก ๋ณํ๋๋ค", | |
| "์ฒญํฌ ๋ถํ ์ด ์๋์ผ๋ก ๋๋ค" | |
| ], | |
| "answer": "Title, NarrativeText, Table ๋ฑ ์์ ํ์ ์ด metadata์ ์ ์ฅ๋๋ค", | |
| "explanation": "`mode='elements'`๋ก ๋ก๋ํ๋ฉด ๊ฐ Document์ `metadata['category']`๋ก ์์ ํ์ ์ด ์ ์ฅ๋ฉ๋๋ค. ํค๋๋ฅผ ์ฒญํฌ ๋ฉํ๋ฐ์ดํฐ๋ก ํ์ฉํ๊ฑฐ๋ ํ ์ด๋ธ๋ง ๋ณ๋ ์ถ์ถํ ๋ ์๋๋ค.", | |
| "source_id": "official-docs-unstructured" | |
| }, | |
| { | |
| "id": "docs-q45", | |
| "lesson_id": "docs-document-loaders", | |
| "question_type": "multiple_choice", | |
| "question": "LangChain `DirectoryLoader`๋ก ํ์ ํด๋๊น์ง ๋ชจ๋ `.md` ํ์ผ์ ๋ก๋ํ๋ glob ํจํด์?", | |
| "options": [ | |
| "**/*.md", | |
| "*.md", | |
| "./**md", | |
| "**md" | |
| ], | |
| "answer": "**/*.md", | |
| "explanation": "`**/*.md`๋ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ๋ชจ๋ ํ์ ๋๋ ํ ๋ฆฌ์์ `.md` ํ์ผ์ ์ฌ๊ท ๊ฒ์ํฉ๋๋ค. `*.md`๋ ํ์ฌ ํด๋๋ง ๊ฒ์ํฉ๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q46", | |
| "lesson_id": "docs-document-loaders", | |
| "question_type": "multiple_choice", | |
| "question": "LangChain Document ๊ฐ์ฒด์์ ํ์ผ ๊ฒฝ๋ก(์ถ์ฒ)๋ฅผ ๊ฐ์ ธ์ค๋ ์ฝ๋๋?", | |
| "options": [ | |
| "doc.metadata['source']", | |
| "doc.source", | |
| "doc.file_path", | |
| "doc.metadata.path" | |
| ], | |
| "answer": "doc.metadata['source']", | |
| "explanation": "Document Loader๋ ๋ก๋๋ ๋ฌธ์์ `metadata` ๋์ ๋๋ฆฌ์ `source` ํค๋ก ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํฉ๋๋ค. RAG ๋ต๋ณ์ ์ถ์ฒ๋ฅผ ํ์ํ ๋ ์ด ๊ฐ์ ์๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q47", | |
| "lesson_id": "docs-summarization", | |
| "question_type": "multiple_choice", | |
| "question": "LangChain์์ ์ฌ๋ฌ ๋ด์ค ๊ธฐ์ฌ์ฒ๋ผ ์ปจํ ์คํธ ์ฐฝ๋ณด๋ค ๊ธด ๋ฌธ์๋ฅผ ์์ฝํ ๋ ์ ํฉํ chain_type์?", | |
| "options": [ | |
| "map_reduce", | |
| "stuff", | |
| "direct", | |
| "compress" | |
| ], | |
| "answer": "map_reduce", | |
| "explanation": "`map_reduce`๋ ๊ฐ ์ฒญํฌ๋ฅผ ๊ฐ๋ณ ์์ฝ(map)ํ ํ ํฉ์ณ์ ์ต์ข ์์ฝ(reduce)์ ๋ง๋ญ๋๋ค. `stuff`๋ ์ ์ฒด๋ฅผ ํ ํ๋กฌํํธ์ ๋ฃ์ผ๋ฏ๋ก ๊ธด ๋ฌธ์์์ ํ ํฐ ์ด๊ณผ ์ค๋ฅ๊ฐ ๋ฉ๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q48", | |
| "lesson_id": "docs-summarization", | |
| "question_type": "multiple_choice", | |
| "question": "`load_summarize_chain` ์คํ ๊ฒฐ๊ณผ์์ ์ต์ข ์์ฝ ํ ์คํธ๋ฅผ ๊ฐ์ ธ์ค๋ ํค๋?", | |
| "options": [ | |
| "result['output_text']", | |
| "result['summary']", | |
| "result['text']", | |
| "result['answer']" | |
| ], | |
| "answer": "result['output_text']", | |
| "explanation": "`chain.invoke(docs)`์ ๋ฐํ๊ฐ ๋์ ๋๋ฆฌ์์ ์์ฝ ๊ฒฐ๊ณผ๋ `output_text` ํค์ ์ ์ฅ๋ฉ๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q49", | |
| "lesson_id": "docs-sql-chain", | |
| "question_type": "multiple_choice", | |
| "question": "LangChain์์ SQLite DB๋ฅผ `SQLDatabase`๋ก ์ฐ๊ฒฐํ๋ ์ฝ๋๋?", | |
| "options": [ | |
| "SQLDatabase.from_uri('sqlite:///./mydb.db')", | |
| "SQLDatabase.connect('./mydb.db')", | |
| "sqlite3.connect('./mydb.db')", | |
| "SQLDatabase('./mydb.db')" | |
| ], | |
| "answer": "SQLDatabase.from_uri('sqlite:///./mydb.db')", | |
| "explanation": "`SQLDatabase.from_uri()`๋ SQLAlchemy ์ฐ๊ฒฐ ๋ฌธ์์ด์ ๋ฐ์ต๋๋ค. SQLite๋ `sqlite:///๊ฒฝ๋ก`, PostgreSQL์ `postgresql://user:pass@host/db` ํ์์ ๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q50", | |
| "lesson_id": "docs-sql-chain", | |
| "question_type": "multiple_choice", | |
| "question": "LangChain Text-to-SQL์์ `SQLDatabase`๊ฐ LLM์ ์๋์ผ๋ก ์ ๊ณตํ๋ ์ ๋ณด๋?", | |
| "options": [ | |
| "DB์ ํ ์ด๋ธ๋ช ๊ณผ ์ปฌ๋ผ ์คํค๋ง", | |
| "DB์ ์ ์ฅ๋ ์ค์ ๋ฐ์ดํฐ ์ํ", | |
| "SQL ์คํ ๊ฒฐ๊ณผ ํ์คํ ๋ฆฌ", | |
| "DB ์ ์ ๋น๋ฐ๋ฒํธ" | |
| ], | |
| "answer": "DB์ ํ ์ด๋ธ๋ช ๊ณผ ์ปฌ๋ผ ์คํค๋ง", | |
| "explanation": "`SQLDatabase`๋ ์ฐ๊ฒฐ๋ DB์ ํ ์ด๋ธ๋ช ๊ณผ ๊ฐ ์ปฌ๋ผ์ ์ด๋ฆยทํ์ ์ ์๋์ผ๋ก ํ๋กฌํํธ์ ์ฃผ์ ํฉ๋๋ค. ๋๋ถ์ LLM์ด ์ค์ ์กด์ฌํ๋ ํ ์ด๋ธ/์ปฌ๋ผ๋ง ์ฐธ์กฐํ๋ SQL์ ์์ฑํ ์ ์์ต๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q39", | |
| "lesson_id": "docs-dotenv", | |
| "question_type": "multiple_choice", | |
| "question": "python-dotenv์์ `.env` ํ์ผ์ ๋ก๋ํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์?", | |
| "options": [ | |
| "from dotenv import load_dotenv; load_dotenv()", | |
| "import dotenv; dotenv.read('.env')", | |
| "os.environ.load('.env')", | |
| ".env ํ์ผ์ ์๋์ผ๋ก ๋ก๋๋๋ค" | |
| ], | |
| "answer": "from dotenv import load_dotenv; load_dotenv()", | |
| "explanation": "`load_dotenv()`๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํด์ผ `.env` ํ์ผ์ ๋ณ์๊ฐ `os.environ`์ ์ฃผ์ ๋ฉ๋๋ค. ํ์ผ ์๋จ์์ ๊ฐ์ฅ ๋จผ์ ํธ์ถํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.", | |
| "source_id": "official-docs-python" | |
| }, | |
| { | |
| "id": "docs-q40", | |
| "lesson_id": "docs-dotenv", | |
| "question_type": "multiple_choice", | |
| "question": ".env ํ์ผ์ ์ฌ์ฉํ ๋ ๋ณด์์ ์ํด ๋ฐ๋์ ํด์ผ ํ๋ ๊ฒ์?", | |
| "options": [ | |
| ".env๋ฅผ .gitignore์ ์ถ๊ฐํ๊ณ .env.example์ ์ปค๋ฐํ๋ค", | |
| ".env๋ฅผ ์ํธํํด์ ์ ์ฅ์์ ์ปค๋ฐํ๋ค", | |
| ".env ํ์ผ๋ช ์ ๋ค๋ฅด๊ฒ ์ง์ด ์จ๊ธด๋ค", | |
| "API ํค๋ฅผ ์งง๊ฒ ์ค์ฌ์ ์ ์ฅํ๋ค" | |
| ], | |
| "answer": ".env๋ฅผ .gitignore์ ์ถ๊ฐํ๊ณ .env.example์ ์ปค๋ฐํ๋ค", | |
| "explanation": "`.env`๋ ์ ๋ Git์ ์ปค๋ฐํ์ง ์์ต๋๋ค. `.env.example`์๋ ํค ์ด๋ฆ๋ง(๊ฐ ์์ด) ์ ์ด ์ด๋ค ํ๊ฒฝ๋ณ์๊ฐ ํ์ํ์ง ๋ฌธ์ํํ๋ ์ฉ๋๋ก ์ปค๋ฐํฉ๋๋ค.", | |
| "source_id": "official-docs-python" | |
| }, | |
| { | |
| "id": "docs-q41", | |
| "lesson_id": "docs-prompt-template", | |
| "question_type": "multiple_choice", | |
| "question": "LangChain์์ ์์คํ ์ญํ ๊ณผ ์ฌ์ฉ์ ๋ฉ์์ง๋ฅผ ๊ตฌ๋ถํด ํ๋กฌํํธ๋ฅผ ๋ง๋๋ ํด๋์ค๋?", | |
| "options": [ | |
| "ChatPromptTemplate", | |
| "PromptTemplate", | |
| "SystemPrompt", | |
| "MessageTemplate" | |
| ], | |
| "answer": "ChatPromptTemplate", | |
| "explanation": "`ChatPromptTemplate.from_messages([(\"system\", \"...\"), (\"human\", \"{question}\")])` ํ์์ผ๋ก ์ญํ ๋ณ ๋ฉ์์ง๋ฅผ ๊ตฌ์กฐํํฉ๋๋ค. `PromptTemplate`์ ์ญํ ๊ตฌ๋ถ ์๋ ๋จ์ ๋ฌธ์์ด ํฌ๋งท์ฉ์ ๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q42", | |
| "lesson_id": "docs-prompt-template", | |
| "question_type": "multiple_choice", | |
| "question": "ChatPromptTemplate์์ ๋ํ ํ์คํ ๋ฆฌ ๋ฉ์์ง ๋ฐฐ์ด์ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์?", | |
| "options": [ | |
| "(\"placeholder\", \"{chat_history}\") ๋๋ MessagesPlaceholder(variable_name=\"chat_history\")๋ฅผ messages์ ์ถ๊ฐํ๋ค", | |
| "chat_history ๋ฌธ์์ด์ system ๋ฉ์์ง์ ์ง์ ํฌํจํ๋ค", | |
| "ํ์คํ ๋ฆฌ๋ LLM์ด ์๋์ผ๋ก ๊ด๋ฆฌํ๋ฏ๋ก ๋ณ๋ ์ฒ๋ฆฌ๊ฐ ๋ถํ์ํ๋ค", | |
| "HistoryTemplate ํด๋์ค๋ฅผ ๋ณ๋๋ก ์ฌ์ฉํ๋ค" | |
| ], | |
| "answer": "(\"placeholder\", \"{chat_history}\") ๋๋ MessagesPlaceholder(variable_name=\"chat_history\")๋ฅผ messages์ ์ถ๊ฐํ๋ค", | |
| "explanation": "`MessagesPlaceholder`๋ ๋ฉ์์ง ๋ฆฌ์คํธ ์ ์ฒด๋ฅผ ๊ทธ ์๋ฆฌ์ ํผ์ณ์ค๋๋ค. RunnableWithMessageHistory์ `history_messages_key`์ placeholder์ ๋ณ์๋ช ์ด ์ผ์นํด์ผ ํฉ๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q43", | |
| "lesson_id": "docs-conversation-memory", | |
| "question_type": "multiple_choice", | |
| "question": "LangChain์์ ๋ฉํฐํด ๋ํ ํ์คํ ๋ฆฌ๋ฅผ ์ฒด์ธ์ ์๋์ผ๋ก ์ฃผ์ ํ๋ ํด๋์ค๋?", | |
| "options": [ | |
| "RunnableWithMessageHistory", | |
| "ConversationChain", | |
| "ChatMemoryBuffer", | |
| "HistoryRunnable" | |
| ], | |
| "answer": "RunnableWithMessageHistory", | |
| "explanation": "`RunnableWithMessageHistory`๋ ๊ธฐ์กด ์ฒด์ธ์ ๊ฐ์ธ `session_id`๋ณ๋ก ํ์คํ ๋ฆฌ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. `get_session_history` ํจ์๋ก ์ ์ฅ์๋ฅผ ์ง์ ํ๋ฉด ์๋์ผ๋ก ์ด์ ๋ํ๊ฐ ์ฃผ์ ๋ฉ๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q44", | |
| "lesson_id": "docs-conversation-memory", | |
| "question_type": "multiple_choice", | |
| "question": "RunnableWithMessageHistory์์ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋์ผํ ๋ํ ํ์คํ ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ ์์ธ์?", | |
| "options": [ | |
| "invoke ์ config์ ๋์ผํ session_id๋ฅผ ์ฌ์ฉํ๋ค", | |
| "ChatMessageHistory๋ฅผ ํด๋์ค ๋ ๋ฒจ์์ ํ๋๋ง ์์ฑํ๋ค", | |
| "get_session_history ํจ์๋ฅผ ์ ์ํ์ง ์์๋ค", | |
| "RunnableWithMessageHistory ๋์ ์ฒด์ธ์ ์ง์ ์ฌ์ฉํ๋ค" | |
| ], | |
| "answer": "invoke ์ config์ ๋์ผํ session_id๋ฅผ ์ฌ์ฉํ๋ค", | |
| "explanation": "`config={\"configurable\": {\"session_id\": \"fixed-id\"}}`์ฒ๋ผ ๊ณ ์ ID๋ฅผ ์ฐ๋ฉด ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๊ฐ์ ํ์คํ ๋ฆฌ๋ฅผ ์๋๋ค. ์ฌ์ฉ์๋ณ๋ก ๊ณ ์ ํ session_id(UUID ๋ฑ)๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.", | |
| "source_id": "official-docs-langchain" | |
| }, | |
| { | |
| "id": "docs-q38", | |
| "lesson_id": "docs-mcp", | |
| "question_type": "multiple_choice", | |
| "question": "Claude Desktop์ ๋ก์ปฌ MCP ์๋ฒ๋ฅผ ์ฐ๊ฒฐํ๋ ค๋ฉด ์ด๋์ ๋ฑ๋กํด์ผ ํ๋๊ฐ?", | |
| "options": [ | |
| "~/Library/Application Support/Claude/claude_desktop_config.json", | |
| "~/.claude/mcp_servers.json", | |
| "CLAUDE.md ํ์ผ", | |
| "ํ๊ฒฝ๋ณ์ MCP_SERVER_PATH" | |
| ], | |
| "answer": "~/Library/Application Support/Claude/claude_desktop_config.json", | |
| "explanation": "Claude Desktop์ MCP ์๋ฒ ๋ชฉ๋ก์ `claude_desktop_config.json`์ ๋ฑ๋กํฉ๋๋ค. ์๋ฒ ์ด๋ฆ, ์คํ ๋ช ๋ น์ด(`command`), ์ธ์(`args`)๋ฅผ JSON์ผ๋ก ์ ์ํ๋ฉด ์ฑ ์ฌ์์ ํ ์๋ ์ฐ๊ฒฐ๋ฉ๋๋ค.", | |
| "source_id": "official-docs-mcp" | |
| }, | |
| { | |
| "id": "docs-q67", | |
| "lesson_id": "docs-vectorstore", | |
| "question_type": "multiple_choice", | |
| "question": "**[์ํฉ ํ๋จ]** ์๋ฒ๋ฅผ ์ฌ์์ํ ๋๋ง๋ค ๋ฒกํฐ ์ธ๋ฑ์ค๊ฐ ์ฌ๋ผ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๊ฐ๋ฐํ์์ `save_local()` ํธ์ถ์ ์ข ์ข ๋น ๋จ๋ฆฝ๋๋ค. ์ด๋ค VectorStore๋ฅผ ์ ํํ๊ณ ๊ทธ ์ด์ ๋?", | |
| "options": [ | |
| "Chroma โ persist_directory๋ง ์ง์ ํ๋ฉด save_local() ์์ด ์๋ ์ ์ฅ๋๋ฏ๋ก", | |
| "FAISS โ ์ฑ๋ฅ์ด ๋ ๋น ๋ฅด๊ณ ํด๋ผ์ฐ๋ ๋ฐฐํฌ์ ์ ๋ฆฌํ๋ฏ๋ก", | |
| "pgvector โ PostgreSQL ๊ธฐ๋ฐ์ด๋ผ ์์ ์ฑ์ด ๋์ผ๋ฏ๋ก", | |
| "Qdrant โ ๋๊ท๋ชจ ๋ฒกํฐ ๊ฒ์์ ์ต์ ํ๋์ด ์์ผ๋ฏ๋ก" | |
| ], | |
| "answer": "Chroma โ persist_directory๋ง ์ง์ ํ๋ฉด save_local() ์์ด ์๋ ์ ์ฅ๋๋ฏ๋ก", | |
| "explanation": "์ด ์ํฉ์ ๊ทผ๋ณธ ๋ฌธ์ ๋ ์๋ ์ ์ฅ ํธ์ถ์ ๋น ๋จ๋ฆฌ๋ ๊ฒ์ ๋๋ค. Chroma๋ `persist_directory='./chroma_db'`๋ง ์ง์ ํ๋ฉด ์๋์ผ๋ก ์ ์ฅ๋๋ฏ๋ก ์ค์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. FAISS๋ ์ฑ๋ฅ์ด ์ข์ง๋ง `save_local()`์ ๋ฐ๋์ ํธ์ถํด์ผ ํด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค.", | |
| "source_id": "official-docs-chromadb", | |
| "difficulty": "medium" | |
| }, | |
| { | |
| "id": "docs-q68", | |
| "lesson_id": "docs-sentence-transformers", | |
| "question_type": "multiple_choice", | |
| "question": "**[์ํฉ ํ๋จ]** RAG ์์คํ ์ 20๋ง ๊ฐ์ ๋ฌธ์๋ฅผ ์ธ๋ฑ์ฑํด์ผ ํฉ๋๋ค. OpenAI ์๋ฒ ๋ฉ API๋ฅผ ์ฐ๋ฉด ๋น์ฉ์ด ์์๋ณด๋ค 10๋ฐฐ ๋์ฌ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ค ์ ํ์ด ๊ฐ์ฅ ์ ํฉํ๊ฐ?", | |
| "options": [ | |
| "sentence-transformers์ all-MiniLM-L6-v2๋ก ๋ก์ปฌ ์๋ฒ ๋ฉ โ ๋ฌด๋ฃ์ด๊ณ ์ธํฐํ์ด์ค๊ฐ ๋์ผํ๋ฏ๋ก", | |
| "OpenAI ์๋ฒ ๋ฉ ์ ์ง โ ํ์ง์ด ์ค์ํ๋ฏ๋ก ๋น์ฉ์ ๊ฐ์ํ๋ค", | |
| "์๋ฒ ๋ฉ์ ์ฌ์ฉํ์ง ์๊ณ ํค์๋ ๊ฒ์๋ง ์ด๋ค", | |
| "Chroma๋ก ๊ต์ฒดํ๋ฉด ์๋ฒ ๋ฉ ๋น์ฉ์ด ์ ๊ฐ๋๋ค" | |
| ], | |
| "answer": "sentence-transformers์ all-MiniLM-L6-v2๋ก ๋ก์ปฌ ์๋ฒ ๋ฉ โ ๋ฌด๋ฃ์ด๊ณ ์ธํฐํ์ด์ค๊ฐ ๋์ผํ๋ฏ๋ก", | |
| "explanation": "`HuggingFaceEmbeddings(model_name='sentence-transformers/all-MiniLM-L6-v2')`๋ OpenAI Embeddings์ ์ธํฐํ์ด์ค๊ฐ ๋์ผํด ์ฝ๋๋ฅผ ํ ์ค๋ง ๋ฐ๊พธ๋ฉด ๋ฉ๋๋ค. ๋ก์ปฌ ์คํ์ด๋ฏ๋ก API ๋น์ฉ์ด ์๊ณ , ๋์ฉ๋ ์ธ๋ฑ์ฑ์ ๊ฒฝ์ ์ ์ ๋๋ค. ํ๊ตญ์ด ๋ง์ผ๋ฉด `jhgan/ko-sroberta-multitask`๋ ๊ณ ๋ คํฉ๋๋ค.", | |
| "source_id": "official-docs-huggingface", | |
| "difficulty": "medium" | |
| }, | |
| { | |
| "id": "docs-q69", | |
| "lesson_id": "docs-summarization", | |
| "question_type": "multiple_choice", | |
| "question": "**[์ํฉ ํ๋จ]** ๋ด์ค ๊ธฐ์ฌ 50๊ฐ๋ฅผ ๋์์ LLM์ ๋ฃ์ด ์์ฝํ๋ ค๋ค ํ ํฐ ์ด๊ณผ ์ค๋ฅ๊ฐ ๋ฌ์ต๋๋ค. ๊ฐ์ฅ ์ ์ ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์?", | |
| "options": [ | |
| "load_summarize_chain(llm, chain_type='map_reduce') ์ฌ์ฉ โ ๊ธฐ์ฌ๋ฅผ ๊ฐ๋ณ ์์ฝ ํ ํฉ์น๋ฏ๋ก ํ ํฐ ์ด๊ณผ๊ฐ ์์", | |
| "๋ชจ๋ ๊ธฐ์ฌ๋ฅผ ํ๋์ ํ๋กฌํํธ์ ๋ฃ๋ stuff ๋ฐฉ์์ ์ ์งํ๋ LLM ๋ชจ๋ธ์ ๊ต์ฒด", | |
| "๊ธฐ์ฌ ๊ฐ์๋ฅผ 5๊ฐ๋ก ์ค์ฌ stuff ๋ฐฉ์ ์ ์ง", | |
| "summarization ๋์ RAG๋ก ๊ธฐ์ฌ๋ฅผ ๊ฒ์ํด ์์ฝ" | |
| ], | |
| "answer": "load_summarize_chain(llm, chain_type='map_reduce') ์ฌ์ฉ โ ๊ธฐ์ฌ๋ฅผ ๊ฐ๋ณ ์์ฝ ํ ํฉ์น๋ฏ๋ก ํ ํฐ ์ด๊ณผ๊ฐ ์์", | |
| "explanation": "`map_reduce`๋ ๊ฐ ๊ธฐ์ฌ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์์ฝ(map)ํ ๋ค ๊ฐ๋ณ ์์ฝ๋ค์ ํฉ์ณ ์ต์ข ์์ฝ(reduce)์ ๋ง๋ญ๋๋ค. ๊ธฐ์ฌ๊ฐ 100๊ฐ๋ 1000๊ฐ๋ ํ ํฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ชจ๋ธ ๊ต์ฒด๋ ๊ธฐ์ฌ ์ ๊ฐ์๋ ๊ทผ๋ณธ ํด๊ฒฐ์ฑ ์ด ์๋๋๋ค.", | |
| "source_id": "official-docs-langchain", | |
| "difficulty": "medium" | |
| }, | |
| { | |
| "id": "docs-q70", | |
| "lesson_id": "docs-langsmith", | |
| "question_type": "multiple_choice", | |
| "question": "**[์ํฉ ํ๋จ]** RAG ์ฑ๋ด์ด ์๋ฑํ ๋ต์ ํ์ต๋๋ค. ๋ฌธ์ ๊ฐ ๊ฒ์ ๋จ๊ณ์ธ์ง, ํ๋กฌํํธ ๋ ๋๋ง ๋จ๊ณ์ธ์ง, LLM ์์ฑ ๋จ๊ณ์ธ์ง ํ์ ์ด ์ ๋ฉ๋๋ค. `print()`๋ก ๋๋ฒ๊น ์ค์ธ๋ฐ ์ด๋ ๋จ๊ณ์ธ์ง ๊ตฌ๋ถ์ด ์ด๋ ต์ต๋๋ค. ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋๊ตฌ๋?", | |
| "options": [ | |
| "LangSmith โ ์ฒด์ธ ๊ฐ ๋จ๊ณ์ ์ ์ถ๋ ฅ์ ํธ๋ฆฌ ํํ๋ก ์๊ฐํํ๋ฏ๋ก", | |
| "Python logging ๋ชจ๋๋ก ๋ ์์ธํ ๋ก๊ทธ ์ถ๋ ฅ", | |
| "LLM ๋ชจ๋ธ์ ๋ ๊ฐ๋ ฅํ ๊ฒ์ผ๋ก ๊ต์ฒด", | |
| "chunk_size๋ฅผ ์ค์ฌ ๊ฒ์ ์ ํ๋ ํฅ์" | |
| ], | |
| "answer": "LangSmith โ ์ฒด์ธ ๊ฐ ๋จ๊ณ์ ์ ์ถ๋ ฅ์ ํธ๋ฆฌ ํํ๋ก ์๊ฐํํ๋ฏ๋ก", | |
| "explanation": "LangSmith๋ ํ๊ฒฝ๋ณ์ 3๊ฐ(`LANGCHAIN_TRACING_V2=true`, `LANGCHAIN_API_KEY`, `LANGCHAIN_PROJECT`) ์ค์ ๋ง์ผ๋ก ์ฒด์ธ ์คํ๋ง๋ค retriever ์ ์ถ๋ ฅ, ๋ ๋๋ง๋ ํ๋กฌํํธ, LLM ์๋ต์ ๋จ๊ณ๋ณ๋ก ๊ธฐ๋กํฉ๋๋ค. ์ด๋ ๋จ๊ณ๊ฐ ๋ฌธ์ ์ธ์ง ์ฆ์ ํน์ ํ ์ ์์ต๋๋ค.", | |
| "source_id": "official-docs-langchain", | |
| "difficulty": "medium" | |
| }, | |
| { | |
| "id": "docs-q71", | |
| "lesson_id": "docs-guardrails", | |
| "question_type": "multiple_choice", | |
| "question": "**[์ํฉ ํ๋จ]** ์๋น์ค ์ฌ์ฉ์๊ฐ \"์์ค์ ์์ด ์์ฝํด์ค\"๋ผ๊ณ ์ ๋ ฅํ๋๋ LLM์ด ๊ทธ๋๋ก ๋ฐ๋์ต๋๋ค. ์์คํ ํ๋กฌํํธ์ '์์ค ๊ธ์ง'๋ฅผ ์ถ๊ฐํ์ง๋ง ์ฐํ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๋ ๊ฐ๋ ฅํ ๋์์?", | |
| "options": [ | |
| "Guardrails AI์ ToxicLanguage Guard๋ฅผ LLM ์ถ๋ ฅ์ ์ ์ฉ โ ํ๋ฅ ์ ์ผ๋ก ์ ํด ์ฝํ ์ธ ๋ฅผ ์ค์ง์ ์ผ๋ก ์ฐจ๋จ", | |
| "์์คํ ํ๋กฌํํธ๋ฅผ ๋ ๊ธธ๊ณ ์์ธํ๊ฒ ์์ฑ", | |
| "๋ ๊ฐ๋ ฅํ LLM ๋ชจ๋ธ๋ก ๊ต์ฒด", | |
| "์ฌ์ฉ์ ์ ๋ ฅ ๊ธธ์ด๋ฅผ 100์๋ก ์ ํ" | |
| ], | |
| "answer": "Guardrails AI์ ToxicLanguage Guard๋ฅผ LLM ์ถ๋ ฅ์ ์ ์ฉ โ ํ๋ฅ ์ ์ผ๋ก ์ ํด ์ฝํ ์ธ ๋ฅผ ์ค์ง์ ์ผ๋ก ์ฐจ๋จ", | |
| "explanation": "์์คํ ํ๋กฌํํธ๋ ํ๋กฌํํธ ์ธ์ ์ ์ผ๋ก ์ฐํ๋ ์ ์์ต๋๋ค. Guardrails AI๋ LLM ์ถ๋ ฅ์ ๋ณ๋ ๋ถ๋ฅ ๋ชจ๋ธ๋ก ๊ฒ์ฆํด ์๊ณ๊ฐ ์ด์์ด๋ฉด ์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค. `on_fail='reask'`๋ก ์ค์ ํ๋ฉด ์๋์ผ๋ก ์ฌ์์ฑ์ ์์ฒญํฉ๋๋ค. ์์คํ ํ๋กฌํํธ๋ณด๋ค ์ค์ง์ ์ธ ๋ณดํธ ์๋จ์ ๋๋ค.", | |
| "source_id": "official-docs-guardrails", | |
| "difficulty": "hard" | |
| }, | |
| { | |
| "id": "docs-q72", | |
| "lesson_id": "docs-redis", | |
| "question_type": "multiple_choice", | |
| "question": "**[์ํฉ ํ๋จ]** ์ฑ๋ด ์๋น์ค๋ฅผ ๋ฐฐํฌํ๋๋ ์๋ฒ๋ฅผ ์ฌ์์ํ ๋๋ง๋ค ๋ชจ๋ ์ฌ์ฉ์์ ๋ํ ๊ธฐ๋ก์ด ์ด๊ธฐํ๋ฉ๋๋ค. ์ธ๋ฉ๋ชจ๋ฆฌ ๋์ ๋๋ฆฌ๋ก ํ์คํ ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ณ ์์ต๋๋ค. ์ต์ํ์ ์ฝ๋ ๋ณ๊ฒฝ์ผ๋ก ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์?", | |
| "options": [ | |
| "get_session_history ํจ์ ๋ด๋ถ๋ฅผ RedisChatMessageHistory๋ก ๊ต์ฒด โ ๋๋จธ์ง ์ฝ๋๋ ๊ทธ๋๋ก", | |
| "RunnableWithMessageHistory๋ฅผ ์ ๊ฑฐํ๊ณ ๋งค ์์ฒญ๋ง๋ค ํ์คํ ๋ฆฌ๋ฅผ DB์ ์ง์ ์ ์ฅ", | |
| "Streamlit session_state์ ํ์คํ ๋ฆฌ๋ฅผ ์ ์ฅ", | |
| "๋ํ ํ์คํ ๋ฆฌ ์์ด ๋จ์ผ ํด์ผ๋ก ์๋น์ค๋ฅผ ์ฌ์ค๊ณ" | |
| ], | |
| "answer": "get_session_history ํจ์ ๋ด๋ถ๋ฅผ RedisChatMessageHistory๋ก ๊ต์ฒด โ ๋๋จธ์ง ์ฝ๋๋ ๊ทธ๋๋ก", | |
| "explanation": "`RunnableWithMessageHistory`๋ `get_session_history` ํจ์๋ง ๋ณด๊ณ ํ์คํ ๋ฆฌ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ด ํจ์ ๋ด๋ถ๋ฅผ `RedisChatMessageHistory(session_id, url='redis://localhost:6379')`๋ก ๋ฐ๊พธ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋ค๋ฅธ ์ฝ๋๋ ์ ํ ์์ ํ ํ์๊ฐ ์์ต๋๋ค.", | |
| "source_id": "official-docs-redis", | |
| "difficulty": "hard" | |
| }, | |
| { | |
| "id": "docs-q73", | |
| "lesson_id": "docs-litellm", | |
| "question_type": "multiple_choice", | |
| "question": "**[์ํฉ ํ๋จ]** ๋ก์ปฌ Ollama๋ก ๊ฐ๋ฐํ๊ณ ํ๋ก๋์ ์๋ Anthropic Claude๋ฅผ ์ธ ๊ณํ์ ๋๋ค. ๋งค๋ฒ LLM ๊ต์ฒด ์ ์ฝ๋๋ฅผ ์ต์๋ก ์์ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ๊ตฌํํด์ผ ํ๋๊ฐ?", | |
| "options": [ | |
| "LiteLLM completion()์ ์ฌ์ฉํ๊ณ model ํ๋ผ๋ฏธํฐ๋ง ๋ณ๊ฒฝ โ ์ฝ๋ ๋๋จธ์ง๋ ๊ทธ๋๋ก", | |
| "OllamaLLM๊ณผ ChatAnthropic์ if๋ฌธ์ผ๋ก ๋ถ๊ธฐ", | |
| "๊ฐ๋ฐ/ํ๋ก๋์ ๋ง๋ค ๋ค๋ฅธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์ง", | |
| "LangChain์ ChatOpenAI๋ฅผ ๊ธฐ๋ณธ์ผ๋ก Ollama๋ ๋ณ๋ ๋ธ๋์น์์ ๊ด๋ฆฌ" | |
| ], | |
| "answer": "LiteLLM completion()์ ์ฌ์ฉํ๊ณ model ํ๋ผ๋ฏธํฐ๋ง ๋ณ๊ฒฝ โ ์ฝ๋ ๋๋จธ์ง๋ ๊ทธ๋๋ก", | |
| "explanation": "LiteLLM์ `completion(model='ollama/llama3.2', ...)`๊ณผ `completion(model='anthropic/claude-3-5-sonnet-20241022', ...)`์ ์ฝ๋๊ฐ ๋์ผํฉ๋๋ค. model ํ๋ผ๋ฏธํฐ ํ ์ค๋ง ๋ฐ๊พธ๋ฉด ํ๋ก๋ฐ์ด๋๋ฅผ ์ ํํฉ๋๋ค. if๋ฌธ ๋ถ๊ธฐ๋ ๋ณ๋ ๋ธ๋์น ๊ด๋ฆฌ๋ ์ ์ง๋ณด์ ๋น์ฉ์ด ๋์ต๋๋ค.", | |
| "source_id": "official-docs-litellm", | |
| "difficulty": "medium" | |
| }, | |
| { | |
| "id": "docs-q74", | |
| "lesson_id": "docs-langgraph", | |
| "question_type": "multiple_choice", | |
| "question": "**[์ํฉ ํ๋จ]** RAG ์ฑ๋ด์ ๋ค์ ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค: \"๊ฒ์ ๊ฒฐ๊ณผ ํ์ง์ด ๋ฎ์ผ๋ฉด ๋ค๋ฅธ ๊ฒ์์ด๋ก ์ฌ์๋ํ๊ณ , 3๋ฒ ์ด์ ์คํจํ๋ฉด '์ฐพ์ง ๋ชปํ์ต๋๋ค'๋ฅผ ๋ฐํ.\" LCEL ์ฒด์ธ๋ง์ผ๋ก ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋๊ฐ?", | |
| "options": [ | |
| "๋ถ๊ฐ๋ฅ โ LCEL์ ์ ํ์ด๋ผ ๋ฃจํ์ ์กฐ๊ฑด ๋ถ๊ธฐ๊ฐ ์๋ค. LangGraph๋ฅผ ์จ์ผ ํ๋ค", | |
| "๊ฐ๋ฅ โ LCEL์ RunnableBranch๋ก ์กฐ๊ฑด ๋ถ๊ธฐ๋ฅผ ๊ตฌํํ ์ ์๋ค", | |
| "๊ฐ๋ฅ โ Python while๋ฌธ์ chain.invoke() ๋ฐ๊นฅ์ ์ฐ๋ฉด ๋๋ค", | |
| "๊ฐ๋ฅ โ retry ํ๋ผ๋ฏธํฐ๋ฅผ chain์ ์ ๋ฌํ๋ฉด ๋๋ค" | |
| ], | |
| "answer": "๋ถ๊ฐ๋ฅ โ LCEL์ ์ ํ์ด๋ผ ๋ฃจํ์ ์กฐ๊ฑด ๋ถ๊ธฐ๊ฐ ์๋ค. LangGraph๋ฅผ ์จ์ผ ํ๋ค", | |
| "explanation": "LCEL์ AโBโC ์ ํ ํ์ดํ๋ผ์ธ์ ๋๋ค. 'ํ์ง ํ๋จ โ ์ฌ์๋ ์ฌ๋ถ ๊ฒฐ์ โ ๋ฃจํ' ๊ฐ์ ๋ฐ๋ณต/๋ถ๊ธฐ ๋ก์ง์ ํํํ ์ ์์ต๋๋ค. LangGraph์ `add_conditional_edges`์ ๋ฃจํ ๊ตฌ์กฐ๊ฐ ์ด๋ฐ ์์ด์ ํธ ํ๋ ํจํด์ ์ ํฉํฉ๋๋ค.", | |
| "source_id": "official-docs-langgraph", | |
| "difficulty": "hard" | |
| }, | |
| { | |
| "id": "docs-q75", | |
| "lesson_id": "docs-airflow", | |
| "question_type": "multiple_choice", | |
| "question": "**[์ํฉ ํ๋จ]** ๋ด์ค ์์ฝ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ์ต๋๋ค. ๋งค์ผ ์ค์ 6์์ ์๋์ผ๋ก ์คํ๋๊ณ ์คํจ ์ ์๋ฆผ์ ๋ฐ๊ณ ์ถ์ต๋๋ค. ๋ด๋น์ ์์ด๋ ์ฃผ๋ง์ ๋์ํด์ผ ํฉ๋๋ค. ๊ฐ์ฅ ์ ํฉํ ๋๊ตฌ๋?", | |
| "options": [ | |
| "Airflow โ DAG๋ก ์ค์ผ์ค ์ ์, ์คํจ ์๋ฆผ, ์ด์ ์คํ ์ด๋ ฅ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅ", | |
| "cron ์คํฌ๋ฆฝํธ โ ๊ฐ์ฅ ๋จ์ํ๊ณ ์ถ๊ฐ ์ค์น๊ฐ ์์", | |
| "Streamlit ๋ฒํผ โ ์๋ ์คํ์ด์ง๋ง UI๊ฐ ์์", | |
| "GitHub Actions โ CI/CD ํ๊ฒฝ์์ ์คํ ๊ฐ๋ฅ" | |
| ], | |
| "answer": "Airflow โ DAG๋ก ์ค์ผ์ค ์ ์, ์คํจ ์๋ฆผ, ์ด์ ์คํ ์ด๋ ฅ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅ", | |
| "explanation": "๋จ์ cron๋ ์ค์ผ์ค๋ง์ ๋์ง๋ง ์คํจ ์ ์๋ฆผ, ์ด์ ์คํ ์ด๋ ฅ ํ์ธ, ์ฌ์คํ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. Airflow๋ `@daily` ์ค์ผ์ค๋ก ์๋ ์คํ๋๊ณ , ์คํจ ์ ์ด๋ฉ์ผ/Slack ์๋ฆผ, ๊ณผ๊ฑฐ ์คํ ์ด๋ ฅ ์กฐํ, ์๋ ์ฌ์คํ์ด ๋ชจ๋ ์ง์๋ฉ๋๋ค. ๋ด๋น์ ์์ด ์ด์ํ๋ ํ๋ก๋์ ํ์ดํ๋ผ์ธ์ ์ ํฉํฉ๋๋ค.", | |
| "source_id": "official-docs-airflow", | |
| "difficulty": "medium" | |
| }, | |
| { | |
| "id": "docs-q76", | |
| "lesson_id": "docs-fastapi", | |
| "question_type": "multiple_choice", | |
| "question": "**[์ํฉ ํ๋จ]** RAG ์ฑ๋ด์ ์์ฑํ์ต๋๋ค. ํ๋ก ํธ์๋ ํ(React), ๋ชจ๋ฐ์ผ ํ(Flutter), ๋ฐ์ดํฐ ํ(Python)์ด ๋ชจ๋ ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. Streamlit ์ฑ ๊ทธ๋๋ก ๋ฐฐํฌํ๋ ๊ฒ์ด ์ข์๊น์?", | |
| "options": [ | |
| "์๋์ค โ FastAPI๋ก REST API๋ฅผ ๋ง๋ค์ด ๊ณต์ ํ๋ ๊ฒ์ด ์ ํฉ. ๊ฐ ํ์ด ์๊ธฐ ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐ ๊ฐ๋ฅ", | |
| "์ โ Streamlit UI๋ฅผ iframe์ผ๋ก ๊ฐ ํ ์๋น์ค์ ์ฝ์ ํ๋ฉด ๋จ", | |
| "์ โ Streamlit์ API ๊ธฐ๋ฅ๋ ์๋์ผ๋ก ์ ๊ณตํจ", | |
| "์๋์ค โ Gradio๋ก ๊ต์ฒดํด์ผ ๋ค๋ฅธ ํ๊ณผ ๊ณต์ ๊ฐ๋ฅ" | |
| ], | |
| "answer": "์๋์ค โ FastAPI๋ก REST API๋ฅผ ๋ง๋ค์ด ๊ณต์ ํ๋ ๊ฒ์ด ์ ํฉ. ๊ฐ ํ์ด ์๊ธฐ ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐ ๊ฐ๋ฅ", | |
| "explanation": "Streamlit์ UI์ ๋ก์ง์ด ๊ฒฐํฉ๋ ๋จ์ผ ์ฑ์ ๋๋ค. ๋ค๋ฅธ ํ์ด LLM ๊ธฐ๋ฅ์ ์ฌ์ฌ์ฉํ๋ ค๋ฉด API๊ฐ ํ์ํฉ๋๋ค. FastAPI๋ก `POST /ask` ์๋ํฌ์ธํธ๋ฅผ ๋ง๋ค๋ฉด React, Flutter, Python ์ด๋์๋ HTTP ์์ฒญ์ผ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค. Streamlit์ ๊ฐ์ธ/ํ ๋ด๋ถ ๋๊ตฌ, FastAPI๋ ์๋น์ค ํตํฉ์ ์ ํฉํฉ๋๋ค.", | |
| "source_id": "official-docs-fastapi", | |
| "difficulty": "medium" | |
| } | |
| ] |