Skip to content

Commit 315afca

Browse files
authored
Merge pull request #14 from PARADOX-BSSM/dev-0.2
Dev 0.2
2 parents 717a611 + 613e1e8 commit 315afca

44 files changed

Lines changed: 2568 additions & 57 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.serena/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/cache
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# 코드 스타일 및 규칙
2+
3+
## 네이밍 규칙
4+
- **변수/함수/메서드**: `snake_case`
5+
- **클래스**: `PascalCase`
6+
- **상수**: `UPPER_SNAKE_CASE`
7+
- **비공개 메서드/속성**: `_leading_underscore`
8+
9+
## 타입 힌트
10+
- **필수**: 모든 함수 파라미터와 반환값에 타입 힌트 사용
11+
- **형식**: 콜론 앞에 공백 (예: `user_id : str`, `chatbot_id: int`)
12+
- 일관성은 없지만 대부분 콜론 뒤에만 공백
13+
- **타입**: Python 표준 타입 힌트 사용 (`str`, `int`, `dict`, `list` 등)
14+
- **Optional**: `Optional[T]` 또는 `T | None` 사용
15+
16+
## 비동기 프로그래밍
17+
- **async/await**: FastAPI 엔드포인트와 서비스 로직에서 일관되게 사용
18+
- **비동기 함수**: 모든 I/O 작업 (DB, API 호출, gRPC 등)은 비동기로 처리
19+
```python
20+
async def chat(chatbot_id: int, ...) -> BaseResponse:
21+
chatbot_response = await chatbot_service.chat(...)
22+
return BaseResponse(...)
23+
```
24+
25+
## FastAPI 패턴
26+
27+
### 라우터
28+
- **APIRouter 사용**: 각 도메인별로 라우터 분리
29+
- **prefix와 tags**: 라우터 그룹화
30+
```python
31+
router = APIRouter(prefix="/chatbots", tags=["chatbot"])
32+
```
33+
34+
### 의존성 주입
35+
- **Depends**: FastAPI의 의존성 주입 시스템 활용
36+
```python
37+
async def chat(
38+
chatbot_id: int,
39+
user_id: str = Depends(get_user_id),
40+
user_grpc_client: UserGrpcClient = Depends(user_stub_dep),
41+
):
42+
...
43+
```
44+
45+
### 응답 형식
46+
- **BaseResponse**: 일관된 응답 래퍼 사용
47+
```python
48+
return BaseResponse(message="success message", data=response_data)
49+
```
50+
51+
## 예외 처리
52+
- **BusinessException**: 비즈니스 로직 예외는 커스텀 예외 사용
53+
```python
54+
class BusinessException(Exception):
55+
def __init__(self, message: str = "에러 발생", status_code: int = 500):
56+
self.status_code = status_code
57+
self.message = message
58+
```
59+
- **Global Exception Handler**: `main.py`에서 전역 예외 처리
60+
61+
## 코멘트 및 문서화
62+
- **한글 코멘트**: 코드 내 주석은 한글로 작성
63+
```python
64+
# 캐릭터 챗
65+
@router.post("/chat/{chatbot_id}")
66+
async def chat(...):
67+
...
68+
```
69+
- **Docstring**: 복잡한 함수에는 docstring 추가 권장 (하지만 필수는 아님)
70+
71+
## Import 순서
72+
1. 표준 라이브러리
73+
2. 서드파티 라이브러리
74+
3. 로컬 모듈
75+
- `core.*`
76+
- `api.*`
77+
- `app.*`
78+
79+
예시:
80+
```python
81+
from fastapi import APIRouter, Depends, Query
82+
83+
from core.grpcs.client import UserGrpcClient
84+
from api.depends.get_user_id import get_user_id
85+
from api.schemas.request.chatbot_request import ChatRequest
86+
from app.chatbot.service import chatbot_service
87+
```
88+
89+
## 파일 구조
90+
- **라우터**: `api/routers/` - FastAPI 엔드포인트만 정의
91+
- **서비스**: `app/{domain}/service.py` - 비즈니스 로직
92+
- **스키마**: `api/schemas/` - Pydantic 모델
93+
- **의존성**: `api/depends/`, `core/*/deps/` - 의존성 주입 함수
94+
95+
## 데이터베이스
96+
- **Beanie ORM**: MongoDB 모델 정의
97+
- **MongoDB 연결**: 앱 lifespan에서 초기화/종료
98+
```python
99+
@asynccontextmanager
100+
async def lifespan(app: FastAPI):
101+
await init_mongodb(app)
102+
yield
103+
await close_mongodb(app)
104+
```
105+
106+
## 코드 포맷팅
107+
- 명시적인 린터/포맷터 설정 파일 없음
108+
- 일반적인 Python 컨벤션 따름 (PEP 8 기반)
109+
- 들여쓰기: 4 스페이스
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# FastAPIProject - 프로젝트 개요
2+
3+
## 프로젝트 목적
4+
AI 캐릭터 챗봇 시스템을 제공하는 FastAPI 기반 백엔드 API 서비스입니다.
5+
6+
### 주요 기능
7+
- **AI 캐릭터 챗봇**: LangChain, OpenAI, Pinecone을 활용한 RAG 기반 대화형 챗봇
8+
- **챗봇 말투셋 관리**: 캐릭터별 말투와 스타일 커스터마이징
9+
- **대화 히스토리**: 사용자와 챗봇 간의 대화 기록 관리
10+
- **gRPC 통신**: User, Chatbot 등 다른 마이크로서비스와 통신
11+
- **이벤트 처리**: Kafka를 통한 비동기 이벤트 발행/구독
12+
- **웹 크롤링**: Selenium + Chromium을 활용한 웹 데이터 수집
13+
14+
## 기술 스택
15+
16+
### 백엔드 프레임워크
17+
- **Python 3.11**
18+
- **FastAPI 0.116**: 현대적인 Python 웹 프레임워크
19+
- **Uvicorn**: ASGI 서버
20+
21+
### 데이터베이스 및 저장소
22+
- **MongoDB** (Motor + Beanie ORM): 주 데이터베이스
23+
- **Redis**: 캐싱
24+
- **Pinecone**: 벡터 데이터베이스 (임베딩 저장)
25+
26+
### AI/ML
27+
- **LangChain**: AI 애플리케이션 프레임워크
28+
- **OpenAI API**: LLM
29+
- **Google Generative AI**: 추가 AI 모델
30+
- **DeepSeek**: 대체 LLM
31+
32+
### 메시징 및 통신
33+
- **Kafka** (aiokafka): 이벤트 스트리밍
34+
- **gRPC** (grpcio): 마이크로서비스 간 통신
35+
36+
### 웹 크롤링
37+
- **Selenium**: 브라우저 자동화
38+
- **undetected-chromedriver**: Chromium 드라이버
39+
- **BeautifulSoup4**: HTML 파싱
40+
41+
### 배포
42+
- **Docker**: 컨테이너화 (ARM64 지원)
43+
- **포트**: 4449
44+
45+
## 프로젝트 구조
46+
47+
```
48+
FastAPIProject/
49+
├── main.py # FastAPI 앱 진입점
50+
├── requirements.txt # Python 의존성
51+
├── Dockerfile # ARM64 Docker 이미지 설정
52+
├── api/ # API 계층
53+
│ ├── routers/ # 엔드포인트 라우터
54+
│ │ ├── chatbot.py # 챗봇 관련 API
55+
│ │ ├── chatbot_wordset.py # 말투셋 관리 API
56+
│ │ ├── chat_history.py # 대화 기록 API
57+
│ │ └── dit.py # DIT 관련 API
58+
│ ├── schemas/ # Pydantic 스키마 (요청/응답)
59+
│ └── depends/ # 의존성 주입
60+
├── app/ # 비즈니스 로직 계층
61+
│ ├── chatbot/ # 챗봇 서비스
62+
│ ├── chatbot_wordset/ # 말투셋 서비스
63+
│ ├── chat_history/ # 대화 기록 서비스
64+
│ └── dit/ # DIT 서비스
65+
├── core/ # 핵심 인프라
66+
│ ├── db/ # 데이터베이스 설정
67+
│ ├── exceptions/ # 커스텀 예외
68+
│ ├── grpcs/ # gRPC 클라이언트
69+
│ ├── events/ # 이벤트 발행/처리
70+
│ ├── embedder/ # 임베딩 생성
71+
│ ├── vectorstores/ # 벡터 저장소 연동
72+
│ ├── sessions/ # 세션 관리
73+
│ ├── loader/ # 데이터 로더
74+
│ └── util/ # 유틸리티
75+
├── ai/ # AI 관련
76+
│ ├── character_chat_bot.py # 캐릭터 챗봇 구현
77+
│ ├── llm.py # LLM 래퍼
78+
│ ├── memory/ # 대화 메모리
79+
│ └── callbacks/ # LangChain 콜백
80+
├── protos/ # gRPC protobuf 정의
81+
└── avro/ # Avro 스키마
82+
```
83+
84+
## 아키텍처 패턴
85+
86+
### 계층 구조
87+
1. **API 계층** (`api/`): FastAPI 라우터, 스키마, 의존성 주입
88+
2. **서비스 계층** (`app/`): 비즈니스 로직
89+
3. **인프라 계층** (`core/`): DB, gRPC, 이벤트 등 인프라 관심사
90+
91+
### 설계 패턴
92+
- **의존성 주입**: FastAPI의 Depends를 통한 DI
93+
- **Repository 패턴**: 데이터 액세스 추상화
94+
- **Event-Driven Architecture**: Kafka를 통한 비동기 이벤트 처리
95+
- **Microservices**: gRPC를 통한 서비스 간 통신
96+
97+
## 환경 설정
98+
- 환경 변수는 `.env` 파일로 관리
99+
- CORS 설정: localhost:5173, 10.200.139.219:5173 허용
100+
- MongoDB 연결은 앱 lifespan에서 관리 (init/close)
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
# Suggested Commands
2+
3+
## 개발 환경 설정
4+
5+
### 가상환경 생성 및 활성화
6+
```bash
7+
python3 -m venv .venv
8+
source .venv/bin/activate # macOS/Linux
9+
```
10+
11+
### 의존성 설치
12+
```bash
13+
pip install -r requirements.txt
14+
```
15+
16+
## 실행 명령어
17+
18+
### 로컬 개발 서버 실행
19+
```bash
20+
# 방법 1: uvicorn 직접 실행
21+
uvicorn main:app --host 0.0.0.0 --port 4449
22+
23+
# 방법 2: 리로드 모드 (개발용)
24+
uvicorn main:app --host 0.0.0.0 --port 4449 --reload
25+
26+
# 방법 3: Python으로 직접 실행
27+
python main.py
28+
```
29+
30+
### 서버 접속
31+
- 로컬: http://localhost:4449
32+
- API 문서: http://localhost:4449/docs (Swagger UI)
33+
- ReDoc: http://localhost:4449/redoc
34+
35+
## Docker 명령어
36+
37+
### Docker 이미지 빌드
38+
```bash
39+
# ARM64용 빌드
40+
docker build -t fastapi-project .
41+
42+
# 플랫폼 명시적 지정
43+
docker build --platform linux/arm64 -t fastapi-project .
44+
```
45+
46+
### Docker 컨테이너 실행
47+
```bash
48+
# 기본 실행
49+
docker run -p 4449:4449 fastapi-project
50+
51+
# 환경 변수 포함
52+
docker run -p 4449:4449 --env-file .env fastapi-project
53+
54+
# 백그라운드 실행
55+
docker run -d -p 4449:4449 --name fastapi-app fastapi-project
56+
```
57+
58+
## 테스트
59+
60+
### pytest 실행
61+
```bash
62+
# 모든 테스트 실행
63+
pytest
64+
65+
# 특정 파일 테스트
66+
pytest tests/test_chatbot.py
67+
68+
# 비동기 테스트 (pytest-asyncio 사용)
69+
pytest -v
70+
71+
# 벤치마크 테스트
72+
pytest --benchmark-only
73+
```
74+
75+
## Git 명령어
76+
77+
### 브랜치 관리
78+
```bash
79+
# 현재 브랜치 확인
80+
git branch
81+
82+
# 상태 확인
83+
git status
84+
85+
# 메인 브랜치로 전환
86+
git checkout master
87+
88+
# 새 브랜치 생성 및 전환
89+
git checkout -b feature/new-feature
90+
```
91+
92+
### 커밋 및 푸시
93+
```bash
94+
# 변경사항 스테이징
95+
git add .
96+
97+
# 커밋
98+
git commit -m "feat: 기능 추가"
99+
100+
# 푸시
101+
git push origin <branch-name>
102+
```
103+
104+
## 유틸리티 명령어 (macOS)
105+
106+
### 파일 검색
107+
```bash
108+
# 파일 찾기
109+
find . -name "*.py"
110+
111+
# 특정 내용 검색
112+
grep -r "pattern" .
113+
114+
# 파일 목록
115+
ls -la
116+
```
117+
118+
### 프로세스 관리
119+
```bash
120+
# 포트 사용 확인
121+
lsof -i :4449
122+
123+
# 프로세스 종료
124+
kill -9 <PID>
125+
```
126+
127+
### Python 관련
128+
```bash
129+
# Python 버전 확인
130+
python --version
131+
132+
# 패키지 설치
133+
pip install <package-name>
134+
135+
# 설치된 패키지 목록
136+
pip list
137+
138+
# requirements.txt 생성
139+
pip freeze > requirements.txt
140+
```
141+
142+
## gRPC 관련
143+
144+
### Protobuf 컴파일
145+
```bash
146+
# proto 파일에서 Python 코드 생성
147+
python -m grpc_tools.protoc -I./protos --python_out=. --grpc_python_out=. ./protos/*.proto
148+
```
149+
150+
## 데이터베이스
151+
152+
### MongoDB
153+
- 연결은 앱 시작 시 자동으로 처리됨 (환경 변수 필요)
154+
- Beanie를 통해 ODM 방식으로 접근
155+
156+
## 환경 변수
157+
- `.env` 파일에 환경 변수 설정 필요
158+
- 주요 환경 변수: MongoDB URI, Redis URI, OpenAI API Key, Pinecone API Key 등

0 commit comments

Comments
 (0)