File size: 10,503 Bytes
13d0427 fa02ae1 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | 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}
Ответ:
""" |