ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

opencode go 生成 word 文档自动修改格式提示词:从 docx XML 到可复用配置

opencode go 生成 word 文档自动修改格式提示词:从 docx XML 到可复用配置 1. 为什么 opencode go 生成的 Word 文档格式总跑偏用 opencode go 生成 Word 文档最让人头疼的不是内容写不出来而是格式反复无常。同一段提示词今天生成的是宋体小四、首行缩进两字符明天可能就变成 Calibri 五号、顶格排版。你打开 docx 一看正文里塞满了手动w:rPr标题编号靠硬编码的「1.1」文本上标用的是 Unicode 的²字符——在 Word 里显示正常换个字体就变成方框。这个问题的根源在于docx 本质是一个 ZIP 包里面装着word/document.xml、word/styles.xml、word/numbering.xml等一堆 XML 部件。大模型在生成时如果被要求「从零手写所有 XML」它很容易在细节上翻车——比如把xmlns命名空间写错、把关系类型Type属性搞混、或者在正文段落里误加w:numPr导致正文被自动编号。这些错误在纯文本预览里看不出来只有用 Word 打开才会暴露。我试过让模型直接输出完整 docx 的 XML结果十次里有三次因为命名空间声明缺失导致文件损坏还有两次因为Content_Types.xml没更新Word 提示「文件已损坏是否修复」。后来换了个思路不让模型从零拼装而是拿一个现成的配置文件.docx当模板底板只替换document.xml和numbering.xml其余部件原样保留。这样格式稳定性立刻上了一个台阶。所以这篇要解决的核心问题是如何设计一套可复用的提示词让 opencode go 在生成 Word 文档时格式调整稳定可复现。适合谁看经常用 AI 生成报告、论文、技术文档但每次都要手动调格式的开发者以及想把「生成 docx」这一步接入自动化流程、需要格式确定性的工程同学。接下来我会拆解 docx 的 XML 结构给出可复制的提示词模板和配置片段并演示怎么对生成结果做格式校验和二次修改。2. 先搞懂 docx 的 XML 结构与格式指令映射要让提示词稳定生效你得先知道 Word 到底认哪些标签。docx 的格式控制分三层样式层styles.xml、编号层numbering.xml、内容层document.xml。三层各司其职混用就会出问题。样式层定义「H1 是什么样」字体、字号、加粗、段前段后间距、缩进。内容层只负责「这段是 H1」通过w:pStyle w:valH1/引用样式。编号层定义「H1 的编号长什么样」abstractNum里写%1、%1.%2这种格式num把abstractNumId和具体的numId绑定。标题段落要同时挂pStyle和numPrWord 才会既显示样式又显示编号。关键映射关系我整理成表格方便你对照提示词里的参数Word 界面操作XML 标签/属性提示词里的写法宋体小四w:sz w:val24/w:eastAsia宋体正文 sz24eastAsia宋体首行缩进 2 字符w:ind w:firstLine480/firstLine480单倍行距w:spacing w:line240 w:lineRuleauto/line240 lineRuleauto两端对齐w:jc w:valboth/jcboth上标w:vertAlign w:valsuperscript/拆 run上标部分加 vertAlign自动编号w:numPrw:ilvl/w:numId//w:numPr标题段落必须同时有 pStyle 和 numPr这里有个容易踩的坑中文双引号的字体归属。如果你把w:hAnsi设成 Times New Roman中文引号「」会跟着变成西文字体和正文宋体不统一。正确做法是正文的w:rFonts设w:asciiTimes New Roman w:eastAsia宋体 w:hAnsi宋体让引号走 hAnsi 挂宋体。希腊字母 α β γ 则要单独拆成一个 runrFonts 全部设 Times New Roman否则在宋体环境下会显示成乱码或方框。还有一个高频错误正文段落里出现w:numPr。有些模型为了让「看起来像列表」的段落有编号会在正文里加 numPr结果整篇正文被 Word 自动编号成 1、2、3……解决办法是在提示词里明确写「绝对不要在正文段落中出现w:numPr」并且正文段落不加任何pStyle直接继承docDefaults的默认格式只在pPr里显式加w:ind w:firstLine480/。理解这三层结构后提示词的设计就有了依据样式和编号的定义交给模板和追加片段内容层只做引用。这样模型不需要每次重新发明轮子格式自然稳定。3. 可复制的提示词模板与配置片段这一节是核心。我把提示词拆成「模板底板要求」「样式定义」「编号定义」「内容层规则」四块你可以直接复制使用。注意提示词里涉及路径的地方统一用用户目录下的配置文件.docx模型会去读这个文件的 ZIP 结构。3.1 模板底板与构建方式提示词开头必须锁定构建方式否则模型会忍不住从零手写你要创建一个 Word 文档.docx以下格式要求必须严格遵守一项都不能错。 构建方式 - 禁止从零手写所有 XML 部件拼装 docx。 - 必须先用用户目录下的「配置文件.docx」作为模板底板。如果没有该文件先不要工作告诉用户去创建。 - 读取模板 ZIP 中全部部件仅替换 word/document.xml 和 word/numbering.xml。 - 更新 [Content_Types].xml 中对应部件的注册条目其余部件styles.xml、settings.xml、fontTable.xml、theme1.xml 等全部原样保留。 - 如果必须在 styles.xml 中添加自定义样式H1/H2/H3把自定义样式追加到模板的 styles.xml 中不要替换整个文件。这段的作用是让模型「只改该改的」。[Content_Types].xml里每个部件都有对应的Override条目如果你替换了document.xml但没更新注册Word 打开时会报「内容有问题」。3.2 样式定义片段追加到 styles.xmlH1/H2/H3 三个样式直接给可复制的 XML 片段。注意w:styleId和w:name要对应basedOn留空避免继承意外格式w:style w:typeparagraph w:styleIdH1 w:name w:valH1/ w:pPr w:spacing w:before240 w:after60/ w:ind w:left0 w:firstLine0/ w:jc w:valleft/ /w:pPr w:rPr w:rFonts w:asciiTimes New Roman w:eastAsia黑体 w:hAnsi黑体/ w:b/ w:sz w:val30/ /w:rPr /w:styleH2 把sz改成 28、before改成 120H3 把sz改成 24、before改成 60。正文样式不单独定义走docDefaults在document.xml的正文段落里只写w:pPr w:ind w:firstLine480/ w:jc w:valboth/ /w:pPr w:r w:rPr w:rFonts w:asciiTimes New Roman w:eastAsia宋体 w:hAnsi宋体/ w:sz w:val24/ /w:rPr w:t xml:spacepreserve正文内容/w:t /w:r3.3 编号定义片段numbering.xml多级编号的关键是abstractNum里 9 个lvl都要定义0/1/2 级实际使用3-8 级留空占位w:abstractNum w:abstractNumId0 w:multiLevelType w:valmultilevel/ w:lvl w:ilvl0 w:start w:val1/ w:numFmt w:valdecimal/ w:lvlText w:val%1/ w:suff w:valspace/ w:lvlJc w:valleft/ w:pPrw:ind w:left0 w:firstLine0//w:pPr /w:lvl w:lvl w:ilvl1 w:start w:val1/ w:numFmt w:valdecimal/ w:lvlText w:val%1.%2/ w:suff w:valspace/ w:lvlJc w:valleft/ w:pPrw:ind w:left0 w:firstLine0//w:pPr /w:lvl w:lvl w:ilvl2 w:start w:val1/ w:numFmt w:valdecimal/ w:lvlText w:val%1.%2.%3/ w:suff w:valspace/ w:lvlJc w:valleft/ w:pPrw:ind w:left0 w:firstLine0//w:pPr /w:lvl /w:abstractNum w:num w:numId1 w:abstractNumId w:val0/ /w:num标题段落引用时pPr里同时写pStyle和numPrw:pPr w:pStyle w:valH1/ w:numPr w:ilvl w:val0/ w:numId w:val1/ /w:numPr /w:pPr3.4 特殊字符处理规则这部分直接写进提示词模型会按规则拆 run特殊字符处理 - 中文双引号必须用全角 U201C左和 U201D右。正文中通过 rFonts 的 hAnsi 属性挂宋体不能挂 Times New Roman。 - 希腊字母α β γ 等从当前 run 中拆出单独包裹为一个 w:r该 run 的 rFonts 全部设为 Times New Roman。 - 上标如 cm²、10⁷禁止使用 Unicode 上标字符U00B2/U2077 等。必须用普通数字字符配合 w:vertAlign w:valsuperscript/ 标签实现拆为多个 run。 - 绝对不要出现 [Pn] 段落标记、英文直引号、Unicode 上标字符U2070 等。3.5 XML 构建细节XML 构建细节 - 所有 XML 文件内部换行统一用 \r\n。 - _rels/.rels 和 word/_rels/document.xml.rels 的元素 xmlns 必须用 http://schemas.openxmlformats.org/package/2006/relationshipsType 属性值才用 http://schemas.openxmlformats.org/officeDocument/2006/relationships。 - document.xml 根元素必须声明 xmlns:xmlhttp://www.w3.org/XML/1998/namespace 以支持 xml:spacepreserve。 - 标题段落不要有任何手动 rPr全部交给 pStyle 引用的样式控制。正文段落的 rPr 只设 rFonts 和 sz。 - 绝对不要在正文段落中出现 w:numPr。这套模板复制到 opencode go 的对话里前面先写清楚文章内容、标题、字数、章节分布最后粘贴格式要求。模型会先读配置文件.docx再按规则替换部件。如果你还没配好 API 入口可以先去 TaoToken 的 API Keys 页面拿一个 Key接入文档里有 opencode go 的配置说明把 Base URL 指向https://taotoken.net/api即可。4. 验证请求与格式校验生成后怎么确认没跑偏生成完 docx 只是第一步你得验证格式真的生效了。我常用的方法是「解压 关键标签检查 Word 打开目测」三步走。4.1 解压 docx 检查 XMLdocx 就是 ZIP直接解压mkdir -p /tmp/docx_check cd /tmp/docx_check unzip -o ~/output.docx -d extracted ls extracted/word/你应该看到document.xml、styles.xml、numbering.xml、settings.xml、fontTable.xml、theme/theme1.xml等部件。如果styles.xml或numbering.xml缺失说明模型没按模板底板走格式肯定不稳定。4.2 用 grep 检查关键标签检查正文段落有没有误加numPrgrep -c w:numPr extracted/word/document.xml这个数字应该等于标题段落数。如果正文段落也被算进去数字会明显偏大。更精确的做法是看numPr是否只出现在带pStyle的段落里grep -o w:pStyle w:valH[123]/ extracted/word/document.xml | wc -l grep -o w:numPr extracted/word/document.xml | wc -l两个数字应该相等。如果numPr比pStyle多说明有正文段落被误编号。检查有没有 Unicode 上标字符grep -P [\x{00B2}\x{00B3}\x{2070}-\x{2079}] extracted/word/document.xml没有输出就是对的。如果有输出说明模型偷懒用了 Unicode 上标需要让它改成vertAlign方案。检查命名空间声明head -c 500 extracted/word/document.xml | grep -o xmlns:xmlhttp://www.w3.org/XML/1998/namespace有输出说明xml:spacepreserve能正常工作中文前后的空格不会被吞。4.3 用 Python 做结构化校验如果你想把校验接入自动化流程用python-docx读一遍更直观from docx import Document doc Document(/tmp/docx_check/output.docx) for i, para in enumerate(doc.paragraphs[:10]): style para.style.name if para.style else None text para.text[:30] print(f[{i}] style{style} | text{text})正常输出应该是标题段落styleH1/H2/H3正文段落styleNormal。如果标题的 style 显示Normal说明pStyle没挂上编号也不会显示。4.4 验证请求让模型自检你可以在提示词末尾加一段自检要求生成完成后请自行检查以下三项并报告结果 1. document.xml 中 w:numPr 出现次数是否等于 H1/H2/H3 段落总数。 2. 是否存在 Unicode 上标字符U00B2/U2077 等。 3. 正文段落是否都不含 w:pStyle。模型会输出检查结果你对照一下就知道有没有跑偏。这一步能省掉很多手动排查时间。如果你在验证过程中需要对比不同模型的输出可以用 TaoToken 的模型对话功能快速切换测试不用改代码就能看哪个模型对 XML 细节把控更稳。5. 常见报错与排查对照这一节列几个我实际遇到过的报错以及对应的排查方向。每个报错都给出真实错误信息和解决动作。5.1 Word 提示「文件已损坏是否修复」这是最常见的。原因通常是[Content_Types].xml没更新或者_rels/.rels的命名空间写错。排查步骤unzip -p output.docx \[Content_Types\].xml | grep -o PartName/word/document.xml如果没有输出说明document.xml没注册。正确条目应该是Override PartName/word/document.xml ContentTypeapplication/vnd.openxmlformats-officedocument.wordprocessingml.document.mainxml/另外检查_rels/.rels的xmlns是不是http://schemas.openxmlformats.org/package/2006/relationships。如果模型写成了officeDocument/2006/relationshipsWord 直接报损坏。5.2 报错401 Unauthorized或local proxy failed如果你是通过 API 调用 opencode go遇到 401 通常是 Key 没配对或者 Base URL 写错。检查你的配置文件{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: claude-sonnet-4-20250514 }local proxy failed一般是本地代理端口没起来或者环境变量HTTP_PROXY指向了不存在的地址。先unset HTTP_PROXY HTTPS_PROXY再重试。5.3 报错reading choices或返回空内容这个报错说明请求发出去了但响应体里没有choices字段。常见原因是模型名写错或者请求体里stream参数和客户端不匹配。检查你的请求curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d {model:claude-sonnet-4-20250514,messages:[{role:user,content:test}]}如果返回{error:{message:model not found}}说明模型 ID 不对。去 TaoToken 的模型对话页面确认可用模型列表。5.4 OAuth 相关报错如果你用的是 Claude Code 或 Codex 这类需要 OAuth 的工具报错OAuth token expired或invalid_grant需要重新走授权流程。在 Claude Code 里通常是claude auth login然后按提示在浏览器完成授权。如果你用的是 API Key 模式就不需要 OAuth直接配ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY即可。5.5 标题编号不显示或重复如果 Word 里标题没有编号检查document.xml里标题段落的pPr是否同时有pStyle和numPr。只有pStyle没有numPr样式生效但编号不显示只有numPr没有pStyle编号显示但字体字号不对。如果编号重复比如两个「1.」检查numbering.xml里是不是定义了多个abstractNum但numId指向了同一个。每个num应该只绑定一个abstractNumId。5.6 中文引号字体不统一打开 Word 看引号是不是变成了 Times New Roman 的样子。如果是检查正文rFonts的hAnsi是不是写成了Times New Roman。正确写法w:rFonts w:asciiTimes New Roman w:eastAsia宋体 w:hAnsi宋体/hAnsi挂宋体引号才会跟中文一致。6. 把格式调整接入长期工作流单次生成验证通过后下一步是把它变成可复用的流程。我的做法是把提示词模板存成一个prompt_template.md把配置文件.docx放在固定目录然后写一个脚本自动调用 opencode go 生成并校验。如果你经常需要生成论文、报告这类格式要求严格的文档建议把「生成」和「校验」拆成两步第一步让模型只输出document.xml和numbering.xml的内容第二步用本地脚本把它们塞进模板 ZIP 并跑校验。这样模型不需要处理 ZIP 打包出错概率更低。对于需要长期跑编码或 Agent 任务的场景TaoToken 的 Coding Plan 提供了更稳定的调用配额适合把文档生成接入 CI 流程。如果你只是偶尔生成几篇用 API Keys 按量调用就够了。最后分享一个实用技巧在提示词里加一句「如果模板文件不存在先停下来告诉用户去创建不要自己造一个」。我踩过的坑就是模型发现配置文件.docx不存在自己从零拼了一个 docx结果格式全乱。加上这句话后它会老老实实等你准备好模板再干活。整套流程跑通后你每次只需要改文章内容和章节结构格式部分完全交给模板和提示词生成出来的 docx 打开就是对的。校验脚本可以挂在生成之后自动跑numPr数量对不上就报警省掉手动检查的功夫。
返回列表