Kentlo's picture
Sync from GitHub 37f011465a0aa2abdfdd94d8bd5f31cfe932c669
28677d8 verified
Raw
History Blame Contribute Delete
56.2 kB
[
{
"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"
}
]