이 프로젝트는 상담 데이터를 수집/분석하고, 유사 사례를 검색(RAG)하여 최종 리포트를 생성하는 엔드 투 엔드 파이프라인입니다.
정신분석학 지식베이스는 주식/코인/자산운용 등 투자·재무 스트레스까지 범위를 확장했습니다. 손실회피·처분효과 같은 행동재무학 편향, 투자중독(도박장애)의 정신병리, 반대매매·강제청산 이후의 위기 개입 등 재무심리 지식이 상담 리포트 생성 시 함께 검색(RAG)됩니다. (의학적 진단을 대체하지 않는 참고용 상담 보조 정보이며, 투자 자문/매수·매도 추천은 제공하지 않습니다.)
- 텍스트/오디오 ingest
- 심리 상태/갈등 요인/위험도 분석 (재무·투자 스트레스 키워드 감지 포함)
- ChromaDB 기반 벡터 검색 (상담 히스토리 + 정신분석학·재무심리 지식베이스)
- LLM(OpenAI/Ollama) 또는 룰 기반 fallback 리포트 생성
- PDF 리포트 다운로드
- Tailwind 기반 대시보드 UI
아래 이미지는 이 저장소의 구성요소와 데이터 흐름을 도식화한 결과입니다.
flowchart TB
A["Frontend\nTailwind Dashboard"] --> B["FastAPI Router"]
B --> C["Ingest Text / Audio"]
C --> D["STT: faster-whisper (optional)"] & E["Analysis Engine\nRule-based + LLM (optional)"]
E --> F["RAG Retriever"] & H["SQLite Metadata / Session DB"] & I["Report Generator"] & L["OpenAI / Ollama (optional)"]
F --> G["ChromaDB Vector Store"]
I --> J["JSON Response"] & K["PDF via ReportLab"]
- 위치:
docs/tech_stack.mmd - 특징: 바이너리 파일 없이 PR 리뷰/머지 가능한 텍스트 다이어그램
- FastAPI: REST API 제공 (
/ingest/text,/ingest/audio,/report,/report/pdf,/seed) - Uvicorn: ASGI 서버 실행
- Pydantic v2: 요청/응답 스키마 검증
- python-multipart: 오디오 파일 업로드 처리
- faster-whisper (옵션): 음성 파일 STT
- sentence-transformers: 임베딩 생성
- RAG 파이프라인: 유사 상담 문맥 검색 후 리포트 강화
- OpenAI / Ollama (옵션): LLM 기반 리포트 생성
- SQLite: 세션/메타데이터 저장 (
runtime/app.db) - ChromaDB: 벡터 인덱스 및 유사도 검색 (
runtime/chroma_store/)
- ReportLab: PDF 생성
- NumPy / Requests / Rich / Typer: 수치 처리, HTTP, CLI/로그 보조
- Tailwind CSS (CDN) 기반 단일 페이지 대시보드
- 텍스트 ingest / 오디오 ingest / 리포트 조회를 한 화면에서 처리
- 다크 테마 + 카드형 레이아웃 + 반응형 구성
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .envuvicorn api.main:app --host 0.0.0.0 --port 8000 --reload- UI: http://localhost:8000/
- Swagger: http://localhost:8000/docs
curl -s http://localhost:11434/api/tags | head
docker run -d --name ollama \
-p 11434:11434 \
-v ollama:/root/.ollama \
--restart unless-stopped \
ollama/ollama:latest
ollama pull llama3.1
root@DESKTOP-D6A344Q:/home/AI-Faster-whisper_RAG_Vector# docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}" | grep -i ollama
ollama ollama/ollama:latest 0.0.0.0:11434->11434/tcp, [::]:11434->11434/tcp
docker exec -it ollama ollama pull llama3.1
root@DESKTOP-D6A344Q:/home/AI-Faster-whisper_RAG_Vector# curl -s http://localhost:11434/api/tags | head
{"models":[{"name":"llama3.1:latest","model":"llama3.1:latest","modified_at":"2026-02-17T13:16:24.945232012Z","size":4920753328,"digest":"46e0c10c039e019119339687c3c1757cc81b9da49709a3b3924863ba87ca666e","details":{"parent_model":"","format":"gguf","family":"llama","families":["llama"],"parameter_size":"8.0B","quantization_level":"Q4_K_M"}}]}root@DESKTOP-D6A344Q:/home/AI-Faster-whisper_RAG_Vector#
root@DESKTOP-D6A344Q:/home/AI-Faster-whisper_RAG_Vector# curl -s http://localhost:11434/api/generate \
-H "Content-Type: application/json" \
-d '{"model":"llama3.1","prompt":"한국어로 한 문장만: Ollama 준비 완료"}' | head
{"model":"llama3.1","created_at":"2026-02-17T13:17:25.775956502Z","response":"O","done":false}
{"model":"llama3.1","created_at":"2026-02-17T13:17:25.996958301Z","response":"ll","done":false}
{"model":"llama3.1","created_at":"2026-02-17T13:17:26.231409922Z","response":"ama","done":false}
{"model":"llama3.1","created_at":"2026-02-17T13:17:26.486278971Z","response":"는","done":false}
{"model":"llama3.1","created_at":"2026-02-17T13:17:26.726166309Z","response":" ","done":false}
{"model":"llama3.1","created_at":"2026-02-17T13:17:26.992847562Z","response":"200","done":false}
{"model":"llama3.1","created_at":"2026-02-17T13:17:27.233127504Z","response":"9","done":false}
{"model":"llama3.1","created_at":"2026-02-17T13:17:27.476620406Z","response":"년","done":false}
{"model":"llama3.1","created_at":"2026-02-17T13:17:27.740653956Z","response":" ","done":false}
{"model":"llama3.1","created_at":"2026-02-17T13:17:27.969888368Z","response":"8","done":false}
curl -X POST http://localhost:8000/seed/seed가 흔히 하는 일 (RAG 프로젝트에서)
당신 .env 구성( DB_PATH=runtime/app.db, CHROMA_DIR=runtime/chroma_store, RAG_TOP_K=4, OLLAMA_MODEL 등 )을 보면, /seed는 대체로 아래 중 하나(또는 조합)일 가능성이 큽니다.
SQLite 초기 데이터 삽입
runtime/app.db에 테이블 생성 + 기본 데이터 insert (예: 사용자/설정/샘플 질의 등)
RAG용 문서 인덱싱
특정 폴더의 문서(txt/pdf/md)를 읽어서 chunking → embedding 생성 → Chroma( runtime/chroma_store )에 저장
샘플 데이터/데모 시나리오 설치
“테스트 질문/답변”, “샘플 문서”, “데모 컬렉션” 등을 만들어서 바로 검색/질문 가능하게 함
(주의) 기존 데이터 리셋/재생성
어떤 구현은 seed 전에 기존 컬렉션/테이블을 지우고 다시 만들기도 합니다.
SESSION_ID=$(python3 - <<'PY'
import uuid
print(uuid.uuid4())
PY
)
curl -X POST "http://localhost:8000/ingest/text" \
-H "Content-Type: application/json" \
-d "{\"client_id\":\"C001\",\"session_id\":\"$SESSION_ID\",\"transcript\":\"회의에서 무시당한 느낌이 들어 화가 났고, 집에 와서도 불안해서 잠을 잘 못 잤어요.\"}"
curl -X POST "http://localhost:8000/ingest/text" \
-H "Content-Type: application/json" \
-d '{"client_id":"C001","transcript":"회의에서 무시당한 느낌이 들어 화가 났고, 집에 와서도 불안해서 잠을 잘 못 잤어요."}'curl -X POST "http://localhost:8000/ingest/text" \
-H "Content-Type: application/json" \
-d '{"client_id":"C002","transcript":"반대매매를 당해서 전 재산을 잃었어요. 대출까지 받아서 물타기를 했는데 손절을 못 했습니다. 밤에 잠도 안 오고 가족한테 말도 못하겠어요."}'analysis.conflict_factors에 재무/투자 스트레스가, report의 psych_hits에는 손실추격행동·
매몰비용·위기평가 등 재무심리 지식이 함께 검색됩니다.
curl "http://localhost:8000/report?client_id=C001&session_id=<SESSION_ID>&persona=warm"persona옵션:default | warm | coach | strict(미지정 시default)
curl -L "http://localhost:8000/report/pdf?client_id=C001&session_id=<SESSION_ID>" -o report.pdfpip install faster-whisper
curl -X POST "http://localhost:8000/ingest/audio" \
-F "client_id=C001" \
-F "audio=@/path/to/audio.wav"기본은 LLM 없이(rule-based fallback) 동작합니다.
export LLM_PROVIDER=openai
export OPENAI_API_KEY=...
export OPENAI_MODEL=gpt-4o-miniexport LLM_PROVIDER=ollama
export OLLAMA_BASE_URL=http://localhost:11434
export OLLAMA_MODEL=llama3.1- SQLite:
./runtime/app.db - Chroma:
./runtime/chroma_store/ - 임시 업로드:
./runtime/tmp/ - PDF 결과물:
./runtime/pdf/
# Built-in corpus(정신분석학 + 재무심리)만 사용, 네트워크 불필요
python scripts/crawl_psychoanalysis.py --no-wikipedia
# 기본: 위키백과(한국어) 크롤링까지 포함 (네트워크 필요)
python scripts/crawl_psychoanalysis.py
# 확장: 영어 위키백과 + PubMed(NCBI) + MedlinePlus(NLM) 공개 API까지 모두 수집
python scripts/crawl_psychoanalysis.py --en --pubmed --medlineplus출력 파일: samples/psychoanalysis_seed.jsonl (약 280개 이상 항목)
크롤링 소스는 전부 공식 공개 API만 사용합니다 — 병원/포털 사이트의 HTML을 직접 스크레이핑하면 robots.txt/ToS 위반 소지가 있어 의도적으로 배제했습니다.
| source | 설명 |
|---|---|
psychoanalysis |
기존 정신분석학 코어 지식 (프로이트, 융, 방어기제, 대상관계, 애착이론 등) |
financial_psychology |
이 저장소에 직접 작성한 재무·투자 스트레스 코퍼스 (아래 카테고리 참고) |
wikipedia_ko / wikipedia_en |
위키백과 REST API (ko/en.wikipedia.org/api/rest_v1/page/summary) |
pubmed |
NCBI E-utilities (eutils.ncbi.nlm.nih.gov) 연구 초록 |
medlineplus |
미국 국립의학도서관(NLM) MedlinePlus 공개 검색 API (wsearch.nlm.nih.gov) |
financial_psychology 코퍼스 카테고리:
행동재무학— 손실회피, 처분효과, 심리적회계, 확증편향, 과신편향, 앵커링효과투자중독_병리— 도박장애와의 유사성, 손실추격행동, 강박적 트레이딩재무스트레스_신체증상— 화병, 범불안장애, 공황장애, 수면장애, 번아웃정신역동_해석— 매몰비용과 부인 방어기제, FOMO와 나르시시즘적 상처, 반대매매와 무력감 등인지왜곡_투자— 파국화, 흑백사고, 개인화, 감정적 추론, 당위적 사고상담개입기법_재무— 손실 일지, 거래 규칙, 마음챙김 기반 충동 관리, 인지재구성위험신호_재무— 반대매매 이후 위기 평가, 전 재산 손실 후 무가치감, 부채 은닉 등 (임상적 평가 참고용)
python scripts/build_psycho_chroma.py \
--chroma-dir runtime/chroma_store \
--seed samples/psychoanalysis_seed.jsonl \
--collection psychoanalysis_knowledge빌드 후 runtime/chroma_store/에 psychoanalysis_knowledge 컬렉션이 생성됩니다.
리포트 생성 시 자동으로 관련 정신분석학 개념이 함께 검색됩니다 (psych_hits 필드).
docker build -f Dockerfile.chromadb -t edumgt/psycho-chroma-db:latest .# 수동 배포
docker login
bash scripts/push_dockerhub.sh latest
# 특정 버전 태그
bash scripts/push_dockerhub.sh v1.0.0
# CI 환경 (Personal Access Token 사용)
DOCKER_PAT=<token> bash scripts/push_dockerhub.sh latestDocker Hub 이미지: edumgt/psycho-chroma-db:latest
# .env 파일 설정 후
docker compose up -d
# 서비스 확인
docker compose ps서비스 구성:
psycho-chroma(port 8001): 정신분석학 ChromaDB HTTP 서버api(port 8000): 상담 RAG API
