Exposure Guide

exposureguide.ai

A platform attempting to make some of the more complex concepts that can help with changing social habits more accessible.

History

This originated as what was supposed to be an open source desktop tool that was intended to be shared around freely. The complexity in it however grew to a point that I felt it was worthwhile to productize it and convert it to a site since the logic had already all been worked out. It's still available for free on desktop however the niceties of having it on a mobile device make the web version worthwhile.

Interface

The interface attempts to fit a substantial amount of information in front of the user. As it originated as a desktop only application I hadn't considered the mobile interface. It was fun to find a mobile UI that allowed the same functionality as the desktop UI without removing anything, and I am quite happy with how it turned out. Splitting the mobile interface into a bottom control panel with tabs, and the top for displaying and selection resulted in an easy and intuitive experience. One important aspect I made sure was smooth was the keyboard control. The mobile interface requires you to press at the top of the phone at times, so making as much as possible of the flow work through just using the keyboard was important to keep things smooth.

Another key decision was abstaining from responsive design. Mobile and web interfaces have fundamentally different interface modes and I don't think it's appropriate to settle for a mediocre experience on both. I rely on initially setting device type on loading and locking the user into that.

AI Usage

I primarily rely on AI for two things in this:

Generation

Given certain user information and some desired result, generating possible things that might get the user to that result. The main issue with this was variation, AI given the same inputs will produce the same outputs so there is a requirement to vary the input adequately to ensure variation in the output.

I handled this multiple routes to ensure the variation.

For simple generations like places, every generation request includes your currently added generations along with implicitly rejecting any suggested generation you didn't accept. It uses those implicitly rejected ones as a negative prompt and the ones you did select as a positive one so every request will have a substantially different body. This type of generation is not persistent over a long time. There just may be at most 5-10 in one go so there isn't an issue with building up garbage context.

The more difficult generation was for the specific exposures. Originally my approach for this was coming up with some kind of scoring and difficulty system that evaluated different domains that might impact the difficulty of the result, then evaluating the user sensitivity per domain. Once this is generated for every exposure I generate random weighted values for the target difficulty, and based on these values include or remove certain phrases to guide the generation of the target. This worked decently however it still had an issue with too frequently generating exposures too similar to previous ones you've completed (It already included the regeneration negative prompts of rejected ones).

Including all previous exposures would needlessly pollute context, so instead I opted to turn places into IDs. They were originally just plaintext that could be edited, but creating a more regulated data type for them allowed me to key off of them so exposures were locked to a location. This means when you make a request for an exposure it can send in context every previous exposure you did at that location to ensure you are doing something different. These two things together effectively created adequate variation in the generation results.

Feedback

A common element throughout this app is the chat function. The point of it is primarily engagement and to guide the user. After the user submits results it provides some light feedback, which I think encourages the user to be more thoughtful about what they are submitting. There is a desire to type enough so you are actually conveying what you experienced so that it can be understood by the LLM. Another unanticipated but effective consequence of making the AI side chat such a focus is taking time to go through things. I did a ton of tweaking on how the messages stream in, the speed they stream in at, and how it shifts depending on your behavior. This makes it so that if you are rushing through things the chat window feels like it's rushing and you are pushed somewhat to slow down. Nothing actually requires that you do, but it does create that atmosphere.

Having the chat be aware how long it has been since their last engagement, being able to help them with planning in general is just about directing the users mind to something they might otherwise look over.

Conclusions

I am very happy with how it came out, and it accomplishes what I set out to do more effectively than I initially expected. Keeping users engaged and using it is a separate question which asks quite a bit of the user. I think it’s better overall to make tools that allow the user to grow rather than create a more accessible one that asks little of the user though. I hope to see more outcomes from it once I do some marketing for it which is a separate question.