“Сделайте мне региональный отчёт о продажах из sales.csv” — запрос, на который языковая модель охотно ответит, создав таблицу в Markdown, округлив пару чисел по пути и описав график, который она не может нарисовать. При локальном запуске GroupDocs.Assembly.Mcp (dnx GroupDocs.Assembly.Mcp --yes) Claude Desktop, Cursor или Copilot передают файл данных движку: ваш шаблон Word или PowerPoint содержит таблицу, итоги и настоящий график, а сервер заполняет их из CSV‑файла или таблицы, не пропуская числа через модель:

Постройте региональный отчёт о продажах из sales.xlsx, используя sales-report.docx, в формате PDF, и слайд с графиком из sales-chart.pptx.

Пошаговая версия с конфигурацией и устранением неполадок находится в документации: How to build a report with tables and charts from a CSV or spreadsheet with an AI agent.

Почему числа должны обходить модель?

Потому что модель — это генератор текста, а отчёт — это арифметика плюс верстка. Когда агент читает CSV и сам пишет отчёт, каждое значение пере‑вводится предсказанием следующего токена. Большинство получается правильно. Ошибочное значение остаётся незамеченным, пока кто‑то не сравнит его с источником, а именно эту работу отчёт должен был сэкономить. С графиками всё ещё хуже: модель может их описать или сгенерировать код, но график в вашем квартальном наборе — это объект в файле PowerPoint, стилизованный кем‑то из маркетинга.

Поэтому разделите работу по тем областям, где каждая сторона сильнее. Шаблон определяет внешний вид отчёта. Движок читает файл и считает. Агент выбирает шаблон и данные, а затем сообщает вам результат.

Что передаёт агент и что видит движок

Ниже показано разделение в виде таблицы:

the agent decides        the engine does            the template owns
-----------------------  -------------------------  -----------------------
which template           reads sales.xlsx/.csv      the table layout
which data file          types the columns          the chart and its style
output format (pdf)      sums, sorts, picks max     headings, fonts, logo
                         fills table rows, chart    what "total" means

Перед генерацией агент может посмотреть файл данных. Для нашей таблицы сервер сообщил одну таблицу с тремя столбцами:

-> get_document_info {"file":{"filePath":"sales.xlsx"}}
<- { "dataKind": "table",
     "data": { "tableCount": 1, "tables": [ { "number": 1,
       "columns": [ "Region", "Quarter", "Revenue" ] } ] } }

Табличный отчёт

Шаблон Word содержит одну строку таблицы с <<foreach [r in sales]>> в первой ячейке и <</foreach>> в последней, а ниже две строки: <<[sales.Sum(r => r.Revenue)]>> и <<[sales.OrderByDescending(r => r.Revenue).First().Region]>>. Один вызов:

-> assemble_document {"template":{"filePath":"sales-report.docx"},
     "data":{"filePath":"sales.xlsx"},"format":"pdf"}
<- Assembled 'sales-report.docx' with 'sales.xlsx' (table 1 (3
   column(s): Region, Quarter, Revenue) as 'sales') as PDF
   Saved to: .../sales-report_assembled.pdf

Отчёт содержит четыре строки (North 182 000, South 146 500, East 98 250, West 211 900), “Total revenue: 638650 EUR” и “Best region: West”. Сервер назвал данные sales, потому что именно так шаблон их перебирает; никому не пришлось явно указывать имя. Тот же шаблон с sales.csv дал те же итоги; для CSV параметры hasHeaders и csvDelimiter покрывают файлы без заголовка или с точкой с запятой.

График

График в шаблоне GroupDocs.Assembly — обычный график с тегами в двух местах. Заголовок графика выглядит так: Revenue by region<<foreach [r in sales]>><<x [r.Region]>> — цикл по строкам, одна категория на каждый регион. Название серии: Revenue<<y [r.Revenue]>> — одно значение на строку. Заполнительные данные внутри графика нужны только для того, чтобы дизайнер мог их увидеть.

-> assemble_document {"template":{"filePath":"sales-chart.pptx"},
     "data":{"filePath":"sales.xlsx"}}
<- Assembled 'sales-chart.pptx' with 'sales.xlsx' (table 1 (3
   column(s): Region, Quarter, Revenue) as 'sales') as PPTX
   Saved to: .../sales-chart_assembled.pptx

Мы открыли результат: столбчатый график с заголовком Revenue by region, категориями North, South, East и West, значениями 182 000, 146 500, 98 250 и 211 900, без тегов и со стилизацией шаблона. Те же теги работают в графиках Word и Excel.

Почему нельзя попросить агента сгенерировать изображение графика?

Можно, и для одноразового ответа в чате это приемлемо. Для отчёта у такого подхода три проблемы: изображение — это картинка, её нельзя кликнуть и проверить значение; её стиль — то, что выбрал код построения, а не ваш фирменный; и числа на ней прошли через модель. График‑шаблон — нативный объект графика, заполненный из файла и стилизованный один раз тем, кто владеет шаблоном.

Честные ограничения

  • Теги таблицы и графика должны уже присутствовать в шаблоне; агент их не создаёт. get_template_fields показывает, какие данные читает шаблон.
  • Режим оценки: каждый вывод начинается с “Evaluation Only. Created with GroupDocs.Assembly 26.7…”, а сохранённые книги получают дополнительный лист.
  • Список, пустой в данных, не имеет типов столбцов, поэтому арифметика над ним не работает, даже при allowMissingMembers. Убедитесь, что фильтр, который вы задаёте, возвращает строки.
  • Шаблоны презентаций на Linux требуют libgdiplus при запуске через dnx; Docker‑образ уже включает его.
  • Даты в файлах данных: храните их как даты или полные ISO‑строки с временем и форматируйте в шаблоне.

FAQ

Может ли AI‑агент построить график из моего CSV без его загрузки?
Да. Сервер работает локально, читает CSV или таблицу из вашей папки хранения и пишет отчёт туда; числа переходят из файла в документ, не проходя через модель.

Какие типы файлов данных может читать шаблон?
JSON, XML, CSV и TSV, а также таблицу внутри таблицы Excel, Word или PowerPoint; dataTable выбирает нужную таблицу, если их несколько.

Можно ли получить отчёт в виде Excel‑файла вместо PDF?
Да, используйте шаблон XLSX; теги помещаются в ячейки листа. В режиме оценки сохранённая книга получает дополнительный лист.

Углублённое изучение