Spaces:
Sleeping
Sleeping
ㅅㅎㅇ
commited on
Commit
·
780b454
1
Parent(s):
8e79e1b
fix: Neon DB ?좏쑕 ?곌껐 ??꾩븘???닿껐 諛?UI ?뺣낫 ?낅뜲?댄듃
Browse files- ConnectionPool???곌껐 ?앹〈 ?뺤씤 諛??먮룞 媛깆떊 ?ㅼ젙 異붽?
- check=ConnectionPool.check_connection: ?곌껐 ?ъ슜 ???앹〈 ?뺤씤
- max_lifetime=300: 5遺?寃쎄낵 ???곌껐 ?먮룞 媛깆떊
- TCP keepalive ?듭뀡 異붽?: ?ㅽ듃?뚰겕 ?⑥젅 諛⑹?
- UI ?ъ슜 媛?대뱶 諛??쒖뒪???뺣낫 ?뱀뀡 ?낅뜲?댄듃
- Fast Track ?덉떆 異붽?
- 吏?ν삎 ?먯씠?꾪듃 ?꾪궎?띿쿂 ?ㅻ챸 媛쒖꽑
- 怨좎젙諛 寃???붿쭊 諛??깅뒫 理쒖쟻???댁슜 異붽?
- CodeWeaver/src/agent/graph.py +16 -2
- CodeWeaver/ui/app.py +25 -25
CodeWeaver/src/agent/graph.py
CHANGED
|
@@ -157,16 +157,30 @@ def get_agent() -> Runnable:
|
|
| 157 |
# 1. 그래프 빌드
|
| 158 |
graph = build_agent_graph()
|
| 159 |
|
| 160 |
-
# 2. 동기 연결 풀 생성
|
| 161 |
# Windows ProactorLoop와 충돌하지 않음
|
| 162 |
safe_url = settings.postgres_db_url.split("@")[-1] if "@" in settings.postgres_db_url else "..."
|
| 163 |
logger.info(f"Target DB: {safe_url}")
|
| 164 |
|
|
|
|
| 165 |
_pool = ConnectionPool(
|
| 166 |
conninfo=settings.postgres_db_url,
|
| 167 |
min_size=1,
|
| 168 |
max_size=20,
|
| 169 |
-
kwargs={
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 170 |
)
|
| 171 |
|
| 172 |
# 3. 동기 체크포인터 연결
|
|
|
|
| 157 |
# 1. 그래프 빌드
|
| 158 |
graph = build_agent_graph()
|
| 159 |
|
| 160 |
+
# 2. 동기 연결 풀 생성 (옵션 강화)
|
| 161 |
# Windows ProactorLoop와 충돌하지 않음
|
| 162 |
safe_url = settings.postgres_db_url.split("@")[-1] if "@" in settings.postgres_db_url else "..."
|
| 163 |
logger.info(f"Target DB: {safe_url}")
|
| 164 |
|
| 165 |
+
# 📝 [FIX] ConnectionPool 설정 강화
|
| 166 |
_pool = ConnectionPool(
|
| 167 |
conninfo=settings.postgres_db_url,
|
| 168 |
min_size=1,
|
| 169 |
max_size=20,
|
| 170 |
+
kwargs={
|
| 171 |
+
"autocommit": True,
|
| 172 |
+
# TCP 레벨 Keepalive 설정 (네트워크 단절 감지)
|
| 173 |
+
"keepalives": 1,
|
| 174 |
+
"keepalives_idle": 30,
|
| 175 |
+
"keepalives_interval": 10,
|
| 176 |
+
"keepalives_count": 5
|
| 177 |
+
},
|
| 178 |
+
# 핵심 1: 연결을 빌려주기 전에 살아있는지 확인 (SELECT 1 실행)
|
| 179 |
+
check=ConnectionPool.check_connection,
|
| 180 |
+
|
| 181 |
+
# 핵심 2: 연결 최대 수명 설정 (300초 = 5분)
|
| 182 |
+
# 5분이 지난 연결은 Pool이 알아서 버리고 새로 만듦 -> Neon의 유휴 타임아웃 회피
|
| 183 |
+
max_lifetime=300
|
| 184 |
)
|
| 185 |
|
| 186 |
# 3. 동기 체크포인터 연결
|
CodeWeaver/ui/app.py
CHANGED
|
@@ -229,9 +229,9 @@ def create_demo() -> gr.Blocks:
|
|
| 229 |
|
| 230 |
### 🚀 주요 기능 활용법
|
| 231 |
1. **Fast Track (빠른 대화)**
|
| 232 |
-
- `"
|
| 233 |
2. **다중 질문 처리 (Map-Reduce)**
|
| 234 |
-
- `"JWT가 뭐야? 그리고 CORS는?"` 처럼
|
| 235 |
3. **문맥 이해 (History)**
|
| 236 |
- `"좀 더 쉽게 설명해줘"` 또는 `"예제 코드로 보여줘"`라고 하면 이전 답변을 바탕으로 보충 설명합니다.
|
| 237 |
4. **쿼리 자동 개선**
|
|
@@ -243,7 +243,7 @@ def create_demo() -> gr.Blocks:
|
|
| 243 |
1. 대화를 나눈 후 **Session ID**를 복사해둡니다.
|
| 244 |
2. 페이지를 새로고침하거나 브라우저를 재시작합니다.
|
| 245 |
3. Session ID 입력창에 복사한 ID를 넣고 대화를 시도합니다.
|
| 246 |
-
4.
|
| 247 |
- 새로운 주제로 대화하려면 반드시 `🗑️ 대화 초기화` 버튼을 누르세요.
|
| 248 |
""")
|
| 249 |
|
|
@@ -321,32 +321,32 @@ def create_demo() -> gr.Blocks:
|
|
| 321 |
# 5. 시스템 정보 (업데이트된 리팩토링 내용 반영)
|
| 322 |
with gr.Accordion("📊 시스템 아키텍처 및 상세 기술 정보", open=False):
|
| 323 |
gr.Markdown("""
|
| 324 |
-
### 🏗️
|
| 325 |
-
CodeWeaver는
|
| 326 |
-
- **
|
| 327 |
-
- **
|
| 328 |
-
- **
|
| 329 |
-
- **Active Self-Correction**: 검색 결과 부족 시 쿼리 자동 정제(Refinement)
|
| 330 |
-
- **Persistence**: 대화 상태의 저장 및 복구
|
| 331 |
|
| 332 |
-
###
|
| 333 |
-
|
| 334 |
-
|
| 335 |
-
|
| 336 |
-
|
| 337 |
-
|
| 338 |
-
|
| 339 |
-
|
| 340 |
-
|
| 341 |
-
|
| 342 |
-
|
| 343 |
-
|
|
|
|
|
|
|
| 344 |
|
| 345 |
### 🛠️ Tech Stack
|
| 346 |
- **Core**: LangGraph, LangChain, Python 3.12
|
| 347 |
-
- **
|
| 348 |
-
- **
|
| 349 |
-
- **Infra**: Neon Serverless PostgreSQL, Qdrant Cloud
|
| 350 |
""")
|
| 351 |
|
| 352 |
return demo
|
|
|
|
| 229 |
|
| 230 |
### 🚀 주요 기능 활용법
|
| 231 |
1. **Fast Track (빠른 대화)**
|
| 232 |
+
- `"대화 요약해줘"`, `"너 누구야?"` 같은 일상 대화는 검색 없이 즉시 답변합니다.
|
| 233 |
2. **다중 질문 처리 (Map-Reduce)**
|
| 234 |
+
- `"JWT가 뭐야? 그리고 CORS는?"` 처럼 최대 2개의 질문을 한 번에 할 수 있습니다.(single search subgraph 동적 복제)
|
| 235 |
3. **문맥 이해 (History)**
|
| 236 |
- `"좀 더 쉽게 설명해줘"` 또는 `"예제 코드로 보여줘"`라고 하면 이전 답변을 바탕으로 보충 설명합니다.
|
| 237 |
4. **쿼리 자동 개선**
|
|
|
|
| 243 |
1. 대화를 나눈 후 **Session ID**를 복사해둡니다.
|
| 244 |
2. 페이지를 새로고침하거나 브라우저를 재시작합니다.
|
| 245 |
3. Session ID 입력창에 복사한 ID를 넣고 대화를 시도합니다.
|
| 246 |
+
4. `"우리 대화 요약해줘"`라고 물어보면 DB에 저장된 기록을 불러와 답변합니다.
|
| 247 |
- 새로운 주제로 대화하려면 반드시 `🗑️ 대화 초기화` 버튼을 누르세요.
|
| 248 |
""")
|
| 249 |
|
|
|
|
| 321 |
# 5. 시스템 정보 (업데이트된 리팩토링 내용 반영)
|
| 322 |
with gr.Accordion("📊 시스템 아키텍처 및 상세 기술 정보", open=False):
|
| 323 |
gr.Markdown("""
|
| 324 |
+
### 🏗️ 지능형 에이전트 아키텍처 (Agentic Workflow)
|
| 325 |
+
CodeWeaver는 단순한 LLM 호출을 넘어, 스스로 계획하고 검증하는 **LangGraph 기반 자율 에이전트**입니다.
|
| 326 |
+
- **Planning & Dynamic Routing**: 질문 의도를 분석하여 단순 대화, 기술 질문, 다중 질문으로 분류하고 최적의 경로로 실행합니다.
|
| 327 |
+
- **Map-Reduce (Parallel Execution)**: 복합적인 질문을 독립된 하위 작업으로 분해하여 병렬 처리 후, 결과를 하나로 통합합니다.
|
| 328 |
+
- **Active Self-Correction**: 검색 결과가 부족하거나 모호할 경우, 스스로 쿼리를 수정하고 재검색(Refinement)하여 답변 품질을 높입니다.
|
|
|
|
|
|
|
| 329 |
|
| 330 |
+
### 🔍 고정밀 검색 엔진 (High-Precision RAG)
|
| 331 |
+
할루시네이션을 방지하고 개발자에게 신뢰할 수 있는 정보를 제공하기 위한 고도화된 검색 파이프라인을 구축했습니다.
|
| 332 |
+
- **Cross-Encoder Reranking**: 검색된 문서들을 **Jina-Reranker**로 정밀 채점하여, 관련성 점수(Threshold 0.35) 미만의 정보는 필터링합니다.
|
| 333 |
+
- **Domain Optimization**: StackOverflow, GitHub, 공식 문서 등 개발자에게 유의미��� **30+ 신뢰 도메인**을 우선적으로 탐색합니다.
|
| 334 |
+
- **Query Translation**: 한글 기술 용어를 영어 원문으로 자동 병기하여 검색 정확도를 극대화했습니다.
|
| 335 |
+
|
| 336 |
+
### ⚡ 성능 최적화 및 사용자 경험 (Performance & UX)
|
| 337 |
+
- **Fast Track**: "안녕", "요약해줘" 같은 일반 대화는 검색 과정을 생략하고 즉시 응답하여 지연 시간을 없앴습니다.
|
| 338 |
+
- **Context Stuffing**: 검색 결과를 요약하는 불필요한 단계를 제거하고, 검증된 원본 문맥을 LLM에 직접 주입하여 **정보 손실 방지 및 속도 향상**을 달성했습니다.
|
| 339 |
+
- **Non-blocking Caching**: 답변 생성 후 Vector DB 저장 작업은 백그라운드 스레드(Daemon)에서 비동기 처리하여 체감 속도를 높였습니다.
|
| 340 |
+
|
| 341 |
+
### 🛡️ 데이터 안정성 및 영속성 (Robustness)
|
| 342 |
+
- **Persistence (PostgreSQL)**: **Neon Serverless DB**를 연동하여 서버가 재시작되어도 대화 맥락(Context)이 영구적으로 보존됩니다.
|
| 343 |
+
- **Type Safety**: Pydantic을 통해 시스템 내부의 모든 데이터 흐름과 상태를 엄격하게 검증하여 런타임 안정성을 확보했습니다.
|
| 344 |
|
| 345 |
### 🛠️ Tech Stack
|
| 346 |
- **Core**: LangGraph, LangChain, Python 3.12
|
| 347 |
+
- **Model**: Google Gemini 2.5 Flash Lite (Reasoning), Jina-Reranker (Evaluation)
|
| 348 |
+
- **Retrieval**: Tavily, StackExchange, GitHub API, FastEmbed
|
| 349 |
+
- **Infra**: Neon Serverless PostgreSQL (Persistence), Qdrant Cloud (Semantic Cache)
|
| 350 |
""")
|
| 351 |
|
| 352 |
return demo
|