ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

Canguo Science 的学术 Skills 是怎么把模型输出变成规范 Word / PDF 的?(含代码)

Canguo Science 的学术 Skills 是怎么把模型输出变成规范 Word / PDF 的?(含代码) 科研工作流的最后一公里是成稿——把一堆分析结果、笔记、引用拼成一份格式规范的 Word 或 PDF。这一步最磨人的不是写内容而是排版、对齐引用、统一格式。Canguo Science 把它封装成了学术 Skills模型负责产出内容Skill 负责把内容变成规范文档。这篇讲讲这条链路在工程上怎么落地用能跑的 Python让模型返回结构化输出 → 用 python-docx 生成规范 Word → 处理字体 / 表格 / 引用 → 导出 PDF。模型这一层在 Canguo Science 里统一走 CanguoAI 的 OpenAI 兼容入口所以下面的代码换任意模型都一样不影响成稿逻辑。代码为便于阅读做了简化。一、先让模型给你结构化的输出直接把模型吐的一大段 Markdown 硬塞进文档格式很难控制。更稳的做法是让模型返回结构化 JSON成稿逻辑只跟固定的数据结构打交道import os, jsonfrom openai import OpenAIclient OpenAI(api_keyos.environ[LLM_API_KEY],base_urlos.environ[LLM_BASE_URL], # OpenAI 兼容入口的 /v1换模型只改 model)SCHEMA_HINT 只输出 JSON结构为{title: 标题,sections: [{heading: 小节标题, body: 正文}],references: [文献1, 文献2]}resp client.chat.completions.create(modelgpt-4o-mini,messages[{role: system, content: 你是科研写作助手。 SCHEMA_HINT},{role: user, content: 写一份关于扩散模型的简短综述},],response_format{type: json_object}, # 保证输出是合法 JSON)data json.loads(resp.choices[0].message.content)一个细节用response_format{type: json_object}时prompt 里必须出现 JSON 字样否则接口会报错——这是 OpenAI 兼容协议的约定。二、用 python-docx 把结构化数据变成 Word拿到规整的data之后生成文档就是照着结构填from docx import Documentdef build_docx(data: dict, outreport.docx):doc Document()doc.add_heading(data[title], level0)for sec in data[sections]:doc.add_heading(sec[heading], level1)doc.add_paragraph(sec[body])if data.get(references):doc.add_heading(参考文献, level1)for i, ref in enumerate(data[references], 1):doc.add_paragraph(f[{i}] {ref})doc.save(out)build_docx(data)结构化的好处在这一步体现得淋漓尽致模型输出一变文档跟着变中间没有脆弱的字符串解析。三、中文字体一个绕不过去的坑python-docx 设中文字体有个经典陷阱——只设font.name对中文不生效中文会回退成默认字体。正确做法是额外通过w:eastAsia设一遍from docx.shared import Ptfrom docx.oxml.ns import qndef set_base_font(doc, latinTimes New Roman, cjk宋体, size12):style doc.styles[Normal]style.font.name latinstyle.font.size Pt(size)# 关键中文字体必须单独通过 w:eastAsia 设置否则不生效style.element.rPr.rFonts.set(qn(w:eastAsia), cjk)这个坑几乎每个用 python-docx 排中文文档的人都会踩一次记住qn(w:eastAsia)就行。四、表格与图表把实验结果放进去科研文档少不了表格和图。表格用add_table图用add_picturefrom docx.shared import Inchesfrom docx.enum.text import WD_ALIGN_PARAGRAPHdef add_table(doc, headers, rows):table doc.add_table(rows1, colslen(headers))table.style Table Grid # 带边框的内置样式最稳for j, h in enumerate(headers):table.rows[0].cells[j].text str(h)for row in rows:cells table.add_row().cellsfor j, v in enumerate(row):cells[j].text str(v)def add_figure(doc, img_path, captionNone):doc.add_picture(img_path, widthInches(5.5))if caption:p doc.add_paragraph(caption)p.alignment WD_ALIGN_PARAGRAPH.CENTERadd_table(docDocument(), headers[方法, 准确率],rows[[A, 0.91], [B, 0.88]])Table Grid是内置样式、任何环境都有比那些花哨样式名稳图的宽度用Inches/Cm控制避免原图过大撑破版面。五、引用与编号让正文和参考文献对得上综述里最容易出错的是引用编号——正文里的[3]得和文末第 3 条对得上。与其手动数不如维护一个引用登记表自动分配编号class Citations:def __init__(self):self._refs []self._index {}def cite(self, ref: str) - str:引用一次返回对应编号同一文献编号固定。if ref not in self._index:self._refs.append(ref)self._index[ref] len(self._refs)return f[{self._index[ref]}]def bibliography(self) - list[str]:return [f[{i}] {r} for i, r in enumerate(self._refs, 1)]cite Citations()para f扩散模型最早由相关工作提出 {cite.cite(Ho et al., 2020)} \f后续被大量改进 {cite.cite(Song et al., 2021)}。print(para) # ...提出 [1]后续被大量改进 [2]。print(cite.bibliography()) # [[1] Ho et al., 2020, [2] Song et al., 2021]正文按出现顺序自动编号文末一次性生成参考文献列表两边永远对得上——这类机械又易错的活正是学术 Skill最该替你干的。六、导出 PDF别指望纯 Python 完美转换很多人以为有个库能把 docx 一键完美转 PDF实际没有那么理想。几条现实路径docx2pdf效果好但依赖本机装了 WordWindows / macOSLibreOffice headless服务器首选命令行批量转无需 Wordreportlab从结构化数据直接另画 PDF排版完全可控但样式得自己写。服务器环境推荐 LibreOffice一行命令搞定import subprocessdef docx_to_pdf(path, outdir.):subprocess.run([soffice, --headless, --convert-to, pdf, --outdir, outdir, path],checkTrue,)选哪条看场景要还原 Word 版式用前两个要完全掌控排版、且不怕多写代码就用 reportlab。七、成稿也要可溯源最后补一句和前面工作流的衔接Canguo Science 里每段内容都能挂上生成它的run_id。成稿时把这个信息留在段落或脚注里读者或审稿人就能顺着它回溯到原始运行——引用不是编出来的而是从真实运行档案里回溯出来的。这是把可溯源一路贯穿到最终文档的关键一步。小结把模型输出变成规范文档工程上就三件事先要结构化输出JSON别让脆弱的字符串解析毁掉排版python-docx 的中文字体要设w:eastAsia表格用Table Grid最稳引用自动编号正文和文末靠登记表对齐PDF 转换按场景选服务器用 LibreOffice headless。这些拼起来就是从模型输出到一份能交付的 Word / PDF这条链路。它跟你用哪个模型无关——在 Canguo Science 里模型走 CanguoAI 的统一入口接进来成稿逻辑一行都不用改。
返回列表