# ============================================ # 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