Skip to content

Commit c49052b

Browse files
authored
Merge pull request #6 from pydataberlin/add_talk_pages
2025: Added talk pages generator
2 parents 4617f66 + 84ee2f5 commit c49052b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

88 files changed

+10642
-0
lines changed

conferences/2025/3LDDAB.html

Lines changed: 261 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,261 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="utf-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1" />
6+
<title>From Manual to LLMs: Scaling Product Categorization - PyData Berlin 2025</title>
7+
<meta name="description" content="How to use LLMs to categorize hundreds of thousands of products into 1,000 categories at scale? Learn about our journey from manual/rule-based methods, via fine... By Giampaolo Casolla, Ansgar Grüne">
8+
9+
<!-- Open Graph / Facebook -->
10+
<meta property="og:type" content="website">
11+
<meta property="og:url" content="https://berlin.pydata.org/conferences/2025/3LDDAB.html">
12+
<meta property="og:title" content="From Manual to LLMs: Scaling Product Categorization - PyData Berlin 2025">
13+
<meta property="og:description" content="How to use LLMs to categorize hundreds of thousands of products into 1,000 categories at scale? Learn about our journey from manual/rule-based methods, via fine... By Giampaolo Casolla, Ansgar Grüne">
14+
<meta property="og:image" content="https://berlin.pydata.org/images/social/3LDDAB.png">
15+
<meta property="og:site_name" content="PyData Berlin">
16+
17+
<!-- Twitter Card -->
18+
<meta name="twitter:card" content="summary_large_image">
19+
<meta name="twitter:url" content="https://berlin.pydata.org/conferences/2025/3LDDAB.html">
20+
<meta name="twitter:title" content="From Manual to LLMs: Scaling Product Categorization - PyData Berlin 2025">
21+
<meta name="twitter:description" content="How to use LLMs to categorize hundreds of thousands of products into 1,000 categories at scale? Learn about our journey from manual/rule-based methods, via fine... By Giampaolo Casolla, Ansgar Grüne">
22+
<meta name="twitter:image" content="https://berlin.pydata.org/images/social/3LDDAB.png">
23+
<meta name="twitter:site" content="@pydataberlin">
24+
25+
<!-- Canonical URL -->
26+
<link rel="canonical" href="https://berlin.pydata.org/conferences/2025/3LDDAB.html">
27+
28+
<link rel="stylesheet" href="../../css/main.css" />
29+
<!--[if lte IE 8]><link rel="stylesheet" href="../../css/ie8.css" /><![endif]-->
30+
<!--[if lte IE 9]><link rel="stylesheet" href="../../css/ie9.css" /><![endif]-->
31+
<style>
32+
.session-header {
33+
background: linear-gradient(to bottom, rgba(46, 49, 65, 0.8), rgba(46, 49, 65, 0.8)), url(../../images/banner.jpg);
34+
background-size: cover;
35+
background-position: center;
36+
padding: 4em 0 2em 0;
37+
text-align: center;
38+
color: white;
39+
}
40+
.session-info {
41+
background: #f5f5f5;
42+
padding: 1em 2em;
43+
margin-bottom: 2em;
44+
border-radius: 4px;
45+
}
46+
.session-info span {
47+
display: inline-block;
48+
margin-right: 2em;
49+
font-weight: 600;
50+
}
51+
.speaker-card {
52+
background: #f9f9f9;
53+
padding: 2em;
54+
margin-bottom: 2em;
55+
border-radius: 4px;
56+
display: flex;
57+
gap: 2em;
58+
}
59+
.speaker-image {
60+
width: 150px;
61+
height: 150px;
62+
object-fit: cover;
63+
border-radius: 50%;
64+
flex-shrink: 0;
65+
}
66+
.speaker-info {
67+
flex-grow: 1;
68+
}
69+
.social-links {
70+
margin-top: 1em;
71+
}
72+
.social-links a {
73+
margin-right: 1em;
74+
color: #4a4e69;
75+
}
76+
.track-badge {
77+
display: inline-block;
78+
background: #4a4e69;
79+
color: white;
80+
padding: 0.3em 1em;
81+
border-radius: 20px;
82+
font-size: 0.9em;
83+
margin-bottom: 1em;
84+
}
85+
.content-section {
86+
max-width: 900px;
87+
margin: 0 auto;
88+
padding: 2em;
89+
}
90+
@media screen and (max-width: 736px) {
91+
.speaker-card {
92+
flex-direction: column;
93+
text-align: center;
94+
}
95+
.speaker-image {
96+
margin: 0 auto;
97+
}
98+
}
99+
</style>
100+
</head>
101+
<body>
102+
103+
<div id="page-wrapper">
104+
105+
<header id="header">
106+
<h1><a href="../../index.html">PyData Berlin</a></h1>
107+
<nav id="nav">
108+
<ul>
109+
<li class="special">
110+
<a href="#menu" class="menuToggle"><span>Menu</span></a>
111+
<div id="menu">
112+
<ul>
113+
<li><a href="../../index.html">Home</a></li>
114+
<li><a href="../../code-of-conduct/en">Code of Conduct</a></li>
115+
<li><a href="https://pydata.org/berlin2025/">PyData Berlin 2025</a></li>
116+
<li><a href="../../blog/">Posts</a></li>
117+
</ul>
118+
</div>
119+
</li>
120+
</ul>
121+
</nav>
122+
</header>
123+
124+
<section class="session-header">
125+
<div class="inner">
126+
127+
<span class="track-badge">Generative AI</span>
128+
129+
<h1>From Manual to LLMs: Scaling Product Categorization</h1>
130+
<p style="font-size: 1.2em; margin-top: 1em;">Talk (long)</p>
131+
</div>
132+
</section>
133+
134+
<section class="wrapper style5">
135+
<div class="content-section">
136+
137+
<div class="session-info">
138+
<span><strong>Level:</strong> Intermediate</span>
139+
140+
<span><strong>Company/Institute:</strong> GetYourGuide</span>
141+
142+
143+
144+
</div>
145+
146+
<h2>Abstract</h2>
147+
<p>How to use LLMs to categorize hundreds of thousands of products into 1,000 categories at scale? Learn about our journey from manual/rule-based methods, via fine-tuned semantic models, to a robust multi-step process which uses embeddings and LLMs via the OpenAI APIs. This talk offers data scientists and AI practitioners learnings and best practices for putting such a complex LLM-based system into production. This includes prompt development, balancing cost vs. accuracy via model selection, testing mult-case vs. single-case prompts, and saving costs by using the OpenAI Batch API and a smart early-stopping approach. We also describe our automation and monitoring in a PySpark environment.</p>
148+
149+
150+
<h3>Prerequisites</h3>
151+
<p>Attendees should have a foundational understanding of machine learning concepts and familiarity with the Python data science stack. Exposure to vector embeddings or Large Language Model (LLM) APIs is helpful but not mandatory.</p>
152+
153+
154+
<h2>Description</h2>
155+
<div class="description-content">
156+
<p><strong>Target Audience:</strong> Data scientists, AI/ML engineers, and practitioners interested in applying large language models (LLMs) / generative AI to solve real-world classification problems at scale. Attendees should have a foundational understanding of machine learning concepts and familiarity with the Python data science stack. Exposure to vector embeddings or LLM APIs is helpful but not mandatory.</p>
157+
<p><strong>Takeaway:</strong> Attendees will gain practical insights and learn best practices for building, debugging, scaling, and productionizing a complex, multi-step generative AI system for large-scale product categorization. They will understand the evolution from traditional methods to LLMs, learn specific techniques for prompt engineering, batch processing, cost optimization with models like OpenAI's, and see the tangible business impact of such a system.</p>
158+
<p><strong>Detailed Outline:</strong></p>
159+
<p>This talk chronicles our journey tackling a yet challenging problem: accurately categorizing hundreds of thousands of diverse products into a fine-grained taxonomy of over 1,000 categories. We'll share our evolution from initial manual and rule-based systems to a sophisticated, production-ready Generative AI pipeline.</p>
160+
<ul>
161+
<li><strong>Part 1: The Challenge &amp; Initial Approaches (10 minutes)</strong><ul>
162+
<li>Introduction to the business need for accurate product categorization at scale.</li>
163+
<li>Overview of the limitations encountered with traditional methods:<ul>
164+
<li>Manual Curation: Slow, expensive, inconsistent, and impossible to scale.</li>
165+
<li>Rule-Based Systems: Brittle, hard to maintain, and unable to handle nuances or new product types.</li>
166+
<li>Fine-tuned Semantic Models: An improvement, but struggled with zero-shot generalization to new categories and required significant labeled data and retraining.</li>
167+
</ul>
168+
</li>
169+
</ul>
170+
</li>
171+
<li><strong>Part 2: Entering the GenAI Era - Iterations &amp; Lessons Learned (10 minutes)</strong><ul>
172+
<li>Our initial exploration using LLMs for categorization, what worked, and what failed.</li>
173+
<li><strong>Developing the Prompt:</strong> We'll dive deep into the iterative process of prompt engineering for this complex multi-label, hierarchical classification task. We'll show examples of early prompts, their failure modes (e.g., inconsistent output format, hallucinated categories, difficulty handling multiple classification signals), and the refinements that led to more reliable results. We will discuss techniques for achieving structured output (e.g., JSON) from the LLM.</li>
174+
<li><strong>Early Scaling Issues:</strong> Discussing the pitfalls of naive API usage, latency problems, and prohibitive costs when dealing with large volumes.</li>
175+
</ul>
176+
</li>
177+
<li><strong>Part 3: Building a Robust, Scalable GenAI Pipeline (10 minutes)</strong><ul>
178+
<li><strong>The Hybrid Approach:</strong> Detailing our successful multi-step architecture that combines the strengths of semantic embeddings for efficient candidate retrieval/filtering and LLMs (specifically leveraging OpenAI models) for nuanced final categorization.</li>
179+
<li><strong>Productionization Strategies:</strong><ul>
180+
<li><em>Batching:</em> Implementing efficient batch processing using asynchronous requests and the OpenAI Batch API to drastically reduce latency and cost.</li>
181+
<li><em>Cost vs. Accuracy:</em> Strategies for selecting the right model based on complexity and cost constraints.</li>
182+
<li><em>Semantic Similarity &amp; Early Stopping:</em> Using vector similarity to intelligently prune the search space, avoiding the need to evaluate every product against all 1,000+ categories with the LLM, thus significantly optimizing cost and throughput.</li>
183+
<li><em>Automation &amp; Monitoring</em>: How we process updates of categories and products automatically in PySpark and monitor that the live system works as expected.</li>
184+
</ul>
185+
</li>
186+
</ul>
187+
</li>
188+
<li><strong>Part 4: Measuring Impact &amp; Looking Ahead (10 minutes)</strong><ul>
189+
<li>Presenting the results: Showcasing the significant improvements in categorization accuracy and coverage compared to previous methodsIllustrative examples of challenging products correctly categorized by the GenAI system.</li>
190+
<li>Discussing the tangible business value derived as measured in A-B tests </li>
191+
<li>Briefly touching upon ongoing work and future directions.</li>
192+
</ul>
193+
</li>
194+
</ul>
195+
<p>This presentation will focus on the practical application and engineering challenges, sharing reusable techniques and hard-won lessons applicable to anyone looking to leverage the power of generative AI for large-scale, real-world problems. We aim to provide a transparent account of not just the successes, but also the crucial learnings from failures encountered along the way.</p>
196+
</div>
197+
198+
<h2>Speakers</h2>
199+
200+
<div class="speaker-card">
201+
202+
<img src="https://cfp.pydata.org/media/avatars/Giampaolo_Casolla_resized_39uW5dK.jpg" alt="Giampaolo Casolla" class="speaker-image">
203+
204+
<div class="speaker-info">
205+
<h3>Giampaolo Casolla</h3>
206+
207+
<p><strong>Senior Data Scientist</strong></p>
208+
209+
210+
<p>Giampaolo Casolla is a Senior Data Scientist at GetYourGuide, leveraging advanced machine learning and Generative AI to solve complex travel industry challenges. With expertise spanning areas like Safety, Risk, and Security, and strong skills in stats, Python, R, and cloud tech, he brings a diverse background to the role. Prior to GetYourGuide, Giampaolo developed award-winning ML solutions at Amazon and has a background in research with publications and conference presentations. At GetYourGuide, he's focused on integrating LLMs and GenAI into data products to drive innovation in travel technology.</p>
211+
212+
213+
</div>
214+
</div>
215+
216+
<div class="speaker-card">
217+
218+
<img src="https://cfp.pydata.org/media/avatars/AnsgarProfilePictureGYG2018MID_yV6V1mq.jpg" alt="Ansgar Grüne" class="speaker-image">
219+
220+
<div class="speaker-info">
221+
<h3>Ansgar Grüne</h3>
222+
223+
<p><strong>Senior Data Scientist</strong></p>
224+
225+
226+
<p>Ansgar Grüne is a Senior Data Scientist at GetYourGuide in Berlin. His work focuses on ML/AI approaches to improve the users search and discovery experience on the platform. He holds a Ph.D. in Theoretical Computer Science and has 10 years of experience as a Data Scientist in the travel industry following several years as software engineer.</p>
227+
228+
229+
</div>
230+
</div>
231+
232+
233+
<div style="text-align: center; margin-top: 3em;">
234+
<a href="https://pydata.org/berlin2025/" class="button special">View Full Conference Program</a>
235+
</div>
236+
237+
</div>
238+
</section>
239+
240+
<footer id="footer">
241+
<ul class="icons">
242+
<li><a href="https://twitter.com/pydataberlin" class="icon fa-twitter"><span class="label">Twitter</span></a></li>
243+
<li><a href="https://github.com/pydataberlin" class="icon fa-github"><span class="label">Github</span></a></li>
244+
</ul>
245+
<ul class="copyright">
246+
<li>&copy; PyData Berlin</li>
247+
<li>Design: <a href="http://html5up.net">HTML5 UP</a></li>
248+
</ul>
249+
</footer>
250+
251+
</div>
252+
253+
<script src="../../js/jquery.min.js"></script>
254+
<script src="../../js/jquery.scrollex.min.js"></script>
255+
<script src="../../js/jquery.scrolly.min.js"></script>
256+
<script src="../../js/skel.min.js"></script>
257+
<script src="../../js/util.js"></script>
258+
<script src="../../js/main.js"></script>
259+
260+
</body>
261+
</html>

0 commit comments

Comments
 (0)