Agent 2.0 exdev 서버 배포 스택
- server-dev start/stop/deploy 및 Gitea push 자동 배포 - local-dev 로컬 개발 환경 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,242 @@
|
||||
# ============================================
|
||||
# RAG System Configuration
|
||||
# ============================================
|
||||
# 서버 구성:
|
||||
# WAS 172.16.180.130 — chatbotApi :8086, exAiChatBot :28012, chatbotAdmin :8087
|
||||
# kakaoChatbotSkill — 별도 웹 서버 (카카오→nginx→Skill :8083)
|
||||
# LLM 게이트웨이 172.16.163.96 — llm-ai / embedding-ai / reranker-ai.ex.co.kr
|
||||
#
|
||||
# 이 파일을 .env로 복사하고 실제 값으로 수정하세요
|
||||
# cp env.template .env
|
||||
|
||||
# ============================================
|
||||
# API 서버 설정
|
||||
# ============================================
|
||||
# Uvicorn 워커 수 (동시 처리 성능)
|
||||
# - 1: 순차 처리 (기본)
|
||||
# - 2-4: 일반적 권장 (CPU 코어 수 기준)
|
||||
# - 4-8: 고성능 환경
|
||||
UVICORN_WORKERS=4
|
||||
|
||||
# Docker 배포 분리 설정
|
||||
# - 운영 기본 포트는 28012입니다.
|
||||
# - 테스트 패키지는 deploy.sh가 아래 값을 28013 / rag-project-test / rag-*-slim-test로 자동 지정합니다.
|
||||
# - 수동으로 같은 서버에 운영/테스트를 동시에 띄우는 경우 포트, 프로젝트명, 로그/벡터 컬렉션을 다르게 유지하세요.
|
||||
# API_HOST_PORT=28012
|
||||
# COMPOSE_PROJECT_NAME=rag-project
|
||||
# RAG_API_IMAGE=rag-api-slim:latest
|
||||
# RAG_BATCH_IMAGE=rag-batch-slim:latest
|
||||
# MONGO_COLLECTION=rag_conversations
|
||||
# QDRANT_COLLECTION=qa_vectors
|
||||
|
||||
# ============================================
|
||||
# 외부 API 엔드포인트
|
||||
# ============================================
|
||||
# ⚠️ 주의: LLM API는 쿼리 응답(API 서비스)에서만 사용됩니다.
|
||||
# - 데이터 준비 단계(embed, index)에서는 LLM 불필요
|
||||
# - preprocess 단계 제거됨 (qa_raw.jsonl 직접 임베딩)
|
||||
|
||||
# 각 서버의 IP와 포트를 개별 설정 가능
|
||||
|
||||
# 신규 게이트웨이(172.16.163.96:443, HTTPS) + 호스트명 라우팅 + Bearer 인증 + OpenAI 호환 포맷
|
||||
# DNS 미등록 상태이면 docker-compose의 extra_hosts로 호스트명 → GATEWAY_IP 매핑 필요
|
||||
GATEWAY_IP=172.16.163.96 # 모델 게이트웨이 IP (extra_hosts 매핑용)
|
||||
MODEL_API_KEY=ADMIN_API_KEY # ★ 실제 발급 키로 교체 (모든 모델 공통)
|
||||
MODEL_VERIFY_SSL=false # 자체서명 인증서 → 검증 비활성화 (curl -k 동일)
|
||||
|
||||
# LLM API (OpenAI 호환 /v1/chat/completions)
|
||||
LLM_BASE_URL=https://llm-ai.ex.co.kr
|
||||
LLM_MODEL_NAME=Qwen/Qwen3.6-27B-FP8
|
||||
|
||||
# Embedding API (OpenAI 호환 /v1/embeddings)
|
||||
# 주의: Qwen3-Embedding은 Query/Document를 구분 (Query엔 Instruct 프리픽스 자동 추가)
|
||||
TEI_EMBED_URL=https://embedding-ai.ex.co.kr
|
||||
EMBED_MODEL_NAME=Qwen/Qwen3-Embedding-8B
|
||||
|
||||
# Reranker API
|
||||
# gateway: /score (게이트웨이) | legacy: /rerank (exdev reranker_server.py)
|
||||
TEI_RERANK_URL=https://reranker-ai.ex.co.kr
|
||||
TEI_RERANK_MODEL=Qwen/Qwen3-Reranker-8B
|
||||
RERANK_API_STYLE=gateway
|
||||
|
||||
# Embedding API
|
||||
# openai: /v1/embeddings (게이트웨이) | tei: /embed (exdev 호스트 TEI)
|
||||
EMBED_API_STYLE=openai
|
||||
|
||||
# API 타임아웃 (초)
|
||||
API_TIMEOUT=60
|
||||
|
||||
# ============================================
|
||||
# 임베딩 배치 크기
|
||||
# ============================================
|
||||
# TEI API 호출 시 한 번에 처리할 텍스트 개수
|
||||
# - TEI API 제한: 최대 32개까지 한 번에 처리 가능
|
||||
# - 권장값: 16~32 (안정성을 위해 32 이하)
|
||||
# - 기본값: 32 (최대 성능)
|
||||
# - 오류 발생 시: 16으로 낮춰보세요
|
||||
EMBED_BATCH_SIZE=32
|
||||
|
||||
# Qdrant 저장 배치 크기 (한 번에 upsert 할 벡터 수)
|
||||
# - 4096차원 임베딩에서 500이면 요청이 ~44MB → Qdrant 32MB 한도 초과(400)
|
||||
# - 100 권장 (차원 크면 더 낮추기)
|
||||
VECTOR_BATCH_SIZE=100
|
||||
|
||||
# ============================================
|
||||
# 벡터 DB 설정
|
||||
# ============================================
|
||||
# 벡터 스토어 선택: faiss | qdrant
|
||||
# - faiss: 단순/고속, 추가 인프라 불필요 (권장: ~1,000개 문서)
|
||||
# - qdrant: 확장 가능, 실시간 업데이트 + 어드민 큐레이션 (운영 기본값)
|
||||
VECTOR_STORE=qdrant
|
||||
|
||||
# Qdrant 설정
|
||||
# 모든 서비스가 network_mode: host 이므로 서비스명(qdrant)이 아닌 127.0.0.1 사용
|
||||
QDRANT_HOST=127.0.0.1
|
||||
QDRANT_PORT=6333
|
||||
QDRANT_COLLECTION=qa_vectors
|
||||
|
||||
# Qdrant dense+sparse 하이브리드 검색
|
||||
# - 테스트 전환 시 QDRANT_COLLECTION=qa_vectors_v2 권장
|
||||
# - qa_vectors_v2는 dense named vector + sparse vector를 함께 저장
|
||||
HYBRID_SEARCH_ENABLED=false
|
||||
SPARSE_SEARCH_ENABLED=true
|
||||
SPARSE_TOP_K=30
|
||||
HYBRID_MERGE_TOP_K=40
|
||||
|
||||
# ============================================
|
||||
# 큐레이션 어드민 (벡터DB 검색/조회/수정/삭제/추가 웹)
|
||||
# ============================================
|
||||
ADMIN_PORT=28013
|
||||
# 별도 프론트 origin 허용(콤마 구분). 내부망이면 * 유지
|
||||
ADMIN_CORS_ORIGINS=*
|
||||
|
||||
# ============================================
|
||||
# 성능 튜닝
|
||||
# ============================================
|
||||
# FAISS 검색 파라미터
|
||||
FAISS_TOP_K=50
|
||||
FAISS_THRESHOLD=0.55
|
||||
|
||||
# FAISS 재검색 Threshold (Query Rewriting 후)
|
||||
# - Query Rewriting으로 재작성된 질문은 더 관대한 threshold 적용
|
||||
# - 원본 질문보다 0.05 낮게 설정 권장
|
||||
# - 예: 원본 0.55 → 재작성 0.50
|
||||
FAISS_THRESHOLD_REWRITE=0.50
|
||||
|
||||
# 재랭킹 파라미터
|
||||
RERANK_CANDIDATES=20
|
||||
RERANK_BATCH_SIZE=16
|
||||
|
||||
# LLM 참고자료 개수 (재랭킹 후 상위 N개를 LLM에 전달)
|
||||
TOP_N_FOR_LLM=5
|
||||
|
||||
# LLM 답변 최대 길이 (토큰 수)
|
||||
# - 512: 짧은 답변 (1-2 문단)
|
||||
# - 1024: 중간 길이 (3-4 문단)
|
||||
# - 2048: 긴 답변 (5-6 문단, 권장)
|
||||
# - 4096: 매우 긴 답변 (전체 문서)
|
||||
LLM_MAX_TOKENS=2048
|
||||
|
||||
# Query Rewriting (쿼리 재작성)
|
||||
# - true: 활성화 (대화 이력 기반 질문 재작성 후 재검색)
|
||||
# - false: 비활성화
|
||||
# 예: "그럼 어디서 사나요?" → "하이패스 단말기는 어디서 구매할 수 있나요?"
|
||||
QUERY_REWRITE_ENABLED=true
|
||||
|
||||
# 대화 이력 참고 설정
|
||||
# - CHAT_HISTORY_LIMIT: 참고할 이전 대화 개수 (1-10 권장, 기본값: 10)
|
||||
# - CHAT_HISTORY_HOURS: 참고할 대화 시간 범위 (시간 단위, 기본값: 24)
|
||||
# - CHAT_HISTORY_ALWAYS_INCLUDE: 정상 질문도 이력 포함 여부
|
||||
# * true: 모든 답변에 대화 맥락 반영 (대화형 챗봇) ← 기본값
|
||||
# * false: threshold 미달 시에만 사용 (Query Rewriting용)
|
||||
CHAT_HISTORY_LIMIT=10
|
||||
CHAT_HISTORY_HOURS=24
|
||||
CHAT_HISTORY_ALWAYS_INCLUDE=true
|
||||
|
||||
# 프록시 우회 설정
|
||||
# - Docker 컨테이너에서 내부 IP로 직접 연결하기 위함
|
||||
# - 회사/조직 프록시가 있는 경우 내부망 대역을 추가
|
||||
NO_PROXY=localhost,127.0.0.1,172.16.0.0/12,172.16.180.130,llm-ai.ex.co.kr,embedding-ai.ex.co.kr,reranker-ai.ex.co.kr,.ex.co.kr
|
||||
no_proxy=localhost,127.0.0.1,172.16.0.0/12,172.16.180.130,llm-ai.ex.co.kr,embedding-ai.ex.co.kr,reranker-ai.ex.co.kr,.ex.co.kr
|
||||
|
||||
# ============================================
|
||||
# Agent tool loop (chatbotApi — 동일 WAS 서버)
|
||||
# ============================================
|
||||
AGENT_MODE=legacy
|
||||
AGENT_MAX_ROUNDS=6
|
||||
CHATBOT_API_BASE_URL=http://127.0.0.1:8086/api
|
||||
INTERNAL_TOOL_API_KEY=
|
||||
CHATBOT_TOOL_TIMEOUT=30
|
||||
AGENT_PENDING_COLLECTION=agent_pending
|
||||
|
||||
# ============================================
|
||||
# MongoDB 대화 이력 설정 (필수!)
|
||||
# ============================================
|
||||
# MongoDB 호스트
|
||||
# ⚠️ 중요: Docker 컨테이너에서 실행 시 환경에 맞게 설정!
|
||||
#
|
||||
# 【환경별 설정】
|
||||
# - Mac/Windows Docker Desktop: host.docker.internal
|
||||
# - Linux (CentOS/Ubuntu/Rocky): 172.17.0.1 ← 대부분의 경우
|
||||
# - 원격 MongoDB 서버: 192.168.1.200 (실제 IP)
|
||||
# - 로컬 개발 (컨테이너 없이): localhost
|
||||
#
|
||||
# 【현재 설정】host 네트워크 모드 + 로컬 MongoDB → 127.0.0.1
|
||||
MONGO_HOST=127.0.0.1
|
||||
|
||||
# MongoDB 포트
|
||||
MONGO_PORT=27017
|
||||
|
||||
# MongoDB 인증 정보
|
||||
# - 데이터베이스별 인증 사용 (authSource=MONGO_DATABASE)
|
||||
# - 권한: MONGO_DATABASE에 대한 readWrite 권한 필요
|
||||
MONGO_USER=exlink
|
||||
MONGO_PASSWORD=!wkcproqkf1
|
||||
|
||||
# MongoDB 데이터베이스 및 컬렉션
|
||||
MONGO_DATABASE=chat_history
|
||||
MONGO_COLLECTION=rag_conversations
|
||||
|
||||
# MongoDB 데이터 보관 기간 (TTL)
|
||||
# - 지정된 기간 이후 자동으로 오래된 대화 기록 삭제
|
||||
# - 단위: 일(day)
|
||||
# - 권장값: 30 (한 달), 7 (일주일), 90 (3개월)
|
||||
# - 기본값: 30일
|
||||
MONGO_TTL_DAYS=30
|
||||
|
||||
# ⚠️ 중요: MongoDB가 없으면 대화 이력 기능이 비활성화됩니다!
|
||||
# - 컨테이너 로그에서 "[Service] ✅ 대화 이력 기능 활성화" 확인
|
||||
# - MongoDB 연결 테스트: docker exec rag-project-api-1 python3 /app/scripts/test_mongodb.py
|
||||
# - 컨테이너 내부 접근 확인: docker exec rag-project-api-1 curl -v telnet://$MONGO_HOST:27017
|
||||
|
||||
# ============================================
|
||||
# 사용 예시
|
||||
# ============================================
|
||||
# 1. 내부 LLM (모든 서비스 같은 서버):
|
||||
# LLM_HOST=192.168.1.100
|
||||
# LLM_PORT=16000
|
||||
# TEI_EMBED_HOST=192.168.1.100
|
||||
# TEI_EMBED_PORT=16001
|
||||
# TEI_RERANK_HOST=192.168.1.100
|
||||
# TEI_RERANK_PORT=16002
|
||||
#
|
||||
# 2. 서버 분리 (LLM과 TEI가 다른 서버):
|
||||
# LLM_HOST=192.168.1.100
|
||||
# LLM_PORT=8000
|
||||
# TEI_EMBED_HOST=192.168.1.200
|
||||
# TEI_EMBED_PORT=80
|
||||
# TEI_RERANK_HOST=192.168.1.200
|
||||
# TEI_RERANK_PORT=81
|
||||
#
|
||||
# 3. OpenAI API 사용:
|
||||
# LLM_BASE_URL=https://api.openai.com # 직접 URL 지정도 가능
|
||||
# LLM_MODEL_NAME=gpt-4o-mini
|
||||
# LLM_API_KEY=sk-proj-xxxxx
|
||||
# TEI_EMBED_HOST=192.168.1.100
|
||||
# TEI_EMBED_PORT=16001
|
||||
# # ... (TEI는 그대로 사용)
|
||||
#
|
||||
# 4. Qdrant 사용 시:
|
||||
# VECTOR_STORE=qdrant
|
||||
# docker-compose --profile qdrant up -d qdrant
|
||||
|
||||
Reference in New Issue
Block a user