Understanding large language models