ขอให้เอเจนต์ AI “เขียนสัญญาการให้บริการสำหรับ Contoso” แล้วมันจะทำในคำพูดของมันเอง พร้อมหัวข้อของมันเอง และคำนวนยอดรวมในหัวของมัน นั่นคือการแบ่งงานที่ไม่ถูกต้อง ด้วยการรัน GroupDocs.Assembly.Mcp บนเครื่องท้องถิ่น (dnx GroupDocs.Assembly.Mcp --yes), Claude Desktop, Cursor หรือ Copilot จะถามเทมเพลต Word ของคุณว่าต้องการฟิลด์อะไร, เติมค่าจากบันทึกของคุณ, และเอนจินจะเรนเดอร์สัญญา, ตารางและการคำนวณรวมไว้โดยที่โมเดลไม่ต้องสัมผัสกับเลเอาต์:

ทำสัญญาการให้บริการสำหรับคำสั่งซื้อนี้โดยใช้ contract‑template.docx และบันทึกเป็น PDF: Contoso Pharma, Keizersgracht 210 Amsterdam, ติดต่อ Dr. Lena Brandt; โฮสติ้งจัดการ 12 เดือนที่ 4,800 EUR, การสนับสนุน 12 เดือนที่ 1,200 EUR, เวิร์กช็อปเริ่มต้นใช้งานหนึ่งครั้งที่ 3,500 EUR; ส่วนลด 5 เปอร์เซ็นต์

เวอร์ชันแบบขั้นตอนพร้อมการกำหนดค่าและการแก้ไขปัญหาอยู่ในเอกสาร: วิธีสร้างเอกสารจากเทมเพลตด้วยเอเจนต์ AI โดยใช้ MCP

ทำไมโมเดลไม่ควรเขียนเอกสารเอง?

เพราะเอกสารที่สร้างขึ้นอาจล้มเหลวในลักษณะที่มองไม่เห็นได้ การจัดวางอาจเบี่ยงเบนจากที่กฎหมายอนุมัติ ข้อความบางข้ออาจถูกพาราฟเรซให้ดูดีแต่มีความหมายต่างออกไป ยอดรวมอาจมาจากการทำนายโทเคนต่อไปแทนการคูณ และการรันแต่ละครั้งอาจแตกต่างกันเล็กน้อย ดังนั้นการตรวจสอบเดือนก่อนจึงบอกอะไรไม่ได้เกี่ยวกับสัญญาเดือนนี้

เทมเพลตจะแก้ไขปัญหานี้ได้ Legal จะเป็นเจ้าของ 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(...) และบรรทัด “A discount of 5 percent applies.” ซึ่งปรากฏเพราะแท็ก <<if>> พบส่วนลดในข้อมูล โมเดลไม่ได้คำนวณส่วนใดส่วนหนึ่งเลย

วิธีนี้ดีกว่าบริการเทมเพลตแบบโฮสต์หรือไม่?

นี่เป็นการแลกเปลี่ยนที่ต่างกัน บริการเทมเพลตแบบโฮสต์จะรับเทมเพลตและข้อมูลของคุณผ่าน HTTPS, เรนเดอร์ในคลาวด์ของพวกเขาและคิดค่าบริการต่อเอกสารหรือต่อเครดิต ที่นี่เทมเพลต, ข้อมูลและผลลัพธ์จะอยู่ในโฟลเดอร์บนเครื่องของคุณ; เอนจินคือ GroupDocs.Assembly ที่ทำงานในกระบวนการเดียวกันและไม่มีอะไรฟังพอร์ตใด ๆ สิ่งที่ส่งไปยังผู้ให้บริการโมเดลคือข้อความคำสั่งที่คุณวางและโครงกระดูกที่เอเจนต์เติม ไม่ใช่สัญญาที่เรนเดอร์ สถาปัตยกรรมนี้อธิบายไว้ในโพสต์ครอบครัวเกี่ยวกับ การประมวลผลเอกสาร AI แบบออน‑พรีมิส

ข้อจำกัดที่ต้องระวัง

  • โหมดประเมินผล: เอกสารที่สร้างทุกฉบับจะเริ่มด้วยบรรทัด “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” จะพิมพ์เป็น 11 November บนเครื่องที่ตั้งค่าเป็น UTC+2 ในการทดสอบของเรา
  • เอเจนต์คือแหล่งข้อมูล ให้ถามมันเพื่อแสดงค่าที่มันสกัดออกมาก่อนที่มันจะเรนเดอร์ แล้วทำการตรวจสอบ

คำถามที่พบบ่อย

เอเจนต์ AI สามารถเติมเทมเพลต Word ของฉันได้โดยไม่ต้องอัปโหลดหรือไม่?
ได้ เซิร์ฟเวอร์ทำงานแบบโลคัลผ่าน stdio และอ่านเทมเพลตจากโฟลเดอร์ที่คุณกำหนด; ผลลัพธ์จะถูกเขียนไว้ข้าง ๆ เทมเพลต

เทมเพลตสามารถอยู่ในรูปแบบใดได้บ้าง?
Word, Excel, PowerPoint, Markdown, HTML, ข้อความและเทมเพลตอีเมล; แต่ละแบบสามารถบันทึกเป็นรูปแบบของตนเองหรือเป็น PDF และรูปแบบอื่น ๆ get_supported_formats จะ列出它们每个模板支持的格式

ถ้าเทมเพลตถูกดูแลโดยคนอื่นจะทำอย่างไร?
นี่แหละคือจุดประสงค์ ผู้ที่เป็นเจ้าของเทมเพลตจะเปลี่ยนข้อกำหนดและการจัดวาง; เอเจนต์จะยังคงเติมโครงกระดูกเดียวกันและ get_template_fields จะบอกฟิลด์ใหม่ใด ๆ ที่ปรากฏในครั้งต่อไปที่มันถาม

ไปให้ลึกขึ้น