AI κΈ°λ° μμ°μ΄ 쿼리μ μ€μκ° μ΄μ νμ§λ‘ λꡬλ μ½κ² λ°μ΄ν°λ² μ΄μ€ λͺ¨λν°λ§ν μ μλ νκ΅ν DB λͺ¨λν°λ§ νλ«νΌμ λλ€.
- Text-to-SQL: μμ°μ΄λ‘ μ λ ₯ν λͺ¨λν°λ§ μ§νλ₯Ό μλμΌλ‘ SQLλ‘ λ³ν
- μ€μκ° λ―Έλ¦¬λ³΄κΈ°: μμ±λ SQL 쿼리 κ²°κ³Όλ₯Ό μ¦μ νμΈ
- μ€λ§νΈ ν μ΄λΈ μΆμ²: κ΄λ ¨ ν μ΄λΈμ AIκ° μλ μΆμ²νμ¬ μ΄μμΉ κ°μ§ μ νλ ν₯μ
- μλ μ€μΌμ€λ§: 1μκ°λ§λ€ λ±λ‘λ μ§νλ₯Ό μλ μ€ν
- λ€μν μ§ν νμ : μμΉν, μΉ΄ν κ³ λ¦¬ν, μνν μ§ν μ§μ
- μ€μκ° λμ보λ: μ§κ΄μ μΈ μ°¨νΈμ μκ°νλ‘ λͺ¨λν°λ§ νν© νμΈ
- μλ μ΄μ νμ§: ν΅κ³ κΈ°λ° μ΄μμΉ κ°μ§ μκ³ λ¦¬μ¦
- λ€μ€ μλ¦Ό μ±λ: μ΄λ©μΌ, Slack, Webhook μ§μ
- ν νμ : μν λ³ μλ¦Ό λμ μ€μ
- μ€μκ° μν λͺ¨λν°λ§: μ§νλ³ μ μ/κ²½κ³ /μ₯μ μν νμ
- DB μ°κ²° μν: μ°κ²°λ λ°μ΄ν°λ² μ΄μ€ μν μ€μκ° νμΈ
- μ€μΌμ€λ¬ μν: λ°±κ·ΈλΌμ΄λ λͺ¨λν°λ§ μλΉμ€ μν νμ
- FastAPI: κ³ μ±λ₯ Python μΉ νλ μμν¬
- LangGraph: AI μμ΄μ νΈ μν¬νλ‘μ° μ€μΌμ€νΈλ μ΄μ
- Azure OpenAI: GPT-4 κΈ°λ° μμ°μ΄ μ²λ¦¬
- Azure Cosmos DB: λͺ¨λν°λ§ λ°μ΄ν° μ μ₯
- Azure AI Search: μ€ν€λ§ κ²μ λ° RAG
- APScheduler: λ°±κ·ΈλΌμ΄λ μμ μ€μΌμ€λ§
- React 19: μ΅μ React λ²μ
- TypeScript: νμ μμ μ±
- Tailwind CSS: μ νΈλ¦¬ν° κΈ°λ° μ€νμΌλ§
- Recharts: λ°μ΄ν° μκ°ν
- TanStack Query: μλ² μν κ΄λ¦¬
- GPT-4: μμ°μ΄ 쿼리λ₯Ό SQLλ‘ λ³ννλ ν΅μ¬ AI λͺ¨λΈ
- Text Embedding: μ€ν€λ§ λ¬Έμμ 벑ν°νλ₯Ό ν΅ν μλ―Έ κΈ°λ° κ²μ
- Chat Completion API: λνν SQL μμ± λ° κ²μ¦
- νμ΄λΈλ¦¬λ κ²μ: ν€μλ κ²μ + λ²‘ν° κ²μμ μ‘°ν©
- νκ΅μ΄ λΆμκΈ°:
ko.luceneλΆμκΈ°λ‘ νκ΅μ΄ 쿼리 μ΅μ ν - λ©ν°ν λνΈ μ§μ: κ³ κ°μ¬λ³ μ€ν€λ§ μΈλ±μ€ λΆλ¦¬
- νν°λ§: μ€ν€λ§, ν μ΄λΈ, λΉμ¦λμ€ νκ·Έ κΈ°λ° μ λ° κ²μ
- NoSQL λ¬Έμ μ μ₯: λͺ¨λν°λ§ μ§ν, 쿼리 νμ€ν 리, μ΄μ κ°μ§ κ²°κ³Ό
- μλ μ€μΌμΌλ§: νΈλν½ μ¦κ°μ λ°λ₯Έ μλ μ±λ₯ νμ₯
- κΈλ‘λ² λΆμ°: λ€μ€ 리μ 볡μ λ‘ κ³ κ°μ©μ± ν보
- λ§μ΄ν¬λ‘μλΉμ€ λ°°ν¬: λ°±μλ APIμ μ€μΌμ€λ¬ μλΉμ€ λΆλ¦¬
- μλ μ€μΌμΌλ§: μ¬μ©λμ λ°λ₯Έ 컨ν μ΄λ μΈμ€ν΄μ€ μ‘°μ
- κ΄λ¦¬ν μΈνλΌ: μλ²λ¦¬μ€ νκ²½μΌλ‘ μ΄μ λΆλ΄ μ΅μν
μ¬μ©μ μμ°μ΄ μ
λ ₯
β
Azure OpenAI (GPT-4) - 쿼리 μ΄ν΄
β
Azure AI Search - κ΄λ ¨ μ€ν€λ§ κ²μ (RAG)
β
Azure OpenAI (GPT-4) - SQL μμ±
β
PostgreSQL - 쿼리 μ€ν
β
Azure Cosmos DB - κ²°κ³Ό μ μ₯
β
μ΄μμΉ κ°μ§ μκ³ λ¦¬μ¦
β
μλ¦Ό μμ€ν
(Slack/Email)
- Azure AI Searchλ₯Ό ν΅ν κ΄λ ¨ ν μ΄λΈ κ²μ
- νμ΄λΈλ¦¬λ κ²μμΌλ‘ μ νλ ν₯μ
- λΉμ¦λμ€ μ»¨ν μ€νΈ κΈ°λ° μ€μ½μ΄λ§
- κ²μλ μ€ν€λ§ μ 보λ₯Ό λ°νμΌλ‘ SQL μμ±
- GPT-4 κΈ°λ° μμ°μ΄ β SQL λ³ν
- λΉμ¦λμ€ λ‘μ§μ κ³ λ €ν 쿼리 μ΅μ ν
- SQL λ¬Έλ² λ° λ³΄μ κ²μ¦
- μ€ν€λ§ νΈνμ± νμΈ
- μνν 쿼리 μ°¨λ¨ (DDL, DML λ±)
- μ½κΈ° μ μ© κ³μ μΌλ‘ μμ ν 쿼리 μ€ν
- νμμμ λ° κ²°κ³Ό μ ν μ€μ
- μλ¬ νΈλ€λ§ λ° λ‘κΉ
- ν΅κ³ κΈ°λ° μ΄μμΉ νμ§ μκ³ λ¦¬μ¦
- νμ€ν 리 λ°μ΄ν°μ λΉκ΅ λΆμ
- μκ³κ° κΈ°λ° μλ¦Ό νΈλ¦¬κ±°
class AgentState(TypedDict):
user_query: str # μ¬μ©μ μ
λ ₯
relevant_tables: List[dict] # κ²μλ ν
μ΄λΈ μ 보
generated_sql: str # μμ±λ SQL
sql_valid: bool # κ²μ¦ κ²°κ³Ό
query_result: dict # μ€ν κ²°κ³Ό
anomaly_detected: bool # μ΄μ κ°μ§ μ¬λΆ
notification_sent: bool # μλ¦Ό λ°μ‘ μνPostgreSQL μ€ν€λ§ μΆμΆ
β
λΉμ¦λμ€ μ»¨ν
μ€νΈ μμ± (YAML)
β
λ¬Έμν λ° λ©νλ°μ΄ν° μΆκ°
β
Azure OpenAI μλ² λ© μμ±
β
Azure AI Search μΈλ±μ±
- 쿼리 λΆμ: μ¬μ©μ μμ°μ΄ μ λ ₯ νμ±
- 컨ν μ€νΈ κ²μ: κ΄λ ¨ ν μ΄λΈ/μ»¬λΌ μ 보 κ²μ
- 컨ν μ€νΈ μμΆ: μ€λ³΅ μ κ±° λ° κ΄λ ¨μ± λμ μ 보 μ λ³
- SQL μμ±: κ²μλ 컨ν μ€νΈλ₯Ό λ°νμΌλ‘ μ νν SQL μμ±
{
"id": "table_name",
"object_type": "table|column|view",
"name": "ν
μ΄λΈλͺ
",
"description": "ν
μ΄λΈ μ€λͺ
",
"content": "κ²μμ© ν
μ€νΈ",
"columns_text": "μ»¬λΌ μ 보",
"relations_text": "κ΄κ³ μ 보",
"sample_queries_text": "μμ 쿼리",
"business_tags": ["νκ·Έ1", "νκ·Έ2"],
"embedding": [벑ν°κ°...]
}- 1μκ° κ°κ²©: λ±λ‘λ λͺ¨λ μ§ν μλ μ€ν
- λ©ν°ν λνΈ: κ³ κ°μ¬λ³ λ 립μ μΈ λͺ¨λν°λ§
- μ₯μ 볡ꡬ: μ€ν¨ν μμ μλ μ¬μλ
- μν μΆμ : μ€μκ° μ€μΌμ€λ¬ μν λͺ¨λν°λ§
- μλμ λΉμ¨ κ°μ§: 20κ° μ€ 1κ°(5%)λ μ΄μμΉλ‘ κ°μ§
- μΉ΄ν κ³ λ¦¬ν λΆν¬ λΆμ: κ·Ήμ/μμ μΉ΄ν κ³ λ¦¬ μλ κ°μ§
- λ€μΈ΅ κ°μ§ μμ€ν : NULL, μ€λ³΅, λΆν¬ μ΄μμΉ μ’ ν© λΆμ
- ν΅κ³μ λ°©λ²: Z-score, IQR κΈ°λ° μμΉν μμλΌμ΄μ΄ νμ§
- μκ³μ΄ λΆμ: νΈλ λ λ³ν λ° ν¨ν΄ μ΄μ κ°μ§
- νμ΅ κΈ°λ₯: νμ€ν 리 λ°μ΄ν° κΈ°λ° μκ³κ° μλ μ‘°μ
- κ·Ήμ μΉ΄ν κ³ λ¦¬: 1% λ―Έλ§ (100κ° μ€ 1κ°)
- μμ μΉ΄ν κ³ λ¦¬: 5% λ―Έλ§ (20κ° μ€ 1κ°) β ν΅μ¬ κΈ°λ₯
- λΆν¬ λΆκ· ν: ν κ°μ΄ 90% μ΄μ μ°¨μ§
- μλμ NULL κ°μ§: 15κ° μ€ 1κ°λ§ NULLμ΄μ΄λ μ΄μμΉλ‘ κ°μ§
- NOT NULL 컬λΌμ NULL κ° μ‘΄μ¬ (μ¬κ°)
- μμ NULL (5% λ―Έλ§) - 20κ° μ€ 1κ° λ―Έλ§
- κ·Ήμ NULL (1% λ―Έλ§) - 100κ° μ€ 1κ° λ―Έλ§
- λ€μ NULL (20% μ΄μ) - λ°μ΄ν° νμ§ λ¬Έμ
- νκ΅μ΄ μ΅μ ν:
ko.luceneλΆμκΈ°λ‘ νκ΅μ΄ 쿼리 μ νλ ν₯μ - λΉμ¦λμ€ μ»¨ν μ€νΈ: λλ©μΈλ³ μ©μ΄μ λΉμ¦λμ€ λ‘μ§ μ΄ν΄
- λ§₯λ½μ μ΄ν΄: "μ κ· νμκ°μ μ", "μ΄νλ₯ " λ± λΉμ¦λμ€ μ©μ΄ μλ ν΄μ
- νμ΄λΈλ¦¬λ κ²μ: ν€μλ + λ²‘ν° κ²μμΌλ‘ μ νλ κ·Ήλν
- κ΄κ³ν μΆλ‘ : ν μ΄λΈ κ° κ΄κ³λ₯Ό κ³ λ €ν μ€λ§νΈ μΆμ²
- 컨ν μ€νΈ μμΆ: κ΄λ ¨μ± λμ μ λ³΄λ§ μ λ³νμ¬ ν ν° ν¨μ¨μ± μ¦λ
- μλμ λΉμ¨ κ°μ§: 20κ° μ€ 1κ°(5%)λ μ νν κ°μ§
- μΉ΄ν κ³ λ¦¬ν λΆμ: λΆν¬ λΆκ· ν λ° μμ μΉ΄ν κ³ λ¦¬ μλ νμ§
- λ€μΈ΅ κ°μ§: NULL, μ€λ³΅, λΆν¬ μ΄μμΉλ₯Ό μ’ ν©μ μΌλ‘ λΆμ
- μ€μκ° λͺ¨λν°λ§: 1μκ°λ§λ€ μλ μ€νλλ λ°±κ·ΈλΌμ΄λ λͺ¨λν°λ§
- λ§μ΄ν¬λ‘μλΉμ€: API, μ€μΌμ€λ¬, μλ¦Ό μλΉμ€ λΆλ¦¬
- ν΄λΌμ°λ λ€μ΄ν°λΈ: Azure μλΉμ€ κΈ°λ° μμ κ΄λ¦¬ν μΈνλΌ
- μλ μ€μΌμΌλ§: νΈλν½ μ¦κ°μ λ°λ₯Έ μλ νμ₯
# νκ²½ λ³μ μ€μ
cp .env.sample .env
# .env νμΌμ νμν Azure μλΉμ€ ν€λ€μ μ€μ νμΈμ# λ°±μλ μλ² (ν¬νΈ 8000)
uv run uvicorn backend.api.v1.main:app --reload --port 8000
# νλ‘ νΈμλ μλ² (ν¬νΈ 5173)
cd frontend
yarn install
yarn dev# λ°±μλμ νλ‘ νΈμλ λͺ¨λ λ°°ν¬
./scripts/deployment/azure/deploy-container-apps.sh
# λλ λͺ
μμ μΌλ‘ all μ΅μ
μ¬μ©
./scripts/deployment/azure/deploy-container-apps.sh all./scripts/deployment/azure/deploy-container-apps.sh backend./scripts/deployment/azure/deploy-container-apps.sh frontend# λ°±μλ μ μ© λ°°ν¬
./scripts/deployment/azure/deploy-backend.sh
# νλ‘ νΈμλ μ μ© λ°°ν¬
./scripts/deployment/azure/deploy-frontend.sh./scripts/deployment/azure/deploy-container-apps.sh help-
Azure CLI μ€μΉ λ° λ‘κ·ΈμΈ
az login az account set --subscription "your-subscription-id"
-
νκ²½λ³μ μ€μ
# .env.production νμΌ μμ± cp .env.sample .env.production # νμν Azure μλΉμ€ ν€λ€μ μ€μ
-
νμ νκ²½λ³μ
ACR_NAME: Azure Container Registry μ΄λ¦COSMOS_ENDPOINT,COSMOS_KEY: Cosmos DB μ°κ²° μ 보AZURE_SEARCH_*: Azure AI Search μ€μ AZURE_OPENAI_*: Azure OpenAI μλΉμ€ μ€μ - κΈ°ν λͺ¨λν°λ§ κ΄λ ¨ μ€μ λ€
db-agent/
βββ backend/ # FastAPI λ°±μλ
β βββ api/v1/ # API μλν¬μΈνΈ
β βββ core/ai/ # AI μμ΄μ νΈ λ° LangGraph
β βββ services/ # λΉμ¦λμ€ λ‘μ§
β βββ models/ # λ°μ΄ν° λͺ¨λΈ
β βββ repositories/ # λ°μ΄ν° μ κ·Ό κ³μΈ΅
βββ frontend/ # React νλ‘ νΈμλ
β βββ src/pages/ # νμ΄μ§ μ»΄ν¬λνΈ
β βββ src/components/ # μ¬μ¬μ© κ°λ₯ν μ»΄ν¬λνΈ
β βββ src/features/ # κΈ°λ₯λ³ λͺ¨λ
βββ scripts/ # μ€μ λ° μ νΈλ¦¬ν° μ€ν¬λ¦½νΈ
βββ infrastructure/ # μΈνλΌ μ½λ