Skip to contents

Classifies course objectives, session objectives and – where given – assessment items in one run, generating the same ids as map_course_to_sessions() and map_sessions_to_assessments() so that the result can be handed straight to check_level_consistency() alongside either mapping. Call it with the same inputs and course_id, or the ids will not line up.

Usage

classify_objectives(
  course_objectives,
  session_objectives,
  course_id,
  llmconfig,
  assessments = NULL,
  taxonomy = "blooms_revised",
  repeats = 1L,
  rationale = TRUE,
  verbosity = 1L,
  ...
)

Arguments

course_objectives

Character: Course objectives.

session_objectives

List of character vectors: Session objectives, named by session.

course_id

Character: Course identifier, used to build stable ids.

llmconfig

rtemis.llm::LLMConfig: Model configuration.

assessments

List of character vectors: Assessment items, named by assessment. Optional. Supplied here rather than classified separately so that both consistency checks read one table and no assessment can be scored against a taxonomy the objectives were not.

taxonomy

Character or Taxonomy: Classification scheme. See list_taxonomies().

repeats

Integer [1, Inf): Independent raters per item. Bloom coding disagrees between human raters at the adjacent-level boundary, so a single rater's level is a point estimate with no visible spread; repeats > 1 fills confidence and keeps every rating in ratings.

rationale

Logical: Whether to ask for a one-sentence justification.

verbosity

Integer [0, Inf): Verbosity level.

...

Additional per-call arguments forwarded to rtemis.llm::generate(), e.g. temperature, seed.

Value

Classification object, with one row per course objective, one per session objective, and one per assessment item where given.

What the model is asked

Each objective is classified in isolation, against the level ladder and its definitions. Two conventions are stated in the prompt because they are where Bloom coding otherwise drifts: the level reflects the cognitive work the objective requires rather than the verb it happens to use, and an objective naming several processes takes the highest one it genuinely requires. The verb the model keyed on is returned in verb, so a level that looks wrong can be traced to the word that produced it.

Author

EDG

Examples

if (FALSE) { # \dontrun{
  obj <- read_objectives("objectives.yaml")
  cfg <- config_Ollama("granite4.2:8b", temperature = 0, think = FALSE)
  b <- classify_objectives(
    obj[["objectives"]],
    obj[["sessions"]],
    course_id = "datasci213",
    llmconfig = cfg
  )
  m <- map_course_to_sessions(
    obj[["objectives"]],
    obj[["sessions"]],
    course_id = "datasci213",
    llmconfig = cfg
  )
  check_level_consistency(m, b)
} # }