<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Johannes Hötter</title>
    <description>The latest articles on Forem by Johannes Hötter (@jhoetter).</description>
    <link>https://forem.com/jhoetter</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F868806%2Fc0bfd936-75b6-4f66-87ef-29634a6f563a.jpeg</url>
      <title>Forem: Johannes Hötter</title>
      <link>https://forem.com/jhoetter</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jhoetter"/>
    <language>en</language>
    <item>
      <title>Twitter Issues are a mess!!</title>
      <dc:creator>Johannes Hötter</dc:creator>
      <pubDate>Sat, 01 Apr 2023 12:50:49 +0000</pubDate>
      <link>https://forem.com/meetkern/twitter-issues-are-a-mess-37ea</link>
      <guid>https://forem.com/meetkern/twitter-issues-are-a-mess-37ea</guid>
      <description>&lt;p&gt;Ok, you all most likely heard it. Twitter went open-source. That's amazing. Curious as I am, I wanted to dive into their &lt;a href="https://github.com/twitter/the-algorithm" rel="noopener noreferrer"&gt;repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When looking into their issues list, I was laughing out loud. Check this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffauqrbxiavcojqyyp27n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffauqrbxiavcojqyyp27n.png" alt="Funny issues"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub users are making fun on the whole release, and turn the issues list into a jokes section.&lt;/p&gt;

&lt;p&gt;As an engineer on the dev team of Twitter, however, I would be really annoyed. Differentiating between issues of trolls and non-trolls is now a new todo on their list. So let's try to help them. I'm going to show a first, very simple version of a classifier for identifying troll-issues in the Twitter repo. Of course, I'm sharing the work on GitHub as well. Here's the &lt;a href="https://github.com/code-kern-ai/twitter-issues-classifier" rel="noopener noreferrer"&gt;repo&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting the data
&lt;/h2&gt;

&lt;p&gt;I've scraped the issues with a simple Python script, which I also shared in the repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;PAT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;add-your-PAT-here&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;# see https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token
&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;twitter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; 
&lt;span class="n"&gt;repo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;the-algorithm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; 

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.github.com/repos/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/issues&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PAT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;all_issues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;issues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;all_issues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;issues&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;next&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;next&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Failed to retrieve issues (status code &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;): &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;

&lt;span class="n"&gt;issues_reduced&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;issue&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;all_issues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;issue_reduced&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;issue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;issue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;html_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;issue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;html_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reactions_laugh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;issue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reactions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;laugh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reactions_hooray&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;issue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reactions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hooray&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reactions_confused&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;issue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reactions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;confused&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reactions_heart&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;issue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reactions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;heart&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reactions_rocket&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;issue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reactions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rocket&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reactions_eyes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;issue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reactions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eyes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;issues_reduced&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;issue_reduced&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;twitter-issues.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;issues_reduced&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Retrieved &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_issues&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; issues and saved to twitter-issues.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of course, these days, I didn't write the code for this myself. ChatGPT did that, but you all already know that.&lt;/p&gt;

&lt;p&gt;I decided to reduce the downloaded data a bit, because much of the content didn't seem to be relevant to me. Instead, I wanted to just have the URL to the issue, the title and body, and some potentially interesting metadata in form of the reactions.&lt;/p&gt;

&lt;p&gt;An example of this looks as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"adding Documentation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"html_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/twitter/the-algorithm/pull/838"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reactions_laugh"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reactions_hooray"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reactions_confused"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reactions_heart"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reactions_rocket"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reactions_eyes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Building the classifier
&lt;/h2&gt;

&lt;p&gt;With the data downloaded, I started &lt;a href="https://github.com/code-kern-ai/refinery" rel="noopener noreferrer"&gt;refinery&lt;/a&gt; on my local machine. With refinery, I'm able to label a little bit of data and build some heuristics to quickly test if my idea works. It's open-sourced under Apache 2.0, you can just grab it and try along.&lt;/p&gt;

&lt;p&gt;Simply upload the &lt;code&gt;twitter-issues.json&lt;/code&gt; file we just created:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qo16d8ceqz608tjrw77.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qo16d8ceqz608tjrw77.png" alt="Upload data"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the &lt;code&gt;title&lt;/code&gt; and &lt;code&gt;body&lt;/code&gt; attributes, I added two &lt;code&gt;distilbert-base-uncased&lt;/code&gt; embeddings directly from Hugging Face.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5a1dgvv8qms3p9ur35xo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5a1dgvv8qms3p9ur35xo.png" alt="Project settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that, I set up three labeling tasks, of which for now only the &lt;code&gt;Seriousness&lt;/code&gt; task is relevant.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnox30jrtt0hjxwbswr48.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnox30jrtt0hjxwbswr48.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Diving into the data, I labeled a few examples to see how the data looks like and to get some reference labels for my automations I want to build.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3jd82pdkx36t0fma4kk3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3jd82pdkx36t0fma4kk3.png" alt="Labeling data"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I realized that quite often, people are searching for jobs in issues. So i started building my first heuristic for this, in which I use a lookup list that I created to search for appearances of job-terms. I'm going to later combine this via &lt;a href="https://www.youtube.com/watch?v=8TusRTqp9uQ&amp;amp;ab_channel=KernAI" rel="noopener noreferrer"&gt;weak supervision&lt;/a&gt; with other heuristics to power my classifier.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ckwz2bnmvufgpc3tffd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ckwz2bnmvufgpc3tffd.png" alt="Job search heuristic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For reference, this is how the lookup lists looks like. Terms are automatically added while labeling spans (which is also why i had three labeling tasks, one for classification and two for span labeling), but I could also have uploaded a CSV file of terms.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fujx1p9nl1tmxla6t87it.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fujx1p9nl1tmxla6t87it.png" alt="Lookup list job terms"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I also already labeled a bit of data, I created a few active learners:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F33rx85uw1tbmha1tpv62.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F33rx85uw1tbmha1tpv62.png" alt="Active Learner"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With weak supervision, I can easily combine this active learner with my previous job search classifier without having to worry about conflicts, overlaps and the likes.&lt;/p&gt;

&lt;p&gt;Also I noted a couple of issues with just a link to play chess online:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg3fqgvwamhgzs0n78k4v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg3fqgvwamhgzs0n78k4v.png" alt="Play chess"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So i added a heuristic for detecting links via spaCy.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fffrrs2zfjqli9j90o1wf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fffrrs2zfjqli9j90o1wf.png" alt="Title is link"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, I also wanted to create a GPT-based classifier, since this is publicly available data. However, GPT seems to be down while I'm initially building this :(&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flfu1tuoe68be0rbj4p5t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flfu1tuoe68be0rbj4p5t.png" alt="GPT-down"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After circa 20 minutes of labeling and working with the data, this is how my heuristics tab looked like&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7uvk32nddy6nmyfaqap1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7uvk32nddy6nmyfaqap1.png" alt="All heuristics"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So there are mainly active learners, some lookup lists and regular-expression like heuristics. I will add GPT in the comments section as soon as I can access it again :)&lt;/p&gt;

&lt;p&gt;Now, I weakly supervised the results:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fktxp9dfxreq3zl9yf7vb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fktxp9dfxreq3zl9yf7vb.png" alt="Distribution"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see that the automation already nicely fits the distribution of trolls vs. non-trolls.&lt;/p&gt;

&lt;p&gt;I also noticed a strong difference in confidence:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr214w76egjq997uumjun.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr214w76egjq997uumjun.png" alt="Confidence distribution"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I headed over to the data browser and configured the confidence so I only see the records with above 80% confidence.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24qgjr6ud74zlejqabd9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24qgjr6ud74zlejqabd9.png" alt="Data browser"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice that in here, we could also filter by single heuristic hits, e.g. to find records where different heuristics vote different labels:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftpkcvwqi362oucgzhvz2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftpkcvwqi362oucgzhvz2.png" alt="Heuristics filtering"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the dashboard, I now filter for the high confidence records and see that our classifier is performing quite good already (note, this isn't even using GPT yet!):&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ohc6kwjjmuchm3qyoq0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ohc6kwjjmuchm3qyoq0.png" alt="Confusion matrix"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Next steps
&lt;/h2&gt;

&lt;p&gt;I exported the project snapshot and labeled examples into the &lt;a href="https://github.com/code-kern-ai/twitter-issues-classifier" rel="noopener noreferrer"&gt;public repository&lt;/a&gt; (&lt;code&gt;twitter_default_all.json.zip&lt;/code&gt;), so you can play with the bit of labeled data yourself. I'll continue on this topic the next days, and we'll add a YouTube video for this article for a version 2 of the classifier. There certainly are further attributes, we can look into, such as taking the length of the body into account (I already saw that shorter bodys typically are troll-like).&lt;/p&gt;

&lt;p&gt;Also, keep in mind that this is an excellent way to benchmark how power GPT can add for your use case. Simply add it as a heuristic, try a few different prompts, and play with excluding or adding it from your heuristics in the weak supervision procedure. For instance, here, I excluded GPT:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7uvk32nddy6nmyfaqap1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7uvk32nddy6nmyfaqap1.png" alt="All heuristics"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I'm really thrilled about Twitter going open-source with their algorithm, and I'm sure it will add a lot of benefits. What you can already tell is due to the nature of Twitter's community, issues are often written by trolls. So finding detecting such will be important for the dev team of Twitter. Maybe this post here can be of help for that :)&lt;/p&gt;

</description>
      <category>twitter</category>
      <category>github</category>
      <category>opensource</category>
      <category>nlp</category>
    </item>
    <item>
      <title>Why and how we started Kern AI (our seed funding announcement)</title>
      <dc:creator>Johannes Hötter</dc:creator>
      <pubDate>Thu, 16 Feb 2023 08:17:15 +0000</pubDate>
      <link>https://forem.com/meetkern/why-and-how-we-started-kern-ai-our-seed-funding-announcement-2lp4</link>
      <guid>https://forem.com/meetkern/why-and-how-we-started-kern-ai-our-seed-funding-announcement-2lp4</guid>
      <description>&lt;p&gt;Our co-founders Henrik and Johannes first met in January during a seminar at the Hasso Plattner Institute in Potsdam. It was a one-week seminar, which went from early in the morning until late at night. During that time, Johannes had just started an AI consultancy and was about to land the big first project. He was euphoric - soon, he would be able to implement a large neural network to process image data on a large scale in a real-world project.&lt;/p&gt;

&lt;p&gt;After an in-depth discussion with Henrik, he realized he wasn’t prepared for it. It was a project deeply-rooted in Physics. The funny thing, Johannes is the person that failed almost every Physics exam in school. He had great knowledge of the latest AI frameworks and architectures and was able to write decent ETL pipelines, but he had zero knowledge about &lt;em&gt;what&lt;/em&gt; he was meant to build.&lt;/p&gt;

&lt;p&gt;Henrik, who studied physics before he started his master's degree, offered to help. They decided to implement the project together, and after they finished it successfully (which, looking back, is a bit of a miracle), they realized two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Henrik and Johannes would make an awesome founder duo&lt;/li&gt;
&lt;li&gt;to implement a successful project, AI alone isn't going to help. It requires both engineers and business users (you might argue, "that is something you can read on Forbes". They did that before, but it was something completely different when they realized it hands-on in a project).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;During 2020, both continued to implement projects but realized that they’d like to start building their own software. By the end of 2022 they decided to turn their consultancy into a software startup. This is how Kern AI was born.&lt;/p&gt;

&lt;p&gt;"We know a lot about AI and have built great projects that created value for clients, but we certainly are missing lots of domain knowledge. Why not build a No-Code AI tool, and let the end user implement the AI?", share Johannes and Henrik about their thinking process.&lt;/p&gt;

&lt;p&gt;Together, they built the first mockup in November '20, signed an agreement with a client by December '20, and developed the MVP in January '21. It was about to go into production, and Henrik and Johannes were about to witness our first SaaS client succeed, right? ... Wrong ...&lt;/p&gt;

&lt;h2&gt;
  
  
  Our first (failed) product: onetask
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl3dx8tsctjq1wr26c97d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl3dx8tsctjq1wr26c97d.png" alt="First product"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We called the SaaS onetask (you had to do one task to build the AI). By labeling data, a model was trained in the background, which you could then call in a small playground or via an API.&lt;/p&gt;

&lt;p&gt;In February '20, both received the first feedback from the client and were shocked: The AI was just as good as random guessing. It learned &lt;em&gt;nothing.&lt;/em&gt; And in addition, the people that labeled the data felt insecure about "building an AI". Henrik and Johannes figured out two new things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The AI was fed with training data that, as a data scientist, you wouldn't consider &lt;em&gt;training data&lt;/em&gt;. It simply wasn't good enough (they did plenty of projects beforehand and faced bad data before, but as they were able to fix data issues with our technical knowledge, they didn't realize how big this obstacle would be).&lt;/li&gt;
&lt;li&gt;Being involved in building AI doesn't mean &lt;em&gt;building the AI&lt;/em&gt;. The users felt insecure. But doesn't No-Code always win? Well, most often, No-Code applications result in deterministic results. Connecting your Webflow form to Hubspot via Zapier means that a new inbound lead is always sent to the CRM. But building AI means building statistical applications that produce results that are probabilistic. It's a new level of complexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As both were trying to figure out with the client how they could improve the AI, one developer from the client’s side asked Henrik why they don't automatically label the data via some rules and then let the users only label parts of the data. This simple statement was core to our product pivot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Give superpowers to technical users. Our main user shifted from a non-technical user to a developer. Understand what they require to build AI, and help them build that.&lt;/li&gt;
&lt;li&gt;Optimize the collaboration with end users (or generally where the technical user requires help), but have clear separations of responsibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that time (the full team was still enrolled at university), Johannes heard about data-centric AI in research, a concept in which developers focus on building the training data of an AI system in collaboration with domain experts. "Jackpot, that's it!" - they looked for another early client, pitched the concept to their data science team (i.e., again, they went to our end users first), and outlined a project.&lt;/p&gt;

&lt;p&gt;In May '21, we had the next MVP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Early signs of the right direction
&lt;/h2&gt;

&lt;p&gt;We saw that the data science team of our client had as the initial training data an Excel spreadsheet that was partially labelled years ago. Think of column A containing the raw content that should be predicted and column B (partially) containing what the model should predict. No documentation at all. Yikes.&lt;/p&gt;

&lt;p&gt;Because of this, in the following project, our goals were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To give data scientists more control in building the AI&lt;/li&gt;
&lt;li&gt;To let domain experts collaborate actively (as we knew that this is crucial from day one)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our MVP gave the data scientists a toolkit powering labelling automation, initially to fill out missing manually labelled data. To set up the automation, we asked the domain experts to label some data with us in a Zoom session and to speak out loud about what they were thinking as they were labelling the data.&lt;/p&gt;

&lt;p&gt;Turns out this 2-hour session was worth a ton. Why?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The data scientists learned more about the data itself. Of course, they weren't completely new to the field, but no domain expert said out loud before what they were thinking about the record.&lt;/li&gt;
&lt;li&gt;In the call, we turned the thoughts into code (think little Python snippets), and ran our software to combine the heuristics with some active learning (i.e., Machine Learning on the data labelled in the session). Seeing how the labelling was turning more and more into automation, the domain experts were excited at the end of the call, feeling they were an active and integral part of the process.&lt;/li&gt;
&lt;li&gt;Lastly, the data scientists had a much better foundation to build models. Their training data now contained &lt;em&gt;more&lt;/em&gt; labels, it contained &lt;em&gt;better&lt;/em&gt; labels (we found tons of mislabeled data in that process).&lt;/li&gt;
&lt;li&gt;Furthermore, the data was documented via automation and was more and more becoming part of an actual software artifact.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkr5117xgjc1c0i46uiv9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkr5117xgjc1c0i46uiv9.png" alt="Screenshot onetask"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ultimately, the data science team built a new model on top of the iterated training data, resulting in an F1-score raise from 72% to 80%. In non-technical terms, this means that you can trust your model much more.&lt;/p&gt;

&lt;p&gt;We found that we were heading in the right direction. Our next question was: "what do we need to build &lt;em&gt;precisely&lt;/em&gt;, and how can we best ship this to developers?”.&lt;/p&gt;

&lt;p&gt;To answer the first question better than anyone else, we realized in early 2022 that we must win the hearts of developers. And this - for many good reasons - typically means via open-source.&lt;/p&gt;

&lt;h2&gt;
  
  
  We went open-source - version 1.0 of “Kern AI refinery”
&lt;/h2&gt;

&lt;p&gt;Fast forward to July ‘22 (after many further product iterations and a full redesign), we open-sourced our product under a new name: Kern AI &lt;a href="https://github.com/code-kern-ai/refinery" rel="noopener noreferrer"&gt;refinery&lt;/a&gt; (the origin of the name is very simple: we want to improve, i.e., refine, the foundation for building models).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq11vcl46p1bk0oh1i0li.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq11vcl46p1bk0oh1i0li.png" alt="Screenshot refinery"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We decided to fully focus on natural language processing (NLP), as we both saw &lt;strong&gt;refinery&lt;/strong&gt; performing exceptionally well in NLP use cases in the past, and as we got incredibly excited about what the future of NLP might bring (this was before ChatGPT btw).&lt;/p&gt;

&lt;p&gt;On our launch day, we were trending on HackerNews, and so we quickly gained interest from developers all over the world. From the feedback we got, we saw that &lt;strong&gt;refinery&lt;/strong&gt; was moving exactly in the direction we hoped it would:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs3cx6go4n0mvvs6m3mly.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs3cx6go4n0mvvs6m3mly.png" alt="Wall of Love"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Shortly after the release, we had more than 1,000 stars on GitHub (i.e., a GH users expressing that they like the project), hundreds of thousands of views on the repository, and dozens of people telling us about the use cases they implemented via refinery. We were thrilled and started digging deeper.&lt;/p&gt;

&lt;p&gt;This leads us to today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Announcing our seed funding, co-led by Seedcamp and Faber with participation from xdeck, another.vc and Hasso Plattner Seed Fund
&lt;/h2&gt;

&lt;p&gt;We are happy to announce that Seedcamp and Faber co-led our seed funding of €2.7m.&lt;/p&gt;

&lt;p&gt;Our investors share our vision of bringing data-centric NLP into action and trust us in building Kern AI by focusing on the end users first. We’re thrilled to receive their support and backing and now aim to continue expanding our platform.&lt;/p&gt;

&lt;p&gt;Doing so, we today announce the release of our &lt;a href="https://www.youtube.com/watch?v=7VXqimJvzdU" rel="noopener noreferrer"&gt;data-centric NLP platform&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is the result of our insights and efforts since we started Kern AI. What makes it stand out?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It puts users in their roles, while also sparking collaboration and creativity.&lt;/strong&gt; &lt;strong&gt;&lt;a href="https://github.com/code-kern-ai/bricks" rel="noopener noreferrer"&gt;bricks&lt;/a&gt;&lt;/strong&gt; (our content library) is connected with &lt;strong&gt;refinery&lt;/strong&gt; (database + application logic), such that developers can turn an idea into implementation within literally seconds. Why? Because that way, devs &lt;em&gt;and&lt;/em&gt; domain experts can validate ideas immediately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is capable of doing the sprint &lt;em&gt;and&lt;/em&gt; the marathon.&lt;/strong&gt; Prototype an idea within an afternoon and automatically have the setup to grow your use cases over time. Just like regular software.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can use it both for batch data &lt;em&gt;and&lt;/em&gt; real-time streams.&lt;/strong&gt; Start by uploading an Excel spreadsheet into refinery, and over time grow your database via native integrations or by setting up your own data stream via our commercial API (gates).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is flexible.&lt;/strong&gt; You are using crowd labelling to annotate your training data? No problem, you can integrate crowd labelling into refinery. Do you already have a set of tools? This also works, and refinery even comes with native integrations to tools like Labelstudio.
The more familiar you get with the platform, the more use cases you will see. That’s what gets us excited: sparking creativity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It can power your own NLP product as the database.&lt;/strong&gt; Or you can use it as the NLP API. Or you can even cover a full end-to-end workflow on it. Use cases range from building sophisticated applications up to implementing a small internal natural language-driven workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our team is genuinely excited about what comes next. We believe that NLP is just about to get started, and it will disrupt almost anything touched by technology. And we’re confident that our work will contribute to it.&lt;/p&gt;

</description>
      <category>nlp</category>
      <category>machinelearning</category>
      <category>opensource</category>
      <category>news</category>
    </item>
    <item>
      <title>How we power our open-source neural search with qdrant</title>
      <dc:creator>Johannes Hötter</dc:creator>
      <pubDate>Mon, 03 Oct 2022 09:32:52 +0000</pubDate>
      <link>https://forem.com/meetkern/how-we-power-our-neural-search-with-qdrant-47nl</link>
      <guid>https://forem.com/meetkern/how-we-power-our-neural-search-with-qdrant-47nl</guid>
      <description>&lt;p&gt;This is going to be part of a series of posts in which we show how refinery builds on top of qdrant, an open-source vector search engine.&lt;/p&gt;




&lt;p&gt;At &lt;a href="https://kern.ai/"&gt;Kern AI&lt;/a&gt;, we believe that the biggest breakthrough in deep learning is all about embeddings. If you wonder what that means: computers can’t really understand unstructured texts or images. Instead, they require some numeric representation of e.g. a text. But how can you transform text into numbers? This is precisely what neural networks excel at, they can learn such representations. What is the benefit, you might wonder? You can calculate with e.g. the meaning of a text. What is the output of “king” - “man” + “woman”? With embeddings, you’ll get the numeric representation of “queen”. And that is nothing less but breakthrough material!&lt;/p&gt;

&lt;p&gt;In other terms: embeddings are a generalization of database technologies. Instead of filtering and searching only on structured data such as spreadsheets, we’re currently experiencing search technologies build on top of embeddings. Effectively, you turn text into a query-able structure that embeds the meaning of the text.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qQ9ZkXnu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://uploads-ssl.webflow.com/61f321fd2dc7db10189dabdb/633aa9f19841f9edf3b6c8a7_tweet_db_extension.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qQ9ZkXnu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://uploads-ssl.webflow.com/61f321fd2dc7db10189dabdb/633aa9f19841f9edf3b6c8a7_tweet_db_extension.png" alt="Tweet from Francois Chollet" width="880" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s say you’re looking for the answer to a question in a large text corpus. With embeddings, you can turn the text passages into numeric vectors, and compute the closest vector to your question. Statistically speaking, this gives you the most relevant answer to your question. You don’t even need to match keywords here, embeddings understand synonyms and context!&lt;/p&gt;

&lt;p&gt;At Kern AI, we have built refinery, an open-source IDE for data-centric NLP. Here, we make use of large-scale language models to compute said embeddings and enable developers to find e.g. similar training samples, to find outliers, or to programmatically apply labeling to the training data. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C_dRW3ae--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://uploads-ssl.webflow.com/61f321fd2dc7db10189dabdb/633aa9d3dcb06d49ce8c1109_neural_search.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C_dRW3ae--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://uploads-ssl.webflow.com/61f321fd2dc7db10189dabdb/633aa9d3dcb06d49ce8c1109_neural_search.png" alt="Screenshot neural search" width="880" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But as we’ve built our developer tool, we realized that scalability was a big issue. Retrieving similar pairs based on their cosine similarity (given by their embeddings) was something we couldn’t do on larger scales, e.g. hundreds of thousands of records.&lt;/p&gt;

&lt;p&gt;This is where qdrant, an open-source vector search engine enters the game. Implemented in Rust, their engine provides an API to their vector database which allows you to retrieve similar pairs even under high load within milliseconds.&lt;/p&gt;

&lt;p&gt;To get started with qdrant, simply execute the following lines in your CLI:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8D97khB1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://uploads-ssl.webflow.com/61f321fd2dc7db10189dabdb/633aaa0e5209928b9f06a213_qdrant_setup.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8D97khB1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://uploads-ssl.webflow.com/61f321fd2dc7db10189dabdb/633aaa0e5209928b9f06a213_qdrant_setup.png" alt="Install qdrant" width="880" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let’s look into an example snippet of our application, in which we have set up an endpoint using FastAPI to retrieve the (up to) 100 most similar records given some reference record:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7H9hv-eu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://uploads-ssl.webflow.com/61f321fd2dc7db10189dabdb/633aaa202c4e884edd4da757_qdrant_python.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7H9hv-eu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://uploads-ssl.webflow.com/61f321fd2dc7db10189dabdb/633aaa202c4e884edd4da757_qdrant_python.png" alt="Implementing with qdrant" width="880" height="1017"&gt;&lt;/a&gt;&lt;br&gt;
You can look further into the code base &lt;a href="https://github.com/code-kern-ai/refinery-neural-search/blob/dev/app.py"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, it is rather straightforward. You need to get the query vector which is your reference, and can limit the result set by a similarity threshold (i.e. which cosine similarity do result records need to have to be contained in the filtered set?). Further, you could extend the search via query filters, which we’re not making use of so far.&lt;/p&gt;

&lt;p&gt;With its scalability and stability, qdrant is a core technology in our stack. As the application of similarity search is not only limited to a neural search approach, we’re even using it for features such as recommendation engines. We’re going to share insights about this in a future article.&lt;br&gt;
‍&lt;br&gt;
Now, we encourage you to look into qdrant and their engine. You can see one live example in our online playground, which you can find here: &lt;a href="https://demo.kern.ai"&gt;https://demo.kern.ai&lt;/a&gt;&lt;br&gt;
‍&lt;br&gt;
Check out their GitHub here: &lt;a href="https://github.com/qdrant/qdrant"&gt;https://github.com/qdrant/qdrant&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And don’t forget to leave a star in our refinery: &lt;a href="https://github.com/code-kern-ai/refinery"&gt;https://github.com/code-kern-ai/refinery&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>datascience</category>
      <category>opensource</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Build for Hugging Face, Rasa or Sklearn</title>
      <dc:creator>Johannes Hötter</dc:creator>
      <pubDate>Tue, 06 Sep 2022 11:24:01 +0000</pubDate>
      <link>https://forem.com/meetkern/build-for-hugging-face-rasa-or-sklearn-5c70</link>
      <guid>https://forem.com/meetkern/build-for-hugging-face-rasa-or-sklearn-5c70</guid>
      <description>&lt;p&gt;We've built our &lt;a href="https://github.com/code-kern-ai/refinery" rel="noopener noreferrer"&gt;open-source IDE for data-centric NLP&lt;/a&gt; with the belief that data scientists and engineers know best what kind of framework they want to use for their model building. Today, we'll show you three new adapters for the SDK.&lt;/p&gt;

&lt;p&gt;Let's jump right in.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hugging Face
&lt;/h2&gt;

&lt;p&gt;Transformer models are arguably one of the most interesting breakthroughs in natural language processing. With Hugging Face, you have access to an abundance of pre-trained models. Ultimately, however, you want to finetune them to your task at hand. This is where Hugging Face datasets come into play, and you can generate them with ease using our adapter.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuploads-ssl.webflow.com%2F61f321fd2dc7db10189dabdb%2F63172718fee3175ae70b1523_huggingface.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuploads-ssl.webflow.com%2F61f321fd2dc7db10189dabdb%2F63172718fee3175ae70b1523_huggingface.png" alt="Hugging Face"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dataset is a Hugging Face-native object, which you can use as follows to finetune your data. This could look as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuploads-ssl.webflow.com%2F61f321fd2dc7db10189dabdb%2F6317284f890932a06ef73247_huggingface_2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuploads-ssl.webflow.com%2F61f321fd2dc7db10189dabdb%2F6317284f890932a06ef73247_huggingface_2.png" alt="Hugging Face"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The documentations of Hugging Face have some further examples on how to finetune your models.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sklearn
&lt;/h2&gt;

&lt;p&gt;The swiss army knife of machine learning. You most likely have already worked with it, and if so, you surely love the richness of algorithms to select from. We do so to, and so we decided to add an integration to Sklearn. You can pull the data and train a model as easy as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuploads-ssl.webflow.com%2F61f321fd2dc7db10189dabdb%2F631726f2bf942d076847c99c_huggingface.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuploads-ssl.webflow.com%2F61f321fd2dc7db10189dabdb%2F631726f2bf942d076847c99c_huggingface.png" alt="Sklearn"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The data object already contains train and test splits derived from the weakly supervised and manually labeled data. You now can fully focus on hyperparameter tuning and model selection. We also highly recommend to check out Truss, an open-source library to quickly serve these models. We'll cover this in a separate article.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rasa
&lt;/h2&gt;

&lt;p&gt;If you want to build a chatbot or conversational AI, Rasa arguably is one of the first choices with its strong framework and community. We love building chatbots with Rasa, and already covered a YouTube series on how to do so. Here, we'll now introduce you the rasa adapter for our SDK, with which you can build the training data for your chatbot with ease.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuploads-ssl.webflow.com%2F61f321fd2dc7db10189dabdb%2F6317272bb243a03c84a9aa8f_rasa_1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuploads-ssl.webflow.com%2F61f321fd2dc7db10189dabdb%2F6317272bb243a03c84a9aa8f_rasa_1.png" alt="Rasa"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will directly pull your training data into a YAML format, off-the-shelf ready for your chatbots to learn from. This way, you can manage and maintain all your chat data within refinery, and have it ready for your chatbot training at hand.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuploads-ssl.webflow.com%2F61f321fd2dc7db10189dabdb%2F63172732baf3d91c232e0a10_rasa_2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuploads-ssl.webflow.com%2F61f321fd2dc7db10189dabdb%2F63172732baf3d91c232e0a10_rasa_2.png" alt="Rasa"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;You see, we already cover some integrations to open source NLP frameworks. If you're missing one, please let us know. We're happy to add them continuously, to bridge the gap between building training data and building models.&lt;/p&gt;

&lt;p&gt;If you haven't tried out refinery yet, make sure to check out our &lt;a href="https://github.com/code-kern-ai/refinery" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Also, feel free to join our &lt;a href="https://discord.com/invite/qf4rGCEphW" rel="noopener noreferrer"&gt;Discord community&lt;/a&gt; - we're happy to meet you there!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>nlp</category>
      <category>datascience</category>
      <category>python</category>
    </item>
    <item>
      <title>Beautiful UIs with Figma and Tailwind</title>
      <dc:creator>Johannes Hötter</dc:creator>
      <pubDate>Mon, 25 Jul 2022 21:27:00 +0000</pubDate>
      <link>https://forem.com/meetkern/beautiful-uis-with-figma-and-tailwind-49dn</link>
      <guid>https://forem.com/meetkern/beautiful-uis-with-figma-and-tailwind-49dn</guid>
      <description>&lt;p&gt;In this post, we’re going to share how we used Figma and Tailwind to redesign our open-source tool refinery. The article will entirely focus on how to build beautiful UIs quickly. You don’t need any prior knowledge to understand this post.&lt;/p&gt;

&lt;p&gt;After this post, you’ll know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why Figma and Tailwind are such a great combination to build a beautiful UI&lt;/li&gt;
&lt;li&gt;How you can quickly build a consistent design&lt;/li&gt;
&lt;li&gt;Those mockups are worth the time! :-)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Our change in UI
&lt;/h3&gt;

&lt;p&gt;To jump into this article, we first want to show you what our manual labeling screen used to look like. The sidebar was too dominant because the color coding and the label colors were a bit gloomy. We knew our UI needed some improvements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwcw60s1mquzuhvc5vz7j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwcw60s1mquzuhvc5vz7j.png" alt="Old UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because of that, we built up some mockups using Figma and Tailwind, arguably one of the best design toolkit combinations. Figma is excellent for building high-quality mockups fast and collaboratively. In contrast, Tailwind offers a great set of predefined classes and components for your web app - and it comes with an amazingly well-designed Figma template kit. Within hours, we set up the following mockup:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4sa66hprpwgfhvyhlkji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4sa66hprpwgfhvyhlkji.png" alt="Mockup UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Showing this page to users, we saw that it not only offered a better-looking design but also provided a better workflow. From here, we decided to implement the mockup in Tailwind. The result is almost looking the same as the mockup, as you can see here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4ooommj26f829ec9oy9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4ooommj26f829ec9oy9.png" alt="New UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So with that in mind, we want to show you how we did that.&lt;/p&gt;




&lt;h3&gt;
  
  
  Don’t start from scratch!
&lt;/h3&gt;

&lt;p&gt;First, it is relevant to know that there are template kits available in Figma. You can browse them in their library or at third-party libraries. So you don’t need to rebuild everything on your own!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Our tip is that you should use templates of which you have the HTML codes, too. This enabled us to easily switch between Figma mockups and implemented UI elements without losing the design. But you can still also build the HTML files from scratch.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In our case, we imported the Tailwind template into Figma and had access to the mockup elements: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ykxz3jpy4t84871ftas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ykxz3jpy4t84871ftas.png" alt="Tailwind Template"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Those same elements are available in the Tailwind UI components library: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frm7wax8rdyyozzanqqbu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frm7wax8rdyyozzanqqbu.png" alt="Tailwind UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And this is not only true for high-level elements like the layout of your screen but also for detailed elements like badges:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjkvlrf8ow5lhqbkw4jwj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjkvlrf8ow5lhqbkw4jwj.png" alt="Tailwind Badges"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Implement your screens in Figma first
&lt;/h3&gt;

&lt;p&gt;From here, it becomes easy to drag and drop your elements into the respective layout you want. After 15 minutes of playing around with it, you should already feel comfortable building custom mockups in Tailwind, and it should take you little effort to turn these mockups into UI shells.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnh8ogau88twcxoy0rmk6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnh8ogau88twcxoy0rmk6.png" alt="Figma editing"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We developed this not only for one but for multiple screens; roughly 95% of the things you can see in our application have been first designed via mockups.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9z9gn3g2dtalbwdfz7r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9z9gn3g2dtalbwdfz7r.png" alt="Figma screens"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The reason we did so was that it helped us to ensure consistency throughout the entire application. It made it easier for our team members to gain early feedback on the whole workflow of the application and how the UI would differ from our previous version. Ultimately, it also allowed us to implement the UI much faster. As soon as the mockup was finished (for that version, of course, we’re already improving on that with our following upcoming versions), we “just” had to implement the shell.‍&lt;/p&gt;

&lt;p&gt;We believe that Figma and Tailwind are the best combinations to build beautiful UIs, but there are many great alternatives. Most important is that this approach helps you build what’s been discussed and agreed upon in a short time. We’ll continue building our application based on mockups, and we’ll discuss them with our community :)‍&lt;/p&gt;

&lt;p&gt;If you’re interested in seeing an application built this same way, check out our &lt;a href="https://github.com/code-kern-ai/refinery" rel="noopener noreferrer"&gt;open-source tool refinery&lt;/a&gt;. Also, feel free to join our community on &lt;a href="https://discord.com/invite/qf4rGCEphW" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; if you have any questions.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>design</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>We're open-source! The data-centric sibling of VS Code</title>
      <dc:creator>Johannes Hötter</dc:creator>
      <pubDate>Mon, 18 Jul 2022 09:53:00 +0000</pubDate>
      <link>https://forem.com/meetkern/were-open-source-the-data-centric-sibling-of-vs-code-3f8p</link>
      <guid>https://forem.com/meetkern/were-open-source-the-data-centric-sibling-of-vs-code-3f8p</guid>
      <description>&lt;h2&gt;
  
  
  Hello, open-source world!
&lt;/h2&gt;

&lt;p&gt;We have been working tirelessly towards this day for a long time. Finally, we can say that Kern refinery goes &lt;a href="https://github.com/code-kern-ai/refinery" rel="noopener noreferrer"&gt;open-source&lt;/a&gt;, and we celebrate this with our version 1.0!&lt;/p&gt;

&lt;p&gt;There are three main reasons why we decided to do that step:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community&lt;/strong&gt;&lt;br&gt;
We strive to create a community of like-minded devs who want to participate in the movement toward data-centric AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Innovation&lt;/strong&gt;&lt;br&gt;
We want to drive innovation through collaboration. Open-source software provides a faster response time to current market needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transparency&lt;/strong&gt;&lt;br&gt;
It is important to us that the access and individualization of our software are possible for all of our users.&lt;/p&gt;

&lt;p&gt;So as of today, you can pip install kern-refinery on your machines to download and run our application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7a5tltcobvouj3aoz5d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7a5tltcobvouj3aoz5d.png" alt="pip install kern-refinery"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that we've finished our open-source go-live, we are looking forward to working towards those three goals every day.&lt;/p&gt;

&lt;p&gt;Our work towards the release was mainly put into - again - three areas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New UI and improved UX&lt;/strong&gt;&lt;br&gt;
You might have noticed that our app has a new look. We did several user tests, rebranded our app, and went for the following look:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhx8ptyl66eynr1u6iga.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhx8ptyl66eynr1u6iga.png" alt="refinery UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, we integrated some features that make it easier to play around with the data from a programmatic point of view, such as the record IDE:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxgvj890psl7860tzt7vn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxgvj890psl7860tzt7vn.png" alt="Record IDE"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can check out those things in our guide.&lt;/p&gt;

&lt;p&gt;What do you think of the new UI look? Let us know, we're excited about your feedback!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extended documentation and use cases&lt;/strong&gt;&lt;br&gt;
We've put extra effort into everything related to your first impression and first successes of using Kern refinery. And what's super important for that is documentation and use cases. You can now not only find more insights in this very documentation but can also find hands-on examples on &lt;a href="https://www.youtube.com/channel/UCru-6X24b76TRsL6KWMFEFg" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, on our &lt;a href="https://github.com/code-kern-ai" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and on our community spaces (&lt;a href="https://github.com/code-kern-ai/refinery/discussions" rel="noopener noreferrer"&gt;discussion forum&lt;/a&gt; and &lt;a href="https://discord.com/invite/qf4rGCEphW" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architectural changes&lt;/strong&gt;&lt;br&gt;
Lastly, with an open-source release, we wanted to improve our architectural design. We've spent lots of effort on refactoring services and making sure that we can quickly iterate on your product feedback and ideas. In total, we've spent now more than 18 months on this very application, from initial design to the first MVP and now version 1.0 - but of course, we are still only getting started to build the data-centric development environment specifically designed to help data scientists in building great AI models. Help us, and we'll make sure to continue building something people love!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxy8j1r8bvj2vsztdyy2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxy8j1r8bvj2vsztdyy2.png" alt="refinery architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To stay up-to-date with everything, make sure to subscribe to our &lt;a href="https://www.kern.ai/resources/newsletter" rel="noopener noreferrer"&gt;newsletter&lt;/a&gt;, and don't forget to give us a star on &lt;a href="https://github.com/code-kern-ai/refinery" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. We couldn't be more excited for the future!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>datascience</category>
      <category>nlp</category>
      <category>python</category>
    </item>
  </channel>
</rss>
