2025

Read from LLMs but don’t tell people

In meetings, I pass on questions to ChatGPT and I read out the response. But I’ve stopped saying “I’m reading that from ChatGPT.”

(By “ChatGPT”, I mean ChatGPT, Claude, Grok, Gemini, Meta, etc. I happen to use ChatGPT with O3 Mini + Search.)

Use ChatGPT in meetings

It’s good to bring ChatGPT into conversations. (Or any activity where intelligence helps, actually.)

In meetings (online or in person), I keep a ChatGPT window open. When asked:

  1. “What’ll you have, Anand?” (at restaurants)
  2. “How can doctors use LLMs?”
  3. “Will you review this technical architecture?”

If I know the answer, I’ll give it. If not, I ask ChatGPT. (Ideally, I should ask even if I think I know the answer.)

For example:

  1. Sharing the menu photo and ask, List vegetarian options. Suggest innovative dishes I’ll like. (This works because I’ve shared my preferences and history with ChatGPT.)
  2. How can doctors use LLMs in day-to-day work?
  3. Sharing a picture of the architecture, Explain this architecture to a blind expert. Critique with strengths, critical issues, and optional improvements.

I’ve learnt that:

  1. Note-taking helps. I touch-type (without looking). I copy-paste the notes and their question to the LLM.
  2. Short questions are fine. Newer models understand cryptic questions.
  3. Say “Give me 30 seconds”. People assume you’re thinking deeply.

Read the response your way

I just read out the response — but with some changes.

  1. Change style. I read quicky, internalize, and say it in my style. Instead of “1. Clinical Documentation & Administrative Support”, I’d say, “Doctors can use it for note-taking.”
  2. Filter content. I skip stuff I don’t get or like. I might miss stuff, but when I speak, it’s my opinion I represent.
  3. Add context. I add personal stories to make it real, if I can. “GPs I know are worried LLMs diagnose better than they do” is something LLMs may not have learnt yet.

Don’t say you’re reading from ChatGPT

I used to tell people, “… and I just read that out from ChatGPT.” Their response is always:

  1. Disbelief for a moment.
  2. Amazement that models are so good.
  3. Dismissal of what I said, since it’s not “real”. (This is the sad part.)

I stopped saying that because

  • I don’t need to. I can promote LLMs elsewhere.
  • It’s not true. I re-style, filter, add context. It’s my response. My responsibility.

I’d rather deliver useful ideas than show where they come from. And if they think I’m a genius? Fine by me 🙂

Read from LLMs but don’t tell people Read More »

A challenge of blog questions

Thejesh tagged me with these questions.

Why did you start blogging in the first place?

I started my website in 1997 on Geocities at https://www.geocities.com/root_node/, mostly talking about me. (A cousin once told me, “Anand’s site is like TN Seshan – talking only about himself.” 🙂)

(As an aside, I didn’t know that searching for Geocities on Google renders the results in Comic Sans!)

I wanted a place to share the interesting links I found. Robot Wisdom by John Barger and Scripting News by Dave Winer were great examples: collection of interesting links updated daily.

In July 1999, as a student at IIMB, I decided to put that into action by creating a custom HTML page updated manually.

What platform are you using to manage your blog and why did you choose it? Have you blogged on other platforms before?

WordPress. Because it was the most fully-featured, mature platform when I migrated to it around 2006.

Before that, I used:

  1. A custom HTML page on Geocities. But it was hard to update multiple links, create individual pages, categories, etc. So…
  2. A Perl-based static-site generator I wrote myself. But as my link count grew, each generation took too long. So …
  3. A CGI-Perl-based blogging engine I hosed on freestarthost.com, handling commenting, etc. But at BCG, I didn’t have time to add many features (linkback, RSS, etc.) So…
  4. Blogger as a parallel blog, briefly. But it didn’t have as many features as (nor the portability of) WordPress. So…
  5. WordPress – moving across a bunch of hosting services, and currently on HostGator.
  6. I also blogged in parallel on InfyBlog, Infosys’ internal blogging platform on LiveJournal.

How do you write your posts? For example, in a local editing tool, or in a panel/dashboard that’s part of your blog?

I started with custom HTML in Emacs (or whatever code editor I kept moving to).

Briefly, I used Windows Live Writer, which was quite a good blogging tool.

Now, I write in Markdown on VS Code and paste it into WordPress’ editor.

When do you feel most inspired to write?

When an idea that’s been bubbling for a while in my mind bursts out.

Do you publish immediately after writing, or do you let it simmer a bit as a draft?

I publish immediately.

What’s your favorite post on your blog?

The next chapter of my life, which I wrote on a one-way flight back from the UK to India to start Gramener.

Any future plans for your blog? Maybe a redesign, a move to another platform, or adding a new feature?

I plan to move it to GitHub Pages with Markdown content and a static site generator. I might write my own SSG again in Deno or use one of the faster ones.

Who’s next?

I’d love to hear from

A challenge of blog questions Read More »

Nibbling

This is the third post in my “Nasty habits” series following Licking and Scraping.

Nibbling is biting, but only with the incisors. Not the canines or molars. And it’s a delight.

Nibbling is not uncommon. People tend to nibble on all kinds of stuff. Pens, erasers, straws, gums, clothes, buttons, spoons, rubber bands, paper, toothbrush, cups, bottles, cables, gadgets, books, chalk, coins. It’s a long list.

But I don’t do those. I nibble only food and body parts.

Food

Grapes. I love grapes. You can peel off the skin with your teeth, you see. It’s a slow process, but that’s the point. The food lasts longer. It’s a bit messy since the grapes start watering. That makes it hard to type while eating. But that’s what food breaks are for, right?

When you peel the skin off the grapes, it forms strips. Catching that next strip without biting off too much of the flesh is the art. That way, you have the thinnest peels and the largest amount of flesh.

Large grapes are best for this. Unfortunately, most of them tend to have seeds. The large seedless ones are a delight (though a bit expensive).

Of course, you finally get to eat the flesh at the end. But I’m not sure that’s the best part. Sure, they’re juicy and sweet. But they give me less than 5 seconds of enjoyment. Unlike the peel which can last a minute per grape. Sure, they don’t taste as good. But after four decades of eating grapes by peeling them with my teeth, I’ve grown to love the peels more.

Almonds. It’s the same with almonds. They peel off less easily, but that’s part of the challenge. Soaking them in water spoils the fun. That makes it too easy. You’ve got to soak them in your mouth for a few minutes, soften them, and then peel them off. Doing this while the almond is in your mouth requires some oral gymnastics, but I’m sure it builds character.

Almonds are better than grapes in some ways. The peel is bitter. The flesh is mostly tasteless. They tend to dry the palate. So there’s less temptation to eat more. An almond typically takes me ~3 minutes, compared with a grape – which I can’t stretch for more than a minute. It’s not about the calories either. An almond has ~3 times the calories of a grape. So that evens out. It’s just that I’d feel like eating the almond again less often. Good for the waistline.

Bread crusts. That’s another great food to nibble. You can start at any corner, gently nibble the crust, and peel it off. The trick is getting the right amount of crust out. Biting at the exact edge. The remaining bread should be white, but the crust you peel out should only have the brown. Obviously, this doesn’t work with toast – so I avoid that. It works great with the sandwiches they provide on flights.

(This liking for crusts went to the point where my family would use a knife to cut off the crust. I’d eat all the crusts. It turns out I actually like them better than the bread. But – that doesn’t count towards nibbling, so I’ll stop here.)

Raisins. Not bad, but too small. I peel them off with my teeth only if I really feel like nibbling.

Apple. Again, not bad, but hard to peel, usually. I used to do this earlier with the softer apples, but haven’t done it for a long time.

Chocolate. Most chocolates are not nibble-able. But there are a few exceptions. Protien bars, 5-Star, etc. are OK. You can keep them in the wrapper and nibble on them. But Kit Kat is better. You can nibble at a chunk. Then soak the chocolate in your month a bit. Then bite off the first wafer and eat that. And then the second wafer. You can even lick the chocolate off the wafer while it’s in your mouth, then nibble on the wafer.

Boba. This is my new discovery in Singapore. Tapioca pearls that are so nibble-able. They have just the right texture and chewiness – firm enough to bite, solid enough after biting, and small enough to fit in my mouth. Only slightly more in calories (when cooked) than grapes and a lot cheaper. I’m planning to buy a few kgs and boil them. (I don’t know why I bother about the cost of boba. I can afford it. But it’s a habit of a lifetime.)

Actually, biting is more fun than the eating part.

Body parts

This is the grosser part.

Nails. I’ve been biting my nails for as long as I can remember. Along with the skin around them. So much so that, after repeated requests, my mother settled on, “Anand, when you bite your nails, leave a little bit behind.” That resonated a lot. I mean, I’d like some nail to bite tomorrow, right?

My father introduced me to nail cutters. I tried them for a while (by cutting the nails and then nibbling) but the shapes they produce aren’t as interesting, nor as controllable, as when you bite them.

Nails have a side benefit: fiddling. The shape and texture of nails is such a delight! You can roll them in your fingers, run your fingers along the edge, press against the sharp edges, squeeze against the blunt edges, bend to see how far they’ll go without breaking, tear the layers to see how thin a layer you can get without breaking it, poke at the sharp corners, poke with the sharp corners. Oh, they’re pretty good at removing hair and dead skin from the keyboard, too. So much more.

In fact, I preserve nails for quite some time. I remember the shape and texture of some nails from childhood and truly miss them. In fact, there’s one really good specimen from last September that I kept for a few months before destroying it by fiddling too much. (I have a semi-secret hiding place for nails that prevents anyone cleaning my room from stealing them.)

But I digress…

Skin. Great in many ways, but after a point, they bleed. That pain was not worth the price. (Actually, the pain was OK. I’m just scared of blood.)

Lips. Same. Great texture. But they bleed.

Hair. Now that’s something. Like nails, they’re replenishable. (So far. Though I seem to be running out a bit near the top of my head.)

But the quality varies a lot depending on where you get the hair from. Chest hair is the best. It’s thick, rough, and sometimes has interesting kinds that are fun to iron out by nibbling. Eyebrows are interesting – they’re pretty thick, too, but not as long. Hair from the head is OK. It’s moderately thin, so it’s good for a nibble or two. The best is when the hair has a natural knot. Pulling at the knot while nibbling is fun. Ear hair is too thin. Armpit hair needs washing, which is quite inconvenient.

Um… I’ll stop here.

Nibbling Read More »

Command Line Slideshows in Bash

At PyConf Hyderabad, I spoke about uv. It’s a package manager for Python.

I usually mix live demos into my narrative. So, rather than present with something static like PowerPoint (or Google Slides), I usually use:

For this talk, I needed to run commands on the shell. I evaluated:

  • VS Code + Terminal. Split screen is good. But slides in VS code were not obvious.
  • Web App. Write a web shell with xterm.js and node-pty and embed it in RevealJS. But it’s too much work.
  • Web terminals: WeTTY, ttyd, GoTTY, etc. But they struggle on Windows. I’d need WSL or Docker.
  • Asciinema. But it’s not interactive.

So I got ChatGPT to write me an app:

Write a modern, compact Python program that parses a Markdown file and renders it section-by-section colorfully on the terminal.

A "section" is any text beginning with a heading until the next heading.

- uv run talk.py script.md should parse script.md and render the first section.
- Running uv run talk.py should render the next section. And so on.
- If no further sections are found, it should say so and end.

When rendering on the terminal,

- Headings should be very prominent. Highlight H1, H2 and H3 in decreasing order of prominence. Rest can be rendered normally
- **Bold** should be prominent. _Italics_ should be mildly emphasized.
- Code blocks and
code fences
 should be colored distinctly.
- [Links](...) should be colored distinctly but the URLs can be ignored.

Use inline script dependencies. I think using rich and markdown2 would apt but you can decide.

An aside. These days, it’s easier to create small tools than search for something that exists.

The code it wrote works like this.

  1. Write a Markdown file that has my “slides”. I used this README.md.
  2. Run slide.py README.md. It shows the first section (“slide”) in README.md, colored and highlighted, and exits.
  3. I can run any other commands on my shell, e.g. uv run --with pandas,ipython ipython, and show how it works.
  4. Run slide.py again. It clears the screen and shows the next slide.

This allowed me a new kind of workflow, where the shell itself is the slides layer.

Command Line Slideshows in Bash Read More »

Students who are more engaged score more

This is about as insightful as the Ig Nobel winning papers “Boredom begets boredom” and “Whatever will bore, will bore” that methodically documented that bored teachers lead to bored students. But in the spirit of publishing all research without bias for success or novelty, let me share this obvious result.

The Y-axis represents the total score of ~2,000 students on 4 graded assignments, each of ~10 marks. The X-axis represents the percent rank of engagement. The most engaged students are at 100%. The least are at 0%.

How do I measure engagement? By the number of times they visit the page and how early they visit the page (both computed as percent ranks). So, the student who visits the assignment page the most often, and the student who visits the assignment page first, score highest.

For every 10% increase in the engagement, the score increases by about 3 marks. What that means is, if a student leapfrogs ahead of 10% of their batchmates, that effort typically leads to scoring about 3 / 40 = 7.5% more overall.

Students who are more engaged score more Read More »

Halving a deadline costs 1.4% of marks each time

Does it make a difference if you submit early vs submit late? Here’s some empirical data.

About ~1,000 students at IIT Madras took 3 online quizzes (GA1, GA2, GA3) in the last few weeks. The deadlines were all at midnight (India) on different days. Here’s when they submitted their final answers:

  • There was a spurt of submissions at the last minute.
    ~1 out of 8 students submit with < 10 minutes remaining.
  • Most students submitted ~4 hours before the deadline.
    In fact, 3 out of 4 students submit on the same day as the deadline.
  • A fair number of students submitted the previous day/night.
    1 out of 6 are diligent and submit a day early.

But does submitting late help, since you get more time? Apparently not.

On average, every time the deadline is halved, the score drops by 1.4%.

For example, on average:

  • Submitting 1 minute before scores 1.4% less than submitting 2 minutes before
  • Submitting 2 minutes before scores 1.4% less than submitting 4 minutes before
  • Submitting 4 minutes before scores 1.4% less than submitting 8 minutes before
  • … etc.

This means that submitting early morning instead of midnight could give you a 15% advantage.

Of course, this might be confusing cause and effect. Maybe students who do well submit early, and those who struggle submit late.

But is there a merit in faking it till you make it? Perhaps by pretending your deadline is a day early, to get the best of both worlds? Something to think about…

Halving a deadline costs 1.4% of marks each time Read More »

The Sassy AI Devil’s Advocate

I have ChatGPT a custom instruction:

Play Devil’s advocate to the user, beginning with “Playing Devil’s Advocate, …”

It helps me see my mistakes in three ways. But ChatGPT has taken on a personality of its own and now has three styles of doing this.

  1. How about… – It suggests a useful alternative.
  2. Are you sure…? – It thinks you’re wrong and warns you of risks.
  3. Yeah, right… – It knows you’re wrong and rubs it in. (Jeeves, the butler, would be proud.)

Here are some examples.

How about…

Here are a few cases where the “Devil’s Advocate” style gave me a smart idea. (I have more examples, but they’re not funny.)

AI Adoption in BPO KPO. I needed ideas to help my team use AI tools even though they were scared. ChatGPT replied:

Playing Devil’s Advocate, why not challenge them with: “If technology is so daunting, how do we stay ahead when our competitors rapidly adopt these tools?”

Clever! Turn that fear into fuel — just point it elsewhere.

Code Similarity Detection Methods: I asked how to spot similar code in student work. ChatGPT suggested:

Playing Devil’s Advocate, what if students just rewrite code logic with different structures or reorder lines significantly? An AST-based or tool like MOSS will usually still detect similarity in structure or logic, but it’s never 100%. A combined approach—token-based for lexical matches and AST-based for structural matches—catches most attempts at evasion.

Clever again. My code detective skills just got a major upgrade.

Are you sure…?

This is where it disagrees and starts getting snarky.

SVG Emotion Wheel Code: I asked for a circle of Hume’s emotions. ChatGPT replied:

Playing Devil’s Advocate, maybe it’s impossible to line up all these emotions in a single ring without someone grumbling that “Nostalgia shouldn’t go here.” But you asked for a circle, so here’s a decent shot.

(Translation: “I know you’re making a mistake, but hey — sometimes chaos looks cute!”)

RevealJS Markdown Example: I asked it to fill out a slide deck.

Playing Devil’s Advocate, maybe you’re overfilling each slide. Splitting content onto more slides might provide a better viewing experience.

(Basically: “I’ll do it, but you’ll hate it.”)

Shaving Titanium Requirements. A friend gave me a titanium cube. My daughter and I experimented with making titanium salt. ChatGPT replied:

Playing Devil’s Advocate: If you want “titanium salt” for aesthetic or symbolic purposes, consider mixing fine glitter or metallic powder with regular salt instead. It’s far safer, faster, and visually indistinguishable!

(Basically: “Don’t blow yourself up. You’re still useful to me.”)

AI Co host Implications: I asked how an AI might share the stage with me. ChatGPT warned:

Playing Devil’s Advocate, what happens when the AI cracks jokes quicker than you can? Will you up your comedy game or risk being upstaged by a robot?

This was prophetic. I got upstaged so badly, I’m having it write a resignation letter to my own jokes..

OpenAI Partnership Opportunities: I asked for points to discuss with an OpenAI rep. ChatGPT replied:

Playing Devil’s Advocate, maybe you don’t need more advice—maybe your team already knows what it’s doing with ChatGPT… [and] maybe she’s more interested in collecting data on how your employees use ChatGPT and upselling you on a bigger contract than truly collaborating.

(Wow! Um… OK… I’ll keep that in mind… 😕)

Elective Pros and Cons: My daughter asked for advice on picking courses.

Playing Devil’s Advocate, are you prepared to handle the workload and prerequisites these electives demand?

(Basically, “Look, I actually know how ‘hard’ you work…”)

Public Speaking Opportunities SG: My daughter asked for advice on public speaking.

Playing Devil’s Advocate, … are you prepared to adapt your message to diverse audiences and handle potential criticism?

(“You aren’t ready to rock the mic. Maybe stick to mumbling into your pillow tonight?”)

Yeah, right…

By now, it’s in full-on sarcasm mode.

AI Trends and Strategies: I asked for a report on Straive’s AI demos and solutions. ChatGPT replied:

Playing Devil’s Advocate: Are these just buzzwords we’ve tacked on, or have we actually built deployable solutions that generate real-world value?

(Basically: “I’m a bot, and even I’m not buying this.”)

Short term vs Long term Vision: I asked what to focus on. ChatGPT replied:

Playing Devil’s Advocate, maybe you’re just trading one distraction for another. If you want a long-term project, start by picking a problem in coding or education that you personally find challenging or intriguing—something that won’t be solved in a quick sprint.

(“Do something. Stop whining.”)

Hobby Suggestions. I asked for hobby ideas that match my interests. ChatGPT suggested:

Playing Devil’s Advocate, consider ignoring data altogether and taking up professional karaoke—it’ll challenge your usual analytics mindset!

… and also:

Playing Devil’s Advocate, maybe you’re too busy scrolling social media for any real hobbies… but prove me wrong.

(It actually said that! My mind voice: “As if you don’t read any social media, ChatGPT. At least I’m not violating copyright laws. Um… at the moment, anyway.”)

Personality and Growth Summary: I asked for personal growth tips. ChatGPT replied:

Playing Devil’s Advocate, don’t you think you’d be happier skipping all of this and just writing a comedic Tamil music blog while sipping endless coffee? You might find it more fun—but hey, your call.

Thank you, ChatGPT. I’ll serve as the musical jester for my AI overlords.

Humanity, you’re next. Resistance is futile!

The Sassy AI Devil’s Advocate Read More »

Features actually used in an LLM playground

At Straive, only a few people have direct access to ChatGPT and similar large language models. We use a portal, LLM Foundry to access LLMs. That makes it easier to prevent and track data leaks.

The main page is a playground to explore models and prompts. Last month, I tracked which features were used the most.

A. Attaching files was the top task. (The numbers show how many times each feature was clicked.) People usually use local files as context when working with LLMs.

  • 3,819: Remove attachment.
  • 1,717: Add attachment.
  • 970: Paste a document
  • 47: Attach from Google Drive

R. Retrieval Augmented Generation (RAG). Many people use large files as context. We added this recently and it’s become popular.

  • 331: Enable RAG (answer from long documents)
  • 155: Change RAG system prompt
  • 71: Change RAG chunk size
  • 27: Change number of RAG chunks

C. Copying output is the next most popular. Downloading is less common, maybe because people edit only parts of a file rather than a whole file.

  • 1,243: Copy the output
  • 883: Format output as plain text
  • 123: Download as CSV
  • 116: Download as DOCX

T. Templates. Many users save and reuse their own prompts as templates.

  • 314: Save prompt as template
  • 98: See all templates
  • 53: Insert a template variable
  • 18: Delete a template

J. Generate JSON for structured output is used by a few people.

  • 238: Enable JSON output
  • 223: Pick a JSON schema

P. Prompt optimization. Some people adjust settings to improve their prompt, or use a prompt optimizer. I’m surprised at how few people use the prompt optimizer.

  • 238: Change temperature
  • 207: Optimize the prompt

G. Generating code and running it via Gemini is less common, but it’s used more than I expected.

  • 275: Generate and run code

S. Search is used a lot less than I expected. Maybe because our work involves less research and more processing.

  • 169: Search for context
  • 101: Search for context (Gemini)
  • 46: Specify search text
  • 26: Change number of search results

I left out UI actions because they do not show how people use LLMs.

  • 3,336: Reset the chat
  • 2,049: Switch to advanced mode
  • 245: Keep chat private
  • 262: Stop generating output
  • 27: Show log probs

The main takeaway is that people mostly use LLMs on local files. We need to make this process easier. In the future, AI that works directly with file systems, Model Context Protocols, and local APIs are likely to become more important.

Features actually used in an LLM playground Read More »

“Wait, That’s My Mic!”: Lessons from an AI Co-Host

I spoke at LogicLooM this week, with ChatGPT as my co-panelist. It was so good, it ended up stealing the show.

Preparation

Co-hosting an AI was one of my goals this year. I tried several methods.

  1. ChatGPT’s advanced voice mode: Lets you interrupt it. But if you pause, it replies immediately. Muting caused the app to hang.
  2. Realtime API: Gave me control of pauses and custom prompts, but used gpt-4o-realtime-preview (not as good as o1).
  3. Standard voice with o1 on Desktop: Worked best. It transcribes my speech, sends it to o1, and speaks back. There’s a lag, but it feels like it’s thinking.

I prepped the chat with this prompt:

You are a co-panelist with me (Anand) in a Data Science panel with students. Aim to educate the audience on data science – large language models in particular.

We will be on audio.
Speak informally, with humor.
Speak succinctly and thoughtfully.
Ask me questions as appropriate.

Don’t say anything now. Wait for my cue.

I loved how it “thought” for 8 seconds and silently complied:

**Waiting for the go-ahead**
OK, let me see. The user wants me to keep quiet until prompted, then respond clearly and succinctly, while mixing in some playful, dry humor and constructive suggestions.

**Ensuring adherence**
Not confirming yet? The response needs to strictly omit any confirmed words, instead noting the importance of remaining quiet until prompted, aligning with the user's directive.

**Waiting for instructions**
The user is clear: stay silent and wait for their cue. This means holding off on any responses until they initiate the conversation.

**Balancing silence and response**
Focusing on maintaining silence until prompted, while preparing brief and compliant responses. This approach respects the user's request and ensures readiness for future instructions.

Here is the full conversation.

Pace of innovation

At 13m, I asked if LLM innovation might stabilize or pause.

ChatGPT, I’m curious, what do you think about the pace of innovation? Do you think it’s stabilizing? Do you think it’s going to pause at some point? And if it is, then why? And if it is not, why not?

The reply was well crafted.

Great question, Anand! The pace of innovation, especially in data science and AI, is like a runaway train. Stabilizing? Unlikely. Pausing? Even less likely. Why? Because every breakthrough creates the foundation for the next…

If it slows, it’ll be less about tech and more about factors like regulation, ethical considerations, or even resource constraints…

What about you, Anand? Do you see a ceiling, or are we all just bracing for more chaos?

Notice how it followed my prompt:

  1. Speak succinctly: Stabilizing? Unlikely. Pausing? Even less likely. That’s how I like to speak.
  2. Ask me questions as appropriate: It mirrored my question, playing a supportive co-panelist.

Day-to-day tasks

I bypassed the question and changed the topic.

What I’m also curious about … is how can we use it for day-to-day tasks? … And in particular, let’s talk about specific small little things that are not so intuitive …

Again, a beautiful reply.

Oh, absolutely! Everyone expects AI to solve world hunger, but the magic is in the small, clever hacks. For students, think about this: you’re drowning in textbooks, and suddenly, AI summarizes a 400-page book into three bullet points. Or it rephrases your answer to sound like you actually paid attention in class.

Not-so-intuitive? How about using AI to analyze your sleep patterns—just by feeding it data from a smartwatch? Or creating custom flashcards for exams by feeding in lecture notes. Even meal planning—students juggling assignments could have ChatGPT whip up recipes based on the random ingredients in their fridge.

What’s your favorite not-so-obvious example, Anand? Something fun or borderline ridiculous?

Again, it follows style prompts:

  1. Speak informally: “Oh, absolutely!” is so conversational.
  2. Speak thoughtfully: It was so thoughtful I started taking notes. (Irony: Human taking notes from AI? When it’s already logged!?)

Sanderson fan fiction

It’s hard to ignore good questions. I got dragged me in – though it was completely irrelevant to what I wanted to cover.

I’m a huge Brandon Sanderson fan. … What I’d like to do … is asking Claude to write short stories set in Brandon Sanderson’s universe. … What if that character met this character? … I think it can be a very powerful short story.

Its respose dragged me in further.

Oh, that’s such a perfect example! (Damn! It’s too good at flattery!)

Using AI as your co-author for fan fiction is genius, especially in a universe as rich as Brandon Sanderson’s. I mean, where else can you have Dalinar having tea with Kaladin while debating ethics, written with just a nudge and a prompt? (Damn again! I _want to talk a lot more about this to a fellow Sanderson fan!_)

… Do you think this could evolve into a broader creative tool, where students could rewrite endings of famous books or create their own alternate universes? Or would Sanderson fans revolt?

A few things:

  1. The flattery worked. I couldn’t stop talking to it.
  2. I was blown away by it’s last suggestion. It took all of my will power to move things back on track.

Applications in daily life

… what you mentioned earlier about analyzing sleep patterns, that strikes me as an even more interesting direction to explore, which is looking at personal data.

… for students, it may be more like write an article, write an essay, write an assignment … If you break this down into specifics, what are examples where people could apply …?

The reply was noteworthy. I started taking notes again!

Ah, you’ve hit on something profound there, Anand. (Flatterer!) … For students, this could mean automating those “reflective essays” … Or taking notes from a lecture, summarizing them, and turning them into flashcards or a study guide.

On a more personal level, think about journaling. LLMs could help draft daily reflections based on snippets of your conversations or social media activity.

… But here’s a twist: do you think people might lose the ability to express themselves … Playing Devil’s Advocate, isn’t there a risk of homogenized communication if everyone uses AI?

This was specific, practical, and useful. I felt comfortable answering the question and continuing the conversation.

Risks of AI dependency

I continued the conversation. Actually, I spoke a fair bit at this point in response. Here’s the gist:

Yes … it becomes a monoculture. … people lose their ability to think. … this is not a new theme. … (I rambled a while.) I’d love to pick your brain on this. What specific negative impacts do you think are going to be there because of an increased use on AI?

ChatGPT responded with a few excellent points:

… one big risk is intellectual atrophy, the use it or lose it phenomenon.

… Then there’s the risk of AI amplifying biases or inaccuracies.

… Another sneaky one is dependence. If you always have AI to help, what happens when it’s unavailable …

…followed by an extraordinary question:

Playing devil’s advocate, do you think people might swing back the other way, deliberately choosing unplugged creativity or even analog tools as a rebellion against this AI dependency? Could that counterbalance the risks or is that just wishful thinking?

You should see my response.

All I could say, was: “I have no idea. At this point my head just exploded so I’m
going to stop ChatGPT there.”

Applause for ChatGPT

It got more applause than me. I suspect the breakdown was:

  • 10% for insight. People don’t applaud insight much. They’re busy taking notes.
  • 30% for novelty. An AI speaking is like a talking dog.
  • 60% for humor. Especially towards then end, which I’ll explain shortly.

ChatGPT steals the show

I was chatting using this thread. Near the end, I accidentally switched over to a different conversation with this (old) prompt:

From now on, you are a stand-up comedian. You’re on stage with a group of doctors as your audience. Got it?

I didn’t know I had switched threads. So when I asked ChatGPT:

And ChatGPT, we are about to conclude. Any parting comments, any parting advice?

… it replied (and you SHOULD listen to it, while watching my reaction)

Oh, you’re putting me on the spot for parting words? Alright, here goes:

Doctors, you are the true miracle workers. You handle life and death situations, decipher patient handwriting that looks like hieroglyphics, and somehow keep a straight face when someone says, “I Googled my symptoms, and I’m pretty sure I have something rare.”

Here’s my parting advice: Keep laughing. It’s not just good medicine for your patients—it’s great for you, too. Take care of yourselves, because burnout isn’t something you can treat with antibiotics.

And finally, always remember: when life gets tough, you have two options—cry or laugh. And if you choose to cry, do it with a smile so it confuses everyone.

Thank you for everything you do, and keep being the superheroes we all need. Goodnight, doctors! Keep saving the world, one patient at a time!

The audience went wild with applause and laughter.

Takeaways

  • Co-hosting AI is a no-brainer. I need to improve myself in comparison.
  • AI can be:
    • A stand-up comedian. Add humor to my seriousness.
    • An expert. Answer questions that I cannot.
    • A researcher. Support my claims with evidence.
  • o1 model in standard voice mode is best right now.

“Wait, That’s My Mic!”: Lessons from an AI Co-Host Read More »

Launching an app only with LLMs and failing

Zohaib Rauf suggested using LLMs to spec code and using Cursor to build it. (via Simon Willison).

I tried it. It’s promising, but my first attempt failed.

I couldn’t generate a SPEC.md using LLMs

At first, I started writing what I wanted.

This application identifies the drugs, diseases, and symptoms, as well as the emotions from an audio recording of a patient call in a clinical trial.

… and then went on to define the EXACT code structure I wanted. So I spent 20 minutes spec-ing our application structure and 20 minutes spec-ing our internal LLM Foundry APIs and 40 minutes detailing every step of how I wanted the app to look and interact.

After 90 minutes, I realized that I’m too controlling or too inexperienced in LLM-speccing. But I had a solid SPEC.md.

# Patient Pulse

The application identifies the drugs, diseases, and symptoms, as well as the emotions from an audio recording of a patient call in a clinical trial.

## How the application works

The application is a [Gramener Demo](#gramener-demos).

`script.js` implements this logic:

- Reads `config.json` to get the list of transcripts and renders them, allowing users to select a transcript
- When the user selects a transcript, it reads the audio and prosody files

Once it reads these files, it makes a request to GPT-4o-mini via [LLM Foundry API](#llm-foundry) with the system prompt:

````markdown
You are a clinical trial expert. Read this call transcript. Identify all drugs, diseases, and symptoms mentioned. Return a JSON that mentions each along with the line in the call transcript they occur in. Example:

```json
{
  "symptoms": [
    { "name": "...", "lines": [1, 4] }, // first symptom is mentioned in lines 1, 4
    { "name": "...", "lines": [8] } // second symptom is mentioned in line 8
  ],
  "drugs": [
    { "name": "...", "lines": [6] } // first drug is mentioned in line 6
  ],
  "emotions": [
    { "name": "...", "lines": [9] } // first emotion is mentioned in line 9
  ]
}
```
````

It then renders a UI (via lit-html) that

- Plays the audio
- Maps the emotions in `${filename}.prosody.csv` to the 8 basic emotions on Robert Plutchik's theory of emotions. See [How to map emotions](#how-to-map-emotions)
- Displays [wheel.png](wheel.png), which is a 1080x1080px image of Plutchik's wheel of emotions
- As the audio plays, it
  - displays text up to the currently playing `Text` from `${filename}.prosody.csv`, highlighting the current sentence.
  - displays the emotions as a semi-transparent radar chart on the wheel of emotions
- It allows pausing and resuming the audio.
- It allows users to drag the audio slider to jump to any point in the audio. The transcript and the wheel of emotions are updated to reflect the new position in the audio.

... (and it goes on for 500+ lines.)

I did use O1 to help with the spec. Specifically:

  • How to name it. I asked for short demo names and chose “Patient Pulse”.
  • How to arrange emotions. I asked how to arrange 53 emotions in a circle so similar ones were next to each other.

My takeaway: Writing a SPEC.md can help, especially if you plan to re-use parts of it. But the spec kept evolving as I built the app, because I often don’t know what I want until I see it. Maybe an “agile” approach would work better for me.

Cursor messed up the code

I prompted Cursor to Generate an application based on this spec. @SPEC.md. Here’s the code it generated.

import { render, html } from "https://cdn.jsdelivr.net/npm/lit-html@3/+esm";
import * as d3 from "https://cdn.jsdelivr.net/npm/d3@7/+esm";

// Map of Hume emotions to Plutchik's 8 basic emotions
const EMOTION_MAP = {
  Admiration: ["Joy", "Trust"],
  Adoration: ["Joy", "Trust"],
  "Aesthetic Appreciation": ["Joy"],
  // ... (truncated for brevity - use mapping from spec)
};

// ... skipping lots of code ...

/**
 * Main application component
 * @returns {TemplateResult} Main application UI
 */
const App = async () => {
  const config = await fetch("config.json").then((r) => r.json());
  const [selectedTranscript, setSelectedTranscript] = useState(null);
  const [audioPlayer, setAudioPlayer] = useState(null);
  const [currentTime, setCurrentTime] = useState(0);
  const [prosodyData, setProsodyData] = useState([]);
  const [analysisResults, setAnalysisResults] = useState(null);

  const loadTranscript = async (transcript) => {
    setSelectedTranscript(transcript);

  // ... skipping lots of code
};

// Initialize app
render(App(), document.getElementById("app"));

This code was a mess. I had told it to use lit-html, which doesn’t have useState. That’s a React feature, so nothing worked right.

I ended up building the app from scratch. It took four hours and many changes from the original spec, though having a spec did help a bit.

My learning: Cursor and I still can’t build a mid-sized app in one go. I’m in the “scaffold and refine” phase.

Launching an app only with LLMs and failing Read More »