Adding Concrete Details
Numbers, names, formats, and examples that anchor AI output.
Adding Concrete Details is a free AI Prompt Engineering lesson on CoddyKit — lesson 3 of 4. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the AI Prompt Engineering learning path, one of 4 lessons in the course, and your progress syncs across the web and the CoddyKit app.
Concrete Details Are Anchors
Concrete details are specific, measurable, verifiable pieces of information. They anchor the model's output to your actual situation instead of a generic interpretation.
Without anchors, the model generates for the imaginary average user. With anchors, it generates for you.
Word Count as a Concrete Constraint
Word count is one of the simplest and most effective concrete details you can add. Compare:
- Vague: 'Write a short description'
- Concrete: 'Write a 75-word description'
The model will count tokens and aim for your target. If it misses slightly, you can ask for an exact recount. Word count eliminates entire categories of rewriting.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=200,
messages=[{
'role': 'user',
'content': (
'Write a product description for a noise-cancelling travel pillow in exactly 60 words. '
'After the description, output the word count in parentheses on a new line.'
)
}]
)
print(response.content[0].text)Target Audience as a Concrete Detail
Naming a specific, concrete audience dramatically changes the vocabulary, examples, and depth of the output.
- Vague: 'Explain neural networks'
- Concrete: 'Explain neural networks to a marketing manager at a Fortune 500 company who has no coding background but understands Excel pivot tables'
The second prompt gives the model a mental picture of a real reader and lets it calibrate complexity perfectly.
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
concrete_audience_prompt = (
'Explain what a REST API is.\n\n'
'Audience: a non-technical product manager who uses Salesforce daily '
'and understands the concept of a form submission on a website. '
'They will use this explanation to brief their engineering team tomorrow. '
'Use one real-world analogy. Max 100 words.'
)
response = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': concrete_audience_prompt}]
)
print(response.choices[0].message.content)Named Entities Over Generalizations
Using named entities — real product names, company names, people, technologies, dates — forces the model out of generic territory.
- Vague: 'Write a competitive analysis'
- Concrete: 'Write a competitive analysis of Notion vs Obsidian vs Roam Research for a power user who manages a 10-person remote team, writes daily, and needs offline access'
Named entities anchor the model to real-world knowledge it has from training.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=400,
messages=[{
'role': 'user',
'content': (
'Compare FastAPI vs Flask vs Django REST Framework '
'for building a production API that will serve a React frontend. '
'Context: 2-person startup team, Python 3.11, needs async support, '
'expects < 50 ms response time, and will deploy on AWS Lambda. '
'Format: 3-column markdown table with rows: setup complexity, '
'async support, performance, learning curve, community size.'
)
}]
)
print(response.content[0].text)Quantitative Constraints
Numbers are unambiguous. Any time you have a numeric requirement, put it in the prompt:
- List exactly N items (not 'a few' or 'several')
- Maximum / minimum word or character counts
- Specific percentages or ratios ('70% practical, 30% theoretical')
- Time constraints ('explain it as if I have 3 minutes to read this')
- Performance targets ('suggest approaches that achieve O(n) time complexity')
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
response = client.chat.completions.create(
model='gpt-4o',
messages=[{
'role': 'user',
'content': (
'Generate exactly 8 onboarding email subject lines for a B2B SaaS product. '
'Requirements:\n'
'- Exactly 8 lines, no more, no fewer\n'
'- Each subject line between 40 and 60 characters\n'
'- 4 must emphasize value, 4 must create urgency\n'
'- Label each line: [VALUE] or [URGENCY]\n'
'- No emojis\n'
'- No duplicate words across all 8 lines'
)
}]
)
print(response.choices[0].message.content)Deadline and Time-Based Framing
Providing a temporal context changes the depth and focus of outputs. Tell the model when this content will be used and the constraints that creates:
- 'This email will be sent in 2 hours — keep it brief'
- 'This is for a board presentation on Monday — executive-level language'
- 'This explanation needs to work in a 5-minute stand-up'
- 'Write this for a team that has 10 minutes to review it before the client call'
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=256,
messages=[{
'role': 'user',
'content': (
'Write a project status update for our AI chatbot project. '
'This will be read aloud at a 5-minute Monday morning stand-up. '
'The audience has zero technical background. '
'Talking time: max 2 minutes (approximately 300 words). '
'Cover: what we shipped last week, one current blocker, one upcoming milestone. '
'Tone: confident and factual. No jargon.'
)
}]
)
print(response.content[0].text)Specific Examples in the Prompt
Including specific examples of what you want or what you do not want is one of the highest-leverage techniques. Examples teach format, voice, and style simultaneously.
You can include:
- An example of the ideal output (one-shot)
- Multiple examples with labels (few-shot)
- An example of what went wrong before (negative example)
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
prompt = '''
Write 3 feature announcement tweets for a new developer tool.
Here is an example of the style I want:
"We just shipped inline type errors in the editor. No more tab-switching to find
what broke. Your flow stays unbroken. Try it now: [link]"
Characteristics of this style:
- Opens with what shipped, not with excitement words
- Describes the user benefit in the second sentence
- Ends with a CTA
- No hashtags. No emojis. Under 200 characters.
New feature: autocomplete that learns from your codebase.
'''
response = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': prompt}]
)
print(response.choices[0].message.content)Domain-Specific Vocabulary
Including domain-specific terms signals to the model the level of expertise expected in the output.
- 'Explain caching' → generic response
- 'Explain Redis LRU eviction policy for a backend engineer migrating from Memcached to Redis 7.x' → expert-level, domain-anchored response
Use the vocabulary of your field in the prompt and the model will mirror it in the output.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
# Generic prompt vs domain-vocabulary prompt
generic = 'Explain caching strategies.'
domain_anchored = (
'Compare write-through, write-behind, and cache-aside patterns '
'for a microservices architecture using Redis 7.x as the cache layer and '
'PostgreSQL 15 as the source of truth. '
'Focus on consistency guarantees, latency tradeoffs, and failure modes. '
'Audience: senior backend engineers familiar with CAP theorem.'
)
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=400,
messages=[{'role': 'user', 'content': domain_anchored}]
)
print(response.content[0].text)Constraints on What to Exclude
Concrete negative constraints (exclusions) prevent the model from going to predictable, generic places:
- 'Do not suggest solutions that require a paid API key'
- 'Do not mention competitors by name'
- 'Do not use the word leverage or synergy'
- 'Do not include theoretical content — practical only'
- 'Exclude approaches that require more than 5 minutes to implement'
Each exclusion rule sharpens the output by eliminating one more avenue for generic content.
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
response = client.chat.completions.create(
model='gpt-4o',
messages=[{
'role': 'user',
'content': (
'Suggest 5 ways to speed up a slow Python script. '
'EXCLUDE:\n'
'- Suggestions requiring third-party libraries (stdlib only)\n'
'- Suggestions about hardware upgrades\n'
'- Rewrites of the entire script\n'
'- Suggestions that take more than 30 minutes to implement\n'
'Each suggestion: one sentence describing what to do, one sentence on expected speedup.'
)
}]
)
print(response.choices[0].message.content)Putting It All Together
Let's build a fully concrete prompt step by step. Starting from: 'Write a job description.'
- Add role: 'For a Senior ML Engineer'
- Add named entity: 'at a Series B AI startup in London'
- Add word count: '350-400 words'
- Add audience: 'for candidates with 5+ years of experience'
- Add structure: 'Format: intro, responsibilities (8 bullets), requirements (5 bullets), nice-to-haves (3 bullets)'
- Add exclusion: 'No cliches like fast-paced or passionate'
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
concrete_prompt = (
'Write a job description for a Senior ML Engineer position '
'at a Series B AI startup in London. '
'Target candidate: 5+ years ML experience, strong Python, familiar with LLMs. '
'Length: 350-400 words. '
'Structure:\n'
'1. 3-sentence company intro (no fluff — focus on product and mission)\n'
'2. Responsibilities: exactly 8 bullet points\n'
'3. Requirements: exactly 5 bullet points\n'
'4. Nice-to-haves: exactly 3 bullet points\n'
'EXCLUDE: phrases like "fast-paced", "passionate", "ninja", "rockstar", "self-starter".'
)
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=600,
messages=[{'role': 'user', 'content': concrete_prompt}]
)
print(response.content[0].text)The Prompt Enrichment Habit
Develop the habit of enriching every prompt before sending it. Run through this quick mental enrichment pass:
- Can I replace any vague word with a number?
- Can I name a specific tool, technology, or person?
- Can I state the audience more precisely?
- Can I add an example of what I want?
- Can I add at least one 'do not include' constraint?
- Can I specify the output format more precisely?
Even two or three enrichments dramatically improve output quality.
# Prompt enrichment in code form: before/after comparison
before = 'Give me ideas for my presentation.'
after = (
'Generate 6 opening hook ideas for a 15-minute conference talk '
'titled "Why Your AI Prompts Are Failing You" at PyCon 2025. '
'Audience: Python developers, mostly backend, some ML experience. '
'Each hook: 2 sentences max. '
'Mix: 2 provocative statistics, 2 counterintuitive questions, 2 short stories. '
'EXCLUDE: "Did you know..." openers and rhetorical questions about the future of AI.'
)
print('BEFORE:', before)
print()
print('AFTER:', after)Knowledge Check
A startup founder sends this prompt: 'Help me write marketing copy.' Which revised prompt uses the most effective concrete details?
Adding Concrete Details — Recap
Concrete details transform vague prompts into precise instructions. Use these anchoring techniques:
- Word count: replace 'short/long' with exact numbers
- Named entities: specific products, tools, companies, people
- Audience: role, experience level, what they already know
- Quantitative constraints: exactly N items, N% of each type
- Domain vocabulary: use the field's own terms to signal expected depth
- Examples: show what good output looks like
- Exclusions: name what the model should avoid
Frequently asked questions
Is the “Adding Concrete Details” lesson free?
Yes — the full text of “Adding Concrete Details” is free to read here on the web, and the AI Prompt Engineering course includes 4 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the AI Prompt Engineering course, upgrade to CoddyKit PRO.
What will I learn in “Adding Concrete Details”?
Numbers, names, formats, and examples that anchor AI output. You practise AI Prompt Engineering with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.
Do I need any experience to start AI Prompt Engineering?
No prior experience is required. AI Prompt Engineering on CoddyKit is structured for beginners through advanced learners; this is — lesson 3 of 4, so you can start here or from the beginning and move at your own pace.
How long does the “Adding Concrete Details” lesson take?
Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.
Can I write and run code in this AI Prompt Engineering lesson?
Yes. Every AI Prompt Engineering lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.
All lessons in this course
- Why Specificity Matters
- Removing Ambiguity from Prompts
- Adding Concrete Details
- Vague vs Specific Prompts Compared