DEV Community

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

Posted on

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!

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!