TL;DR
Achieving consistent, high-quality code from Large Language Models (LLMs) requires more than just
a good prompt. It demands a structured approach to guiding AI behavior. By implementing
Agentic Coding Environments
and leveraging techniques like
Few-Shot, Multi-Shot, and One-Shot prompting, engineering teams can enforce specific coding
patterns, control undesirable behaviors like aggressive mocking, and ensure the AI adheres to
established best practices. This strategy transforms the LLM from a volatile code generator into a
predictable, pattern-following development partner.
The Challenge: Unpredictable AI Behavior
Large Language Models (LLMs) are powerful tools, but their behavior can be notoriously inconsistent. One team might find their chosen LLM, like Gemini 2.5, has a tendency to generate excessive mocks in test code, sometimes even mocking the entire implementation. This isn’t just unhelpful; it’s detrimental, leading to brittle tests that provide a false sense of security.
The core of the problem is that general-purpose LLMs lack specific context about your repository’s architecture, patterns, and preferences. Without guidance, they fall back on the most common patterns they were trained on, which may not align with your engineering standards. The result is a constant battle to refactor AI-generated code, slowing down development and introducing potential for error.
The Solution: Agentic Coding Environments
To solve this, we must move beyond simple prompting and adopt an
Agentic Coding Environment
. This involves creating
specialized “personas” or “agents” for your AI, each configured with specific rules and context
for different tasks. For example, you can have a “Test Generation Agent,” a “Refactoring Agent,”
or a “Documentation Agent.”
This approach allows you to inject high-level guidance that governs how the LLM functions for a specific task. Instead of providing a generic prompt, you’re activating a specialized agent that already knows the rules of the road for its domain.
Guiding the “Test Generation Agent”
A common pain point is test generation. An unguided LLM might produce tests that use aggressive mocking, which can hide bugs and make tests difficult to maintain. For instance, monkey-patching a class method for a single test can have unintended side effects on subsequent tests in the same suite.
# An undesirable pattern often generated by LLMs
def test_some_feature_with_bad_mocking(self):
# This modification affects all subsequent tests in this class!
type(MyModel).foo_bar = lambda: "mocked_value"
# ... test logic ...
To combat this, we equip our “Test Generation Agent” with a high-level rules file in Markdown. This file explicitly defines:
- When to use mocks: Only for external dependencies or complex, slow-running services.
- Preferred mocking patterns: Using
unittest.mock.patch
as a context manager or decorator to ensure mocks are properly scoped. - Patterns to avoid: Explicitly forbidding dynamic type modification like
type(Model).foo_bar = ...
.
This simple ruleset transforms the agent’s output from a potential liability into a consistent, high-quality contribution.
Multi-Shot and Few-Shot Prompting for Pattern Enforcement
Beyond high-level rules, we can use more granular prompting techniques to enforce specific coding
patterns. This is where Few-Shot
and
Multi-Shot
prompting shine.
Multi-Shot Prompting: The “Do This, Not That” Framework
For complex or critical patterns, a Multi-Shot
approach is
highly effective. We create detailed Markdown files that provide multiple examples of “what to
avoid” and “what to use instead.” This gives the AI a rich set of contextual examples to learn from.
For instance, a multi-shot document for our “Test Generation Agent” might include:
Pattern to Avoid: Over-mocking
# DONT: Mocking internal methods of the class under test
@patch('my_module.MyClass._internal_helper')
def test_feature(self, mock_helper):
# ...
Preferred Pattern: Testing the Public Interface
# DO: Test the public method and assert its observable behavior
def test_feature(self):
result = self.my_class.public_method(input)
self.assertEqual(result, expected_output)
By providing several such examples, we create a powerful, context-rich prompt that leaves little room for ambiguity.
Few-Shot and One-Shot Prompting for Quick Corrections
For simpler patterns, Few-Shot
(2-5 examples) or even
One-Shot
(a single example) prompting can be sufficient.
This is useful for enforcing stylistic preferences or simple refactorings.
For example, to enforce a specific import order:
One-Shot Example: “When writing Python code, always order imports as follows: standard library, third-party packages, then local application imports.”
# Correct import order
import os
from datetime import datetime
import requests
from my_app import models, utils
Key Takeaways
- Stop generic prompting: Adopt an
Agentic Coding Environment
with specialized AI personas for different development tasks. - Codify your rules: Create high-level Markdown rule files to guide your AI agents on critical patterns, especially for tasks like testing and mocking.
- Use Multi-Shot prompting for complex patterns: Provide detailed “do this, not that” examples to give the AI rich context.
- Leverage Few-Shot and One-Shot for simple rules: Quickly enforce stylistic conventions and minor refactoring patterns.
- Iterate and refine: Your prompting strategies should evolve with your codebase and engineering practices.
By treating your AI as a configurable team member and providing it with clear, pattern-based guidance, you can significantly increase the quality and consistency of its contributions, turning it into a true force multiplier for your team.
Partner with Tech Celerate to Master Your AI Workflow
At Tech Celerate, we specialize in building and refining the very
Agentic Coding Environments
described here. We help
engineering teams move beyond basic AI adoption to create highly optimized, predictable, and
scalable AI-assisted development workflows.
Our services include:
- AI Agent & Persona Development: We design and implement custom AI agents tailored to your specific needs, from testing and refactoring to documentation and security analysis.
- Prompt Engineering & Optimization: We craft and maintain the high-level rules and multi-shot example libraries required to ensure your AI agents adhere to your engineering standards.
- Workflow Integration: We seamlessly integrate these AI capabilities into your existing development lifecycle, whether you’re using Agile, DevOps, or a hybrid model.
- Training & Enablement: We empower your team to effectively use and manage your new AI-powered tools, ensuring you get the maximum ROI from your investment.
Stop fighting with unpredictable AI and start building with a reliable, pattern-driven partner.
Contact Tech Celerate today to learn how we can help you build a more efficient and predictable engineering practice.