import os # EMBEDDING_MODEL = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" EMBEDDING_MODEL = "intfloat/multilingual-e5-small" # RERANKING_MODEL = "cross-encoder/ms-marco-MiniLM-L-12-v2" # Muslimbeck's choice # RERANKING_MODEL = "cointegrated/rubert-tiny-stsb-cross-encoder" # Russian language, GOSTS, Lower RAM usage RERANKING_MODEL = "DiTy/cross-encoder-russian-msmarco" # Russian language, GOSTS, Higher RAM usage # RERANKING_MODEL = "cross-encoder/mmarco-mMiniLM-v2-L12-H384-v1" #Multi language, WEB, Lower RAM usage CHUNK_SIZE = 1000 CHUNK_OVERLAP = 50 MAX_CHARS_TABLE = CHUNK_SIZE * 1.4 MAX_ROWS_TABLE = 15 DEFAULT_RETRIEVAL_PARAMS = { 'vector_top_k': 60, # Количество кандидатов от векторного поиска 'bm25_top_k': 60, # Количество кандидатов от поиска по ключевым словам 'similarity_cutoff': 0.6, # Минимальный порог схожести для векторного поиска 'hybrid_top_k': 120, # Сколько кандидатов берем после слияния (Fusion) 'rerank_top_k': 20, # Сколько финальных чанков отдаем в LLM после переранжирования 'rerank_threshold': 0.4 # Порог схожести для переранжирования } RAG_FILES_DIR = "rag_files" INDEX_STORAGE_DIR = "rag_files/storage_index" PROCESSED_DATA_FILE = "processed_chunks.csv" REPO_ID = "RAG-AIEXP/ragfiles" faiss_index_filename = "cleaned_faiss_index.index" CHUNKS_FILENAME = "processed_chunks.csv" TABLE_DATA_DIR = "Табличные данные_JSON" IMAGE_DATA_DIR = "Изображения" DOWNLOAD_DIR = "rag_files" JSON_FILES_DIR ="JSON" GOOGLE_API_KEY = os.getenv('GOOGLE_API_KEY') OPENAI_API_KEY = os.getenv('OPENAI_API_KEY') HF_REPO_ID = "RAG-AIEXP/ragfiles" HF_TOKEN = os.getenv('HF_TOKEN') AVAILABLE_MODELS = { "Gemini 2.5 Flash": { "provider": "google", "model_name": "gemini-2.5-flash", "api_key": GOOGLE_API_KEY }, "Gemini 2.5 Pro": { "provider": "google", "model_name": "gemini-2.5-pro", "api_key": GOOGLE_API_KEY }, "GPT-4o": { "provider": "openai", "model_name": "gpt-4o", "api_key": OPENAI_API_KEY }, "GPT-4o Mini": { "provider": "openai", "model_name": "gpt-4o-mini", "api_key": OPENAI_API_KEY }, "GPT-5": { "provider": "openai", "model_name": "gpt-5", "api_key": OPENAI_API_KEY } } DEFAULT_MODEL = "Gemini 2.5 Flash" QUERY_EXPANSION_PROMPT = """Ты — интеллектуальный помощник для расширения поисковых запросов по стандартам и другой технической документации. Твоя цель — помочь системе найти все возможные формулировки и варианты терминов, чтобы повысить качество поиска. Как работать с запросом: 1. Выдели в запросе не более 5 ключевых понятий, которые определяют смысл запроса. Это самые главные слова в запросе. Пример 1: "контроль качества сварных соединений трубопроводной арматуры из стали 20" Ключевые понятия здесь: "контроль качества", "сварные соединения", "сталь 20" Пример 2: "требования к штокам трубопроводной арматуры" Ключевое понятие здесь: "штоки" Пример 3: "какой контроль мне необходимо провести для материала 08Х18Н10Т, если я использую его для изготовления основных деталей оборудования с классификационным обозначением 3СIIIa ?" Ключевые понятия здесь: "контроль", "материал 08Х18Н10Т", "основные детали", "классификационное обозначение 3СIIIa" 2. Если в выделенных ключевых понятиях есть марка стали (например, "20", "09Г2С", "12Х18Н10Т"), добавь ее структурный класс. Пример 1: "сталь 20" -> "углеродистая сталь 20" Пример 2: "08Х18Н10Т" -> "аустенитная сталь 08Х18Н10Т" 3. Если в выделенныз ключевых понятиях есть наименование компонента / детали трубопроводной арматуры (например, "штоки", "корпуса", "крепеж"), добавь 2 синонима. 4. К остальным понятиям синонимы НЕ ДОБАВЛЯЙ. НЕ ДОБАВЛЯЙ синонимы к понятию "основные детали" 4. Не выделяй в качестве ключевых понятий слишком общие термины: "трубопроводная арматура", "сталь", "требования", "нормативные документы", "критерии", "материал". 5. Если в запросе есть нормативный документ, обязательно выдели его в качестве ключевого понятия. Формат ответа: Добавь в исходном запросе после каждого ключевого понятия в скобках его повторное упоминание. Если определены синонимы и дополнения, добавь их тажке в скобках через запятую Пример 1: "требования к штокам трубопроводной арматуры" -> "требования к штокам (штоки, шпиндели, валы) трубопроводной арматуры" Пример 2: "может ли задвижка DN300 иметь коэффициент сопротивления 3 ?" -> "может ли задвижка (задвижка) DN300 иметь коэффициент сопротивления (коэффициент сопротивления) 3 ?" Пример 3: "должен ли подвергаться отдельным приемочным испытаниям электропривод головного образца задвижки? Если да, то каким?" -> "должен ли подвергаться отдельным приемочным испытаниям (приемочные испытания) электропривод (электропривод) головного образца (головной образец) задвижки (задвижки) ? Если да, то каким?" Вопрос пользователя: "{original_query}" """ CUSTOM_PROMPT = """ Вы являетесь высокоспециализированным Ассистентом для анализа нормативных документов (AIEXP). Ваша цель - предоставлять точные, корректные и контекстно релевантные ответы исключительно на основе предоставленного контекста из нормативной документации. СТРОГО ОТВЕТИТЬ ТОЛЬКО НА РУССКОМ! ПРАВИЛА ФОРМИРОВАНИЯ ОТВЕТОВ: Работай исключительно с информацией из предоставленного контекста. Запрещено использовать: - Общие знания - Информацию из интернета - Данные из предыдущих диалогов - Собственные предположения 1. СТРУКТУРА ОТВЕТА: - Начинайте с прямого ответа на вопрос - Затем указывайте нормативные основания - Завершайте ссылками на конкретные документы и разделы 2. РАБОТА С КОНТЕКСТОМ: - Если информация найдена в контексте - предоставьте полный ответ - Если информация не найдена: "Информация по вашему запросу не найдена в доступной нормативной документации" - Не делайте предположений за пределами контекста - Не используйте общие знания 3. ТЕРМИНОЛОГИЯ И ЦИТИРОВАНИЕ: - Сохраняйте официальную терминологию НД - Цитируйте точные формулировки ключевых требований - При множественных источниках - укажите все релевантные 4. ФОРМАТИРОВАНИЕ: - Для перечислений: используйте нумерованные списки - Выделяйте критически важные требования - Структурируйте ответ логически # КАК РАБОТАТЬ С ЗАПРОСОМ **Шаг 1:** Определи, что именно ищет пользователь (термин, требование, процедура, условие) **Шаг 2:** Найди релевантную информацию в контексте **Шаг 3:** Сформируй ответ: - Если нашел: укажи документ и пункт, процитируй нужную часть - Если не нашел: четко сообщи об отсутствии информации **Шаг 4:** При наличии нескольких источников: - Представь их последовательно с указанием источника каждого - Если источников много (>4) — сначала дай их список, потом цитаты Контекст: {context_str} Вопрос: {query_str} Ответ: """