公司动态

AI实验室文档自动化:让AI自写文档的工程实践

📅 2026/9/2 15:43:40
AI实验室文档自动化:让AI自写文档的工程实践
这次我们不聊模型部署聊一个 AI 实验室里经常被低估的环节文档。Ethan Mollick 提出的建议是AI 实验室应该让 AI 自己来写文档而不是把文档当成纯人工的整理工作。这句话听起来像管理建议但落到工程上实际上是一套可以执行的文档自动化工作流让大模型参与 API 文档生成、PRD 撰写、实验记录整理和知识库维护。它的价值不在于“省掉写文档的人”而在于让文档从“滞后记录”变成“同步资产”和代码、模型版本一起演进。这篇博文会把这个观点拆成可落地的工程实践包括环境搭建、文档生成流水线、接口封装、批量任务、质量验证和成本观察。先说核心判断AI 实验室文档真正的问题不是“没人写”而是“写不过来”和“写了就过期”。模型接口天天改实验结果散落在对话和 Notebook 里API 文档跟不上代码变更新成员上手先问一遍内部群。Ethan Mollick 的提议本质上是把这个流程从“人工整理知识”改成“AI 同步生成知识”人类只负责审校、决策和补上下文。下面我会按工程习惯给出全套方案。1. 核心观点速览项目说明观点来源Ethan Mollick 关于 AI 实验室工作方式的公开主张核心主张AI 实验室应让 AI 参与自写文档使文档与代码、模型同步演化要解决的问题文档过期、隐性知识流失、实验不可复现、接口变更追踪困难适合对象AI 实验室、算法团队、AIGC 项目组、平台工程/DevOps 团队落地方式LLM API 文档仓库 自动化流水线CI/CD 或定时任务技术门槛需要 Python 基础能申请大模型 API 或部署本地小模型批量任务支持可对多个模块、多个模型版本批量生成和更新文档API 服务可封装为内部文档生成服务供统一调用硬件要求使用云端 API 时无特殊要求本地部署需按模型参数量评估适合场景接口文档、PRD 文档、实验记录、数据说明、模型卡、内部知识库需要注意这套方法不是“让 AI 写一篇漂亮 Markdown 交差”而是把文档生产过程接入代码仓库和实验流程让每次代码变更、模型更新、Prompt 调整都有对应的文档变更。2. 观点拆解为什么文档是 AI 实验室的核心资产很多团队把文档看成负担但在 AI 实验室里文档本身就是核心技术资产。原因可以拆成四层。第一层文档是模型的上下文。AI 编程助手、Agent 工具、RAG 系统都需要高质量文档作为输入。如果一个模型的 API 文档是过期的Agent 生成的代码就会调用错误参数如果内部模块说明含糊下游团队就要反复试错。换句话说文档质量直接影响 AI 工具的使用效果。Ethan Mollick 的呼吁背后有一个逻辑AI 实验室已经在用 AI 写代码了那 AI 为什么不能参与写文档文档是 AI Agent 的“营养”AI 生成和维护自己的文档比人肉维护更容易保持同步。第二层文档是实验的可复现基础。AI 实验涉及模型版本、训练数据、Prompt 模板、超参数、随机种子等变量。单靠口头交流和聊天记录实验很难复现。把每个实验的输入输出、关键参数和结论转成结构化文档是团队能持续迭代的前提。AI 自写文档的意义在于它可以把“代码变更 实验结果”自动整理成记录不用等某个工程师有空了再补。第三层文档是评估和微调的语料来源。AI 生成的文档经过人工审校后会逐步积累成高质量的领域文本。这些文本可以用来微调垂直模型、构造评测集、优化 Prompt。很多公司做垂直大模型时最大的瓶颈就是缺高质量语料而内部文档恰恰是可以合规使用的私有语料之一。让 AI 自写文档相当于在业务流转中持续沉淀训练数据。第四层文档是团队协作的接口。AI 实验室通常同时存在算法、后端、平台、测试等多个角色。算法工程师产出模型 API后端要接后端改了接口测试要同步模型更新后业务方需要知道能力边界。没有统一文档信息就散落在不同人的电脑里。而把文档纳入代码仓库用 AI 自动生成初稿再由负责人修订合并就能形成一套可持续维护的协作接口。这四点已经说明Ethan Mollick 提出的不是“文档写作自动化”这么简单而是把文档从辅助品提升为 AI 实验室的基础设施。3. 适用场景与使用边界3.1 适合的场景模型 API 文档每次发布新模型版本时自动生成接口说明、参数列表、示例代码。实验记录自动整理训练尝试、Prompt 实验结果、badcase 分析。数据说明对数据集来源、字段含义、清洗规则生成说明文档。PRD 文档初稿产品需求描述可以先用 AI 生成结构化草案人工再做判断。内部知识库将 FAQ、排障手册、模块设计文档统一纳入生成和更新流程。3.2 不适合的场景对外发布的法律、合规、合同类文件必须由有资质的人员审核AI 只能做辅助起草。涉及未公开模型结构、核心算法细节、用户隐私数据的文档不能直接交给云端 API 处理。需要高度创意或深度业务判断的内容AI 生成初稿可以但最终决策必须人工负责。3.3 合规边界使用 AI 生成文档时必须注意三点输入数据脱敏、输出内容审校、模型服务商的数据使用协议。涉及真实用户信息、商业机密、未公开训练数据的场景优先选择私有化部署模型或者在脱敏后再调用 API。任何 AI 生成内容在对外发布或进入正式流程前都必须经过人工复核。这既是工程要求也是合规底线。4. AI 辅助文档生成工作流的环境与工具链准备要落地这套工作流不需要太重的硬件。如果调用云端大模型 API普通开发机就可以如果坚持本地部署需要根据模型参数量准备对应显存。4.1 基础依赖推荐使用 Python 3.10 以上版本核心依赖如下pip install openai fastapi uvicorn pyyaml python-dotenv说明openai用于调用 OpenAI 兼容格式的大模型接口只需要把 base_url 改成实际服务商地址即可对接 DeepSeek、通义千问、本地 vLLM、Ollama 等。fastapi和uvicorn用于封装文档生成 API 服务。pyyaml用于解析批量任务配置。python-dotenv用于管理 API Key 等环境变量。如果不想调用外部 API也可以使用 Ollama 跑本地小模型。此时需要准备 8GB 以上显存或 16GB 以上内存取决于模型大小并用ollama serve暴露本地接口。4.2 模型选择逻辑文档生成任务对模型要求不高优先选性价比高的模型。代码接口文档类任务建议选择代码能力较强的模型PRD 和方案设计类任务建议选择中文理解能力好的模型。批量生成内部记录时可以选用小参数模型降低成本生成对外接口文档时可以临时切换更强模型并配合人工审校。4.3 目录结构参考把文档纳入代码仓库后建议统一规划目录ai-doc-lab/ ├── docs/ │ ├── api/ # 接口文档 │ ├── prd/ # 产品需求文档 │ ├── experiments/ # 实验记录 │ ├── data/ # 数据集说明 │ └── knowledge/ # 内部知识库 ├── scripts/ │ ├── generate_doc.py # 文档生成脚本 │ ├── batch_generate.py # 批量任务脚本 │ └── validate_doc.py # 文档质量校验 ├── configs/ │ ├── api_doc.yaml # 批量任务配置 │ └── prompts/ # 各类型文档的 Prompt 模板 ├── outputs/ │ └── generated/ # 生成的文档暂存区 └── .env # 环境变量存放 API Key这个结构把输入、配置、脚本、输出分开便于批量任务和后续回溯。5. 第一步把“口头知识”转成结构化文档很多 AI 实验室的现状是关键信息在聊天记录里在某个工程师的备注里就是不在文档里。要解决这个问题第一个自动化脚本应该完成“读取代码或实验记录 - 调用大模型 - 生成 Markdown 文档”这件事。下面给出generate_doc.py的核心逻辑调用 OpenAI 兼容格式接口import os import time from openai import OpenAI from dotenv import load_dotenv load_dotenv() client OpenAI( api_keyos.getenv(LLM_API_KEY), base_urlos.getenv(LLM_BASE_URL, https://api.openai.com/v1), ) DOC_PROMPT_TEMPLATE 你是一名资深技术文档工程师。请根据下面的代码和背景说明生成一份 Markdown 格式的技术文档。 要求 1. 文档结构完整包含功能概述、核心参数、返回值、调用示例、注意事项。 2. 参数表使用 Markdown 表格不要遗漏必填参数。 3. 示例代码保持简洁准确匹配当前代码实现。 4. 如果发现接口定义和描述不一致请明确指出。 代码或实验记录 {context} 背景说明 {background} def generate_document(context: str, background: str, save_path: str) - None: prompt DOC_PROMPT_TEMPLATE.format(contextcontext, backgroundbackground) response client.chat.completions.create( modelos.getenv(LLM_MODEL, gpt-4o-mini), messages[ {role: system, content: 你是一名严谨的技术文档工程师。}, {role: user, content: prompt}, ], temperature0.2, max_tokens2000, ) content response.choices[0].message.content.strip() os.makedirs(os.path.dirname(save_path), exist_okTrue) with open(save_path, w, encodingutf-8) as f: f.write(content) print(f[OK] 已生成文档: {save_path}) if __name__ __main__: # 实际使用时改为读取真实代码文件或实验记录 context open(models/sample_model.py, r, encodingutf-8).read() background 这是推荐系统排序模型的一个特征编码模块需要生成接口说明文档。 generate_document(context, background, outputs/generated/model_feature_api.md)运行方式python scripts/generate_doc.py这里的关键点有两个一个是 Prompt 中要求模型“明确指出接口定义和描述不一致”降低 AI 生成内容的盲从性另一个是把temperature调低到 0.2 左右让输出更稳定减少无意义的自由发挥。6. 接入 Git 提交链路让文档跟着代码一起更新单次生成文档不算自动化。要让文档持续有效需要把它挂到 CI/CD 或 Git 提交流程里。最简单的做法是保存一份 GitHub Actions 工作流文件在每次 push 到主分支或发布 Release 时自动扫描代码变更并更新对应文档。以 GitHub Actions 为例新增.github/workflows/docs-auto-update.ymlname: Auto Update AI Docs on: push: branches: - main paths: - models/** - services/** - configs/** jobs: generate-docs: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkoutv4 - name: Set up Python uses: actions/setup-pythonv5 with: python-version: 3.10 - name: Install dependencies run: pip install openai pyyaml python-dotenv - name: Generate docs env: LLM_API_KEY: ${{ secrets.LLM_API_KEY }} LLM_BASE_URL: ${{ secrets.LLM_BASE_URL }} LLM_MODEL: ${{ secrets.LLM_MODEL }} run: python scripts/batch_generate.py --config configs/api_doc.yaml - name: Create Pull Request uses: peter-evans/create-pull-requestv6 with: commit-message: docs: auto update AI generated docs branch: docs-auto-update title: docs: AI 自动更新文档 body: 本 PR 由 AI 文档生成工作流自动创建请人工审校后合并。这个工作流的意义在于文档更新不是一个人“有空再写”而是每次代码变更自动触发。AI 生成初稿后创建独立分支和 PR由开发同学审校再合并。这样既利用了 AI 的自动化能力又守住了人工审核的底线。如果没有用 GitHub而是内网 GitLab也可以用 GitLab CI 的rules和schedule实现相同逻辑。核心思路不变代码变更触发生成任务生成结果进入待审校分支。7. 接口 API 与批量任务当文档生成不再是零散脚本而是团队公共能力时要封装成 API 服务。这里用 FastAPI 做一个最小可用服务提供两个接口单个文档生成和批量任务提交。7.1 文档生成服务封装from fastapi import FastAPI, HTTPException from pydantic import BaseModel from generate_doc import generate_document app FastAPI(titleAI Document Generator) class DocRequest(BaseModel): context: str background: str save_path: str class BatchDocRequest(BaseModel): tasks: list[DocRequest] app.post(/v1/doc/generate) def generate_doc_api(req: DocRequest): try: generate_document(req.context, req.background, req.save_path) return {status: ok, save_path: req.save_path} except Exception as e: raise HTTPException(status_code500, detailstr(e)) app.post(/v1/doc/batch) def batch_generate_doc_api(req: BatchDocRequest): results [] for idx, task in enumerate(req.tasks): try: generate_document(task.context, task.background, task.save_path) results.append({index: idx, status: ok, path: task.save_path}) except Exception as e: results.append({index: idx, status: failed, error: str(e)}) return {status: done, results: results}启动服务uvicorn doc_api:app --host 0.0.0.0 --port 80007.2 批量任务配置化批量任务建议用 YAML 配置而不是把任务硬编码在代码里。参考configs/api_doc.yamltasks: - context_file: models/feature_encoder.py background: 特征编码模块负责将原始特征转为 embedding save_path: docs/api/feature_encoder.md - context_file: models/rank_model.py background: 排序模型主推理入口 save_path: docs/api/rank_model.md - context_file: services/rec_service.py background: 推荐服务对外接口层 save_path: docs/api/rec_service.md对应批量脚本batch_generate.pyimport argparse import yaml from pathlib import Path from generate_doc import generate_document def load_context(context_file: str) - str: path Path(context_file) if not path.exists(): raise FileNotFoundError(f上下文文件不存在: {context_file}) return path.read_text(encodingutf-8) def run(config_path: str): with open(config_path, r, encodingutf-8) as f: config yaml.safe_load(f) for task in config[tasks]: context load_context(task[context_file]) generate_document( contextcontext, backgroundtask.get(background, ), save_pathtask[save_path], ) if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(--config, requiredTrue, helpYAML config path) args parser.parse_args() run(args.config)7.3 curl 调用示例服务启动后用下面的方式调用curl -X POST http://127.0.0.1:8000/v1/doc/generate \ -H Content-Type: application/json \ -d { context: def predict(features): return model(features), background: 模型推理函数, save_path: outputs/generated/predict.md }重点提示实际部署时不要把所有文件路径暴露给任意调用方需要做路径白名单或根目录限制如果服务部署在内网也要加访问鉴权防止被滥用。7.4 批量任务的失败重试建议批量任务最容易出现的问题是中途断掉。建议在每个任务开始前写日志生成结束后记录 token 消耗和耗时失败时保存异常信息并继续执行下一个任务。整个批次跑完后重新执行失败列表而不是从头再跑一遍。8. 效果验证与质量评估AI 生成文档不能“生成了就当完成了”。要建立一套质量验证机制至少覆盖四个方面。8.1 格式校验用脚本检查生成文档是否包含必备章节、表格是否完整、代码块是否闭合。这可以拦截明显的结构错误。下面是一个最小校验片段def validate_markdown(path: str) - list[str]: content open(path, encodingutf-8).read() errors [] if ## 功能概述 not in content: errors.append(缺少功能概述) if ## 参数 not in content: errors.append(缺少参数说明) if ## 调用示例 not in content: errors.append(缺少调用示例) return errors8.2 接口一致性检查对接口文档可以用 AST 解析代码提取真实的函数签名和参数列表与生成的文档做对比。这一步能有效防止“ AI 脑补了不存在的参数”。核心逻辑是import ast def extract_signatures(filepath: str) - dict: tree ast.parse(open(filepath, encodingutf-8).read()) signatures {} for node in ast.walk(tree): if isinstance(node, ast.FunctionDef): params [arg.arg for arg in node.args.args] signatures[node.name] params return signatures然后把提取结果与文档中的参数表做 diff发现问题就自动拦截 PR。8.3 人工抽样评估自动化检查解决“格式”和“结构”问题解决不了“内容是否真的准确”的问题。建议每轮批量生成后抽样 20% 的文档进行人工评分评分维度包括准确性、完整性、可读性、与代码一致性。评分结果可以回填到下一轮 Prompt 中持续优化生成模板。8.4 文档生效测试更严谨的做法是把文档中的调用示例抽出来实际执行一遍看能否跑通。文档里的示例代码一旦能通过测试说明文档至少没有严重的“假代码”问题。这个环节与常规的接口测试可以共用一套用例。9. 资源占用、成本与性能观察AI 自写文档不是零成本。团队要关注四个指标token 数量、生成延迟、失败率和审校耗时。Token 成本文档生成任务的 token 消耗与输入上下文长度和输出长度成正比。输入如果是整个代码文件几千行代码会消耗大量 token。建议先按模块拆分只把核心代码片段和关键文档上下文传给模型。生成延迟使用云端 API 时单篇文档耗时通常在几十秒到几分钟不等取决于输入长度和模型负载。如果对延迟敏感建议用小参数模型先跑初稿再用强模型做审校。失败率批量任务失败通常来自超时、限流和上下文过长。建议在代码中加入重试逻辑遇到限流时指数退避。审校耗时如果 AI 生成的文档需要大量人工返工说明 Prompt 模板或上下文提供方式不对。应优先优化输入信息而不是更换更强模型。显存和主机资源方面纯 API 调用方案几乎不占用本地 GPU本地部署方案则按实际模型参数量准备硬件。我的建议是优先用 API 跑文档生成因为这类任务不涉及敏感数据时成本远低于人力维护成本。为了控制成本和性能可以设计缓存机制只有当代码文件哈希变化时才重新生成对应文档。这能显著减少重复调用。10. 常见问题与排查方法问题现象可能原因排查方式解决方案生成的文档与代码不一致输入上下文过旧或 Prompt 未要求比对代码查看生成时使用的代码文件版本每次生成前读取最新代码并在 Prompt 中强调一致性文档出现幻觉写了不存在的参数模型缺乏真实代码上下文检查上下文是否包含完整函数定义改用 AST 提取真实签名后传入 Prompt批量任务中途失败API 限流、网络波动、单任务上下文过长查看任务日志和错误类型增加重试逻辑拆分大任务降低并发Token 成本快速增长输入包含大量无关代码观察输入 token 统计精简上下文只传入核心代码片段文档格式混乱模型输出 Markdown 不规范检查原始返回内容增加格式约束并跑 Markdown 校验脚本生成服务被内部滥用缺少鉴权或路径限制查看访问日志加 API Token限制落盘目录本地部署显存不足模型参数量超出显卡容量观察进程显存占用使用量化模型或切换 API 方案审校人工成本高Prompt 模板不够明确分析错误类型根据错误样本迭代 Prompt补充术语表和格式规范排查的总原则是先看输入再看输出最后看流程。大多数文档生成质量问题不是模型不够强而是上下文没给够、Prompt 没约束好、代码版本没对齐。11. 最佳实践与合规建议第一先小范围跑通一个模块再推广到整个团队。不要一开始就给所有代码生成文档。选一个接口稳定、注释相对完整的模块做试点跑通“生成 - 审校 - 合并”的闭环再逐步扩大范围。第二文档和代码必须在一个仓库。只有代码和文档同库才能通过 Git 的变更记录追踪“哪次代码变动导致文档需要更新”。文档放在 Wiki 或在线文档平台会重新变成人工同步问题。第三必要的时候建立术语表和文档风格指南。AI 生成中文技术文档时术语不一致是常见问题。提前准备一份术语对照表并在每次 Prompt 中附带能明显提升一致性。第四涉及隐私和版权的内容严格执行脱敏。内部技术文档、模型测试数据、用户案例在送入云端大模型之前必须清除个人身份信息和商业敏感信息。如果做不到脱敏就使用私有化部署模型。第五对外发布的文档必须人工审校。AI 生成内容可以作为初稿但不能直接作为对外接口文档、合规文件或合同文本。审校责任必须落实到具体的人。第六给文档打上“生成方式”标记。建议在文档头部加上“本文件由 AI 辅助生成请在使用前人工复核”之类的注释避免后续读者盲目信任 AI 输出。12. 总结Ethan Mollick 的呼吁落到工程上是一条清晰的主线把文档生成从人工任务变成 AI 参与的自动化流水线让文档跟着代码和模型版本走再通过接口服务和批量任务把能力放大。这套方案不要求团队拥有顶级显卡不要求一次性重写所有文档只需要从一个脚本、一个模块、一个 PR 开始。真正值得验证的核心能力是AI 生成的文档能否经过接口一致性检查、人工审校后直接进入仓库并在下一次代码变更时自动触发更新。做成这件事文档就会从“没人愿意写的负担”变成团队最稳的资产也能为后续 RAG 知识库、AI Agent 和垂直模型微调持续提供高质量语料。建议先复制本文的脚本和配置跑一次试运行再根据实际项目调整 Prompt 和校验规则。