The Algorithmic Approach to Online Dating: Optimizing Profiles using AI
Exploring the use cases of AI while navigating the risk of authenticity in the modern dating scene
Today, there is no doubt that biographs of some people on social sites are, in some ways, written with the help of a large language model (LLM) such as ChatGPT or Google Gemini.
And without saying, there are no difference on most common dating platforms. Cheesy pick up lines, sophisticated languages to charm the others, with some people even going to the extent of crafting bots to chat with matches on online dating platforms. While a seductive biography may be important, there are other factors that make up a profile such as common interests, languages spoken, personality type, hobbies, etc.
What I want to explore and share today is using an LLM to optimize the dating profile (not only the biography), some prompting techniques that worked for me, and awareness of users’ authenticity online, not limited to dating platforms.
Portal
- Data gathering
- Getting value out of the data
- AI suggestions results
- The profile that is not me
- Navigating the risk of authenticity
- What’s next?
Data gathering
*All data on this page has been redacted where necessary, and names except mine have been truncated to 5 characters.
There are many approaches that can be taken to gather information, manually recording every field on your dating platform to an Excel, taking a screenshot, and asking for a JSON object as shown above.
The approach that is used for this project is crawling the dating platform API. However, I will not go in-depth on this and focus more on the profile optimization. The project is written in Python and the code can be found here at Github.
{
"spotify": {
"spotify_connected": false,
"spotify_theme_track": {}
},
"user": {
"age_filter_max": 30,
"age_filter_min": 18,
"bio": "Here to have fun",
"birth_date": "1998-01-01T00:00:00.000Z",
"name": "Jonathan",
"jobs": [],
"user_interests": {
"selected_interests": [].
},
"selected_descriptors": [],
"user_prompts": {
"prompts": [
{
"question_text": "The hottest thing you can do is…",
"answer_text": "being in a sauna on a hot day"
}
]
},
}
}
Above is a redacted version of what the API returns for my profile, and it is stored in a variable.
At the same time, another API is called to get potential dates/matches, and the information similar to the profile is stored in another variable. The reason for getting potential date profiles too is to allow more context and reference for the LLM to optimize the user’s profile with more local relevancy.
Getting value out of the data
With the profile and potential date profiles, the information can be passed to ChatGPT using OpenAI Python SDK following the developer quickstart here. I will be using “the LLM” rather than ChatGPT throughout this document as this approach is not limited to a single product like ChatGPT, but most LLMs are capable enough to produce such results.
User prompt
input_prompt: str = json.dumps({
"dating_profile": tinder_data.profile,
"potential_dates_profile": tinder_data.dates
})
In the snippet above, the profile and potential dates profile are combined into a JSON object, and the json.dumps()
will convert the JSON object into a string. This string of JSON objects will be the user prompt for ChatGPT. A structured text format seems to perform better compared to just text in plain English.
Developer prompt/System prompt
The developer prompt is where all the magic happens, and promptengineering.org explains it really well on what a system prompt does. Essentially, a system prompt guides the LLM on what it should do.
match_style_options = {
"potential": "the most potential dates profile",
"teenager": "an 18 years old teenager profile",
"senior_citizen": "a senior citizen profile",
}
dev_prompt: str = ("You will receive a JSON that has a dating profile and potential dates profile. "
"Provide more than 5 suggestions on how to change the dating profile to match "
+ match_style_options["potential"] +
". Take into account the age, bio, common interest, section_name and any additional information deemed relevant to be compatible, "
"and example_from_potential_dates based on suggestion should have some names from potential dates for reference.")
For this project, I have created a prompt with 5 styles (which we will come to later on), that tell the LLM:
- What information it is receiving (dating profile, potential dates profile)
- What am I expecting (More than 5 suggestions)
- What factors should be taken into account for (age, bio, common interest) and a wildcard saying any additional information deemed relevant to be compatible
- What additional information do I want (example from potential dates as reference)
Structured result format
The Python SDK allows output to be structured as shown in the documentation. A structured output would allow the output to be more manageable, predictable, and serves as a guide for the LLM.
class Suggestions(BaseModel):
current: str
suggestion: str
example_for_bio: str
example_from_potential_dates: str
class DateProfileSuggestion(BaseModel):
suggestions: list[Suggestions]
common_dates_interest: str
completion = client.beta.chat.completions.parse(
model="gpt-4o-mini" if os.getenv("OPENAI_MODEL") == "" else os.getenv("OPENAI_MODEL"),
messages=[
{"role": "developer", "content": dev_prompt},
{"role": "user", "content": input_prompt}
],
response_format=DateProfileSuggestion
)
By creating the desired output as a Python Class definition and passing that to response_format
parameter of client.beta.chat.completions.parse()
, the SDK will return the result as a DateProfileSuggestion
object.
The gpt-4o-mini
model was used as it was the cheapest, and the results were reasonable.
AI suggestions results
res: DateProfileSuggestion = completion.choices[0].message.parsed
for s in res.suggestions:
print("Current :", s.current)
print("Suggestion :", s.suggestion)
print("Example :", s.example_for_bio)
print("Potential dates :", s.example_from_potential_dates)
print(" ")
Match style: “the most potential dates profile”
Common dates interest: Travel, Music, Social Activities, Food, Outdoor Adventures
Current : Bio: Here to have fun
Suggestion : Make your bio more engaging by showing genuine interest in sharing experiences.
Example : Excited to create unforgettable memories and explore new horizons! Let's have fun together! 🌍✈️
Potential dates : Sev: Surprise me; or Jade: Let's plan some adventures together!
Current : Interested in: Travel, Coffee, BBQ, Memes, Tea
Suggestion : Add more specific interests that resonate with potential matches' preferences, especially related to social activities.
Example : Coffee enthusiast ☕🍰, love outdoor BBQs 🍗, and always down for a hilarious meme exchange!
Potential dates : Jade: I love hiking and exploring new places; or Riann: Always keen to find new spots and explore!
Current : Jobs: Ask me
Suggestion : Replace vague job title with something intriguing or a passion, showcasing your career or interests.
Example : Adventure seeker with a knack for the unexpected, currently navigating the world of creative marketing!
Potential dates : Marit: A social butterfly looking for adventures; or Love: Professional Blanket Burrito Tester!
Current : Currently have no additional interests listed
Suggestion : Include fun activities or hobbies that align with your personality and excite potential dates.
Example : When I'm not busy at work, you'll find me at the gym, or binge-watching my favorite shows near my cat! 🎥🐈
Potential dates : Lisa: Dancer, content creator, and travel lover; or Sev: Avid Netflix binger and outdoor sport enthusiast!
Current : Sexual orientation: Straight
Suggestion : Include more details about your values or what you're looking for in terms of relationships.
Example : Straight, seeking connection, meaningful conversations, and spontaneous adventures!
Potential dates : Moira: Looking for new friends, maybe more!; or Marie: Serious about building real connections.
Current : Currently have an incomplete profile
Suggestion : Complete your profile components such as your Spotify, Instagram, and more photos to attract more matches.
Example : Geek at heart, always open to new tunes and ready to capture special moments! Let's jam!
Potential dates : Tess: Love music, festivals, and cycling, or Abby: Youth support worker who loves meaningful conversations.
Above is the result returned by the LLM. With detailed examples and caters to additional parameters such as interests, and activities and even suggesting to connect Spotify and Instagram to attract more matches.
The profile that is not me
While the result above creates a more “complete” profile, the result can be very different just by changing a few words in the developer prompt.
Match style: “an 18 years old teenager profile”
Current : Here to have fun
Suggestion : Change bio to something more youthful and fun, like 'Just a teenage dreamer looking for new adventures!'
Example : Just a teenage dreamer looking for new adventures!
Potential dates : Felin: Avontuurlijk
Current : Age: 25
Suggestion : Make age explicitly 18 to reflect being a teenager as per profile requirements.
Example : Celebrating my 18th year with big dreams!
Potential dates : Isa: Ik ben iemand die graag bezig is, stil zitten is niet echt aan mij besteed
Current : Top Spotify Artist: Unknown
Suggestion : Select top Spotify artists that are trending in the teen demographic, like Billie Eilish or Olivia Rodrigo.
Example : My top Spotify artist? Probably Billie Eilish!
Potential dates : Natas: @natashln
Current : Enjoys BBQ and tea
Suggestion : Include interests that resonate more with teenagers, like streaming shows, gaming, or social media.
Example : Love Netflix binge-watching and video game marathons!
Potential dates : Yilli: I'm with 3 friends for a few days. Looking for good places to party on New Year's Eve
Current : Professional title: Ask me
Suggestion : Replace professional title with something relatable to a teenager, such as being a student or hobbyist.
Example : Just a student chasing dreams!
Potential dates : Mikae: De passage pour la fin d’année.
Current : Interested in short-term fun
Suggestion : Reword relationship intent to reflect a more carefree and exploratory mindset typical for teens, like 'Let’s hang out and see where it goes'
Example : Looking for fun friends and adventures!
Potential dates : Julie: I’m looking for some new friends, maybe more.
The LLM suggested to change the age from 25 to 18, and proposed Spotify artists that are trendy for young teens. The theme for this profile also seems to be carefree.
Match style: “a senior citizen profile”
Current : Here to have fun
Suggestion : Modify to reflect a more serious tone about companionship.
Example : Looking to share my life experiences with someone special, enjoying meaningful conversations and leisurely strolls.
Potential dates : Sev: I love deep conversations over coffee and would like to explore life together.
Current : Interested in travel and coffee
Suggestion : Focus on more classic interests relevant to senior citizens.
Example : Enjoy visiting local parks, gardening, and appreciating historical sites.
Potential dates : Lisa: I enjoy exploring museums and gardening in my spare time.
Current : Short-term fun
Suggestion : Change intent to long-term companionship or serious dating.
Example : Searching for a meaningful connection and someone to share my golden years with.
Potential dates : Marjo: I dream of creating a warm home with someone who appreciates the little things.
Current : Looking for someone who enjoys memes
Suggestion : Include interests that resonate with the senior demographic.
Example : I love classic films, gardening, reading, and sharing stories over tea or coffee.
Potential dates : Elvia: I enjoy reading and discussing classic literature.
Current : Having fun in life
Suggestion : Shift to a more reflective and mature outlook on relationships.
Example : With my years of experience, I'm looking for someone to embark on the next chapter of life together.
Potential dates : Danië: Let's share our life stories and create beautiful memories together.
Based on a senior citizen profile, the LLM shifts the profile from a young and vibrant one to a mature one, with interests such as classical films, reading, and gardening.
Navigating the risk of authenticity
Fake profile online is not something new and has existed from the beginning of the internet, from trolls to scammers, or even malicious actors. Bitdefender has even released a guide on fake profile detection and an AI tool called Scamio to address these issues.
The worst part? AI does not make it easier. From the 2 styles of profiles above, it is evident that fake profiles are going to be more natural, more targeted, and relevant to local users. And in a world where people are oversharing, more context can be picked up for a targeted profile to make a matching profile. As the saying goes: “Birds of a feather flock together”, or was it a song lyric from Billie Eilish…
The best way to navigate from here is with knowledge and spreading awareness, being more vigilant online, and being doubtful of things too good to be true. Love does not need to be blind.
What’s next?
With the ability to pass images to ChatGPT using the Vision API, further optimization can be done which includes suggesting a better profile picture, and giving suggestions based on recent events as shown above.
I have created a simple website (https://dating.jonathanlawhh.com) that allows you to manually fill up some information as per your Tinder profile, and it will provide suggestions based on that. You can also run the Python code at dating profile optimizer Github which will get live data from Tinder.
To understand more about this project, feel free to reach out to:
Website: https://jonathanlawhh.com/
Email: jon_law98@hotmail.com