A place to cache linked articles (think custom and personal wayback machine)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="fr">
  4. <!-- Has to be within the first 1024 bytes, hence before the `title` element
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset="utf-8">
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name="viewport" content="width=device-width,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>Poking around OpenAI. (archive) — David Larlet</title>
  13. <meta name="description" content="Publication mise en cache pour en conserver une trace.">
  14. <!-- That good ol' feed, subscribe :). -->
  15. <link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
  16. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  17. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
  18. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
  19. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
  20. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  21. <link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
  22. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  23. <meta name="msapplication-TileColor" content="#f7f7f7">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
  26. <meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
  27. <!-- Is that even respected? Retrospectively? What a shAItshow…
  28. https://neil-clarke.com/block-the-bots-that-feed-ai-models-by-scraping-your-website/ -->
  29. <meta name="robots" content="noai, noimageai">
  30. <!-- Documented, feel free to shoot an email. -->
  31. <link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
  32. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  35. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  36. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  37. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  38. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  39. <script>
  40. function toggleTheme(themeName) {
  41. document.documentElement.classList.toggle(
  42. 'forced-dark',
  43. themeName === 'dark'
  44. )
  45. document.documentElement.classList.toggle(
  46. 'forced-light',
  47. themeName === 'light'
  48. )
  49. }
  50. const selectedTheme = localStorage.getItem('theme')
  51. if (selectedTheme !== 'undefined') {
  52. toggleTheme(selectedTheme)
  53. }
  54. </script>
  55. <meta name="robots" content="noindex, nofollow">
  56. <meta content="origin-when-cross-origin" name="referrer">
  57. <!-- Canonical URL for SEO purposes -->
  58. <link rel="canonical" href="https://lethain.com/openai-exploration/">
  59. <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">
  60. <article>
  61. <header>
  62. <h1>Poking around OpenAI.</h1>
  63. </header>
  64. <nav>
  65. <p class="center">
  66. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  67. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  68. </svg> Accueil</a> •
  69. <a href="https://lethain.com/openai-exploration/" title="Lien vers le contenu original">Source originale</a>
  70. </p>
  71. </nav>
  72. <hr>
  73. <p>I haven’t spent much time playing around with the latest LLMs,
  74. and decided to spend some time doing so. I was particularly curious
  75. about the usecase of using embeddings to supplement user prompts
  76. with additional, relevant data (e.g. supply the current status of their
  77. recent tickets into the prompt where they might inquire about progress on
  78. said tickets). This usecase is interesting because it’s very attainable
  79. for existing companies and products to take advantage of, and I imagine it’s
  80. roughly how e.g. Stripe’s GPT4 integration with their documentation works.</p>
  81. <p>To play around with that, I created a script that converts all of my writing
  82. into embeddings, tokenizes the user-supplied prompt to identify relevant sections
  83. of my content to inject into an expanded prompt, and sent that expanded prompt
  84. to OpenAI AI’s API.</p>
  85. <p>You can <a href="https://github.com/lethain/openai-experiments/blob/main/corpus.py">see the code on Github</a>,
  86. and read my notes on this project below.</p>
  87. <h2 id="references">References</h2>
  88. <p>This exploration is inspired by the recent work
  89. by <a href="https://eugeneyan.com/writing/llm-experiments/#llm-tools-to-summarize-query-and-advise">Eugene Yan</a>
  90. and <a href="https://simonwillison.net/2023/Apr/4/llm/">Simon Willison</a>.
  91. I owe particular thanks to <a href="https://twitter.com/eugeneyan/status/1646336530695467010">Eugene Yan</a>
  92. for his suggestions to improve the quality of the responses.</p>
  93. <p>The code I’m sharing below is scrapped together from a number of sources:</p>
  94. <p>I found none of the examples quite worked as documented, but ultimately I was able to get them working
  95. with some poking around, relearning Pandas, and so on.</p>
  96. <h2 id="project">Project</h2>
  97. <p>My project was to make the OpenAI API answer questions with awareness of all of my personal writing from this blog,
  98. <a href="https://staffeng.com">StaffEng</a> and <a href="https://infraeng.dev/">Infrastructure Engineering</a>.
  99. Specifically this means creating embeddings from Hugo blog posts in Markdown to use with OpenAI.</p>
  100. <p>You can <a href="https://github.com/lethain/openai-experiments/blob/main/corpus.py">read the code on Github</a>.
  101. I’ve done absolutely nothing to make it easy to read, but it is a complete example, and you could use
  102. it with your own writing by changing <a href="https://github.com/lethain/openai-experiments/blob/main/corpus.py#L112">Line 112</a>
  103. to point at your blog’s content directories. (Oh, and changing the prompts on <a href="https://github.com/lethain/openai-experiments/blob/main/corpus.py#L260">Line 260</a>.</p>
  104. <p>You can see a screenshot of what this looks like below.</p>
  105. <p><img src="/static/blog/2023/openai-experiment.png" alt="Screenshot of terminal program running Github lethain/openai-experiment"></p>
  106. <p>This project is pretty neat, in the sense that it works. It did take me a bit longer than expected, probably about three hours
  107. to get it working given some interruptions, mostly because the documentation’s examples were all subtly broken or didn’t actually connect
  108. together into working code. After it was working, I inevitably spent a few more hours fiddling around as well.
  109. My repo is terrible code, but is a full working code if anyone
  110. else had similar issues getting the question answering using embeddings stuff working!</p>
  111. <p>The other comment on this project is that I don’t really view this as a particularly effective solution to the problem I wanted to solve,
  112. as it’s performing a fairly basic k-means algorithm to match tokenized versions of my blog posts against the query,
  113. and then injecting the best matches into the GPT query as context. Going into this, I expected, I dunno, something more
  114. sophisticated than this. It’s a very reasonable solution, and a cost efficient solution because it avoids any model (re)training,
  115. but feels a bit more basic than I imagined.</p>
  116. <p>Also worth noting, the total cost to developing this app and running it a few dozen times: $0.50.</p>
  117. <h2 id="thoughts">Thoughts</h2>
  118. <p>This was a fun project, in part because it was a detour away from what I’ve spent most of my time on the last few months,
  119. which is writing my next book. Writing and editing a book is very valuable work, but it lacks the freeform joy of
  120. hacking around a small project with zero users. Without overthinking or overstructuring things too much,
  121. here are some bullet points thoughts about this project and expansion of AI in the industry at large:</p>
  122. <ul><li>As someone who’s been working in the industry for a while now, it’s easy to get jaded about new things.
  123. My first reaction to the recent AI hype is very similar to my first reaction to the crypto hype:
  124. we’ve seen hype before, and initial hype is rarely correlated with long-term impact on the industry
  125. or on society. In other words, I wasn’t convinced.</li><li>Conversely, I think part of long-term engineering leadership is remaining open to new things.
  126. The industry has radically changed from twenty years ago, with mobile development as the most obvious proof point.
  127. Most things won’t change the industry much, but some things will completely transform it,
  128. and we owe cautious interest to these potentially transformational projects.</li><li>My personal bet is that the new AI wave is moderately transformative but not massively so.
  129. Expanding on my thinking a bit, LLMs are showing significant promise at mediocre solutions to very general problems.
  130. A very common, often unstated, Silicon Valley model is to hire engineers, pretend the engineers are
  131. solving a problem, hire a huge number of non-engineers to actually solve the problem “until the technology automates it”,
  132. grow the business rapidly, and hope automation solves the margins in some later year.
  133. LLM adoption should be a valuable tool in improving margins in this kind of business,
  134. which in theory should enable new businesses to be created by improving the potential margin.
  135. However, we’ve been in a decade of <a href="https://www.readmargins.com/p/zirp-explains-the-world">zero-interest-rate policy</a>
  136. which has meant that current-year margins haven’t mattered much to folks,
  137. which implies that most of these ideas that should be enabled by improved margins should
  138. have already been attempted in the preceeding margin-agnostic decade.
  139. This means that LLMs will make those businesses better, but the businesses themselves should
  140. have already been tried, and many of them have failed ultimately due to market size preventing
  141. required returns moreso than margin of operating their large internal teams to mask over missing margin-enhancing technology.</li><li>If you ignore the margin-enhancement opporunties represented by LLMs,
  142. which I’ve argued shouldn’t generate new business ideas but improve existing business ideas already
  143. tried over the last decade, then it’s interesting to ponder what the sweet spot is for these tools.
  144. My take is that they’re very good at supporting domain experts, where the potential damaged caused by
  145. inaccuracies is constrained, e.g. Github Copilot is a very plausible way to empower a proficient programmer,
  146. and a very risky way to train a novice in a setting where the code has access to sensitive resources or data.
  147. However, to the extent that we’re pushing experts from authors to editors, I’m not sure that’s an actual speed
  148. improvement for our current generation of experts, who already have mastery in authorship and (often) a lesser
  149. skill in editing. Maybe there is a new generation of experts who are exceptional editors first, and authors second,
  150. which these tools will foster. If that’s true, then likely the current generation of leaders is unable to
  151. assess these tools appropriately, but&amp;mldr; I think that most folks make this argument about most new technologies,
  152. and it’s only true sometimes. (Again, crypto is a clear example of something that has not overtaken existing
  153. technologies in the real world with significant regulatory overhead.)</li></ul>
  154. <p>Anyway, it was a fun project, and I have a much better intuitive sense of what’s possible
  155. in this space after spending some time here, which was my goal. I’ll remain very curious to
  156. see what comes together here as the timeline progresses.</p>
  157. <p class="mt6 instapaper_ignoref"></p>
  158. </article>
  159. <hr>
  160. <footer>
  161. <p>
  162. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  163. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  164. </svg> Accueil</a> •
  165. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  166. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
  167. </svg> Suivre</a> •
  168. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  169. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
  170. </svg> Pro</a> •
  171. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  172. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
  173. </svg> Email</a> •
  174. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  175. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
  176. </svg> Légal</abbr>
  177. </p>
  178. <template id="theme-selector">
  179. <form>
  180. <fieldset>
  181. <legend><svg class="icon icon-brightness-contrast">
  182. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
  183. </svg> Thème</legend>
  184. <label>
  185. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  186. </label>
  187. <label>
  188. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  189. </label>
  190. <label>
  191. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  192. </label>
  193. </fieldset>
  194. </form>
  195. </template>
  196. </footer>
  197. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  198. <script>
  199. function loadThemeForm(templateName) {
  200. const themeSelectorTemplate = document.querySelector(templateName)
  201. const form = themeSelectorTemplate.content.firstElementChild
  202. themeSelectorTemplate.replaceWith(form)
  203. form.addEventListener('change', (e) => {
  204. const chosenColorScheme = e.target.value
  205. localStorage.setItem('theme', chosenColorScheme)
  206. toggleTheme(chosenColorScheme)
  207. })
  208. const selectedTheme = localStorage.getItem('theme')
  209. if (selectedTheme && selectedTheme !== 'undefined') {
  210. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  211. }
  212. }
  213. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  214. window.addEventListener('load', () => {
  215. let hasDarkRules = false
  216. for (const styleSheet of Array.from(document.styleSheets)) {
  217. let mediaRules = []
  218. for (const cssRule of styleSheet.cssRules) {
  219. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  220. continue
  221. }
  222. // WARNING: Safari does not have/supports `conditionText`.
  223. if (cssRule.conditionText) {
  224. if (cssRule.conditionText !== prefersColorSchemeDark) {
  225. continue
  226. }
  227. } else {
  228. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  229. continue
  230. }
  231. }
  232. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  233. }
  234. // WARNING: do not try to insert a Rule to a styleSheet you are
  235. // currently iterating on, otherwise the browser will be stuck
  236. // in a infinite loop…
  237. for (const mediaRule of mediaRules) {
  238. styleSheet.insertRule(mediaRule.cssText)
  239. hasDarkRules = true
  240. }
  241. }
  242. if (hasDarkRules) {
  243. loadThemeForm('#theme-selector')
  244. }
  245. })
  246. </script>
  247. </body>
  248. </html>