The Indeed Killer: AI Optimized Job Finder

Authors

Grant Schiederer

Dillon Johnston

Jacob Coleman

Published

December 7, 2025

Project Summary & Skills Used

For our computing II Final project, we built an interactive job-search that assist users in finding suitable jobs in the United States. We saw a gap in the market because job searches like Indeed simply have you give your location and they find jobs near that location. However, with today’s job market many people do not have the luxury of finding a job where they already live so we gave them the option to explore lotions throughout the United States that have jobs that match their skills. Our program allows users rate how important salary, distance, and how close a certain job is to their desired job. They then insert their experience and desired job with a description of what their perfect job looks like. Our project works by embedding each job description into a 1024-dimensional vector using a sentence transformer model (BGE-3) and computes cosine similarity between the user’s description and each job posting. We are able to take our user’s inputs and display a Vaadin map that shows clusters of where the hot-spots are for their preferred types of jobs, and after a they select a cluster our program will rank the jobs in that cluster according to the users inputs.This project incorporates several engineering concepts, such as multi-criteria decision making, data processing, machine learning-based text embedding, K-means clustering for geographic visualization. We use all of these industrial engineering concepts to create an easy to use tool that is able to create optimal outcomes for the user while keeping a focus on real world application.

Key Skills Used During the Project

  • Vaadin skills to make a reliable and simple to use interface

  • Object-oriented programming in Java

  • AI integration and text embedding

  • K-means clustering using SMILE’s machine learning library

  • Teamwork and communication skills between team members

Project Development Process

Our project started with a fairly simple idea: create a job selector that let users choose a few criteria and see which jobs matched. Once we began planning, we realized how we could take it a step above. This led us to expand the project far beyond basic filtering and into a full recommendation system that used AI-generated job descriptions, vector embeddings, clustering, and an interactive map.
As the design evolved, our development process started to feel like a complete pipeline with multiple stages. Data moved through several formats CSV, Parquet, and NPY as it traveled between Python and Java. Python handled the AI generation and similarity scoring, while Java dealt with filtering, clustering, and the user interface. Keeping everything consistent between these two languages was one of the biggest parts of the project, and it taught us a lot about how real systems pass data across different tools.
We ran into several challenges along the way. One of the first was making sure our fit-score model calculated everything correctly. We had to align similarity values, salary scaling, location preferences, and user-chosen weights so that both Python and Java treated the data the same way. Another major challenge was getting the map to work the way we wanted. Missing latitude/longitude columns, layout issues, and clustering mismatches caused the map to fail multiple times. Fixing these problems required stepping back and making sure every stage of the data pipeline was working as intended.
By the end, the final system met and surpassed what we had originally pictured. Seeing all the different components finally connect was extremely rewarding. What started as a simple idea grew into a full AI-supported recommendation tool, and the development process gave us valuable experience working with multiple technologies, debugging larger systems, and building a complete application from start to finish.

Key Features or Highlights

This project was particularly difficult to fit all the different pieces together. We were using tons of different libraries all with different syntax conventions. Seeing all the integration work together was very gratifying. We used intermediaries like csv, parquet, npy to create snapshots of our work and files. Every step of the process this single data was sent through so many different channels. It was sort of like an assembly line. In the real world with hundreds of systems working simultaneously this experience was very practical. A flow chart of this sequence is shown below to visualize our work and how all the AI work ends up back to the jobs for fit score.

Another part we were proud of was the data generation aspect. It was exhausting and took around 50 hours to generate but was an eye opening experience to the possibilities of AI. Our functionality went through each line and providing the AI only a job title, company description, and salary to write a 200 word job description. We were able to mess with the model parameters, something you can’t do from the main user interface on AI programs using python, which allowed us to use a lightweight model tailored to creative writing for speed. We changed the temperature which influences how random the generation is to make similar inputs create drastically different outputs. Moreover it allowed checkpoints to be saved along the way so we could start and stop. Code snippets are shown below

Function to build prompt

Runs the function with dataframe row, runs model, checks to make sure generation finished sentence and didn’t cut off, and added back result to generated description column

Finally the culmination of our project which was this final calculation showed the weaving of so many different working parts to get this ultimate output. It took the fit score from the program above, the salary score standardized relative to the job market for its relative benchmark, and the location score which evaluated whether the job was in the user’s desired cluster, picked from our complex clustering map. Finally it incorporated the user input which were weights on these scores to account for their preferences. It did this for every row to find the best overall jobs.

The code snippets above demonstrated the complex nexus of so many components all to come together to provide professional job recommendations. Thousands of computations all working in the background to come together for a common purpose. 


Reflection

This project has been a phenomenal experience for me to dip my toes into the vast and ever-changing world of AI. To be able to integrate this with the skills that I learned in class was fulfilling. There were many challenges during the semester with adopting the unique syntax of different libraries, but by the end, it all began to click during this project. Hours of brainstorming, modifying, and tweaking just to get our idea. By the end looking back it was miraculous to see what I had managed to do.

I was familiar with embedding and AI tools from my research role but this was the first opportunity I had to get hands on. I had to dive into niche source code and libraries to uncover the tools and functions I needed to accomplish my task. Because most AI support is only available on python I faced the challenge of integrating java and python. I found the code and after trial and error was able to integrate and entire AI workflow into our project.

I developed most of the code and was able to use parameterized methods and the object oriented interface of vaadin to visualize the computations and workflow. The button and textbox trigger logic was a challenge but logical and useful for future projects. 

I was also impressed with my ability to take initiative and lead. I was consistently driving discussions, challenging ideas, and propelling our project forward. I took charge during moments of stagnation and used my expertise on AI to explain and deliver ideas to my teammates. 

Overall, while this project was immensely challenging and tested my will, seeing all that hard work come to fruition was priceless. I was thankful to have a supportive team that were as passionate as I was about making a memorable project. A lot of times these big ideas can be too tedious to implement and often times you have to take shortcuts, but we were able to fully execute this idea and make something exceptional.