ㅅㅎㅇ 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 ?덉떆 異붽?
- 吏€?ν삎 ?먯씠?꾪듃 ?꾪궎?띿쿂 ?ㅻ챸 媛쒖꽑
- 怨좎젙諛€ 寃€???붿쭊 諛??깅뒫 理쒖쟻???댁슜 異붽?

Files changed (2) hide show
  1. CodeWeaver/src/agent/graph.py +16 -2
  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={"autocommit": True}
 
 
 
 
 
 
 
 
 
 
 
 
 
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는?"` 처럼 **최대 2개** 질문을 한 번에 할 수 있습니다.
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. **`"우리 대화 요약해줘"`**라고 물어보면 DB에 저장된 기록을 불러와 답변합니다.
247
  - 새로운 주제로 대화하려면 반드시 `🗑️ 대화 초기화` 버튼을 누르세요.
248
  """)
249
 
@@ -321,32 +321,32 @@ def create_demo() -> gr.Blocks:
321
  # 5. 시스템 정보 (업데이트된 리팩토링 내용 반영)
322
  with gr.Accordion("📊 시스템 아키텍처 및 상세 기술 정보", open=False):
323
  gr.Markdown("""
324
- ### 🏗️ LangGraph 구현 패턴 (핵심 기능)
325
- CodeWeaver는 LangGraph의 고급 패턴을 활용하여 자율 에이전트를 구현했습니다.
326
- - **Conditional Edges**: 질문 유형, 캐시 히트, 검색 품질에 따른 동적 라우팅
327
- - **Send API (Map-Reduce)**: 다중 질문의 병렬 실행(Fan-out) 결과 통합(Fan-in)
328
- - **Subgraph**: 검색-평가-정제 과정의 모듈화
329
- - **Active Self-Correction**: 검색 결과 부족 시 쿼리 자동 정제(Refinement)
330
- - **Persistence**: 대화 상태의 저장 및 복구
331
 
332
- ### 최신 리팩토링 최적화 사항 (Technical Highlights)
333
- 1. **아키텍처 안정화 (Sync Mode 전환)**
334
- - **배경**: Windows(`ProactorEventLoop`)와 `psycopg 3` 드라이버, `Gradio` 간의 Event Loop 충돌 발생.
335
- - **해결**: 불안정한 비동기 처리 대신 **동기(Sync) 모드**로 아키텍처를 전환하고 `ConnectionPool`을 적용하여 OS 제약 없는 안정적인 실행 환경 확보.
336
- 2. **데이터 영속성 (Persistence)**
337
- - 기존 In-Memory 방식을 **Neon Serverless PostgreSQL**로 교체하여, 서버 재시작 시에도 대화 맥락이 영구 보존되도록 개선.
338
- 3. **검색 품질 고도화 (Reranking)**
339
- - **Cross-Encoder(Jina-Reranker)** 도입: 검색 결과의 문맥 유사도를 정밀 채점하여 정확도 대폭 향상 (Threshold 0.35 필터링).
340
- 4. **응답 속도 최적화**
341
- - **Context Stuffing**: 검색 결과 요약 단계를 제거하고 원본 문맥을 활용하여 Latency 단축.
342
- - **Non-blocking Caching**: 캐시 저장 로직을 백그라운드 스레드로 분리.
343
- - **Fast Track**: 일상 대화 즉시 응답 처리.
 
 
344
 
345
  ### 🛠️ Tech Stack
346
  - **Core**: LangGraph, LangChain, Python 3.12
347
- - **AI Model**: Google Gemini 2.5 Flash Lite
348
- - **Search**: Tavily (30+ Docs), StackOverflow, GitHub, Jina Reranker
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