노후 준비, 어떻게(How) 해야 할까? 고객이 누구인지를 깊이 이해하고(
Know Who), 그들에게 딱 맞는 노후 솔루션을 제시(Know How)하는 시니어 통합 자산 관리 & 라이프 케어 플랫폼 노후하우(KnowWhoHow) 의 AI 서버입니다.
사용자 자산·은퇴 목표·투자 성향을 바탕으로 금융상품을 추천하는 AI 서버입니다.
사용자 자산과 목표 키워드를 기준으로 상품 후보와 추천 이유를 함께 제공합니다.
사용자·세션별 대화 문맥을 유지하며 답변 키워드와 금융상품 추천을 연결합니다. 사용자 피드백은 실시간 Re-ranking에 반영하고, 프롬프트 인젝션 차단을 통해 민감 정보를 보호합니다.
flowchart LR
A[User Query] --> B[Persona Context]
B --> C[LangGraph Agent]
C --> D{Search Tool Selection}
D --> E1[Deposit]
D --> E2[Saving]
D --> E3[Annuity]
D --> E4[Fund]
E1 & E2 & E3 & E4 --> F[MongoDB Atlas<br/>Vector Search · Top 3]
F --> C
C --> G[Structured JSON]
G --> H[Feedback Re-ranking]
H --> I[REST / SSE Response]
J[(Like / Dislike Logs)] --> H
| 단계 | 처리 |
|---|---|
| Persona | 연령, 투자 성향, 자산, 소득, 은퇴 목표, 관심 키워드를 하나의 사용자 문맥으로 구성 |
| Retrieval | 에이전트가 상품군별 검색 도구를 호출하고 벡터 유사도 상위 3개 후보를 조회 |
| Generation | 검색 결과와 페르소나를 바탕으로 추천 상품·혜택·이유를 JSON으로 생성 |
| Re-ranking | 싫어요 상품은 제외하고 좋아요 상품은 상단에 배치 |
| Delivery | 추천 API 또는 챗봇 SSE 스트림으로 상품·답변·후속 질문을 전달 |
MySQL User Data
→ Persona Text + Embedding
→ MongoDB user_vectors
User Query + Persona Text
→ LangGraph Tool Calling
→ Product Vector Search (k=3)
→ LLM Structured Output
→ Feedback Re-ranking
- 페르소나 문맥: 사용자 정보를 페르소나 텍스트와 임베딩으로 저장한다. 온라인 추천에는 페르소나 텍스트를 에이전트 문맥으로 사용한다.
- 동일 임베딩 공간: 검색 질의와 금융상품
rag_text를text-embedding-004로 벡터화해 유사도를 계산한다. - 카테고리별 검색: 예금·적금·연금저축·펀드 컬렉션을 분리한다. 예금/적금은
product_type메타데이터로 한 번 더 필터링한다. - Agentic Retrieval: LangGraph가 질문과 페르소나에 맞는 검색 도구를 고르고, 도구 결과를 다음 추론 문맥에 넣는다.
flowchart LR
A[금융감독원 · 금융위원회 · KVIC API] --> B[Airflow DAG]
B --> C[정규화 · rag_text 생성]
C --> D[Gemini Embedding]
D --> E[(MongoDB Atlas Upsert)]
E --> F[Collection Merge]
E --> G[Expired Product Cleanup]
E --> H[Embedding Backfill]
F --> I[Vector Index]
상품군별 DAG가 원천 데이터를 수집하고 검색용 텍스트와 임베딩을 생성. 유지보수 DAG는 만기 상품 정리, 컬렉션 통합, 누락 임베딩 보강을 맡습니다.
만기되거나 갱신된 상품이 검색 후보에 남지 않도록 수집 DAG와 유지보수 DAG를 분리했습니다. 만기 상품 정리, 컬렉션 통합, 임베딩 backfill을 자동화해 검색 인덱스의 상태를 일정하게 유지하도록 합니다.
민감 정보 보호와 비용 효율성을 위해 온프레미스와 AWS를 터널링으로 연결한 하이브리드 구조입니다. CI/CD·데이터 수집·MyData는 온프레미스에서, Main·AI·Frontend 서버는 AWS Private Subnet에서 운영합니다.
외부 요청은 Route 53과 WAF를 거쳐 Public Subnet의 Nginx Reverse Proxy로 전달된 후, Private Subnet의 대상 서버로 라우팅됩니다. 내부 서버의 직접 SSH 접근은 차단하며, 허용된 IP의 관리자만 분리된 접속 키와 SSH ProxyJump를 사용해 Bastion Host를 경유합니다.
온프레미스에는 CI/CD와 MyData 시스템을 구성했습니다. Jenkins는 관리자 IP만 허용하고 민감 정보는 Credentials로 관리하며, MyData 트래픽은 Nginx와 HAProxy를 거쳐 Master·Slave DB로 분산됩니다. Airflow가 수집한 금융 데이터는 MongoDB Atlas의 벡터 검색에 활용됩니다.
| Area | Technology | Role |
|---|---|---|
| LLM | Gemini 2.5 Flash / Groq Qwen3-32B | 추천 근거 생성, 스트리밍 상담 |
| Agent | LangGraph, LangChain | 검색 도구 선택과 Agent-Tool 반복 실행 |
| Embedding | Google text-embedding-004 |
사용자·상품 텍스트 벡터화 |
| Retrieval | MongoDB Atlas Vector Search | 상품군별 의미 기반 Top-K 검색 |
| AI API | FastAPI | 추천·벡터화·SSE 챗봇 API |
| Data | Apache Airflow, Pandas, PyMongo | 금융상품 ETL·임베딩·적재·정리 |
| Storage | MongoDB Atlas, MySQL | 벡터/로그 저장, 사용자 원천 데이터 조회 |
평가 기준일: 2025-12-09
| 평가 | 데이터와 기준 | 결과 |
|---|---|---|
| RAG 시나리오 | 추천·지식·보안·일상대화 등 53개 질의의 의도/키워드/상품 반환 검증 | 46/53 (86.8%) |
| Retrieval | 추천 및 특정 상품 검색 25개 질의에서 기대 키워드가 Top-K에 포함되는지 확인 | Recall@1/3/5 = 0.92 |
| API 단위 테스트 | Chat·Recommendation·Vectorization·Admin, 외부 의존성 Mock | 38/38 통과 |
평가 원본은 rag_eval_result_final_20251209.csv, 테스트 범위는 test_results_report.md에 정리돼 있다.
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/v1/recommendations/{user_id} |
사용자 페르소나 기반 금융상품 추천 |
POST |
/api/v1/chat/stream |
SSE 기반 AI 상담 |
POST |
/api/v1/chat/feedback |
상품 좋아요·싫어요 저장 |
GET |
/api/v1/chat/history |
세션별 대화 내역 조회 |
POST |
/api/v1/users/{user_id}/vectorize |
사용자 페르소나 생성 및 벡터 갱신 |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/v1/admin/stats/overview |
전체 대화·API 호출·만족도·활성 사용자 통계 조회 |
GET |
/api/v1/admin/stats/trends |
월별 대화 및 API 요청 추이 조회 |
GET |
/api/v1/admin/stats/feedback |
좋아요·싫어요 피드백 분포 조회 |
GET |
/api/v1/admin/users |
사용자별 AI 사용량과 만족도 조회 |
GET |
/api/v1/admin/logs |
사용자별 최근 챗봇 대화 로그 조회 |
GET |
/api/v1/admin/logs/{user_id} |
특정 사용자의 전체 대화 내역 조회 |
- 금융상품 ETL 및 임베딩 파이프라인
- 사용자 마이데이터 기반 페르소나 생성과 벡터화
- LangGraph 상품 추천 에이전트와 카테고리별 검색 도구
- 구조화 추천 API, SSE 챗봇, 피드백 재정렬
- RAG 시나리오 평가와 API 단위 테스트
Directory Structure
ai-server/
├── airflow/
│ ├── dags/ # 상품 수집·임베딩·정리 DAG
│ └── plugins/etl_utils.py # 공통 ETL 로직
├── server/
│ ├── app/api/ # FastAPI endpoints
│ ├── app/rag/ # LangGraph, tools, prompts
│ ├── app/services/ # 추천·채팅·벡터화 서비스
│ └── tests/ # API 및 RAG 평가
├── scripts/ # 데이터 보정 유틸리티
└── docker-compose.local.yml






