از یک عامل هوش مصنوعی بخواهید «قرارداد خدمات برای Contoso را بنویسید» و آن به زبان خود، با عناوین خود و با مجموعی که در ذهنش محاسبه کرده است، انجام می‌دهد. این تقسیم کار نادرست است. با اجرای GroupDocs.Assembly.Mcp به‌صورت محلی (dnx GroupDocs.Assembly.Mcp --yes)، Claude Desktop، Cursor یا Copilot از قالب Word شما می‌پرسند که چه فیلدهایی نیاز دارد، آن‌ها را از یادداشت‌های شما پر می‌کنند و موتور قرارداد، جدول و محاسبات را رندر می‌کند، بدون اینکه مدل به چیدمان دست بزند:

قرارداد خدمات این سفارش را با استفاده از contract-template.docx تهیه کنید و به‌صورت PDF ذخیره کنید: Contoso Pharma، Keizersgracht 210 Amsterdam، تماس: دکتر لنا براندت؛ 12 ماه میزبانی مدیریت‌شده به‌قیمت 4,800 یورو، 12 ماه پشتیبانی به‌قیمت 1,200 یورو، یک کارگاه راه‌اندازی به‌قیمت 3,500 یورو؛ تخفیف 5 درصد.

نسخه گام‌به‌گام با پیکربندی و عیب‌یابی در مستندات موجود است: چگونه اسناد را از قالب‌ها با استفاده از عوامل هوش مصنوعی و MCP تولید کنیم.

چرا مدل نباید سند را بنویسد؟

زیرا یک سند تولید‌شده به‌صورت‌هایی خراب می‌شود که تشخیصشان دشوار است. چیدمان از نسخه قانونی تأییدشده منحرف می‌شود. یک بند به‌صورت پارافرِز می‌شود به‌طوری که خوب به‌نظر می‌رسد اما معنای دیگری دارد. مجموع به‌جای ضرب، از پیش‌بینی توکن بعدی به‌دست می‌آید. و هر بار اجرا کمی متفاوت است، بنابراین بررسی ماه گذشته درباره قرارداد ماه جاری چیزی نمی‌گوید.

یک قالب این وضعیت را معکوس می‌کند. بخش حقوقی مالک contract-template.docx است، با عناوین، بلوک امضای خود و تگ‌های <<[customer.Name]>>. کار مدل به بخشی که در آن مهارت دارد محدود می‌شود: خواندن یک ایمیل یا مجموعه‌ای از یادداشت‌ها و تبدیل آن به مقادیر ساخت‌یافته. موتور بقیه کار را انجام می‌دهد، به‌همین شکل هر بار.

عامل چگونه می‌داند چه چیزی را پر کند؟

آن از قالب می‌پرسد. get_template_fields تگ‌ها را بدون اجرای موتور می‌خواند و نام‌های استفاده‌شده در قالب، تمام فیلدهایی که می‌خواند و یک اسکلت JSON برای پر کردن را برمی‌گرداند. این خروجی سرور برای قالب قرارداد ما بود:

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

آن اسکلت قرارداد بین مدل و سند است. عامل آن را از متن سفارش پر می‌کند و به‌عنوان dataJson برمی‌گرداند.

چه اتفاقی می‌افتد وقتی عامل یک فیلد را فراموش می‌کند؟

به‌دقت به آن اطلاع داده می‌شود. در تست ما اولین تلاش عامل آدرس ایمیل مشتری را نادیده گرفت. سرور رد کرد و نقص را نام برد:

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

یک مدل که متن آزاد می‌نویسد به‌ساکت‌گی آن خط را حذف می‌کرد. در اینجا عامل می‌تواند از شما آدرس را بپرسد، یا با شما تصمیم بگیرد که فیلد می‌تواند خالی بماند.

کل تبادل

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

با افزودن ایمیل، فراخوان دوم موفق شد:

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

سند شامل جدول هزینه سه‌ردفی است که توسط <<foreach>> در ردیف جدول ساخته شده، مقادیر توسط قالب محاسبه می‌شوند (<<[item.Quantity * item.UnitPrice]>>)، مجموع 75500 EUR از items.Sum(...)، و خط «یک تخفیف 5 درصدی اعمال می‌شود.» که فقط به‌دلیل یافتن یک تگ <<if>> که تخفیف را در داده‌ها پیدا کرده، وجود دارد. مدل هیچ‌یک از این‌ها را محاسبه نکرد.

آیا این بهتر از سرویس قالب میزبانی‌شده است؟

این یک تعادل متفاوت است. سرویس‌های قالب میزبانی‌شده قالب و داده‌های شما را از طریق HTTPS می‌گیرند، در ابر خود رندر می‌کنند و به‌ازای هر سند یا هر اعتبار هزینه می‌گیرند. در اینجا قالب، داده‌ها و خروجی در پوشه‌ای روی ماشین شما می‌مانند؛ موتور GroupDocs.Assembly به‌صورت در‑فرآیند اجرا می‌شود و هیچ‌چیزی بر روی پورت گوش نمی‌دهد. آنچه به ارائه‌دهنده مدل شما می‌رسد متن سفارش است که می‌چسبانید و اسکلت‌ایی که عامل پر می‌کند، نه قرارداد رندرشده. معماری در پست خانواده درباره on-premise AI document processing آمده است.

محدودیت‌های صادقانه

  • حالت ارزیابی: هر سند تولید‌شده با خط «Evaluation Only. Created with GroupDocs.Assembly 26.7…» شروع می‌شود، کتاب‌کارهای ذخیره‌شده یک برگه اضافی دریافت می‌کنند، و قالب‌های ایمیل فقط بدنهٔ متن سادهٔ خود را نگه می‌دارند. یک فایل لایسنس یا کلیدهای متری حذف هر سه را انجام می‌دهد.
  • سینتکس قالب <<[name]>> است. جای‌گذاری‌های {{name}} به‌عنوان متن باقی می‌مانند؛ get_template_fields این را می‌گوید.
  • قالب‌ها ورودی مورد اعتماد هستند: تگ‌های تصویر و سند هر مسیر یا URLی که عبارتشان برمی‌گرداند بارگذاری می‌کند. یک پوشه برای سرور سوار کنید.
  • تاریخ‌ها: آن‌ها را به‌صورت 2026-11-12T00:00:00 بنویسید و در قالب فرمت کنید (<<[contract.Date]:"d MMMM yyyy">>). یک تاریخ فقط "2026-11-12" در ماشین UTC+2 ما به‌صورت 11 نوامبر چاپ شد.
  • عامل منبع داده است. از او بخواهید مقادیر استخراج‌شده را قبل از رندر فهرست کند و آن‌ها را بازبینی کنید.

سؤالات متداول

آیا یک عامل هوش مصنوعی می‌تواند قالب Word من را بدون بارگذاری پر کند؟
بله. سرور به‌صورت محلی از طریق stdio اجرا می‌شود و قالب را از پوشه‌ای که پیکربندی می‌کنید می‌خواند؛ خروجی در کنار آن نوشته می‌شود.

قالب می‌تواند در چه فرمت‌هایی باشد؟
Word، Excel، PowerPoint، Markdown، HTML، متن و قالب‌های ایمیل؛ هر کدام می‌توانند به فرمت خود یا به PDF و سایر فرمت‌ها ذخیره شوند. get_supported_formats آن‌ها را برای هر قالب فهرست می‌کند.

اگر قالب توسط شخص دیگری نگهداری شود چه؟
این هدف است. هر کسی که مالک قالب است، بندها و چیدمان را تغییر می‌دهد؛ عامل همچنان همان اسکلت را پر می‌کند و get_template_fields هر فیلد جدیدی را که دفعهٔ بعد می‌پرسد نشان می‌دهد.

عمیق‌تر بروید