用AI自动化文档:一个实用工作流
保持技术文档最新是一场持续的战斗。代码变更、功能发布,文档逐渐过时。手动重写README文件、API参考和内部wiki既繁琐又容易出错。但借助现代AI,你可以自动化大部分过程。本文介绍了一个实用的、逐步的工作流,使用AI工具生成和维护文档——而不会失去对质量的控制。
为什么用AI自动化文档?
文档通常是冲刺中的最后优先级。然而,它是用户和团队成员首先检查的内容。AI可以在三个方面提供帮助:
- 速度:以前需要数小时的文档初稿现在只需几分钟。
- 一致性:AI遵循你的风格指南和模板,减少差异。
- 新鲜度:当集成到CI/CD中时,每次代码变更都会重新生成文档。
但AI并非万能药。它需要人工监督语气、准确性和上下文。下面的工作流在自动化与审查之间取得了平衡。
核心工作流:从代码到已发布文档
这是我们构建的高级管道:
- 提取上下文从你的代码库中(函数、类、注释、提交消息)。
- 生成草稿使用LLM(如GPT-4或Claude)和结构化提示。
- 验证和丰富输出,使用静态分析和测试。
- 审查和编辑由领域专家进行。
- 发布到你的文档站点或仓库。
让我们深入每一步。
步骤1:提取结构化上下文
在将任何内容输入AI之前,你需要干净的输入。对于代码文档,这意味着:
- 带有适当docstrings/注释的源文件。
- API模式(OpenAPI、GraphQL SDL等)。
- 配置文件(例如,docker-compose、nginx.conf)。
使用脚本将这些解析为LLM可以消费的JSON结构。例如,对于Python项目,你可以使用ast提取函数签名和docstrings:
import ast, json
with open('module.py') as f:
tree = ast.parse(f.read())
functions = []
for node in ast.walk(tree):
if isinstance(node, ast.FunctionDef):
functions.append({
'name': node.name,
'docstring': ast.get_docstring(node),
'args': [a.arg for a in node.args.args],
'returns': ast.unparse(node.returns) if node.returns else None
})
print(json.dumps(functions, indent=2))
这个JSON成为你发送给AI的“上下文”。结构越清晰,输出越好。
步骤2:使用提示模板生成草稿
现在,编写一个提示,要求LLM根据提取的上下文编写文档。一个好的提示包括:
- 角色(例如,“你是一位资深技术作家”)。
- 目标受众(例如,“初级开发人员”)。
- 输出格式(Markdown、reStructuredText等)。
- 任何风格规则(主动语态、祈使语气)。
- 上下文JSON。
示例提示:
你是一位技术作家。为函数
{function_name} 编写一个Markdown部分,解释其目的、参数、返回值
以及一个代码示例。使用这个JSON作为信息来源:
{function_json}
目标受众:对代码库不熟悉的开发者。
使用友好但专业的语气。
通过模板化这个,你可以为模块中的每个函数、API中的每个端点或YAML文件中的每个配置选项生成文档。
步骤3:验证和丰富
原始的AI输出可能不正确或产生幻觉。验证它:
- 检查代码示例:在沙箱中运行或进行lint检查。
- 验证参数名称:与提取的上下文交叉检查。
- 使用Markdown linter:例如markdownlint来捕获格式问题。
你还可以通过添加来自测试套件的真实使用示例来丰富输出。如果你有单元测试,AI可以根据它们生成“用法”部分。
步骤4:人工审查和编辑
即使经过验证,也需要人工审查文档的语气、完整性和AI无法理解的上下文。设置审查流程:
- 创建包含生成文档的拉取请求。
- 分配领域专家作为审查者。
- 使用清单:准确性、清晰度、链接、代码片段。
这一步不是可选的。AI是草稿助手,而不是最终作者。
步骤5:自动发布
一旦批准,发布文档。如果你使用静态站点生成器如Docusaurus或MkDocs,你可以在合并时触发构建。例如,在GitHub Actions中:
name: Deploy docs
on:
push:
branches: [main]
paths: ['docs/**']
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.11'
- run: pip install mkdocs-material
- run: mkdocs gh-deploy --force
现在,每次合并的文档更改都会在几分钟内上线。
更好的AI文档实用技巧
使用一致的风格指南
在提示中定义你的风格规则。例如,“使用主动语态,避免第一人称复数,并始终包含代码示例”。越具体,你需要编辑的就越少。
利用提交消息
提交消息是变更日志的金矿。AI可以将一系列提交总结为变更日志条目。例如,将git log --oneline的输出喂给LLM,并请求一个用户友好的摘要。
迭代提示
你的第一个提示不会完美。在小样本上测试,调整,然后重复。为不同类型的文档(API参考、教程、FAQ)保留提示库。
比较:手动 vs. AI辅助 vs. 全自动
| 方面 | 手动 | AI辅助(本工作流) | 全自动(无人工) |
|---|---|---|---|
| 速度 | 慢 | 快 | 非常快 |
| 准确性 | 高(如果作者了解代码) | 审查后高 | 有风险(幻觉) |
| 一致性 | 变化 | 高 | 高 |
| 维护成本 | 高 | 中 | 低 |
| 人工监督 | 完全 | 需要 | 无 |
正如你所见,AI辅助方法在速度和品质之间取得了平衡。
你可以使用的工具
有许多工具可以实现这个工作流:
- 代码分析:AST解析器(Python、TypeScript)、ctags或语言服务器。
- LLM API:OpenAI GPT-4、Anthropic Claude或通过Ollama的开源模型。
- 文档生成器:Sphinx、MkDocs、JSDoc或自定义脚本。
- CI/CD:GitHub Actions、GitLab CI、Jenkins。
你不需要复杂的平台。几个Python脚本和一个LLM API密钥就足以开始。
真实世界示例:自动化README
让我们通过一个简单的例子。假设你有一个带有package.json的Node.js项目。你想自动生成README的“安装”和“用法”部分。
- 从
package.json中提取name、version和bin字段。 - 提取主要导出的JSDoc注释。
- 将此JSON发送给LLM,提示:“为名为{name}的CLI工具编写安装和使用说明。”
- 审查输出并将其粘贴到你的README中。
这可以在每次发布时运行的CI作业中完全自动化。
潜在陷阱及如何避免
- 幻觉:始终验证代码示例和技术声明。
- 过度冗长的输出:在提示中设置字数限制。
- 过时的上下文:确保提取脚本在最新代码上运行。
- 安全泄露:从发送给LLM的上下文中删除机密和内部URL。
FAQ
哪个AI模型最适合文档?
没有单一的最佳模型。GPT-4和Claude在一般写作方面很强,但像Llama 3这样的开源模型可以针对你的领域进行微调。根据成本、隐私和质量需求进行选择。
AI能否完全取代人类技术作家?
不,还不能。AI可以起草和维护文档,但人工监督对于准确性、语气和战略规划至关重要。最好的方法是人机协作。
如何防止AI发明API细节?
只向AI提供提取的、经过验证的上下文(如函数签名),并指示它不要添加任何外部信息。同时,实现一个验证步骤,将输出与源代码进行检查。
采取下一步
从小处开始:选择一个模块或README部分并自动化其生成。然后将工作流扩展到整个代码库。为了使你的文档更易于访问,你可以使用可靠的工具如Markdown转Word转换器或Markdown转HTML转换器将Markdown草稿转换为精美的PDF或网页发布。这些免费工具帮助你以受众需要的格式分发AI生成的文档。
用AI自动化文档并不是要取代作者——而是将他们解放出来,专注于真正重要的事情:创建用户喜爱的清晰、有用的内容。