AI-Powered Documentation - Automating Technical Writing with GPT-4
Technical documentation is time-consuming but essential. Here’s how I automated 70% of our documentation workflow using GPT-4, saving 15+ hours per week while improving quality.
Table of contents
The Documentation Problem
Before AI:
- 15-20 hours/week writing docs
- Docs often outdated
- Inconsistent style
- Developers hate writing docs
Goal: Automate documentation while maintaining quality and accuracy.
Solution Architecture
Code Repository
↓
AST Parser → Extract structure
↓
GPT-4 → Generate docs
↓
Human Review → Verify accuracy
↓
Documentation Site
Automating API Documentation
Extract API Structure
import ast
import inspect
from typing import List, Dict
def extract_function_info(source_code: str) -> List[Dict]:
"""Extract function signatures and docstrings from Python code"""
tree = ast.parse(source_code)
functions = []
for node in ast.walk(tree):
if isinstance(node, ast.FunctionDef):
func_info = {
'name': node.name,
'args': [arg.arg for arg in node.args.args],
'returns': ast.unparse(node.returns) if node.returns else None,
'docstring': ast.get_docstring(node),
'decorators': [ast.unparse(d) for d in node.decorator_list],
'line_number': node.lineno
}
functions.append(func_info)
return functions
# Example usage
with open('api.py', 'r') as f:
code = f.read()
functions = extract_function_info(code)
Generate Documentation with GPT-4
import openai
def generate_api_docs(function_info: Dict) -> str:
"""Generate comprehensive API documentation using GPT-4"""
prompt = f"""
Generate comprehensive API documentation for this function:
Function name: {function_info['name']}
Parameters: {', '.join(function_info['args'])}
Returns: {function_info['returns']}
Current docstring: {function_info['docstring'] or 'None'}
Include:
1. Clear description of what the function does
2. Detailed parameter descriptions with types and constraints
3. Return value description
4. Usage examples with code
5. Common errors and how to handle them
6. Performance considerations if relevant
Format in Markdown.
"""
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are a technical documentation expert. Generate clear, comprehensive, and accurate API documentation."},
{"role": "user", "content": prompt}
],
temperature=0.3 # Lower temperature for more consistent output
)
return response.choices[0].message.content
# Generate docs for all functions
for func in functions:
docs = generate_api_docs(func)
print(f"\n## {func['name']}\n")
print(docs)
Example Output
Input Function:
def process_payment(amount: float, currency: str, payment_method: str) -> dict:
"""Process a payment transaction"""
# Implementation
pass
Generated Documentation:
## process_payment
### Description
Processes a payment transaction using the specified payment method and currency. This function handles the complete payment flow including validation, processing, and response generation.
### Parameters
- **amount** (`float`, required)
- The payment amount to process
- Must be a positive number
- Precision: up to 2 decimal places
- Example: `99.99`
- **currency** (`str`, required)
- ISO 4217 currency code
- Supported currencies: USD, EUR, GBP, JPY
- Case-insensitive
- Example: `"USD"` or `"usd"`
- **payment_method** (`str`, required)
- Payment method identifier
- Supported methods: `"credit_card"`, `"debit_card"`, `"paypal"`, `"stripe"`
- Example: `"credit_card"`
### Returns
`dict`: Payment transaction result containing:
- `transaction_id` (str): Unique transaction identifier
- `status` (str): Transaction status (`"success"`, `"failed"`, `"pending"`)
- `amount` (float): Processed amount
- `currency` (str): Currency code
- `timestamp` (str): ISO 8601 timestamp
- `error` (str, optional): Error message if status is "failed"
### Usage Examples
```python
# Basic usage
result = process_payment(
amount=99.99,
currency="USD",
payment_method="credit_card"
)
print(result)
# Output: {
# 'transaction_id': 'txn_abc123',
# 'status': 'success',
# 'amount': 99.99,
# 'currency': 'USD',
# 'timestamp': '2023-10-05T14:30:00Z'
# }
# Handle errors
try:
result = process_payment(
amount=0.01,
currency="EUR",
payment_method="paypal"
)
except ValueError as e:
print(f"Payment failed: {e}")
Error Handling
Common Errors:
-
ValueError: Invalid amount (negative or zero)
# Raises ValueError process_payment(amount=-10, currency="USD", payment_method="credit_card") -
CurrencyNotSupportedError: Unsupported currency
# Raises CurrencyNotSupportedError process_payment(amount=100, currency="XYZ", payment_method="credit_card") -
PaymentMethodError: Invalid payment method
# Raises PaymentMethodError process_payment(amount=100, currency="USD", payment_method="bitcoin")
Performance Considerations
- Average processing time: 200-500ms
- Timeout: 30 seconds
- Rate limit: 100 requests per minute per API key
- For high-volume transactions, consider using batch processing API
## Automating Code Comments
### Generate Inline Comments
```python
def add_comments_to_code(code: str) -> str:
"""Add helpful comments to code using GPT-4"""
prompt = f"""
Add clear, helpful inline comments to this code.
Comments should explain:
- What each section does
- Why certain approaches are used
- Any non-obvious logic
- Edge cases being handled
Code:
```python
{code}
Return the code with comments added. """
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are an expert programmer. Add clear, helpful comments to code."},
{"role": "user", "content": prompt}
],
temperature=0.2
)
return response.choices[0].message.content
### Example
**Input**:
```python
def fibonacci(n):
if n <= 1:
return n
a, b = 0, 1
for _ in range(2, n + 1):
a, b = b, a + b
return b
Output:
def fibonacci(n):
"""
Calculate the nth Fibonacci number using iterative approach.
Time complexity: O(n), Space complexity: O(1)
"""
# Base case: first two Fibonacci numbers are 0 and 1
if n <= 1:
return n
# Initialize first two Fibonacci numbers
a, b = 0, 1
# Iteratively calculate Fibonacci numbers
# Starting from index 2 since we already have 0 and 1
for _ in range(2, n + 1):
# Update: a becomes b, b becomes sum of previous two numbers
a, b = b, a + b
# Return the nth Fibonacci number
return b
Generating User Guides
Create Tutorial from Code
def generate_tutorial(code: str, topic: str) -> str:
"""Generate a tutorial from code examples"""
prompt = f"""
Create a beginner-friendly tutorial about {topic} using this code example.
Code:
```python
{code}
Include:
- Introduction explaining what we’ll build
- Prerequisites
- Step-by-step instructions
- Explanation of each code section
- Common mistakes to avoid
- Next steps for learning more
Write in a friendly, encouraging tone. """
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are a patient, encouraging programming teacher."},
{"role": "user", "content": prompt}
],
temperature=0.7
)
return response.choices[0].message.content
## Automated README Generation
```python
def generate_readme(repo_info: Dict) -> str:
"""Generate comprehensive README.md"""
prompt = f"""
Generate a comprehensive README.md for this project:
Project name: {repo_info['name']}
Description: {repo_info['description']}
Main language: {repo_info['language']}
Dependencies: {', '.join(repo_info['dependencies'])}
Features: {', '.join(repo_info['features'])}
Include:
1. Project title and description
2. Features list
3. Installation instructions
4. Usage examples
5. API documentation (if applicable)
6. Contributing guidelines
7. License information
8. Badges (build status, coverage, etc.)
Format in Markdown with proper sections and code blocks.
"""
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are an expert at writing clear, comprehensive README files."},
{"role": "user", "content": prompt}
],
temperature=0.4
)
return response.choices[0].message.content
Quality Control
Verify Documentation Accuracy
def verify_documentation(code: str, docs: str) -> Dict:
"""Verify that documentation matches code"""
prompt = f"""
Review this documentation for accuracy against the code.
Code:
```python
{code}
Documentation: {docs}
Check for:
- Accuracy of parameter descriptions
- Correctness of return value description
- Validity of examples
- Missing edge cases
- Outdated information
Return a JSON object with:
-
“accurate”: boolean
-
“issues”: list of issues found
-
“suggestions”: list of improvements """
response = openai.ChatCompletion.create( model=“gpt-4”, messages=[ {“role”: “system”, “content”: “You are a meticulous code reviewer.”}, {“role”: “user”, “content”: prompt} ], temperature=0.2 )
return json.loads(response.choices[0].message.content)
## Workflow Integration
### GitHub Actions
```yaml
name: Auto-Generate Documentation
on:
push:
branches: [main]
paths:
- 'src/**/*.py'
jobs:
generate-docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup Python
uses: actions/setup-python@v2
with:
python-version: '3.10'
- name: Install dependencies
run: |
pip install openai
- name: Generate documentation
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
python scripts/generate_docs.py
- name: Create Pull Request
uses: peter-evans/create-pull-request@v4
with:
commit-message: 'docs: auto-generate API documentation'
title: 'Auto-generated documentation update'
body: 'Automated documentation update based on code changes'
branch: 'docs/auto-update'
Results
Time Savings
| Task | Before | After | Savings |
|---|---|---|---|
| API docs | 8 hours/week | 2 hours/week | 75% |
| Code comments | 4 hours/week | 1 hour/week | 75% |
| User guides | 3 hours/week | 1 hour/week | 67% |
| Total | 15 hours/week | 4 hours/week | 73% |
Quality Improvements
- Consistency: 95% (vs 60% manual)
- Completeness: 90% (vs 70% manual)
- Up-to-date: 100% (automated on every commit)
Cost Analysis
- GPT-4 API costs: ~$50/month
- Time saved: 11 hours/week × $50/hour = $550/week
- ROI: 1000%+
Best Practices
1. Use Lower Temperature for Docs
# For documentation (consistent, factual)
temperature=0.2-0.3
# For creative content (tutorials, examples)
temperature=0.6-0.7
2. Always Verify Generated Content
# Never commit without review
docs = generate_docs(code)
verified = verify_documentation(code, docs)
if not verified['accurate']:
print("Issues found:", verified['issues'])
# Manual review required
3. Maintain Style Guide
system_prompt = """
You are a technical writer following our style guide:
- Use active voice
- Keep sentences under 20 words
- Use code examples for every concept
- Explain acronyms on first use
- Use "you" to address the reader
"""
4. Version Control for Prompts
# prompts/api_docs_v1.txt
PROMPT_VERSION = "1.2.0"
PROMPT_TEMPLATE = """
Generate API documentation...
"""
Limitations
What AI Can’t Do Well
- Domain-specific jargon: May need correction
- Company-specific processes: Requires customization
- Complex architecture decisions: Needs human insight
- Regulatory compliance: Must be verified by experts
When to Use Human Writers
- Legal documentation
- Security-critical docs
- High-level architecture
- Strategic planning docs
Conclusion
AI-powered documentation automation:
✅ Saves time: 70%+ reduction in documentation time ✅ Improves consistency: Standardized format and style ✅ Keeps docs updated: Automated on every code change ✅ Reduces developer friction: Less manual writing
❌ Still needs review: AI can make mistakes ❌ Requires setup: Initial investment in tooling ❌ Not for everything: Some docs need human expertise
Recommendation: Start with API documentation automation, then expand to other areas.
ROI: Pays for itself in the first week.
The future of technical documentation is AI-assisted, not AI-replaced. Use AI to handle the tedious parts, freeing humans for high-value work.