---
Why This Was Necessary: The First Alarm in Slack
One day in Slack, we saw a message from one of our recruiters: "It seems that the AI doesn't understand what it means to be a Senior Go Developer." This was not just a complaint—it touched on our entire recruitment system. We began to realize that errors in candidate evaluation could lead to a waste of time and resources for our team and the companies we work with.
Context of the Problem
In today's world, recruiting requires high accuracy. We aimed to use AI to automate candidate evaluation, but with each new application, we faced increasing issues with AI hallucinations. Candidates who clearly did not meet the qualifications were advancing to the next stage. This created dissatisfaction among recruiters and reduced trust in our platform.
The Problem in Detail
One striking example was a recent resume that entered our system. The candidate claimed to have 10 years of experience in Go, but there were no mentions of specific projects or technologies related to this platform in their profile. The AI identified them as a strong candidate, but upon closer inspection, we realized it was just a hallucination.
Initial Attempts at Solutions
Our first attempt involved using simple keywords to filter resumes. However, as practice showed, this did not solve the problem. Candidates with insufficient experience still made it into the system. We even considered introducing multi-level testing, but that increased the time and resources spent on selection.
Technical Approach
Ultimately, we decided to combine several approaches. We added deterministic filters that checked for specific technologies and projects in resumes. We also implemented qualification signal analysis, taking into account not only experience but also participation in open-source projects or publications. Additionally, we used cached GPT explanations for deeper analysis.
func filterCandidates(candidates []Candidate) []Candidate {
var qualified []Candidate
for _, candidate := range candidates {
if hasRelevantExperience(candidate) && isSenior(candidate) {
qualified = append(qualified, candidate)
}
}
return qualified
}
What Changed in the Product
After implementing the new filters and analysis methods, we noticed a significant decrease in the number of candidates with unrealistic expectations. This allowed recruiters to focus on truly qualified specialists, thereby improving the quality of selection. We also updated the /jobs and /for-companies pages to reflect the new approach to candidate evaluation.
What We Learned
- Fact-checking is more important than it seems. Simple keywords won't provide an accurate picture.
- Deterministic filters can significantly improve output quality.
- Feedback from recruiters is key to improving processes.
- Using cached data helps reduce query processing time.
What This Means for Candidates
For candidates, this means that their resumes will be analyzed based on real skills and experience. We strive to create a fairer and more transparent recruitment system where your achievements are valued. It also means that candidates will have a higher chance of getting an interview if their qualifications meet the requirements.
What This Means for Recruiters
Recruiters can be confident that the system effectively filters candidates, allowing them to focus on more important aspects of their work. This will save time and improve the quality of hiring. Moreover, they will be able to provide better recommendations based on accurate data.
Next Steps
Despite the progress made, we understand that the work is not finished. We continue to monitor the quality of analysis and are ready to make changes to algorithms as needed. If we had the opportunity to go back to the beginning, we might have integrated more complex analysis methods right away to avoid the initial difficulties. ---