Poproś agenta AI, aby „napisał umowę serwisową dla Contoso”, a on zrobi to własnymi słowami, własnymi nagłówkami i z sumą wyliczoną w głowie. To niewłaściwy podział pracy. Z uruchomionym lokalnie GroupDocs.Assembly.Mcp (dnx GroupDocs.Assembly.Mcp --yes), Claude Desktop, Cursor lub Copilot pytają Twój szablon Word, które pola są potrzebne, wypełniają je na podstawie Twoich notatek, a silnik renderuje umowę, tabelę i obliczenia, bez ingerencji modelu w układ:

Utwórz umowę serwisową dla tego zamówienia używając contract-template.docx i zapisz ją jako PDF: Contoso Pharma, Keizersgracht 210 Amsterdam, kontakt Dr. Lena Brandt; 12 miesięcy zarządzanego hostingu za 4 800 EUR, 12 miesięcy wsparcia za 1 200 EUR, jedno warsztaty wdrożeniowe za 3 500 EUR; 5 procent zniżki.

Wersja krok po kroku z konfiguracją i rozwiązywaniem problemów znajduje się w dokumentacji: Jak generować dokumenty z szablonów przy użyciu agentów AI z MCP.

Dlaczego model nie powinien pisać dokumentu?

Ponieważ wygenerowany dokument może zawierać błędy trudne do zauważenia. Układ odchodzi od zatwierdzonego prawnie. Klauzula zostaje sparafrazowana w sposób brzmiący dobrze, ale znaczący coś innego. Suma powstaje w wyniku prognozowania kolejnego tokenu zamiast mnożenia. I każdy przebieg jest nieco inny, więc przegląd z zeszłego miesiąca nie mówi nic o umowie z tego miesiąca.

Szablon odwraca tę sytuację. Dział prawny posiada contract-template.docx, z jego nagłówkami, blokiem podpisu i tagami <<[customer.Name]>>. Zadanie modelu ogranicza się do tego, w czym jest dobry: czytania e‑maila lub zestawu notatek i przekształcania ich w wartości strukturalne. Silnik robi resztę, za każdym razem w ten sam sposób.

Jak agent wie, co wypełnić?

Pytanie kierowane jest do szablonu. get_template_fields odczytuje tagi bez uruchamiania silnika i zwraca nazwy używane w szablonie, każde pole, które odczytuje, oraz szkielet JSON do wypełnienia. Oto, co serwer zwrócił dla naszego szablonu umowy:

-> get_template_fields {"template":{"filePath":"contract-template.docx"}}
<- { "tagCount": 17,
     "dataSourceNames": [ "contract", "customer", "items" ],
     "dataSkeleton": {
       "contract": { "Number": "", "Date": "", "Discount": "" },
       "customer": { "Name": "", "Address": "", "Contact": "",
                     "Email": "" },
       "items": [ { "Title": "", "Quantity": 0, "UnitPrice": 0 } ] } }

Ten szkielet jest umową między modelem a dokumentem. Agent wypełnia go na podstawie tekstu zamówienia i odsyła jako dataJson.

Co się dzieje, gdy agent zapomni pole?

Zostaje to dokładnie zgłoszone. W naszym teście pierwsza próba agenta pominęła adres e‑mail klienta. Serwer odmówił i wskazał brak:

-> assemble_document {"template":{...},"dataJson":"{... no Email ...}"}
<- Document assembly failed for 'contract-template.docx': ...
   Can not get the value of member 'Email' on type ''. The template
   reads 'Email', which the data does not have. Check the spelling
   (names are case-sensitive) with get_template_fields and add it to
   the data. ... pass allowMissingMembers=true to output nothing for
   missing members and empty lists.

Model generujący wolny tekst po cichu pominąłby tę linię. Tutaj agent może poprosić Cię o adres lub wspólnie z Tobą zdecydować, że pole może pozostać puste.

Cała wymiana

user            agent                       Assembly MCP server
 | "Make the contract for this order: ..."                      |
 |-------------->|                                              |
 |               |-- get_template_fields {"template":          |
 |               |     "contract-template.docx"} ------------->|
 |               |<- dataSkeleton: contract, customer, items --|
 |               |   (fills the skeleton from the order text)  |
 |               |-- assemble_document {"dataJson":"{...}",    |
 |               |     "format":"pdf"} ----------------------->|
 |               |<- Saved to: .../contract-template_          |
 |               |   assembled.pdf ----------------------------|
 |<- "Contract ready: 3 items, total 75500 EUR, 5% discount."  |
   layout, table and arithmetic come from the template

Po dodaniu e‑maila, drugie wywołanie zakończyło się sukcesem:

-> assemble_document {"template":{"filePath":"contract-template.docx"},
     "dataJson":"{...}","format":"pdf"}
<- Assembled 'contract-template.docx' with inline JSON (JSON object)
   as PDF
   Saved to: .../contract-template_assembled.pdf

Dokument zawiera trzywierszową tabelę opłat zbudowaną przy użyciu <<foreach>> w wierszu tabeli, kwoty obliczone w szablonie (<<[item.Quantity * item.UnitPrice]>>), sumę 75500 EUR pochodzącą z items.Sum(...) oraz linijkę „Obowiązuje 5 procent zniżki.”, która istnieje tylko dlatego, że tag <<if>> wykrył zniżkę w danych. Model nie obliczył nic z tego.

Czy to lepsze niż usługa szablonów hostowana?

To inny rodzaj wymiany. Usługi szablonów hostowane pobierają Twój szablon i dane przez HTTPS, renderują w chmurze i pobierają opłatę za dokument lub za kredyt. Tutaj szablon, dane i wynik pozostają w folderze na Twoim komputerze; silnik to GroupDocs.Assembly działający w procesie, i nic nie nasłuchuje na porcie. To, co trafia do dostawcy modelu, to tekst zamówienia, który wklejasz, oraz szkielet wypełniony przez agenta, a nie wyrenderowana umowa. Architektura jest opisana w poście rodzinnym o przetwarzaniu dokumentów AI on-premise.

Szczere ograniczenia

  • Tryb ewaluacji: każdy wygenerowany dokument zaczyna się od linii „Evaluation Only. Created with GroupDocs.Assembly 26.7…”, zapisane skoroszyty zyskują dodatkowy arkusz, a szablony e‑mail zachowują tylko treść w formacie tekstowym. Plik licencyjny lub klucze rozliczane zużyciem usuwają wszystkie trzy elementy.
  • Składnia szablonu to <<[name]>>. Zastępniki {{name}} pozostają jako tekst; get_template_fields tak informuje.
  • Szablony są zaufanym wejściem: tagi obrazu i dokumentu ładują dowolną ścieżkę lub URL zwrócony przez ich wyrażenie. Zamontuj jeden folder dla serwera.
  • Daty: zapisz je jako 2026-11-12T00:00:00 i formatuj w szablonie (<<[contract.Date]:"d MMMM yyyy">>). Data jedynie "2026-11-12" została wydrukowana jako 11 listopada na maszynie UTC+2 w naszym teście.
  • Agent jest źródłem danych. Poproś go o listę wartości, które wyodrębnił przed renderowaniem, i je przejrzyj.

FAQ

Czy agent AI może wypełnić mój szablon Word bez jego przesyłania?
Tak. Serwer działa lokalnie przez stdio i odczytuje szablon z folderu, który skonfigurujesz; wynik jest zapisywany obok niego.

Jakie formaty może mieć szablon?
Word, Excel, PowerPoint, Markdown, HTML, tekstowe i e‑mailowe szablony; każdy może być zapisany w swoim formacie lub jako PDF i inne. get_supported_formats wymienia je dla każdego szablonu.

Co jeśli szablon jest utrzymywany przez kogoś innego?
To jest sedno. Kto posiada szablon, zmienia klauzule i układ; agent nadal wypełnia ten sam szkielet, a get_template_fields pokaże mu każde nowe pole przy następnym zapytaniu.

Zagłęb się