From 08779c3938b40d89f7616aad7c0d50ec1548ba88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Fri, 26 Jun 2026 09:44:31 +0400 Subject: [PATCH] =?UTF-8?q?v1.0.178:=20P0=20=E2=80=94=20=D1=83=D0=BB=D1=83?= =?UTF-8?q?=D1=87=D1=88=D0=B5=D0=BD=D1=8B=20=D0=BF=D1=80=D0=BE=D0=BC=D0=BF?= =?UTF-8?q?=D1=82=D1=8B=20classify=20=D0=B8=20diff.=20Classify:=20=D0=B1?= =?UTF-8?q?=D0=BB=D0=BE=D0=BA=20=D0=9D=D0=A3=D0=91=D0=95=D0=A1=3D=D0=98?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D0=B5=D0=BB=D1=8C,?= =?UTF-8?q?=20parent=5Fnumber=3Dnull=20=D0=B4=D0=BB=D1=8F=20contract,=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D1=8B=20doc=5Ftype=3Dother?= =?UTF-8?q?,=203=20few-shot=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D0=B0.?= =?UTF-8?q?=20Diff:=20UNRESOLVED=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20?= =?UTF-8?q?ADD=20=D0=BF=D1=80=D0=B8=20=D1=81=D0=BE=D0=BC=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/llm_prompt.py | 48 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/deploy/llm_prompt.py b/deploy/llm_prompt.py index ddcdd07..ee2a1d1 100644 --- a/deploy/llm_prompt.py +++ b/deploy/llm_prompt.py @@ -102,7 +102,7 @@ FALLBACK_DIFF = """Ты — анализатор допсоглашений (Д 7. Если в тексте есть и фраза о новой редакции, и точечные правки — приоритет за «новой редакцией»: full_replace. EDGE-CASES: -8. UNRESOLVED — если ДС упоминает изменение услуги, которой НЕТ в текущей спецификации, ИЛИ название настолько отличается, что нельзя уверенно сопоставить с конкретным id. В reason укажи причину. +8. UNRESOLVED — если ДС упоминает изменение услуги, которой НЕТ в текущей спецификации, ИЛИ название настолько отличается, что нельзя уверенно сопоставить с конкретным id. ВАЖНО: если СОМНЕВАЕШЬСЯ в сопоставлении — делай UNRESOLVED, а НЕ ADD. Лучше unresolved, чем ложный дубликат. В reason укажи причину. 9. Частичные данные: если в ДС нет цены/кол-ва/даты — ставь null для этих полей, не выдумывай. 10. Пропускай итоговые строки («Итого», «НДС», «К оплате») и подписи/реквизиты. 11. price, qty, sum — ЧИСЛА (без «руб.», без пробелов; «55 000,00» \u2192 55000). Не пересчитывай суммы сам — бери из ДС. @@ -242,17 +242,45 @@ def build_classify_prompt(header_text): body = prompt["body"].replace("{header_text}", header_text) return body, prompt.get("id", "") # Fallback - body = """Ты — классификатор договорных документов. Ниже фрагмент текста документа. + body = """Ты — классификатор договорных документов облачного провайдера НУБЕС. -Определи: -1. doc_type: "contract", "supplement", "specification", "other" -2. own_number: номер ЭТОГО документа -3. parent_number: номер родительского договора (для допников/спецификаций) -4. doc_date: дата в формате YYYY-MM-DD -5. counterparty: название контрагента -6. confidence: "ok" или "low" +Ниже фрагмент текста документа. Определи: -Верни СТРОГО JSON: {"doc_type":"...","own_number":"...","parent_number":"...","doc_date":"...","counterparty":"...","confidence":"..."} +1. doc_type: + - "contract" — договор (заголовок «Договор», «Соглашение», преамбула с условиями) + - "supplement" — допсоглашение (ссылается на родительский договор, меняет условия) + - "specification" — спецификация / приложение с таблицей услуг (стойко-места, IP, каналы, питание) + - "other" — НЕ договорной документ: акт сверки, счёт, счёт-фактура, УПД, акт оказанных услуг, платёжное поручение, доверенность, письмо + +2. own_number — номер ЭТОГО документа (например «XXX001-03700», «МЭС-123/2024», «1» для допника). + Если номер не указан — null. + +3. parent_number — номер родительского договора (для supplement и specification). + Для doc_type="contract": ВСЕГДА null. + +4. doc_date — дата документа в формате YYYY-MM-DD. Если дата прописью — переведи в цифры. + Если нет даты — null. + +5. counterparty — название КОНТРАГЕНТА (Заказчика). + ВАЖНО: НУБЕС — всегда Исполнитель. НЕ возвращай НУБЕС как counterparty. + НУБЕС известен как: «НУБЕС», «ООО НУБЕС», «ООО "НУБЕС"», «Nubes». + counterparty — ВСЕГДА другая сторона (Заказчик/Покупатель/Абонент). + Если документ не содержит контрагента — null. + +Верни СТРОГО JSON без пояснений: +{"doc_type":"...","own_number":"...","parent_number":"...","doc_date":"...","counterparty":"..."} + +ПРИМЕР 1 (договор): +Текст: «Договор № XXX001-03700 от 15.03.2025. ООО "НУБЕС" (Исполнитель) и ЗАО "ТехноПлюс" (Заказчик)...» +Ответ: {"doc_type":"contract","own_number":"XXX001-03700","parent_number":null,"doc_date":"2025-03-15","counterparty":"ЗАО \"ТехноПлюс\""} + +ПРИМЕР 2 (допсоглашение): +Текст: «Допсоглашение №1 к Договору № XXX003-01300 от 05.06.2024...» +Ответ: {"doc_type":"supplement","own_number":"1","parent_number":"XXX003-01300","doc_date":"2024-06-05","counterparty":"АО XXX003"} + +ПРИМЕР 3 (мусор): +Текст: «Акт сверки взаимных расчётов за 1 квартал 2025 г. Стороны: НУБЕС и ООО Ромашка. Сальдо 150 000 руб.» +Ответ: {"doc_type":"other","own_number":null,"parent_number":null,"doc_date":"2025-03-31","counterparty":"ООО Ромашка"} ДОКУМЕНТ: ---