Черновик

Архитектура агента

Агент итеративно заполняет шаблон кредитного заключения по пакету DD-документов клиента. Для каждого поля — значение + цитаты (файл, страница, фрагмент). Ненайденное не блокирует остальное — уходит в раздел «требует проверки» и ждёт аналитика на HITL-ревью.

Вход / выход

Вход

Выход

Заполненный DOCX + трассировка: для каждого поля указан источник (файл, страница, цитата).

Пайплайн

  1. Ingest — извлекаем текст: PDF через pdfminer, сканы через OCR, DOCX через python-docx, XLSX через openpyxl. Режем на чанки с метаданными (file, page, offset).
  2. Index — эмбеддинги чанков в векторный стор (на задачу свой индекс, клиенты не смешиваются).
  3. Plan — из шаблона вытягиваем упорядоченный список полей → очередь пунктов.
  4. Итеративный ReAct — агент идёт по очереди, по одному пункту:
    • нашёл — пишет {value, citations};
    • после N шагов / низкой уверенности не нашёл — помечает not_found c причиной и переходит к следующему.
  5. Assemble — собираем финальный ответ: заполненное — в DOCX, пропущенное — в раздел «требует ручной проверки» с частичными цитатами.
  6. Render — финальный DOCX + приложение со ссылками на источники.

Тулы агента

ToolНазначениеВыход
rag.query(q, k=5)Семантический поиск по индексу задачиtop-k чанков с (file, page, snippet, score)
fs.list()Перечислить файлы задачи[{name, mime, pages}]
fs.read_page(file, page)Прочитать страницу целикомтекст страницы
fs.grep(file, pattern)Regex-поиск в файле[(page, line, context)]
bash.run(cmd)Read-only утилиты в песочнице (pdftotext, pdfinfo…)stdout / stderr, с таймаутом

rag.query — основной путь: дёшево и с цитированием. fs.read_page / fs.grep — когда нужен полный контекст страницы или соседние поля (таблицы, реквизиты). bash.run — крайний случай.

ReAct-контур на один пункт

system: «Заполни поле X шаблона LA. Верни JSON {value, citations:[{file,page,quote}]}
         либо {status:"not_found", reason, partial_evidence?}.»
loop:
  thought → tool_call → observation
  stop:
    ok       — value готов и есть ≥1 citation
    give_up  — достигнут лимит шагов / низкая уверенность
Giving up — штатный исход, не ошибка. Пункт уходит в «требует проверки», агент переходит к следующему. Лимит шагов (напр. 6), таймаут, валидация цитаты (страница действительно содержит quote).

Стек

OCRdots.ocr (для сканов и PDF без текстового слоя)
EmbeddingsBAAI bge-m3 (многоязычный, длинный контекст; ру/уз)
Vector DBMilvus (коллекция на задачу, метаданные file, page, offset)
LLMцелевой — локальная on-prem (vLLM / TGI / Ollama + Qwen2.5 / Llama-3 / DeepSeek). На этапе прототипа — OpenRouter (только обезличенные / тестовые данные), потом свитч на локальный endpoint.

Где это живёт

Открытые вопросы