No-code AI: OpenAI MyGPTs, LlamaIndex rags, or LangChain OpenGPTs?
Tags: openai, llamaindex, langchain, nocode
Published: 2023-12-02 09:28:11

OpenAI recently released a beta feature named **My GPTs**, which allows anyone to easily customize a version of ChatGPT for a specific purpose. This opens the door to new uses of Large Language Models (LLMs) in creating specialized ChatBots. What I find innovative is the method of customizing GPT: by answering questions and giving instructions to ChatGPT, which then configures the bot. Now, anyone can create their own GPT without needing programming skills! This new no-code approach has been adopted by LlamaIndex, enabling anyone to create a custom bot that implements the Retrieval-Augmented Generation (RAG) pattern on a single document.

In this article, I'll explore how to create such a personalized GPT with OpenAI and then what the brand new **rags** and **OpenGPTs** projects from LlamaIndex and LangChain allow you to do similarly.

## 1. Customize a version of OpenAI ChatGPT

![OpenAI Logo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7knvtbueq6jdb38mgo7s.png)

Access to the "My GPTs" feature requires a paid account on OpenAI.

![OpenAI Explore](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l013k3wcy480b4ntxw8g.png)

### Create a GPT

Once logged in, you can explore public GPTs or create your own.

![My GPTs](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3ckcldqlo4046p07dbxe.png)

Click on 'Create a GPT' and answer the questions. For our example, we will create a GPT specialized in mudras (hand gestures), with its specific knowledge based on a PDF file.

![New GPT](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hw3em7zixjm7xw0zkp3r.png)

You can switch between the *Create* and *Configure* views to design your GPT.

![Configure View](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1v8g7412sjgyl4tlfnyl.png)

The *Configure* view allows you to change or refine the GPT name, description, instructions, and prompt examples.

### Implement RAG

This is where I uploaded the *mudras.pdf* file for my GPT to use in Retrieval-Augmented Generation (RAG).

![Document Upload](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6tbyw36b2brran51opyl.png)

You can test the GPT in the *Preview* panel and then publish it with private, unlisted, or public visibility.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/anste0y8ch87pqhh5lbb.png)

Start a new chat to use the GPT.

![New Chat](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9jhldn6kyy7ydc4fjw56.png)

After posing a question, you can see the GPT searching the document to provide an answer.

![Searching my knowledge](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iixyjo8sgyxic5o1v580.png)

Once the search phase is completed, the GPT displays its response.

![My GPT response](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dryijta9fb2kazpqlc3p.png)

### Add external API Calls

It's also possible to add actions to the GPT configuration. Let's add a call to an external API.

![My GPT new action](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/52660mvbll04suyzu1fq.png)

The schema I declared is as follows:

```json
{
  "openapi": "3.1.0",
  "info": {
    "title": "YogArkana",
    "description": "Get detailed instructions on a Mudra",
    "version": "v0.0.1"
  },
  "servers": [
    {
      "url": "https://deck.yogarkana.com"
    }
  ],
  "paths": {
    "/json/mudra/{name}Fr": {
      "get": {
        "description": "From the Sanskrit name of a mudra get the following elements in JSON format: name, description, directions, details, concentration and benefits",
        "operationId": "GetMudra",
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "description": "Name of the Mudra in Sanskrit, with the first letter in capital and the rest in Camel Case (remove spaces in the name). If not present at the end of the name append 'Mudra' with no space.",
            "required": true,
            "deprecated": false,
            "allowEmptyValue": false,
            "explode": false,
            "allowReserved": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "deprecated": false
      }
    }
  },
  "components": {
    "schemas": {}
  }
}
```

In summary, I instruct my GPT on how to call the YogArkana backend to get information on a specific mudra when provided with its Sanskrit name. Note that in the *description* fields, I give specific rules to format the API call properly.

We can test and debug the API call in the *Preview* panel.

![My GPT Preview](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3wv1666cb6uvmi62qwxs.png)

Here are some examples of debug information provided.

```json
[debug] Calling HTTP endpoint
{
  "domain": "deck.yogarkana.com",
  "method": "get",
  "path": "/json/mudra/{name}Fr",
  "operation": "GetMudra",
  "operation_hash": "44384b85e501956265a75d90b721b53a7bbe3efe",
  "is_consequential": false,
  "params": {
    "name": "ChinMudra"
  }
}
```
I can verify that the API call is well formatted and the *name* parameter is correctly formed.

```json
[debug] Response received
{
  "response_data": {
    "_id": "ChinMudraFr",
    "_rev": "4-0f815dcb8505d3257afbcc7cb2d71911",
    "sanskrit": "Chin Mudra",
    "lang": "fr",
    "translation": "Geste de la conscience",
    "type": "mudra",
    "order": 20,
    "quality": "Abandon au divin",
    "arcane": true,
    "directions": [
      "Joignez les bouts des indexes et des pouces de chaque main",
      "Les pouces et les indexes forment un cercle",
      "Gardez les trois autres doigts allongés",
      "Tournez les paumes vers le bas et posez les sur les genoux ou les cuisses",
      "Détendez les épaules et gardez la colonne dans son alignement naturel"
    ],
...
```
Then, I can review the response returned by the external API. Note that the information is in French, but the final answer is translated into English and summarized by the LLM.

Let's publish the new version of the GPT, and there we have it: a fully operational GPT called "Mudra Guru" created without writing a single line of code.

## 2. Do (almost) the same with rags from LlamaIndex

![LlamaIndex Logo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r6cpvyd8j6y6ntss45k2.png)

[LlamaIndex](https://www.llamaindex.ai) recently released the [rags](https://github.com/run-llama/rags/) project to create a similar experience. It's still in its early stages, but I couldn't resist testing it.

The installation is straightforward
```bash
git clone https://github.com/run-llama/rags.git && cd rags
pip install -r requirements.txt
```

### RAG with OpenAI GPT

After installing all dependencies, create the `.streamlit/secrets.toml` configuration file to store the OpenAI API key.
```bash
openai_key = "<openai_key>"
```
Then, run the application and navigate to the Web GUI.

```bash
streamlit run 1_🏠_Home.py
```

![rags Home](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pxm681tszld31cv83obb.png)

rags operates in three sequential steps.

Like with OpenAI's 'My GPTs', the first step is to explain in natural language what you want the ChatBot to accomplish. In my prompt, I mention the *mudras.pdf* file.

Here is the entire conversation I had to create the ChatBot:

```
rags: What RAG bot do you want to build?

me: Provide advice and detailed instructions on mudras based on 
the content on the mudras.pdf file

rags: Great, the content from "mudras.pdf" has been loaded 
successfully. Now, I can create a system prompt to generate advice 
and detailed instructions on mudras for you. Let's proceed with 
creating the system prompt.

What specific aspects of mudras would you like the advice and 
instructions to focus on? For example, are you interested in 
mudras for meditation, healing, or perhaps for specific health 
issues? Please provide me with a bit more detail so I can tailor 
the system prompt accordingly.

me: The use of mudras will be provided by the user

rags: The system prompt has been created successfully. Now, I can 
use this prompt to generate advice and detailed instructions on 
mudras as specified by the user.

Before we proceed to create the agent, would you like to set any 
specific parameters for the Retrieval-Augmented Generation (RAG) 
pipeline? For example, you can set the number of documents to 
retrieve or adjust the threshold for document relevance. Please 
let me know if you'd like to customize any settings.

me: no

rags: The agent has been created successfully and is now ready to 
provide advice and detailed instructions on mudras based on the 
content loaded from the "mudras.pdf" file.

If you have any specific questions or need information on 
particular mudras, feel free to ask, and the agent will assist you 
accordingly. Is there anything else you would like to do at this moment?
```

In step 2, "RAG Config", I can refine the proposed system prompt and change the LLM parameters. I just check the "Include Summarization" box and update the agent.

Here is the system prompt proposed by rags:
```
System Prompt:

"Utilize the provided tools to offer advice and detailed 
instructions on mudras. When responding to user queries, ensure 
that you always apply the information from the tools available. Do 
not provide responses without consulting these resources. Your 
guidance should be thorough and adhere to the details contained 
within the tools. Remember, the data source should not be 
explicitly mentioned in your responses; it is an implicit part of 
your analysis and the answers you provide."
```

Step 3 is the actual use of the ChatBot.

![rags Step 3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/07fwovow1z5lki7u38ya.png)

And there you have it! For now, rags is more limited than OpenAI's GPTs, supporting only a single PDF file for RAG and not offering actions, but it's still in its early stages. I anticipate many alternative open source solutions will soon adopt this no-code approach to setting up a ChatBot.

## RAG with a local LLM

But rags has another exciting feature: the ability to support different LLMs like Claude 2 or Replicate, as well as local models from Hugging Face!

So, let's modify our ChatBot to use the [Luna AI Llama2](https://huggingface.co/TheBloke/Luna-AI-Llama2-Uncensored-GGML) model for inference and the [BGE Small EN](https://huggingface.co/BAAI/bge-small-en) model for embeddings.

I downloaded the inference model myself and stored it in the rags directory due to its size, letting rags download the second, smaller model.

We need to install some new dependencies to enable rags to run the models locally.
```python
pip install transformers torch llama-cpp-python
```

We can now reconnect to the rags GUI and, in step 2, change the LLM configuration with the two models, adding the *local:* prefix.

![rags Local models](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/meefpan6rkzi61c2qmf6.png)

After moving to step 3, we can chat with our document using only local models!

![rags Chat local LLMs](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vic61yoo2xv7mxw6utcd.png)

Note that step 1 still uses OpenAI to configure the bot. It's also possible to modify this.

## 3. What about OpenGPTs from LangChain?

Let's nox delve into [OpenGPTs](https://github.com/langchain-ai/opengpts/) by the LangChain project. 

![LangChain Logo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h9qm6ace1c5k9m1sz2ay.png)

This new tool features a frontend developed in Typescript/React and a backend in Python. However, be mindful that its license is unique and prohibits providing hosted or managed services using the software. Additionally, contributing to the project requires signing a [Contributor License Agreement](https://forms.gle/bJtcHNhhWwarQf83A) and granting copyright to LangChain.

OpenGPTs, like rags, aims to facilitate the creation of custom GPTs without the need for programming. Users can simply select components and configurations. It utilizes the LangChain framework, offering options such as LLMS, vector databases, and various tools. One of its features includes content retrieval, alongside capabilities like external website searches.

A key difference from rags is OpenGPTs' ability to integrate tools into the custom GPT, enhancing it with specific functions. However, it does not support configuration through chat.

You can explore the solution online [here](https://opengpts-example-vz4y4ooboq-uc.a.run.app/), but let's proceed with a hands-on installation and test.

## Installation and configuration

The default installation is straightforward. Begin by cloning and installing the backend requirements:
```bash
git clone https://github.com/langchain-ai/opengpts.git && cd opengpts
```

Next, configure your license keys in the `.env` file. This step allows customization of the default setup and the choice of different vectorstores or LLMs, such as Azure OpenAI, Anthropic, and Amazon Bedrock. It's also necessary to provide API keys for certain tools:
```bash
OPENAI_API_KEY=your_secret_here
ANTHROPIC_API_KEY=your_secret_here
AWS_ACCESS_KEY_ID=your_secret_here
AWS_SECRET_ACCESS_KEY=your_secret_here
AZURE_OPENAI_DEPLOYMENT_NAME=your_secret_here
AZURE_OPENAI_API_BASE=your_secret_here
AZURE_OPENAI_API_VERSION=your_secret_here
AZURE_OPENAI_API_KEY=your_secret_here

TAVILY_API_KEY=your_secret_here
FIREWORKS_API_KEY=your_secret_here
YDC_API_KEY=your_secret_here
KAY_API_KEY=your_secret_here
```

Although it's possible to customize further, we'll stick to the default setup for this demonstration and just rovide our OpenAI key.

Now, create the docker containers for the backend:
```bash
docker compose up -d
```
This command initiates a Redis container for both vectorstore and configuration persistence, as well as the backend container.

Then, start the frontend:
```bash
cd frontend
yarn
yarn dev
```

OpenGPTs also offers an [API](https://opengpts-example-vz4y4ooboq-uc.a.run.app/docs) for building custom frontends or integrating with existing applications.

## Custom Bots creation and use

Navigate to http://localhost:5173/ to create and use your custom ChatBots. Configuring a new Bot involves setting various parameters and options.

![New Bot](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t96ggbjznsy9vmpir6df.png)

In my test, I selected the GPT-3.5 model, enabled the 'Retrieval' tool, uploaded two documents, and named my bot 'TS Bot'.

![Retrieval configuration](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xleuccw4xrhouvo2tyvo.png)

The logs confirm the Bot's creation and document ingestion into Redis:
```bash
opengpts-backend-1  | INFO:     172.22.0.1:56704 - "PUT /assistants/fbc5a3c7-ffc6-47b3-bb0d-0e6948269968 HTTP/1.1" 200 OK
redis               | 1:M 01 Dec 2023 21:51:46.611 # <search> creating vector index. Server memory limit: 13064253440B, required memory: 6308144B, available memory: 13063239320B
redis               | 1:M 01 Dec 2023 21:51:46.612 * <module> Scanning index opengpts in background
redis               | 1:M 01 Dec 2023 21:51:46.613 * <module> Scanning index opengpts in background: done (scanned=2)
opengpts-backend-1  | INFO:     172.22.0.1:56708 - "POST /ingest HTTP/1.1" 200 OK
```

Now, you can interact with your newly created bot.

![Chat with the new Bot](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6weutff97pqxz7puyziv.png)

OpenGPTs indicates the use of the Retriever tool, and you can view the response of the invoked function:

![Retriever result](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fl451y7rup7f8k0jf81z.png)

---
Here is a summary of the three solutions we covered in this article.

| **Custom GPT**                 | **[My GPTs](https://chat.openai.com/gpts/discovery)**      | **[rags](https://github.com/run-llama/rags)**              | **[OpenGPTs](https://github.com/langchain-ai/opengpts/)**                      |
| -------------------------- | ----------- | ----------------- | ----------------------------- |
| Platform/framework         | OpenAI      | LlamaIndex        | LangChain                     |
| License                    | Proprietary | Open Source (MIT) | Open with [limitations](https://github.com/langchain-ai/opengpts/blob/main/LICENSE) on usage |
| Supported models           | OpenAI      | OpenAI, Anthropic, Replicate, Hugging Face | OpenAI, Azure OpenAI, Anthropic  |
| Supported vectorstores     | OpenAI      | Simple Vector Store (default), LlamaIndex vectorstore (code) | Redis (default), LangChain vectorstores (code)  |
| Configuration through Chat | Yes         | Yes               | Not yet                       |
| Tools and actions          | Yes         | Not yet           | Yes                           |

In conclusion, the advent of OpenAI's **My GPTs**, LlamaIndex's **rags**, and LangChain's **OpenGPTs** projects marks a significant milestone in the democratization of AI technology. These platforms not only simplify the process of creating specialized ChatBots but also open up a world of possibilities for users without extensive programming knowledge. Through the intuitive interfaces of My GPTs, rags and OpenGPTs, we can now tailor ChatBots to specific needs, whether it's for detailed knowledge on mudras or any other niche topic.

As we continue to explore and expand the capabilities of AI, tools like My GPTs, rags and OpenGPTs will play a crucial role in shaping the future of personalized AI interactions. Stay tuned for upcoming features, and in the meantime, begin creating your own assistants!

The journey into the realm of customized AI has just begun, and the possibilities are as limitless as our imagination.