{"id":20520,"date":"2026-08-07T22:27:14","date_gmt":"2026-08-07T22:27:14","guid":{"rendered":"https:\/\/www.comet.com\/site\/?p=20520"},"modified":"2026-08-07T22:27:34","modified_gmt":"2026-08-07T22:27:34","slug":"f1-radio-rag-ai-eval-example","status":"publish","type":"post","link":"https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/","title":{"rendered":"I Built a RAG Pipeline for F1 Team Radio, Then Made It Grade Itself"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>I wanted to see if I could build a RAG system that would output interesting and accurate F1 race weekend insights and summaries based on the entire weekend\u2019s team-radio messages. Here are the five commands that took it from a simple demo to something I would trust.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you have never listened to Formula 1 team radio, it is one of the great unfiltered data sources in sport. Drivers pulling four G at 300kph, describing tyre degradation in real time, occasionally swearing at their race engineer about strategy. It is dense, timestamped, emotional, full of jargon, and scattered across twenty drivers and a whole race weekend.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Which is to say it is a mess. And messes are where retrieval-augmented generation either earns its keep or breaks in a way nobody notices until a customer does.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So I built a RAG pipeline that answers questions like <em>&#8220;What tyre problems did drivers report?&#8221;<\/em> by retrieving the relevant radio messages and summarizing them. It took an afternoon and worked on the first try, which was the problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Because a RAG system that returns plausible text is easy. It gave me confident, well-written summaries with specific driver names and specific complaints, and I had no idea which parts were real. F1 radio makes that trap obvious: the answers <em>sound<\/em> authoritative because the source material is authoritative, and with data like this, you can&#8217;t tell a confident summary from an accurate one just by reading it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The interesting half of the project was everything after it worked.<\/p>\n\n\n\n<h2 id=\"h-why-this-is-a-useful-example-not-just-a-fun-one\" class=\"wp-block-heading\"><strong>Why this is a useful example, not just a fun one<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Strip out the racing and look at the shape of the problem. You have high-volume, timestamped, domain-specific chatter from many participants, and you want reliable summaries scoped to a person, a time window, or a topic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It\u2019s similar to how you\u2019d handle customer support tickets, sales call transcripts, your incident channel during an outage, clinical notes, field-service logs, or Slack workspaces. The retrieval failures are the same ones too, and they&#8217;re almost never semantic: they&#8217;re scoping failures, the right sentiment from the wrong person, or the right person in the wrong time window.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F1 radio makes those failures obvious and entertaining instead of subtle and expensive.<\/p>\n\n\n\n<h2 id=\"h-why-i-chose-opik-for-this-project\" class=\"wp-block-heading\"><strong>Why I chose Opik for this project<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I needed three things, and I wanted them in one tool rather than stitched together.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>I needed to see inside the pipeline before judging it.<\/strong> Evaluating something you cannot observe gives you a score with nowhere to go. When a summary is wrong, I need to know within seconds whether retrieval pulled the wrong messages or the model ignored the right ones. Those two failures produce the same bad answer and have nothing else in common.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>I needed both kinds of evaluation.<\/strong> Some of what I cared about is a hard assertion: did it stay inside the session I asked about. Some of it is a judgment call: is this summary actually grounded in the retrieved context. Plenty of tools cover both, but I wanted them in one place with the traces, rather than assembling the pieces myself.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>I needed to optimize against the result, not my instincts.<\/strong> This was the deciding factor. Opik ships an Agent Optimizer with six algorithms behind one API, including the MetaPrompt optimizer I ended up using. Hand-tuning a prompt without an evaluation set is not engineering, it is preference expressed as a commit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Opik is an open-source LLM observability and agent evaluation platform, built by Comet. It&#8217;s one of the most active open-source options in the category, with 21,125 GitHub stars as of 2026-08-05, and it does all three of the above in one place. It&#8217;s Apache-2.0, so the version I ran locally is the full thing, not a trial tier.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where I would look at something else.<\/strong> I considered LangSmith, which is a genuinely good platform and the more mature product in several respects. We keep a fuller LangSmith vs. Opik comparison if you want the feature and pricing detail. If this project had been built on LangChain or LangGraph, LangSmith&#8217;s native integration is tighter than anything else available and I would probably have used it. Its annotation tooling is excellent and has been in production use longer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two things sent me to Opik anyway. Self-hosting is available on LangSmith only at the Enterprise tier, while Opik self-hosts free with the full feature set, which matters for a weekend project and matters more for anything touching data you cannot send to a vendor. And LangSmith&#8217;s documented optimization is human-in-the-loop: it amplifies your feedback into few-shot examples rather than autonomously searching prompt variants against a fitness function. Its autonomous optimizer, Promptim, is a separate library that LangChain labels experimental. Step four below runs that same kind of autonomous search, on this project.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pro tip:<\/strong> if you are choosing between observability tools, pick the one whose evaluation story you understand, not the one with the longest feature list. You will interact with the eval loop every single day and the rest maybe twice a quarter.<\/p>\n\n\n\n<h2 id=\"h-how-i-built-it\" class=\"wp-block-heading\"><strong>How I built it<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Five commands, and the last three are the ones that matter.<br><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Step<\/strong><\/td><td><strong>Command<\/strong><\/td><td><strong>What it does<\/strong><\/td><\/tr><tr><td>1. Ingest<\/td><td><code>f1rag ingest<\/code><\/td><td>Loads radio messages into a local ChromaDB store, tagged with session, driver, and lap<\/td><\/tr><tr><td>2. Ask<\/td><td><code>f1rag ask \"...\"<\/code><\/td><td>Runs retrieval and generation, emitting a trace of nested spans to Opik<\/td><\/tr><tr><td>3. Evaluate<\/td><td><code>f1rag eval<\/code><\/td><td>Creates a dataset and test suite, then scores it with the Test Suite pass rate plus ContextRecall and Hallucination metrics<\/td><\/tr><tr><td>4. Optimize<\/td><td><code>f1rag optimize<\/code><\/td><td>Runs MetaPromptOptimizer.optimize_prompt() to search for a better summarizer prompt, scored against an AnswerRelevance judge<\/td><\/tr><tr><td>5. Promote<\/td><td><code>f1rag promote<\/code><\/td><td>Writes the winning prompt to the Opik Prompt Library with version control<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. Ingest<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">f1rag ingest loads the radio messages into a local <strong>ChromaDB<\/strong> vector store using its default embeddings, tagged with session, driver, and lap as metadata.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The metadata is doing more work than it looks. Since most failures here are scoping failures, keeping those fields queryable is what lets me diagnose a bad answer later instead of guessing at it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>One honest note on the data.<\/strong> The messages are synthetic. OpenF1&#8217;s endpoint serves audio recordings rather than transcripts, so using real radio would have meant a speech-to-text pipeline and a licensing conversation before I could evaluate anything. I generated them instead. A clean labelled corpus rarely exists on day one, and waiting for one is how evaluation gets postponed forever. Synthetic data is enough to build the loop; swap in real transcripts later and the loop still runs.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. Ask<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>uv run f1rag ask \"What tyre problems did drivers report?\"<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Every call in the chain carries <code>@opik.track<\/code>, so retrieval and generation both land in Opik as a <strong>trace<\/strong> made of nested <strong>spans<\/strong>. One decorator, and the pipeline stops being a black box. This is the basic move behind LLM observability, and it is the prerequisite for everything below.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3. Evaluate<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is where the project stopped being a demo, and I ran both kinds of evaluation rather than picking a side.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Test Suites<\/strong> handle the assertions. Each suite has global rules every case must pass, plus item-level assertions for specific scenarios, written in plain English and returning a pass rate: did it mention the driver I asked about, stay inside the session, and avoid inventing a lap number?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Metrics<\/strong> handle the graded half, using LLM-as-a-Judge scorers. If you are new to scoring retrieval quality, the RAG evaluation guide covers the ideas underneath these two:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ContextRecall<\/strong> asks whether the retrieved context actually contained what was needed.<\/li>\n\n\n\n<li><strong>Hallucination<\/strong> asks whether the summary asserts anything the context does not support.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">ContextRecall isolates retrieval and Hallucination isolates generation, so when both look healthy but the answer is still wrong, the problem is the prompt itself, which is exactly what step four exists to fix.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>4. Optimize<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>f1rag optimize<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>MetaPrompt<\/strong> is one of six algorithms in Opik&#8217;s Agent Optimizer, alongside GEPA, Evolutionary, Few-Shot Bayesian, HRPO, and Parameter Optimization. Under the hood it calls <code>MetaPromptOptimizer.optimize_prompt()<\/code>, which takes my summarizer prompt and my evaluation dataset and searches for a version that scores better against an AnswerRelevance judge.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The real unlock is that the search runs against a fitness function at all, not that a machine is writing the prompts. Step three is what makes step four possible, and skipping it is why so much prompt engineering is just vibes with extra steps.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>5. Promote<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>f1rag promote<\/code> writes the winning prompt to the Opik <strong>Prompt Library<\/strong> with version control.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prompts are application logic that most of us keep in a string literal, edit in production, and cannot roll back. Versioning closes the loop: the prompt that scored well is the prompt that ships, and when next month&#8217;s version scores worse, I can see what changed and go back. That slow degradation has a name, prompt drift, and version history is how you catch it early.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Run the whole cycle with <code>f1rag run-all<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Where this approach has limits<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Three, honestly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>LLM-as-a-Judge is a model, so it has variance.<\/strong> Hallucination and ContextRecall are judged by an LLM, which means they carry their own failure modes including position and verbosity bias. That&#8217;s meaningfully better than spot-checking by hand, but it isn&#8217;t ground truth, so sample the judgments with human review periodically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Optimization overfits to your eval set.<\/strong> MetaPrompt improves the score you give it. If the dataset does not represent real traffic, you get a prompt tuned to a fiction. Grow the dataset from production traces instead of treating it as fixed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Synthetic data flatters retrieval.<\/strong> Generated messages are cleaner than real radio: no crosstalk, no dropped audio, no engineer talking over a driver mid-corner. Expect recall to drop when real transcripts arrive, and treat that first real run as a new baseline rather than a regression.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Final thoughts<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The F1 data is what made this fun enough to finish on a weekend. The part worth stealing is the loop: trace what happens, define what good means, measure it, optimize against the measurement, version what won.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The common failure mode is stopping after step two: ship on a demo, then find out what was broken from users. Getting from there to something I&#8217;d actually trust took five commands.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Opik is free and open source, self-hosted or managed, whether you are debugging your first RAG pipeline or running dozens in production.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install opik opik-optimizer chromadb litellm typer<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Clone <code>comet-ml\/opik-examples<\/code>, <code>cd<\/code> into <code>use-cases\/f1_radio_rag<\/code>, then run <code>f1rag ingest<\/code> and <code>f1rag ask<\/code> in dry-run mode with no credentials at all. Add a model-provider key (<code>ANTHROPIC_API_KEY<\/code> by default) plus <code>OPIK_API_KEY<\/code> and <code>OPIK_WORKSPACE<\/code> when you want live summaries and the traces, experiments, and prompt versions to show up in Opik.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I wanted to see if I could build a RAG system that would output interesting and accurate F1 race weekend insights and summaries based on the entire weekend\u2019s team-radio messages. Here are the five commands that took it from a simple demo to something I would trust. If you have never listened to Formula 1 [&hellip;]<\/p>\n","protected":false},"author":153,"featured_media":20521,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"customer_name":"","customer_description":"","customer_industry":"","customer_technologies":"","customer_logo":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[8,65,7],"tags":[],"coauthors":[367],"class_list":["post-20520","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-comet-community-hub","category-llmops","category-tutorials"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>I Built a RAG Pipeline for F1 Team Radio, Then Made It Grade Itself<\/title>\n<meta name=\"description\" content=\"I wanted to see if I could build a RAG system that would output F1 race insights and summaries based on the weekend\u2019s team-radio messages.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"I Built a RAG Pipeline for F1 Team Radio, Then Made It Grade Itself\" \/>\n<meta property=\"og:description\" content=\"I wanted to see if I could build a RAG system that would output F1 race insights and summaries based on the weekend\u2019s team-radio messages.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/\" \/>\n<meta property=\"og:site_name\" content=\"Comet\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/cometdotml\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-07T22:27:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-07T22:27:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/08\/f1-radio-rag-pipeline-1024x576.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"576\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Francisco Schulz\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@Cometml\" \/>\n<meta name=\"twitter:site\" content=\"@Cometml\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Francisco Schulz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"I Built a RAG Pipeline for F1 Team Radio, Then Made It Grade Itself","description":"I wanted to see if I could build a RAG system that would output F1 race insights and summaries based on the weekend\u2019s team-radio messages.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/","og_locale":"en_US","og_type":"article","og_title":"I Built a RAG Pipeline for F1 Team Radio, Then Made It Grade Itself","og_description":"I wanted to see if I could build a RAG system that would output F1 race insights and summaries based on the weekend\u2019s team-radio messages.","og_url":"https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/","og_site_name":"Comet","article_publisher":"https:\/\/www.facebook.com\/cometdotml","article_published_time":"2026-08-07T22:27:14+00:00","article_modified_time":"2026-08-07T22:27:34+00:00","og_image":[{"width":1024,"height":576,"url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/08\/f1-radio-rag-pipeline-1024x576.png","type":"image\/png"}],"author":"Francisco Schulz","twitter_card":"summary_large_image","twitter_creator":"@Cometml","twitter_site":"@Cometml","twitter_misc":{"Written by":"Francisco Schulz","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/#article","isPartOf":{"@id":"https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/"},"author":{"name":"Francisco Schulz","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/4048f451d3289cacae9d9cb0d15f7d84"},"headline":"I Built a RAG Pipeline for F1 Team Radio, Then Made It Grade Itself","datePublished":"2026-08-07T22:27:14+00:00","dateModified":"2026-08-07T22:27:34+00:00","mainEntityOfPage":{"@id":"https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/"},"wordCount":1749,"commentCount":0,"publisher":{"@id":"https:\/\/www.comet.com\/site\/#organization"},"image":{"@id":"https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/#primaryimage"},"thumbnailUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/08\/f1-radio-rag-pipeline.png","articleSection":["Comet Community Hub","LLMOps","Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/","url":"https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/","name":"I Built a RAG Pipeline for F1 Team Radio, Then Made It Grade Itself","isPartOf":{"@id":"https:\/\/www.comet.com\/site\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/#primaryimage"},"image":{"@id":"https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/#primaryimage"},"thumbnailUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/08\/f1-radio-rag-pipeline.png","datePublished":"2026-08-07T22:27:14+00:00","dateModified":"2026-08-07T22:27:34+00:00","description":"I wanted to see if I could build a RAG system that would output F1 race insights and summaries based on the weekend\u2019s team-radio messages.","breadcrumb":{"@id":"https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/#primaryimage","url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/08\/f1-radio-rag-pipeline.png","contentUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/08\/f1-radio-rag-pipeline.png","width":1672,"height":941},{"@type":"BreadcrumbList","@id":"https:\/\/www.comet.com\/site\/blog\/f1-radio-rag-ai-eval-example\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.comet.com\/site\/"},{"@type":"ListItem","position":2,"name":"I Built a RAG Pipeline for F1 Team Radio, Then Made It Grade Itself"}]},{"@type":"WebSite","@id":"https:\/\/www.comet.com\/site\/#website","url":"https:\/\/www.comet.com\/site\/","name":"Comet","description":"Build Better Models Faster","publisher":{"@id":"https:\/\/www.comet.com\/site\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.comet.com\/site\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.comet.com\/site\/#organization","name":"Comet ML, Inc.","alternateName":"Comet","url":"https:\/\/www.comet.com\/site\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/#\/schema\/logo\/image\/","url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/01\/logo_comet_square.png","contentUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/01\/logo_comet_square.png","width":310,"height":310,"caption":"Comet ML, Inc."},"image":{"@id":"https:\/\/www.comet.com\/site\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/cometdotml","https:\/\/x.com\/Cometml","https:\/\/www.youtube.com\/channel\/UCmN63HKvfXSCS-UwVwmK8Hw"]},{"@type":"Person","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/4048f451d3289cacae9d9cb0d15f7d84","name":"Francisco Schulz","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/image\/22aed144e2f1f5dc9237d51cb621ff02","url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/08\/francisco-schulz-96x96.jpeg","contentUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/08\/francisco-schulz-96x96.jpeg","caption":"Francisco Schulz"},"description":"Francisco Schulz is an AI and MLOps engineer at Comet who specializes in turning experimental LLM systems into scalable, production-ready agents. With expertise spanning Python, cloud infrastructure, Kubernetes, LLMs, and AI observability, he combines hands-on engineering with systems thinking. Francisco brings a practical understanding of AI operations, helping teams simplify complex workflows and build reliable infrastructure for emerging technologies like MCP.","url":"https:\/\/www.comet.com\/site\/blog\/author\/franciscoschulz\/"}]}},"jetpack_featured_media_url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/08\/f1-radio-rag-pipeline.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/20520","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/users\/153"}],"replies":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/comments?post=20520"}],"version-history":[{"count":1,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/20520\/revisions"}],"predecessor-version":[{"id":20522,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/20520\/revisions\/20522"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/media\/20521"}],"wp:attachment":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/media?parent=20520"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/categories?post=20520"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/tags?post=20520"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/coauthors?post=20520"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}