Introduction
In this blog post, we present how to create OpenAI models within MindsDB. This example is a sentiment analysis where we infer emotions behind a text. The input data is taken from our sample MongoDB database.
Prerequisites
To follow along, install MindsDB locally via Docker or Docker Desktop.
How to Connect MindsDB to a Database
We use a collection from our MongoDB public demo database, so let’s start by connecting MindsDB to it.
You can use Mongo Compass or Mongo Shell to connect our sample database like this:
test> use mindsdb
mindsdb> db.databases.insertOne({
'name': 'mongo_demo_db',
'engine': 'mongodb',
'connection_args': {
"host": "mongodb+srv://user:MindsDBUser123!@demo-data-mdb.trzfwvb.mongodb.net/",
"database": "public"
}
})
Tutorial
In this tutorial, we create a predictive model to infer emotions behind a text, a task also known as sentiment analysis.
Now that we’ve connected our database to MindsDB, let’s query the data to be used in the example:
mindsdb> use mongo_demo_db
mongo_demo_db> db.amazon_reviews.find({}).limit(3)
Here is the output:
{
_id: '63d013b5bbca62e9c7774b1d',
product_name: 'All-New Fire HD 8 Tablet, 8 HD Display, Wi-Fi, 16 GB - Includes Special Offers, Magenta',
review: 'Late gift for my grandson. He is very happy with it. Easy for him (9yo ).'
}
{
_id: '63d013b5bbca62e9c7774b1e',
product_name: 'All-New Fire HD 8 Tablet, 8 HD Display, Wi-Fi, 16 GB - Includes Special Offers, Magenta',
review: "I'm not super thrilled with the proprietary OS on this unit, but it does work okay and does what I need it to do. Appearance is very nice, price is very good and I can't complain too much - just wish it were easier (or at least more obvious) to port new apps onto it. For now, it helps me see things that are too small on my phone while I'm traveling. I'm a happy buyer."
}
{
_id: '63d013b5bbca62e9c7774b1f',
product_name: 'All-New Fire HD 8 Tablet, 8 HD Display, Wi-Fi, 16 GB - Includes Special Offers, Magenta',
review: 'I purchased this Kindle Fire HD 8 was purchased for use by 5 and 8 yer old grandchildren. They basically use it to play Amazon games that you download.'
}
Let’s create a model collection to identify sentiment for all reviews:
Note that you need to create an OpenAI engine first before deploying the OpenAI model within MindsDB.
Here is how to create this engine:
mongo_demo_db> use mindsdb
mindsdb> db.ml_engines.insertOne(
{
"name": "openai_engine",
"handler": "openai",
"params": {
"openai_api_key": "your-openai-api-key"
}
})
mongo_demo_db> use mindsdb
mindsdb> db.models.insertOne({
name: 'sentiment_classifier',
predict: 'sentiment',
training_options: {
engine: 'openai_engine',
prompt_template: 'describe the sentiment of the reviews strictly as "positive", "neutral", or "negative". "I love the product":positive "It is a scam":negative "{{review}}.":'
}
})
In practice, the insertOne
method triggers MindsDB to generate an AI collection called sentiment_classifier
that uses the OpenAI integration to predict a field named sentiment
. The model is created inside the default mindsdb
project. In MindsDB, projects are a natural way to keep artifacts, such as models or views, separate according to what predictive task they solve. You can learn more about MindsDB projects here.
The training_options
key specifies the parameters that this handler requires.
- The
engine
parameter defines that we use the openai
engine.
- The
prompt_template
parameter conveys the structure of a message that is to be completed with additional text generated by the model.
Once the insertOne
method has started execution, we can check the status of the creation process with the following query:
mindsdb> db.models.find({
'name': 'sentiment_classifier'
})
It may take a while to register as complete depending on the internet connection. Once the creation is complete, the behavior is the same as with any other AI collection – you can query it either by specifying synthetic data in the actual query:
mindsdb> db.sentiment_classifier.find({
review: 'It is ok.'
})
Here is the output data:
{
sentiment: 'neutral',
review: 'It is ok.'
}
Or by joining with a collection for batch predictions:
mindsdb> db.sentiment_classifier.find(
{
'collection': 'mongo_demo_db.amazon_reviews'
},
{
'sentiment_classifier.sentiment': 'sentiment',
'amazon_reviews.review': 'review'
}
).limit(3)
Here is the output data:
{
sentiment: 'positive',
review: 'Late gift for my grandson. He is very happy with it. Easy for him (9yo ).'
}
{
sentiment: 'positive',
review: "I'm not super thrilled with the proprietary OS on this unit, but it does work okay and does what I need it to do. Appearance is very nice, price is very good and I can't complain too much - just wish it were easier (or at least more obvious) to port new apps onto it. For now, it helps me see things that are too small on my phone while I'm traveling. I'm a happy buyer."
}
{
sentiment: 'positive',
review: 'I purchased this Kindle Fire HD 8 was purchased for use by 5 and 8 yer old grandchildren. They basically use it to play Amazon games that you download.'
}
The amazon_reviews
collection is used to make batch predictions. Upon joining the sentiment_classifier
model with the amazon_reviews
collection, the model uses all values from the review
field.