""" configuration for vector Storage and retriever can adjust settings for Pinecone and embedding model configurations. edit these values as needed when the embedding model changes. """ import os from pathlib import Path # ============================================================================ # PINECONE CONFIGURATION # ============================================================================ # API Key - loaded from .envpinecone file _envfile = Path(__file__).parent / ".envpinecone" PINECONE_API_KEY = _envfile.read_text().strip() if _envfile.exists() else "" # Index Configuration # Index Configuration PINECONE_INDEX_NAME = os.environ.get("PINECONE_INDEX_NAME", "rag-hybrid-index-v2") PINECONE_CLOUD = os.environ.get("PINECONE_CLOUD", "aws") PINECONE_REGION = os.environ.get("PINECONE_REGION", "us-east-1") # ============================================================================ # EMBEDDING CONFIGURATION (NVIDIA NIM) # ============================================================================ # NVIDIA API Key - loaded from environment or .envnvidia file _nvidia_envfile = Path(__file__).parent / ".envnvidia" NVIDIA_API_KEY = os.environ.get("NVIDIA_API_KEY") or ( _nvidia_envfile.read_text().strip() if _nvidia_envfile.exists() else "" ) # embedding dimension - must match the model output # current: nvidia/llama-3.2-nv-embedqa-1b-v2 (2048 dimensions) EMBEDDING_DIMENSION = int(os.environ.get("EMBEDDING_DIMENSION", "2048")) # embedding model identifier EMBEDDING_MODEL = os.environ.get("EMBEDDING_MODEL", "nvidia/llama-3.2-nv-embedqa-1b-v2") # ============================================================================ # RETRIEVAL CONFIGURATION # ============================================================================ # number of top results to return from similarity search TOP_K = int(os.environ.get("TOP_K", "30")) # similarity metric used by Pinecone # options: "cosine", "euclidean", "dotproduct" (cosine is the most used usually) SIMILARITY_METRIC = os.environ.get("SIMILARITY_METRIC", "cosine") # RRF constant for hybrid retrieval (higher = more equal weighting between dense/sparse) RRF_K = int(os.environ.get("RRF_K", "60")) # ============================================================================ # CROSS-ENCODER RERANKER CONFIGURATION # ============================================================================ # Enable/disable cross-encoder reranking after retrieval RERANKER_ENABLED = os.environ.get("RERANKER_ENABLED", "true").lower() in ("true", "1", "yes") # Cross-encoder model for reranking RERANKER_MODEL = os.environ.get("RERANKER_MODEL", "cross-encoder/ms-marco-MiniLM-L6-v2") # Number of passages to return after reranking (controls how many chunks the LLM sees) RERANKER_TOP_N = int(os.environ.get("RERANKER_TOP_N", "10")) # ============================================================================ # CONVERSATION MEMORY CONFIGURATION # ============================================================================ # Namespace for conversation memories (separate from document vectors) CONVERSATION_MEMORY_NAMESPACE = "conversation_memory" # Default boost for memory results during retrieval merging MEMORY_BOOST = float(os.environ.get("MEMORY_BOOST", "0.5")) # Minimum similarity score for conversation memories (filters out irrelevant ones) MEMORY_MIN_SCORE = float(os.environ.get("MEMORY_MIN_SCORE", "0.2")) # ============================================================================ # SPARSE INDEX CONFIGURATION # ============================================================================ # Sparse index for BM25-style retrieval (separate from dense index) SPARSE_INDEX_NAME = os.environ.get("SPARSE_INDEX_NAME", "rag-sparse-index-v1") SPARSE_EMBEDDING_MODEL = "pinecone-sparse-english-v0" # ============================================================================ # LANGSMITH CONFIGURATION # ============================================================================ # LangSmith API Key - loaded from .envlangsmith file _langsmith_envfile = Path(__file__).parent / ".envlangsmith" LANGCHAIN_API_KEY = os.environ.get("LANGCHAIN_API_KEY") or ( _langsmith_envfile.read_text().strip() if _langsmith_envfile.exists() else "" ) # Enable tracing when API key is available LANGCHAIN_TRACING_V2 = "true" if LANGCHAIN_API_KEY else "false" LANGCHAIN_PROJECT = os.environ.get("LANGCHAIN_PROJECT", "cognitive-rag-retrieval") def get_config_summary() -> dict: """return a summary of current configuration (for debugging mostly).""" return { "pinecone_index": PINECONE_INDEX_NAME, "pinecone_cloud": PINECONE_CLOUD, "pinecone_region": PINECONE_REGION, "embedding_dimension": EMBEDDING_DIMENSION, "embedding_model": EMBEDDING_MODEL, "top_k": TOP_K, "similarity_metric": SIMILARITY_METRIC, "reranker_enabled": RERANKER_ENABLED, "reranker_model": RERANKER_MODEL, "reranker_top_n": RERANKER_TOP_N, "api_key_set": bool(PINECONE_API_KEY), }