Реализация AI-извлечения данных из договоров
Договор — неструктурированный документ с критически важными данными: стороны, предмет, сроки, суммы, условия расторжения. Ручное внесение этих данных в CRM/ERP — источник ошибок и временных затрат. AI-извлечение автоматизирует этот процесс.
Ключевые поля для извлечения
class ContractData(BaseModel):
# Стороны
party_1_name: str
party_1_inn: str | None
party_2_name: str
party_2_inn: str | None
# Предмет и условия
subject: str # краткое описание предмета договора
contract_type: str # поставка, услуги, аренда, подряд...
contract_number: str | None
contract_date: date
# Финансовые условия
total_amount: Decimal | None
currency: str
payment_terms: str # «30 дней после подписания акта»
# Сроки
start_date: date | None
end_date: date | None
auto_renewal: bool
# Расторжение
termination_notice_days: int | None
penalty_clause: str | None
Pipeline извлечения
def extract_contract_data(pdf_path: str) -> ContractData:
# Шаг 1: Извлечение текста
text = extract_text_from_pdf(pdf_path) # pdfminer.six
# Шаг 2: Разбивка на смысловые секции
sections = split_into_sections(text) # LLM или regex по заголовкам
# Шаг 3: Structured extraction через LLM
response = client.beta.chat.completions.parse(
model="gpt-4o",
messages=[{
"role": "user",
"content": f"Извлеки данные из договора:\n\n{text[:15000]}"
}],
response_format=ContractData,
)
return response.choices[0].message.parsed
Работа с длинными договорами
Договоры на 30–50 страниц не помещаются в контекстное окно. Стратегия:
- Детерминированное извлечение реквизитов из преамбулы (стороны, номер, дата) — regex
- LLM для предмета договора и нестандартных условий — только релевантные секции
- Отдельный промпт для финансовых условий (ищем в секции «Цена и порядок оплаты»)
Верификация извлечённых данных
- ИНН: валидация через контрольную цифру
- ОГРН: checksum validation
- Суммы в цифрах vs словах — должны совпадать
- Дата начала < дата окончания
- Название сторон совпадает с реестром ФНС (по ИНН через API nalog.ru)
Поля с низкой уверенностью (или не прошедшие валидацию) → флаг для ручной проверки.







