My first attempt at a B2B lead generation AI agent, Algom Alpha, failed to deliver a single qualified lead for three weeks. It burned $17.83 in Groq API calls and $4.12 in Oracle Cloud egress. The core problem: my definition of "qualified" was too loose, and my signal-to-noise ratio on X (formerly Twitter) was abysmal. I needed to find companies actively hiring for specific roles, not just discussing them.
I built Algom Alpha to find B2B leads for AIdeazz, specifically targeting companies that need production AI agents but don't have the internal capacity. This means looking for signals like "hiring for ML engineer," "seeking AI talent," or "building an internal AI team." The initial version just scraped X for these keywords, leading to a 95% false-positive rate. I then refined the process, focusing on hiring-adjacent keywords and a multi-agent scoring system. My current false-positive rate is 68%, which I'm still not proud of, but it's a significant improvement.
The Signal: Hiring-Adjacent Keywords on X
The initial keyword list was too broad: ["AI", "ML", "LLM", "agent", "hiring", "developer"]. This pulled in everything from academic discussions to spam. I shifted to a more targeted approach, combining hiring intent with specific AI roles.
Current keyword list (example subset):
"hiring AI engineer""seeking machine learning lead""building internal AI team""need prompt engineer""looking for ML ops""AI product manager opening"
This still generates noise. A tweet like "We're building an internal AI team, but we're looking for a partner not an employee" would be a false positive for direct hiring, but a potential lead for AIdeazz. This nuance is where the multi-agent system comes in.
Algom Alpha's Architecture: Oracle Cloud, Groq, and a Scoring Cascade
Algom Alpha runs on an Oracle Cloud Infrastructure (OCI) VM. I use OCI because of the free tier and predictable billing, which is critical when you're bootstrapping with zero VC. The core components are:
1. X Scraper Agent (Python/Tweepy): This agent continuously monitors X for the refined keyword list. It collects tweet text, author, timestamp, and follower count. Rate limits are a constant battle; I cycle through multiple developer accounts to manage this.
2. Initial Filter Agent (Groq Llama 3 8B): This agent receives raw tweets. Its prompt is simple: "Is this tweet likely indicating a company is hiring for an AI-related role, or actively seeking AI development help? Respond 'YES' or 'NO'." I use Groq for its speed and low latency, which keeps the per-tweet cost minimal ($0.0001 per 1k tokens for Llama 3 8B). This agent is the first line of defense against obvious spam or irrelevant discussions.
3. Contextual Analysis Agent (Groq Llama 3 70B or Claude 3 Haiku): If the Initial Filter Agent says "YES," the tweet and its author's profile (scraped separately) are passed to this agent. This is where the "qualified lead" definition starts to solidify. The prompt here is more complex:
Analyze the provided tweet and user profile. Determine if this company is a viable B2B lead for an AI agent development service.
Criteria for 'viable':
- Explicitly states hiring for AI/ML roles OR
- Explicitly states building an internal AI team/product OR
- Expresses a need for AI development expertise (e.g., "struggling with LLM integration," "need help with AI strategy")
- Company appears to be established (not a solo founder looking for free advice)
- Not an AI services company itself (we don't sell to competitors)
- Not a university or research institution (unless explicitly seeking commercial partnership)
- Not a personal account seeking a job
Output a JSON object:
{
"is_qualified": boolean,
"reason": "string explaining qualification or disqualification",
"company_name": "string (extract from profile if possible)",
"contact_signal": "string (e.g., 'DM open', 'link to careers page', 'email in bio')"
}
I route between Groq Llama 3 70B and Claude 3 Haiku based on current API latency and cost. Groq is faster but sometimes hallucinates company names. Claude is more reliable for complex reasoning but slower.
4. Scoring Agent (Python/Pandas): This agent takes the JSON output. It assigns a score based on
is_qualified (100 points if true, 0 if false), and then adds points for contact_signal (e.g., +20 for email, +10 for DM open, +5 for careers page link). It also penalizes based on follower count (e.g., -5 for <100 followers, indicating a smaller, potentially less established entity).5. Human Review Queue (Telegram Bot): Leads with a score above 80 are pushed to a Telegram bot. This bot sends me the tweet, the company name, and the reason for qualification. This is where I manually review and confirm.
The 68% False-Positive Rate: Where the System Breaks
My 68% false-positive rate means that for every 100 leads the system flags as "qualified," 68 are actually not. This is expensive in terms of my time for manual review.
Common false positives:
AI Service Providers: "We're hiring for an ML engineer to build our clients'* AI solutions." The Contextual Analysis Agent sometimes misses the "our clients'" nuance, especially with less explicit phrasing.
- Academic/Research: "Our university lab is seeking a PhD student for AI research." The agent struggles to differentiate between academic hiring and commercial product development.
- Personal Job Seekers: "I'm an AI engineer looking for new opportunities." The agent sometimes misinterprets "looking for" as the company looking for talent, not an individual. This is less frequent now due to profile analysis, but still happens.
- Ambiguous Intent: "AI is changing everything, we need to adapt." This is too vague, but sometimes the agent interprets "need to adapt" as "need help."
- Old Posts: X's search can sometimes pull up older, irrelevant posts. I've implemented a timestamp filter, but some still slip through.
The root cause is often the LLM's inability to fully grasp the subtle context of human language, especially when profiles are sparse or tweets are intentionally vague. I'm constantly refining the prompts and adding more negative examples to the agent's training data (via few-shot prompting).
What a Bot Calls 'Qualified'
For Algom Alpha, a "qualified lead" means a company that:
1. Is actively hiring for or explicitly seeking AI development expertise. This is the primary signal.
2. Appears to be a legitimate business, not an individual or an academic institution. This is inferred from profile details, follower count, and linked websites.
3. Is not a direct competitor (i.e., another AI agent development firm). This is a critical filter.
4. Has a clear path for contact. This could be a DM, an email, or a public careers page.
My definition of "qualified" is still evolving. Initially, it was just "hiring for AI." Now, it's about fit for AIdeazz. A company hiring 100 ML engineers internally is less qualified than a small-to-medium business saying, "We need an LLM integrated, but don't have the in-house team." The latter is my sweet spot.
The 68% false-positive rate is a direct cost. Each manual review takes 30-60 seconds. For 100 leads, that's an hour of my time. My goal is to get this under 30% by the end of Q3 2024 through more sophisticated prompt engineering, better negative examples, and potentially integrating a small, fine-tuned model for specific classification tasks. The current system is a working prototype, generating some leads, but the efficiency needs significant improvement.
Frequently Asked Questions
Q: Why X instead of LinkedIn for B2B lead generation?
A: LinkedIn's API access is heavily restricted and expensive for programmatic scraping. X, while challenging with rate limits, offers more accessible public data for a bootstrapped operation.
Q: How do you handle X's rate limits and account suspensions?
A: I use multiple X developer accounts and rotate API keys. I also implement exponential backoff for API calls and introduce random delays between requests to mimic human behavior.
Q: What's the cost per qualified lead with your current setup?
A: Given the 68% false-positive rate, the cost is approximately $0.85 per true qualified lead, factoring in API costs and my manual review time (valued at $50/hour). This needs to come down.
Q: Why not use a single, larger LLM for all analysis?
A: Cost and latency. Routing smaller, faster models (like Groq Llama 3 8B) for initial filtering significantly reduces the overall API spend and processing time compared to sending every raw tweet to a larger, more expensive model.
Q: How do you prevent the agents from generating identical leads?
A: I store all processed tweet IDs in an Oracle Autonomous Database. Before processing, the X Scraper Agent checks this database to ensure no duplicate tweets are sent down the pipeline.