“Make me the regional sales report from sales.csv” to prośba, na którą model językowy chętnie odpowie, generując tabelę w Markdown, zaokrąglając jedną‑dwie liczby po drodze i opisując wykres, którego nie potrafi narysować. Przy uruchomionym lokalnie GroupDocs.Assembly.Mcp (dnx GroupDocs.Assembly.Mcp --yes), Claude Desktop, Cursor lub Copilot przekazują plik danych do silnika: szablon Worda lub PowerPointa zawiera tabelę, sumy i prawdziwy wykres, a serwer wypełnia je z pliku CSV lub arkusza kalkulacyjnego, nie przepuszczając liczb przez model:

Utwórz regionalny raport sprzedaży z pliku sales.xlsx, zapisując sales-report.docx jako PDF oraz slajd wykresu jako sales-chart.pptx.

Szczegółowa wersja krok po kroku z konfiguracją i rozwiązywaniem problemów znajduje się w dokumentacji: Jak zbudować raport z tabelami i wykresami z pliku CSV lub arkusza kalkulacyjnego przy użyciu agenta AI.

Dlaczego liczby powinny ominąć model?

Ponieważ model jest generatorem tekstu, a raport to arytmetyka plus układ. Gdy agent odczytuje CSV i sam tworzy raport, każda wartość jest wpisywana przez prognozowanie kolejnego tokenu. Większość wychodzi poprawnie. Ta, która nie, jest niewidoczna, dopóki ktoś nie sprawdzi jej w źródle – dokładnie to zadanie, które raport miał zaoszczędzić. Wykresy są jeszcze gorsze: model może je opisać lub wygenerować kod, ale wykres w kwartalnym decku to obiekt w pliku PowerPoint, stylizowany przez kogoś z marketingu.

Dlatego podziel pracę według mocnych stron każdej ze stron. Szablon określa, jak raport ma wyglądać. Silnik odczytuje plik i wykonuje obliczenia. Agent wybiera szablon i dane oraz informuje, co wyszło.

Co przekazuje agent, a co widzi silnik

Oto podział w jednej tabeli:

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

Przed generowaniem agent może spojrzeć na plik danych. Dla naszego arkusza serwer zgłosił jedną tabelę z trzema kolumnami:

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

Raport tabelaryczny

Szablon Worda ma jeden wiersz tabeli z <<foreach [r in sales]>> w pierwszej komórce i <</foreach>> w ostatniej, plus dwie linie poniżej: <<[sales.Sum(r => r.Revenue)]>> oraz <<[sales.OrderByDescending(r => r.Revenue).First().Region]>>. Jedno wywołanie:

-> 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

Raport zawiera cztery wiersze (North 182000, South 146500, East 98250, West 211900), „Total revenue: 638650 EUR” oraz „Best region: West”. Serwer nazwał dane sales, ponieważ tak szablon iteruje; nikt nie musiał tego określać. Ten sam szablon z sales.csv dał te same sumy; dla CSV parametry hasHeaders i csvDelimiter obsługują pliki bez wiersza nagłówka lub z średnikami.

Wykres

Wykres w szablonie GroupDocs.Assembly to zwykły wykres z tagami w dwóch miejscach. Tytuł wykresu brzmi Revenue by region<<foreach [r in sales]>><<x [r.Region]>>: pętla po wierszach, jedna kategoria na region. Nazwa serii to Revenue<<y [r.Revenue]>>: jedna wartość na wiersz. Dane zastępcze wewnątrz wykresu służą jedynie projektantowi do podglądu.

-> 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

Otworzyliśmy wynik: wykres słupkowy zatytułowany Revenue by region, kategorie North, South, East i West, wartości 182000, 146500, 98250 i 211900, z usuniętymi tagami i nienaruszonym stylem szablonu. Te same tagi działają w wykresach Worda i Excela.

Dlaczego nie prosić agenta o obraz wykresu?

Można, i w jednorazowej odpowiedzi w czacie to w porządku. W raporcie pojawiają się trzy problemy: obraz to zdjęcie, więc nikt nie może w nie kliknąć i sprawdzić wartości; jego styl to domyślne ustawienia kodu rysującego, a nie Twój firmowy styl; oraz liczby na obrazie przeszły przez model. Wykres szablonowy to natywny obiekt wykresu, wypełniony z pliku i wystylizowany raz przez właściciela szablonu.

Szczere ograniczenia

  • Tagi tabeli i wykresu muszą już znajdować się w szablonie; agent ich nie projektuje. get_template_fields pokazuje, jakie dane szablon odczytuje.
  • Tryb ewaluacji: każde wyjście zaczyna się od „Evaluation Only. Created with GroupDocs.Assembly 26.7…”, a zapisane skoroszyty zyskują dodatkowy arkusz.
  • Lista, która jest pusta w danych, nie ma typów kolumn, więc operacje arytmetyczne na niej zawodzą, nawet przy allowMissingMembers. Sprawdź, czy filtr, którego używasz, zwraca wiersze.
  • Szablony prezentacji na Linuksie wymagają libgdiplus przy uruchamianiu przez dnx; obraz Docker go zawiera.
  • Daty w plikach danych: zachowaj je jako daty lub pełny format ISO z czasem i sformatuj w szablonie.

FAQ

Czy agent AI może stworzyć wykres z mojego CSV bez jego przesyłania?
Tak. Serwer działa lokalnie, odczytuje CSV lub arkusz kalkulacyjny z folderu przechowywania i zapisuje raport tam; liczby przechodzą z pliku do dokumentu, nie przechodząc przez model.

Jakie pliki danych może odczytać szablon?
JSON, XML, CSV i TSV oraz tabela wewnątrz arkusza kalkulacyjnego, dokumentu Word lub PowerPoint; dataTable wybiera tabelę, gdy jest ich kilka.

Czy raport może być plikiem Excel zamiast PDF?
Tak, użyj szablonu XLSX; tagi trafiają do komórek arkusza. W trybie ewaluacji zapisany skoroszyt zyskuje dodatkowy arkusz.

Zagłęb się