The Content Crunch is Real: My Product Launch Scenario
Last quarter, we had a new product launch. Not just a feature, but a whole new offering that needed a full suite of content: blog posts, social media updates, email sequences, and even some basic landing page copy. The marketing team was swamped. We needed about twenty distinct pieces of content, all with a consistent voice, accurate technical details, and a quick turnaround. This wasn’t a job for a single prompt in ChatGPT; it was a content factory problem. That’s when I decided to really dig into how to use AI for content creation at scale.
My goal wasn’t to replace writers, but to offload the initial drafting, research synthesis, and basic copy generation that eats up so much time. I wanted an agentic workflow that could take a product brief, scour our internal docs and external competitor sites, and then spit out first drafts that a human editor could polish in minutes, not hours.
Designing the Agent: More Than Just a Prompt
I started with a multi-agent architecture. One agent for research, another for drafting, and a third for editing and tone consistency. I chose CrewAI for its clear task and agent definition, which made orchestrating these roles much simpler than some of the more abstract graph-based frameworks I’ve tried. Each agent had a specific role, a set of tools, and a clear goal.
- The Researcher Agent: This one was responsible for gathering facts. Its tools included a custom web scraper for our internal wiki, a Google Search API for external data, and a PDF parser for product spec sheets. It’d synthesize findings into a structured JSON output.
- The Draftsman Agent: Taking the researcher’s output, this agent would generate the initial content. Its primary tool was an LLM call, but with specific instructions for tone, length, and target audience. It knew to write blog posts, then social snippets, then email copy, all from the same core information.
- The Editor Agent: This agent was the quality gate. It checked for factual accuracy against the original research, ensured brand voice consistency, and flagged any repetitive phrasing or awkward sentences. This was crucial for maintaining our brand identity.
The initial setup involved a lot of trial and error. Defining the exact prompt for each agent, giving them the right context, and making sure they handed off information correctly was a headache. I spent days just refining the JSON schema for the researcher’s output so the draftsman wouldn’t hallucinate or miss key details.
The Build: From Idea to First Failure
My first attempt was a disaster. The researcher agent would often get stuck in a loop, trying to re-verify facts it had already found, or it would return irrelevant data. The draftsman, in turn, would produce content that was technically correct but utterly devoid of personality, or worse, completely off-topic because the researcher’s output was poorly structured. Debugging this was like trying to find a needle in a haystack made of LLM tokens.
I quickly realized I needed better observability. I integrated LangSmith into the workflow. Seeing the full trace of each agent’s thought process, tool calls, and LLM inputs/outputs was a lifesaver. It showed me exactly where the researcher was getting confused and why the draftsman was misinterpreting instructions. For example, I found a common pattern where the researcher would get a slightly different phrasing for the same fact from two sources and then treat them as distinct, leading to redundant or conflicting information being passed down the chain. A simple pre-processing step to normalize common terms fixed that.
Here’s a simplified snippet of how I defined a task for the researcher in CrewAI:
@agent.task(
description="""Synthesize all gathered information into a concise, structured JSON object.
Include product features, benefits, target audience, and key differentiators.
Ensure factual accuracy and avoid repetition. Focus on the core value proposition.
"""
)
def research_synthesis_task(self, product_brief: str) -> str:
return Task(
description=f"Analyze the product brief: {product_brief}. Use search tools to gather
relevant data. Summarize findings into a JSON object with keys like 'features', 'benefits',
'audience', 'differentiators'.",
agent=self.researcher_agent,
expected_output="A JSON string containing synthesized product information."
)
This level of explicit instruction, combined with LangSmith’s traces, helped me pinpoint and fix the silent failures that would otherwise just result in bad content without a clear error message.