DEV Community

Cover image for Easy LLM based text classification with instructor_ex
Byron Salty
Byron Salty

Posted on

3

Easy LLM based text classification with instructor_ex

I got lucky today.

Just as I was contemplating how to add grammar and spell checking to my Text-to-Image game, I read about a new library that I could use to solve both problems at the same time.

My game involves trying to find 5 missing words needed to complete a prompt phrase which was used to generate the original image. Every time there is a unique guess, I generate a new image to show the user if they were close. But if a user guesses a phrase that someone else guessed then I can pull the image from cache and don't need to pay for a new generation.

This means that spelling errors cost me money.

And since the target phrase is grammatically correct, any bad grammar is also a waste.

I was considering adding a dictionary to check words against, and I wasn't sure what to do about grammar checking...


Enter instructor_ex and LLMs

I'm a bit ashamed to admit that I didn't first jump to using an LLM to solve this problem - because the answer is pretty obvious now.

Why not just ask an LLM, which understands both grammar and spelling VERY well:
"Is the following phrase grammatically correct and spelled correctly?"

This is the exact type of question and use case that Thomas Millar's new library instructor_ex is designed to make easy.


Step 0 - Add Instructor to your project

Update your mix.exs deps

 defp deps do
    [
      ...
      {:instructor, "~> 0.0.2"},
      ...
    ]
Enter fullscreen mode Exit fullscreen mode

Add instructor and openai to your config:

config :instructor,
  adapter: Instructor.Adapters.OpenAI

config :openai,
  api_key: "sk-...8pj",
  http_options: [recv_timeout: 10 * 60 * 1000]
Enter fullscreen mode Exit fullscreen mode

Note You can tell from this config that OpenAI is not the only adapter and LLM you can use.


Step 1 - Create a Grammar classifier

Instructor follows the ecto schema pattern, which I believe could be extremely helpful for more complex use cases. In my use case, the effort was minimal and definition was pretty clear.

The one part that was a bit confusing was that the question being asked of the LLM is embedded in the @doc string for the schema. Here's my classifier:

defmodule GrammarClassification do
  use Ecto.Schema

  @doc """
  A classification of whether or not a provided phrase is grammatically correct and has correct spelling
  """
  @primary_key false
  embedded_schema do
    field(:is_correct?, :boolean)
  end
end
Enter fullscreen mode Exit fullscreen mode

Step 2 - Classify some text and get a result

I then wrapped the calling of the classifier in a simple helper function which follows the exact format from the example notebooks found in project:

defmodule Teleprompt.TextHelper do
  def is_correct?(phrase) do
    {:ok, %{is_correct?: result}} =
      Instructor.chat_completion(
        model: "gpt-3.5-turbo",
        response_model: GrammarClassification,
        messages: [
          %{
            role: "user",
            content: "Classify the following text: #{phrase}"
          }
        ]
      )

    result
  end
end
Enter fullscreen mode Exit fullscreen mode

Now I can simply call a single function, pass in a string of words, and receive a true/false response on whether or not it is spelled correctly and grammatically correct.

Hell yeah!

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more

Top comments (1)

Collapse
 
aaronblondeau profile image
aaronblondeau •

I would've never known about instructor_ex (or Instructor or instructor-js). Haven't been totally happy with LangChain's documentation and syntax so going to give those a look - thanks!

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more