Back Original

LLM use policy

Every word of prose on any of my websites, or GitHub top-level READMEs, or in any email or text I send, is written by me, personally, with my meat fingers and my organic brain.

That’s it, that’s the whole policy.

I’ve chosen the words in the policy carefully. In the rest of this piece I’ll say a little more about why I felt I needed a policy at all, and why I’ve phrased it exactly the way I have. If you read the rest of this page you may think I’m a pedantic language-lawyer. That may be so. The habits of mind that are encouraged by math and programming are cousin, perhaps even closer kin, to pedantic language-lawyering.

(I’m also a pretty serious plein-air painter, primarily making representational landscape paintings in gouache. Those are also made with my meat eyes and hands and so forth, but they’re made without any digital tools at all, so an LLM policy isn’t really necessary. You can see my work at my art website.)

For the rest of this document I’ll refer to all of the various modern generative AI/ML systems as LLMs.

I never use LLMs to stand in for me, in my communication with you

That’s why the policy is about websites, top-level READMEs, and messages I send. If you’re reading it and it purports to be from me, I promise it actually is from me, as if I said it to your face.

Hold me to that! Since I use LLMs as tools and for all kinds of automated wrangling of websites and code, I might accidentally end up with LLM prose somewhere it shouldn’t be. That’s a bug! Email me and I’ll apologize and fix it.

I use LLMs for programming, research, math and drawing figures

The stuff in this category isn’t prose, so the policy doesn’t apply.

LLMs are powerful tools that let me be more ambitious with what I can make and what I can learn. I can get to a deeper, more accurate understanding than was previously possible (for me). For example, when I was curious about a class of sampling algorithms, I used LLMs to do literature reviews, figure out if some paper was actually relevant to my problem, and look for more recent work that may have superseded it. I asked for implementations of alternative algorithms and a benchmarking setup to compare them. Some algorithms predated GPUs but I could see that the core step was parallelizable; can I have a WebGPU implementation? I learn better when there are visuals and interactivity, but I find it tedious to write plotting code.

I also find it tedious to write frontend code. My memory for CSS and Javascript framework minutiae is pretty bad. And yet, I like interacting with my projects through a nice UI! I used to be trapped in a terminal, and now I am free. (Or free-er. I still mostly interact with my computer from inside a terminal. Oh well.) Surely many of you are nodding along.

I’m happy to defend research uses of LLMs, because they ultimately feed into my thinking and understanding. I’m also happy to defend the use of LLMs for developing software systems, because I’m still ultimately responsible for their correctness. The situation is analogous but not identical to accepting other people’s PRs, or using a code generator, or a third-party dependency. If the binary has a bug then it’s my problem and it’s my fault.

The stuff in this category is prose, but it’s not on any of my websites, or project top-level READMEs, or in any message I send. So the policy doesn’t apply.

LLMs are great for understanding big complicated codebases, including ones I’ve written. When I’m using them for this I often ask for a variety of artifacts: high-level diagrams, descriptions of subsystems and how they interact, a brief history of the project, a summary of the most common kinds of bugs and feature requests, state machine diagrams of the key tricky algorithms or distributed systems stuff, dependency graphs, and so on. I often check these artifacts into the repository so I can look at them later, and also so that future LLM sessions can begin with them. These forms of documentation aren’t guaranteed to stay up-to-date, unlike types or tests or executable code samples. And they’re not guaranteed to be correct, unlike a TLA+ proof of a model of the system. But they’re often a better starting point than staring at the directory structure and filenames.

LLMs are also great for reading papers, following up on citations and finding references that have solved nearly the problem I’m interested in. I like that! I want to smash the problem with whatever tool I can use, and if someone else already made the tool then I want to proceed immediately to the smashing. There’s probably another nice problem right after this one; wouldn’t it be better to spend my time on that? When I’m using LLMs in this way, I’ll have them write summaries of their findings. These may find their way into my public repositories. That’s okay; they’re not supposed to be communication between myself and another human. They’re my notes.

But some code documentation is really human-to-human

A project’s top-level README isn’t really a description of how the code works, at least not primarily. It is a claim on your attention as a human to help you decide whether the project is interesting or useful for you. In a very real sense, it is as if I’m talking to you at work or at a party and describing my project to you. I’m talking to you, human. The README might contain a description of how the code works, if I think that’s important enough to be highlighted in an initial human-to-human contact. Some projects are about what they do, and others are about how they work. It depends. It’s my call to make. That’s why top-level docs are covered by the policy.

I use LLMs to generate images

My cooking blog has lots of generated images. They are quite obviously generated and aren’t attempting to fool anyone. All the jokes in the captions are written by me using an artisanal, secret, manual process.

During the writing process I might use LLMs for research and to check correctness

I’m careful with this. I don’t use LLMs to edit my prose, because I want to sound like myself. What is the value of authenticity, exactly? Maybe it’s a costly signal: I spent the time writing this, so it’s likelier to be worth your while to read it? I don’t think that’s quite right. I wouldn’t hire a human to clean up my writing (but maybe I should oops!). Maybe I value authenticity because it’s interesting and fun to be in congress, so to speak, with another living human.

But when I’m writing about math or science or programming, I do use LLMs to check for correctness. I’m careful with the prompt: the model is instructed to point out inaccuracies and omissions, and to produce arguments or citations that show me what’s actually right. But it must not rewrite what I’ve said into a corrected form that I’m supposed to copy-paste into the piece. That job is left to the token generator between my ears.

I sometimes ask LLMs for word choices, although I prefer to go to Webster’s 1913 dictionary first. For example, when I used the word “congress” above, I wanted to check that I was using it right. Webster’s 1913 confirmed both the innocent meaning – “a meeting of individuals, whether friendly or hostile; an encounter” – and the double-entendre I intended. Dictionaries and thesauri are perfect when you already have a word and you need something sharper, or with a better sound, or a different connotation. I use an LLM when I have a situation in mind that I can describe in a sentence but don’t have a precise word for. I think that’s okay; it’s as if I asked my friend, “Hey, what’s a word for when […]?”