# 🎓 Glide Tutorial - AI Assisted Data Entry

**URL:** <https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959>\
**Category:** Community Resources\
**Tags:** ai, chatgpt, openai, tutorial\
**Created:** [July 16, 2023, 5:41am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959 "2023-07-16T05:41:19Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Loqode](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/loqode/32/50217_2.png) [@Loqode](https://community.glideapps.com/u/Loqode)\
**Post date:** [July 16, 2023, 5:41am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/1 "2023-07-16T05:41:19Z")

</div>

[![](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/3X/e/c/ec4832601732c2cc4d6dcbb661a0843e324c205f.jpeg "🎓 Glide Tutorial - AI Assisted Data Entry (Huge Opportunity)") ](https://www.youtube.com/watch?v=LQydZM-xNuw)

What’s up Gliders!

In this video I introduce a concept called AI Assisted Data Entry. IBM estimates that US-based businesses are losing [$3.1 trillion dollars annually](https://hbr.org/2016/09/bad-data-costs-the-u-s-3-trillion-per-year) due to low-quality or incomplete data, so if we can turn even just a fraction of that low-quality, bad data into high-quality, accurate data… We can unlock a TON of value.

The problem is that everyone hates data entry, so I came up with a “Hybrid” solution that uses ChatGPT to select from a predefined set of answers, but allows human oversight & tweaking before submission.

I experimented quite a bit with JSON + Parsing, but for some reason Glide was caching the parsed JSON answers, which lead to “old” data being submitted on Add Row… Ended up using Regex to extract what I needed.

Anyhow, hope you find this valuable!

Cheers 🍿

---

<div class="post-metadata">

**Author:** ![Darren\_Murphy](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/darren_murphy/32/47326_2.png) [@Darren\_Murphy](https://community.glideapps.com/u/Darren_Murphy)\
**Post date:** [July 16, 2023, 6:07am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/2 "2023-07-16T06:07:01Z")

</div>

Fantastic! 👍  
Awesome job, mate. Incredibly clear and easy to follow.

Curious - do you ever see a race condition where the user specific column values are set before everything’s been extracted? Looks like it works fine in the video, although I’d be a little concerned about that. I guess if it ever did become an issue then a short wait or wait for condition would sort it out.

---

<div class="post-metadata">

**Author:** ![Loqode](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/loqode/32/50217_2.png) [@Loqode](https://community.glideapps.com/u/Loqode)\
**Post date:** [July 16, 2023, 6:48am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/3 "2023-07-16T06:48:40Z")

</div>

Thanks Darren! 🙏

I haven’t experienced that yet, but it’s a very valid concern… You could (_and probably should_) throw a Wait action in there to ensure all the values are present before Setting Column Values.

I initially had a “wait for condition” action in place that ensured one of the “Suggestion” columns had a value before continuing (so the wait time was a _small_ as possible instead of waiting for a pre-defined time) but while testing ChatGPT returned a slightly wonky response, which meant the value couldn’t be extracted properly, which in turn meant the column remained empty and the Wait for condition was not met…

So I kinda scrapped that and proceeded without it since I didn’t run into any errors.

But now that I think about it, you could probably create a column (or set of columns) that check for at least one or more responses being present before proceeding… Or just use a Wait for ~200ms or something extremely quick/unnoticeable.

Anyhow, thanks for watching! 🫡

---

<div class="post-metadata">

**Author:** ![Rosewebstudio](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/rosewebstudio/32/12261_2.png) [@Rosewebstudio](https://community.glideapps.com/u/Rosewebstudio)\
**Post date:** [July 16, 2023, 7:17am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/4 "2023-07-16T07:17:27Z")

</div>

Great job 👏 very powerful concept and use of AI.

If you have time (just a suggestion and understand if you don’t want to share) but it might be helpful to others see the prompt, message & regex syntax - so all the bits of the puzzle so they can replicate.

---

<div class="post-metadata">

**Author:** ![Loqode](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/loqode/32/50217_2.png) [@Loqode](https://community.glideapps.com/u/Loqode)\
**Post date:** [July 16, 2023, 8:01am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/5 "2023-07-16T08:01:51Z")

</div>

@Rosewebstudio Happy to share! We all level-up together 🚀

**System Prompt (Template Column):**  
AAA, BBB (etc) would be replaced by a joined list of values you’ve imported from another table. These act as a predefined/approved set of answers you want AI to select from, which in turn allows relation columns, data consistency, etc.

> You are WineGPT, the worlds best wine researcher and assistant. You return accurate and up-to-date information about wine based on wine reviews, information, descriptions, and articles.
> 
> You job is to follow the instructions below and return the desired information in the format specified.
> 
> For each category, a predefined list of answers is provided, and the number of desired results are specified. The results you return will either be a single answer, or a set of answers separated by a comma.
> 
> Do NOT include any whitespace between comma separated answers.
> 
> If you cannot find any information on the wine, search for another vintage. If you still cannot find any information, return “Wine Not Found”.
> 
> The wine will be specified, it’s your job to return the rest of the information for each category. Here’s the information you need to return:
> 
> Wine Type:
> 
> - Options: AAA
> - Return: 1
> 
> Visual Clarity:
> 
> - Options: BBB
> - Return: 1
> 
> … etc

**Message Prompt (Template Column):**  
In this case, all we’re doing is specifying the subject (wine) and then providing the format we want the response to be returned in. You could also make this JSON, then later “Transform” i.e. Parse that JSON, but i got funny cached results from time to time so I stuck to Regex, which is shown below. Same idea, different exectution.

> Wine = AAA
> 
> Return your answer in the exact format below:
> 
> WineType: answer  
> VisualClarity: answer  
> … etc

**Extraction Example (Extract Matching Text Column)**  
Then all we’re doing is isolating and extracting specific pieces of data so we can use/leverage them throughout the app. In this case, I’m select the Response that is generated by AI as the text, and then extracting the WineType from this text. The result would be (for example) “red” for this particular column.

> Text = Response  
> Regular Expression = (?\<=WineType: )(.\*)

---

<div class="post-metadata">

**Author:** ![ThinhDinh](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/thinhdinh/32/49_2.png) [@ThinhDinh](https://community.glideapps.com/u/ThinhDinh)\
**Post date:** [July 16, 2023, 9:09am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/6 "2023-07-16T09:09:23Z")

</div>

Have you found any cases that your response contain extra text that is not in the format that you requested?

---

<div class="post-metadata">

**Author:** ![AyS\_0908](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/ays_0908/32/27349_2.png) [@AyS\_0908](https://community.glideapps.com/u/AyS_0908)\
**Post date:** [July 16, 2023, 9:40am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/7 "2023-07-16T09:40:51Z")

</div>

Fantastic! And imagine how far you could go on this use case when we will be able to integrate from Glide with “chalGpt” Plugins & ‘code interpreter’ (there may have a way via Zappier…still looking)

Well done.

---

<div class="post-metadata">

**Author:** ![Loqode](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/loqode/32/50217_2.png) [@Loqode](https://community.glideapps.com/u/Loqode)\
**Post date:** [July 16, 2023, 9:41am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/8 "2023-07-16T09:41:19Z")

</div>

@ThinhDinh Not so far… It’s pretty consistent!

The only instances where my results are not “flawless” is when it:

1. Returns more than I’ve specified for a particular category where I’m requesting more than 1 answer (e.g. I request 6 aromas, and it returns 7 aromas).
2. Returns an answer immediately after the semi-colon without a space (e.g. “Topic:Answer” instead of “Topic: Answer”) which causes the regex to break. This could probably solved by requesting JSON then parsing it… But as I mentioned, I ran into some odd “caching” _esque_ issues where previous values (despite the JSON text field that they are Parsing being empty/cleared) were returning values from the previous JSON snippet when I added a new row.

---

<div class="post-metadata">

**Author:** ![Loqode](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/loqode/32/50217_2.png) [@Loqode](https://community.glideapps.com/u/Loqode)\
**Post date:** [July 16, 2023, 9:44am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/9 "2023-07-16T09:44:50Z")

</div>

But the great thing about this setup is that even if it only extracts 8/10 values from the response, you can still manually select the appropriate values for the 2 missing columns before submission, so it’s fairly accomodating even if the response isn’t perfectly formatted.

---

<div class="post-metadata">

**Author:** ![ThinhDinh](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/thinhdinh/32/49_2.png) [@ThinhDinh](https://community.glideapps.com/u/ThinhDinh)\
**Post date:** [July 16, 2023, 9:52am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/10 "2023-07-16T09:52:13Z")

</div>

> [@AyS\_0908](#):
>
> integrate from Glide with “chalGpt” Plugins & ‘code interpreter’ (there may have a way via Zappier…still looking)

As I told you in your post, if there’s no API to do so, you won’t be able to use it 😅

---

<div class="post-metadata">

**Author:** ![Rosewebstudio](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/rosewebstudio/32/12261_2.png) [@Rosewebstudio](https://community.glideapps.com/u/Rosewebstudio)\
**Post date:** [July 16, 2023, 10:54am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/11 "2023-07-16T10:54:13Z")

</div>

Excellent thanks for sharing - it’s all good learning 👏

---

<div class="post-metadata">

**Author:** ![AyS\_0908](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/ays_0908/32/27349_2.png) [@AyS\_0908](https://community.glideapps.com/u/AyS_0908)\
**Post date:** [July 16, 2023, 10:55am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/12 "2023-07-16T10:55:26Z")

</div>

Yes but I am digging 🙂  
Since OpenAi has open the gpt4 API ([GPT-4 API general availability and deprecation of older models in the Completions API](https://openai.com/blog/gpt-4-api-general-availability)), I am wondering if we can’t do something with zappier, webhooks etc… but since I don’t know anything to all of this, it’s only assumptions

---

<div class="post-metadata">

**Author:** ![ThinhDinh](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/thinhdinh/32/49_2.png) [@ThinhDinh](https://community.glideapps.com/u/ThinhDinh)\
**Post date:** [July 16, 2023, 11:42am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/13 "2023-07-16T11:42:30Z")

</div>

No, you can’t. The GPT-4 API only has access to the GPT-4 model itself. Plugins and Code Interpreter are different models in their ecosystem.

---

<div class="post-metadata">

**Author:** ![AyS\_0908](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/ays_0908/32/27349_2.png) [@AyS\_0908](https://community.glideapps.com/u/AyS_0908)\
**Post date:** [July 16, 2023, 12:39pm UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/14 "2023-07-16T12:39:05Z")

</div>

Arrggghh…

So, need to implement a partially manual workflow, right ?

Something like:  
. Glide button to ‘copy to clipboard’ (the csv link) \> open link (chatgpt)  
Then manually:  
. Paste the csv link  
. Select ‘code interpreter’  
. Copy the resulting pdf  
. Back to Glide, text entry component to paste the link to the pdf with the analysis…

---

<div class="post-metadata">

**Author:** ![gvalero](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/gvalero/32/1037_2.png) [@gvalero](https://community.glideapps.com/u/gvalero)\
**Post date:** [July 16, 2023, 4:20pm UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/15 "2023-07-16T16:20:14Z")

</div>

Great idea and solution!

I’ve never thought of an idea like this, but now I think I have 2-3 use cases for this.

Thanks for sharing all this.

Feliz día Marco!

---

<div class="post-metadata">

**Author:** ![erwblo](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/erwblo/32/75_2.png) [@erwblo](https://community.glideapps.com/u/erwblo)\
**Post date:** [July 16, 2023, 6:34pm UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/16 "2023-07-16T18:34:58Z")

</div>

Not yet!

---

<div class="post-metadata">

**Author:** ![AyS\_0908](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/ays_0908/32/27349_2.png) [@AyS\_0908](https://community.glideapps.com/u/AyS_0908)\
**Post date:** [July 17, 2023, 1:41pm UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/17 "2023-07-17T13:41:29Z")

</div>

Yeah, this is a new type of API called AMI: Application _Manual_ Interface 😉

---

<div class="post-metadata">

**Author:** ![ThinhDinh](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/thinhdinh/32/49_2.png) [@ThinhDinh](https://community.glideapps.com/u/ThinhDinh)\
**Post date:** [July 18, 2023, 12:40am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/18 "2023-07-18T00:40:43Z")

</div>

That’s too manual, to be honest. I wouldn’t like it as a user. I wouldn’t build any products until I’m sure an API is supported and is stable.

---

<div class="post-metadata">

**Author:** ![erwblo](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/erwblo/32/75_2.png) [@erwblo](https://community.glideapps.com/u/erwblo)\
**Post date:** [July 18, 2023, 7:49am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/19 "2023-07-18T07:49:22Z")

</div>

But isn’t it referring to this example? Where the API is stable but the results are not always perfect so the user can change whatever should be different?

---

<div class="post-metadata">

**Author:** ![AyS\_0908](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/ays_0908/32/27349_2.png) [@AyS\_0908](https://community.glideapps.com/u/AyS_0908)\
**Post date:** [July 18, 2023, 8:20am UTC](https://community.glideapps.com/t/glide-tutorial-ai-assisted-data-entry/63959/20 "2023-07-18T08:20:08Z")

</div>

Agree with you, but at this stage the product is… for me… so I can deal with it 🙂
