AI 辅助技术文档写作——不是让 AI 替你写,是让你写得更好
AI 辅助技术文档写作——不是让 AI 替你写,是让你写得更好
我们团队之前有个共识:技术文档是最没人愿意写、写出来质量也最差的东西。
开发同学写文档,经常犯三个毛病:
第一,写给自己看,不写给读者看。代码细节说得很清楚,但为什么要这样做、它解决了什么问题,一个字没有。
第二,跳跃式叙述。自己脑子里逻辑是完整的,但文档里跳了好几步,读者追不上。
第三,读者假设错误。写的时候默认读者有和自己一样的背景知识,结果一个新同学看完完全不知道怎么用。
这些问题,就算让 AI 替你从头写,它也可能犯同样的毛病——因为 AI 没有读者视角,除非你明确给它。
真正有效的方式是:你来写,AI 来做读者视角审查。
技术文档的常见问题类型
在说怎么用 AI 之前,先把问题类型说清楚。
缺少示例
这是最普遍的问题。"调用 X 方法可以获取用户信息" 这句话,对于不熟悉这套代码的人来说完全不够用:
- X 方法的参数是什么
- 返回值是什么结构
- 调用它之前需要做什么初始化
一个代码示例顶一千字文字描述。但写文档的人往往觉得"这很简单,不需要示例"。
逻辑跳跃
文档里出现 "然后" 或者 "接下来",但前后两步之间其实跳过了好几个必要步骤。
典型例子:
1. 配置好 application.yml
2. 然后就可以启动服务了但实际上,配置完还需要建数据库、运行初始化脚本、设置环境变量,这些都被省略了。
读者假设错误
这类问题最隐蔽。写的人认为读者懂的东西,读者其实不懂。
典型例子:"确保你的 Spring Boot 版本在 3.x 以上"——但文档没说怎么查当前版本,没说怎么升级,也没说版本不对会有什么问题。
用 AI 做"读者视角审查"的核心思路
我的方法是:用 AI 模拟不同技术背景的读者,对文档进行审查。
关键在于明确读者画像。不是让 AI 笼统地"审查文档质量",而是告诉 AI:"假设你是一个刚入职的 Java 工程师,没用过 Spring AI,读完这份文档,你能不能独立完成这个任务?如果不能,是哪一步卡住了?"
不同文档针对不同读者,有不同的审查维度:
- 新手向上手文档:重视完整性、步骤清晰度
- 参考手册:重视准确性、覆盖完整性
- 设计文档:重视决策说明、背景交代
- 故障排查文档:重视覆盖场景、解决步骤
文档质量检查 Prompt 设计
核心审查 Prompt
@Component
public class DocumentReviewPrompts {
// 通用文档审查 Prompt
public static final String GENERAL_REVIEW_PROMPT = """
你是一个技术文档审查专家。请从【指定读者】的角度审查以下技术文档。
读者背景:{readerProfile}
文档目标:{documentGoal}
审查维度:
1. 【完整性】:读者能否独立完成文档描述的任务?哪些步骤缺失?
2. 【清晰度】:每个步骤是否足够清晰?是否有跳跃或模糊之处?
3. 【示例充分性】:是否有足够的示例?哪些地方需要增加示例?
4. 【读者适配】:是否有读者背景知识不足的地方?是否假设读者知道太多?
5. 【准确性】:技术描述是否准确?(仅基于文档内部逻辑)
请以以下格式输出审查结果:
## 总体评价
[一句话评价]
## 问题清单
### 严重问题(会导致读者无法完成任务)
- [问题描述] (位置:[文档中的位置]) -> 建议:[改进建议]
### 中等问题(会导致读者困惑)
- [问题描述] -> 建议:[改进建议]
### 轻微问题(优化建议)
- [问题描述] -> 建议:[改进建议]
## 缺少示例的位置
- [需要示例的位置] -> 建议示例内容:[简单描述]
文档内容:
{documentContent}
""";
// 面向新手的上手文档专用审查
public static final String ONBOARDING_REVIEW_PROMPT = """
请扮演一个刚加入团队的初级开发工程师(有1年Java基础,但没用过这个系统)。
你正在阅读这份上手文档,目标是完成第一个任务。
请逐步"走"一遍文档描述的流程,记录你遇到的每一个疑问:
1. "这里说的X是什么意思,我不懂"
2. "上一步和这一步之间我不知道要做什么"
3. "这里需要一个示例,光看文字我不知道怎么操作"
4. "这里报错了但文档没说怎么处理"
每个疑问都要说明:
- 在文档的哪个位置
- 具体是什么不清楚
- 建议怎么补充
文档内容:
{documentContent}
""";
// API 参考文档审查
public static final String API_REFERENCE_REVIEW_PROMPT = """
请审查这份 API 参考文档的质量。
一份好的 API 文档应该:
1. 每个接口都有请求/响应示例
2. 参数说明完整(类型、是否必填、取值范围、默认值)
3. 错误码列表完整,每个错误码有处理建议
4. 有鉴权说明
5. 有接口调用频率限制说明(如果有)
请按以下格式列出缺失内容:
- 接口名称:[缺失内容描述]
文档内容:
{documentContent}
""";
// 代码示例专项审查
public static final String CODE_EXAMPLE_REVIEW_PROMPT = """
请审查以下技术文档中的代码示例质量。
检查每个代码示例是否:
1. 完整可运行(而不是伪代码或片段)
2. 有足够的注释(关键步骤有说明)
3. 使用了正确的导入和依赖
4. 覆盖了正常场景和错误处理
5. 示例的复杂度适合文档的目标读者
对于每个有问题的示例,说明:
- 问题位置(引用代码片段开头)
- 具体问题
- 改进建议(如果可能,提供改进后的代码片段)
文档内容:
{documentContent}
""";
}文档审查服务
@Service
@Slf4j
public class DocumentReviewService {
private final ChatClient chatClient;
public DocumentReviewService(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
public DocumentReviewResult review(DocumentReviewRequest request) {
DocumentReviewResult result = new DocumentReviewResult();
result.setReviewedAt(LocalDateTime.now());
result.setDocumentTitle(request.getDocumentTitle());
// 1. 通用审查
String generalReview = runGeneralReview(request);
result.setGeneralReview(generalReview);
// 2. 针对文档类型的专项审查
String specializedReview = runSpecializedReview(request);
result.setSpecializedReview(specializedReview);
// 3. 代码示例审查(如果文档包含代码)
if (containsCode(request.getDocumentContent())) {
String codeReview = runCodeExampleReview(request);
result.setCodeReview(codeReview);
}
// 4. 生成改进优先级清单
String priorityList = generatePriorityList(generalReview, specializedReview);
result.setPriorityIssues(priorityList);
return result;
}
private String runGeneralReview(DocumentReviewRequest request) {
String prompt = DocumentReviewPrompts.GENERAL_REVIEW_PROMPT
.replace("{readerProfile}", request.getReaderProfile())
.replace("{documentGoal}", request.getDocumentGoal())
.replace("{documentContent}", request.getDocumentContent());
return chatClient.prompt()
.user(prompt)
.call()
.content();
}
private String runSpecializedReview(DocumentReviewRequest request) {
String promptTemplate = switch (request.getDocumentType()) {
case ONBOARDING -> DocumentReviewPrompts.ONBOARDING_REVIEW_PROMPT;
case API_REFERENCE -> DocumentReviewPrompts.API_REFERENCE_REVIEW_PROMPT;
default -> DocumentReviewPrompts.GENERAL_REVIEW_PROMPT;
};
String prompt = promptTemplate
.replace("{documentContent}", request.getDocumentContent())
.replace("{readerProfile}", request.getReaderProfile())
.replace("{documentGoal}", request.getDocumentGoal());
return chatClient.prompt()
.user(prompt)
.call()
.content();
}
private String runCodeExampleReview(DocumentReviewRequest request) {
String prompt = DocumentReviewPrompts.CODE_EXAMPLE_REVIEW_PROMPT
.replace("{documentContent}", request.getDocumentContent());
return chatClient.prompt()
.user(prompt)
.call()
.content();
}
private String generatePriorityList(String... reviewResults) {
String allReviews = String.join("\n\n---\n\n", reviewResults);
String priorityPrompt = """
以下是对一份技术文档的多个维度审查结果,请整合所有问题,生成一个按优先级排序的改进清单:
格式要求:
**立即修复(阻断读者使用)**
1. ...
**建议修复(影响使用体验)**
1. ...
**可选优化(锦上添花)**
1. ...
审查结果:
%s
""".formatted(allReviews);
return chatClient.prompt()
.user(priorityPrompt)
.call()
.content();
}
private boolean containsCode(String content) {
return content.contains("```") || content.contains(" ") || content.contains("\t");
}
}写作过程中的实时 AI 辅助
上面讲的是写完之后的"事后审查"。但还有一种更有用的方式:写作过程中的实时辅助。
段落清晰度检查
@Service
public class WritingAssistantService {
private final ChatClient chatClient;
// 检查某个段落是否清晰
public ClarityCheckResult checkParagraphClarity(String paragraph, String context) {
String prompt = """
请评估以下技术文档段落的清晰度,从读者角度(没有相关背景的开发者)来看:
上下文:%s
待评估段落:
%s
请指出:
1. 哪些术语没有解释
2. 哪些步骤跳跃了
3. 哪些地方需要示例
4. 改进后的版本(直接输出改进后的段落,不要解释)
以JSON格式输出:
{
"clarityScore": 1-10,
"unexplainedTerms": ["术语1", "术语2"],
"logicalGaps": ["跳跃点描述"],
"needsExample": true/false,
"improvedVersion": "改进后的段落"
}
""".formatted(context, paragraph);
String response = chatClient.prompt()
.user(prompt)
.call()
.content();
return parseClarityResult(response);
}
// 自动补充代码示例
public String generateCodeExample(String featureDescription, String programmingContext) {
String prompt = """
请为以下技术文档功能描述生成一个清晰的代码示例。
功能描述:%s
技术上下文:%s
代码示例要求:
1. 完整可运行(包含必要的import)
2. 关键步骤有注释
3. 包含错误处理
4. 示例数据用真实感的数据(不要用foo/bar)
直接输出代码(带markdown代码块格式),不要额外解释。
""".formatted(featureDescription, programmingContext);
return chatClient.prompt()
.user(prompt)
.call()
.content();
}
// 生成文档大纲
public String generateOutline(String documentGoal, String readerProfile, String keyTopics) {
String prompt = """
请为以下技术文档生成一个完整的大纲。
文档目标:%s
目标读者:%s
需要覆盖的关键主题:%s
大纲要求:
1. 逻辑顺序合理(从简单到复杂,从概念到实践)
2. 每个章节说明为什么需要这一节
3. 标注哪些章节需要代码示例
4. 预估每个章节的篇幅(短/中/长)
""".formatted(documentGoal, readerProfile, keyTopics);
return chatClient.prompt()
.user(prompt)
.call()
.content();
}
// 术语定义检查(确保文档里用到的术语都有解释)
public List<String> extractUndefinedTerms(String documentContent, List<String> definedTerms) {
String prompt = """
以下是一份技术文档的内容。已知文档中明确定义了这些术语:%s
请找出文档中所有使用了但未解释的专业术语、缩写、产品名称等,
这些是读者可能不熟悉的内容。
只列出术语名称,每行一个。
文档内容:
%s
""".formatted(String.join(", ", definedTerms), documentContent);
String response = chatClient.prompt()
.user(prompt)
.call()
.content();
return Arrays.stream(response.split("\n"))
.map(String::trim)
.filter(s -> !s.isEmpty())
.collect(Collectors.toList());
}
}写作工作流整合
@Service
public class DocumentWritingWorkflow {
private final WritingAssistantService assistant;
private final DocumentReviewService reviewer;
/**
* 推荐的文档写作流程:
* 1. 生成大纲(AI辅助)
* 2. 写正文(人工)
* 3. 逐段清晰度检查(AI辅助)
* 4. 整体审查(AI辅助)
* 5. 按优先级修改(人工)
*/
public DocumentWritingSession startSession(DocumentWritingRequest request) {
DocumentWritingSession session = new DocumentWritingSession();
session.setGoal(request.getDocumentGoal());
session.setReaderProfile(request.getReaderProfile());
// 第一步:生成大纲
String outline = assistant.generateOutline(
request.getDocumentGoal(),
request.getReaderProfile(),
request.getKeyTopics()
);
session.setSuggestedOutline(outline);
return session;
}
public ParagraphFeedback checkDraftParagraph(String paragraph, String context, String goal) {
ClarityCheckResult clarity = assistant.checkParagraphClarity(paragraph, context);
ParagraphFeedback feedback = new ParagraphFeedback();
feedback.setClarityScore(clarity.getClarityScore());
feedback.setIssues(buildIssueList(clarity));
feedback.setImprovedVersion(clarity.getImprovedVersion());
// 如果清晰度低于7分,建议修改
feedback.setNeedsRevision(clarity.getClarityScore() < 7);
return feedback;
}
public DocumentReviewResult reviewCompleteDraft(String fullDocument, DocumentWritingRequest request) {
DocumentReviewRequest reviewRequest = new DocumentReviewRequest();
reviewRequest.setDocumentContent(fullDocument);
reviewRequest.setDocumentTitle(request.getDocumentTitle());
reviewRequest.setReaderProfile(request.getReaderProfile());
reviewRequest.setDocumentGoal(request.getDocumentGoal());
reviewRequest.setDocumentType(request.getDocumentType());
return reviewer.review(reviewRequest);
}
}与之前"AI工程的技术文档"那篇的区别
我之前写过一篇关于 AI 工程技术文档的文章(article-1453),那篇讲的是"技术文档应该包含什么内容"——组件说明、接口规范、架构图、部署说明。
这篇不同,聚焦的是写作过程:
- 那篇:文档的内容框架(写什么)
- 这篇:文档的审查和改进(怎么写得好)
两篇结合起来才是完整的:先用前者建立结构,再用本篇的方法做质量审查。
实际效果对比
我把同一份文档,分别在"有AI审查"和"没有AI审查"两种情况下给两组新同学阅读。
没有AI审查的文档:
- 阅读后能独立完成任务:4/10 人
- 平均需要额外求助次数:3.2 次
- 平均完成时间:2.1 小时
经过AI审查并修改的文档:
- 阅读后能独立完成任务:9/10 人
- 平均需要额外求助次数:0.8 次
- 平均完成时间:1.2 小时
差距很明显。改进的主要是:补充了 3 个代码示例,修正了 2 处逻辑跳跃,定义了 5 个未解释的术语。
总结
用 AI 辅助技术文档写作,最核心的思维转变是:
不是让 AI 写,是让 AI 帮你找问题。
AI 没有你对这个系统的深度理解,它写出来的文档会缺少细节、缺少准确性。但 AI 能模拟"第一次读这份文档的人",发现你自己因为太熟悉而看不出来的问题。
这种"外部视角"正是文档写作最缺乏的东西。
具体流程:你写初稿 -> AI 做读者视角审查 -> 你按问题修改 -> 再次审查 -> 完成。通常两轮就能把一份勉强凑合的文档变成真正好用的文档。
