{"id":12869,"date":"2025-02-19T07:29:14","date_gmt":"2025-02-19T15:29:14","guid":{"rendered":"https:\/\/live-cometml.pantheonsite.io\/?p=12869"},"modified":"2025-10-27T20:04:50","modified_gmt":"2025-10-27T20:04:50","slug":"a-simple-recipe-for-llm-observability","status":"publish","type":"post","link":"https:\/\/www.comet.com\/site\/blog\/a-simple-recipe-for-llm-observability\/","title":{"rendered":"A Simple Recipe for LLM Observability"},"content":{"rendered":"\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"509\" src=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/header-image-recipebot-1024x509.png\" alt=\"\" class=\"wp-image-12933\" srcset=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/header-image-recipebot-1024x509.png 1024w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/header-image-recipebot-300x149.png 300w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/header-image-recipebot-768x381.png 768w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/header-image-recipebot.png 1033w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">So, you\u2019re buil<\/span><span style=\"font-weight: 400;\">ding an AI application on top of an LLM, and you\u2019re planning on setting it live in production. And thanks to the proliferation of frameworks and APIs, you\u2019re able to prototype, test, and deploy faster than ever. Before you go to production, however, you realize you still have one problem to solve: <\/span><i><span style=\"font-weight: 400;\">How are you supposed to monitor this thing?<\/span><\/i><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">One thing I\u2019ve learned over the course of 10+ years in production ML and AI, is the importance of monitoring these software systems. Despite our best efforts, models have a way of surprising us when they\u2019re deployed. Once an LLM is in production and in the hands of our users, we want to be proactively alerted to any disruptive behavior or bugs so we can preemptively resolve them before there is significant negative impact. Yet monitoring LLMs is complex, and although best practices can overlap and borrow from traditional software development, there are some fundamental differences.&nbsp;&nbsp;<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-why-monitoring-llms-is-different\"><span style=\"font-weight: 400;\">Why Monitoring LLMs is Different<\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">Production issues with an LLM look quite different from the issues that arise in traditional software. The LLM itself is now a component of the software architecture that needs to be monitored. These models are nondeterministic by nature, meaning that their output is probabilistically generated and there is natural variability expected in the results, resulting in strange behavior issues we\u2019ve never seen in software. Traditional software, for example, doesn\u2019t hallucinate or generate biased content. So LLMs have different failure points, and because of this, a different approach and set of tools is required to provide complete monitoring coverage to safeguard these models against their potential failure points.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">As LLMOps matures, we are discovering the exact monitoring paradigms we should implement before we flip the switch to live. <\/span><span style=\"font-weight: 400;\">As developers, we want to keep tabs on the health of our apps and proactively monitor for potential issues. We\u2019d also like to visualize the behavior in a nice dashboard. That is actually really challenging with LLMs because of the nondeterministic nature of their output. For example, traditional software will throw an error when it fails\u2014at least, hopefully. Your LLM, on the other hand, isn\u2019t going to tell you if it\u2019s hallucinating. As a result, we have to be thoughtful about what we measure to assess the health of our system, and it can be very difficult to develop and generate the right set of numeric metrics to monitor the LLMs behavior online at scale.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">In this article, I will propose&nbsp;metric categories that must be considered before your LLM goes live, and provide a framework using OSS tools to configure a full coverage monitoring and debugging strategy. I\u2019ll be using <\/span><a href=\"https:\/\/github.com\/openai\/openai-python\"><span style=\"font-weight: 400;\">OpenAI\u2019s SDK<\/span><\/a><span style=\"font-weight: 400;\"> and <\/span><a href=\"https:\/\/github.com\/comet-ml\/opik\"><span style=\"font-weight: 400;\">Opik<\/span><\/a><span style=\"font-weight: 400;\"> and providing easy copy paste coding samples so you can customize this monitoring strategy in your own apps. I was surprised by how quickly I was able to stand up production quality monitoring for a real LLM app using open source tools. This tutorial may look simple, but don\u2019t be fooled &#8211; a few lines of clean code can actually build a powerful and meaningful product!&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">If you\u2019re looking to personalize a monitoring strategy for your own LLM app, this tutorial will give you some ideas about what you should be monitoring for, as well as provide a code example that can easily be customized to fit a monitoring strategy that is specific to your needs. And if you do use this monitoring strategy or code for your own projects, I\u2019d love to see what you built! Please tag me in your projects if you post about them on LI, or drop your Github in the comments down below.&nbsp;<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-monitoring-strategy-for-llms\"><span style=\"font-weight: 400;\">Monitoring Strategy for LLMs<\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">So what are these unique failure points specific to live LLM models? What should we be worried about once our LLM project is live? I propose three categories of online metrics that should be considered for monitoring:<\/span><b> Cost, Quality, and Output.<\/b><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cost-metrics\">Cost Metrics<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">Running LLM inference can be expensive. Every call a customer makes to your app is likely one or multiple calls to an LLM model. Whether that model is hosted internally on your servers, or an API from an LLM provider like OpenAI, that call is going to cost you some $. Costs can escalate quickly, especially with high API usage, frequent model queries, and large inference workloads. So monitoring your cost metrics is crucial for maintaining ROI on your project.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">I typically monitor for the following cost metrics:<\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">Number of Traces<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">Duration<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">Token Usage<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">Estimated Cost<\/span><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-quality-metrics\">Quality Metrics<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">Because we\u2019re working with AI and not just a cut and dry software tool, the definition of quality becomes a bit complex. LLMs are known to do strange things like hallucinate, or go off the rails and start producing harmful or inappropriate content. So, quality here means keeping the AI operating within its expected boundaries. We have to consider metrics to perform moderation and detect hallucinations as fundamental pieces of the monitoring puzzle. Often, engineers and data scientists build guardrails into AI software to mitigate these kinds of risks and ensure the safe, ethical, and responsible use of AI. Without guardrails, LLMs can generate misinformation, biased responses, offensive content, or security vulnerabilities that bring harm to your product or business. Yikes.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">Guardrails can be implemented in a couple of different ways. Typically, they involve some logic to programmatically block inputs or outputs that are detected as harmful. Often, guardrails will also be coupled with human in the loop intervention. Alongside guardrails, it is also important to design a mechanism of gathering insights to improve model performance iteratively, like collecting user scores.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">Luckily Opik has these LLM quality and feedback metrics built-in, making it easy for you to apply them to your project as well as customize additional metrics.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">I typically monitor for the following quality metrics:<\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">Hallucinations<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">Moderation<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">User Feedback Scores<\/span><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-custom-output-metrics\">Custom Output Metrics<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">The output of LLMs can vary due to the nondeterministic nature of these models we discussed earlier. If you\u2019re interested in learning more about that, I have an article that covers it <\/span><a href=\"https:\/\/statistician-in-stilettos.medium.com\/testing-the-limits-of-llms-in-predictive-analytics-4235dd1501c6\"><span style=\"font-weight: 400;\">here<\/span><\/a><span style=\"font-weight: 400;\">. Because of this, there can be variability and errors in the output that are specific to our use case, and difficult to detect with an out of the box standard metric.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">I typically monitor for my output using a custom \u201cLLM as a Judge\u201d metrics. In the example below, I\u2019ll show you how I used Opik to create a custom prompt to generate a metric that measures the usefulness and accuracy of my very specific output in the context of the application.&nbsp;<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-building-an-llm-observability-system-with-openai-and-opik\"><span style=\"font-weight: 400;\">Building an LLM Observability System with OpenAI and Opik<\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">Okay great, so I have a good monitoring strategy in place that can be easily customized to my project, while still covering the bases of what could go wrong with an LLM in production. <\/span><i><span style=\"font-weight: 400;\">But how do I implement it?<\/span><\/i><span style=\"font-weight: 400;\"> I used the OpenAI SDK and Opik python SDK to do this, but you could create something similar with many different model providers and OSS observability tools.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">You can also use the Opik dashboard to review your metrics, feedback scores, trace count and tokens over time at both a daily and hourly granularity. Then, when a production issue is detected, you can debug and troubleshoot the issue by exploring the trace data you logged to Opik. So this is the perfect tool to provide both easy integrations into my existing project code, as well as give me an UI to keep an eye on my metrics and inputs and outputs once my project is live. And the thing I really liked about it as a developer who loves to tinker with personal projects, is that after my AI app was completed, I was able to get Opik integrated and up and running in under an hour. It was only a few lines of code to configure the logging and personalize the metrics and monitoring strategy.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-example-recipe-generator-project-with-reproducible-monitoring-code\"><span style=\"font-weight: 400;\">Example Recipe Generator Project with Reproducible Monitoring Code<\/span><\/h2>\n\n\n\n<figure class=\"wp-block-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"300\" src=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image1-300x300.png\" alt=\"\" class=\"wp-image-12870\" srcset=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image1-300x300.png 300w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image1-150x150.png 150w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image1.png 512w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">The best way to learn AI is to tinker with it hands on. So I built a working LLM recipe generator to assist me with my home cooking endeavors, and I set up a custom end-to-end monitoring strategy to ensure the system stays within budget and operates as expected.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">The app is quite simple, and can be run in a jupyter notebook. The user simply enters a query for a dish, and the prompt instructs it to return a recipe that can reasonably be executed by a home chef like you or I.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">If you\u2019d like to reproduce my project exactly, I\u2019ve shared all the code here: <\/span><a href=\"https:\/\/colab.research.google.com\/drive\/14hAdcD_g2V0eOAfyYfU9PZydb3PacTXi#scrollTo=tIt5QWb3RdLf\"><span style=\"font-weight: 400;\" data-rich-links=\"{&quot;fple-t&quot;:&quot;Monitoring LLM Systems in Production with Comet Opik.ipynb&quot;,&quot;fple-u&quot;:&quot;https:\/\/colab.research.google.com\/drive\/14hAdcD_g2V0eOAfyYfU9PZydb3PacTXi#scrollTo=tIt5QWb3RdLf&quot;,&quot;fple-mt&quot;:&quot;application\/vnd.google.colaboratory&quot;,&quot;type&quot;:&quot;first-party-link&quot;}\">Monitoring LLM Systems in Production with Comet Opik.ipynb<\/span><\/a><span style=\"font-weight: 400;\">&nbsp;<\/span><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@opik.track(flush=True)\ndef generate_recipe(dish_name):\n\n    prompt = f\"\"\"\n    You are a world-class home chef and recipe developer. Generate a step-by-step recipe for {dish_name}.\n    Include a list of ingredients with quantities, clear cooking instructions, preparation time, cooking time, and serving size.\n    If applicable, provide useful tips, optional variations, or suggestions for substitutes.\n    Keep the recipe straightforward and easy to follow for a novice at home cook.\n    \"\"\"\n\n    # Request recipe generation from OpenAI's completions model\n    response = openai_client.chat.completions.create(\n        model=\"gpt-3.5-turbo\",\n        messages=&#91;\n            {\"role\": \"system\", \"content\": \"You are a world-class chef and recipe developer.\"},  # system message\n            {\"role\": \"user\", \"content\": prompt}  # User's input prompt\n        ],\n        max_tokens=500,\n        temperature=0.7,\n        n=1\n    )\n\n    # Add user feedback score to the trace in Opik\n    opik_context.update_current_trace(\n    feedback_scores=&#91;\n        {\"name\": \"user_feedback\", \"value\": 1.0, \"reason\": \"It looks good.\"}\n        ]\n    )\n\n    return response\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">I\u2019m using the <\/span><a href=\"https:\/\/platform.openai.com\/docs\/guides\/text-generation\"><span style=\"font-weight: 400;\">OpenAI SDK<\/span><\/a><span style=\"font-weight: 400;\"> to make a simple call to gpt 3.5 turbo. Here I can configure the model used and prompt as well as define model parameters such as the temperature and max tokens.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">Then, I use the <\/span><a href=\"https:\/\/www.comet.com\/docs\/opik\/tracing\/integrations\/openai\"><span style=\"font-weight: 400;\">Opik OpenAI integration<\/span><\/a><span style=\"font-weight: 400;\"> with the <\/span><a href=\"https:\/\/www.comet.com\/docs\/opik\/tracing\/log_traces#using-function-decorators\"><span style=\"font-weight: 400;\">@track<\/span><\/a><span style=\"font-weight: 400;\"> decorator to seamlessly integrate the metrics collection as well as logging traces.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">The inference step for my app is equally as simple. I simply enter the name of a dish and run the code to generate a recipe.&nbsp;<\/span><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Example usage\ndish_name = \"cheddar dill biscuts like at red lobster. It should include milk and 3 eggs. the butter is melted. No baking powder. 4 cups flour. instant yeast\"\nrecipe = generate_recipe(dish_name)\n\n#extract just the recipe text and print\nprint(recipe.choices&#91;0].to_dict()&#91;'message']&#91;'content'])<\/code><\/pre>\n\n\n\n<div class=\"notebook-scrolling-horizontal\">\n<div class=\"notebook-content-background\">\n<div class=\"notebook-content \">\n<div class=\"notebook-cell-list\">\n<div id=\"cell-8IGA3UzhLlS5\" class=\"cell code code-has-output icon-scrolling focused\" tabindex=\"-1\" role=\"region\" aria-label=\"Cell 8: Code cell: \">\n<div class=\"main-content\">\n<div class=\"cell-contents\">\n<div class=\"codecell-input-output\">\n<div class=\"output\" role=\"region\" aria-label=\"Cell 8 output\">\n<div class=\"output-content\">\n<div class=\"output-iframe-container\">\n<div class=\"output-iframe-sizer\">\n<div>\n<div>\n<div>\n<div class=\"stream output_text\">\n<pre>OPIK: Started logging traces to the \"recipe-generator\" project at <a href=\"https:\/\/www.comet.com\/opik\/statisticianinstilettos\/redirect\/projects?name=recipe-generator\" target=\"_blank\" rel=\"nofollow noopener\">https:\/\/www.comet.com\/opik\/statisticianinstilettos\/redirect\/projects?name=recipe-generator<\/a>.\n**Cheddar Dill Biscuits**\n\n**Ingredients:**\n- 4 cups all-purpose flour\n- 1 packet instant yeast\n- 3 large eggs\n- 1 cup milk\n- 1 cup melted butter\n- 1 cup shredded cheddar cheese\n- 2 tablespoons dried dill\n- 1 teaspoon salt\n\n**Instructions:**\n\n**Preparation Time:** 20 minutes\n**Cooking Time:** 15-20 minutes\n**Serving Size:** 12 biscuits\n\n1. Preheat your oven to 375\u00b0F (190\u00b0C) and line a baking sheet with parchment paper.\n\n2. In a large mixing bowl, combine the flour, instant yeast, shredded cheddar cheese, dried dill, and salt. Mix well to combine all the dry ingredients.\n\n3. In a separate bowl, whisk together the eggs, milk, and melted butter until well combined.\n\n4. Make a well in the center of the dry ingredients and pour the wet mixture into it. Use a spatula to gently fold the wet and dry ingredients together until a soft dough forms. Do not overmix.\n\n5. Turn the dough out onto a lightly floured surface and gently knead it a few times until it comes together.\n\n6. Roll out the dough to about 1-inch thickness. Use a round cookie cutter or a glass to cut out biscuits from the dough.\n\n7. Place the biscuits on the prepared baking sheet, leaving a little space between each one.\n\n8. Bake in the preheated oven for 15-20 minutes, or until the biscuits are golden brown and cooked through.\n\n9. Remove the biscuits from the oven and let them cool slightly before serving.\n\n**Tips:**\n- Be gentle when mixing and kneading the dough to ensure a light and fluffy texture.\n- Feel free to add more cheese or dill according to your taste preference.\n- Serve the biscuits warm with butter or your favorite spread.\n\nEnjoy your delicious homemade Cheddar Dill Biscuits that are reminiscent of the ones served at Red Lobster!\n<\/pre>\n<\/div>\n<\/div>\n<div><\/div>\n<\/div>\n<\/div>\n<div>\n<div><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"add-cell\">\n<hr>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-traces-and-spans\"><span style=\"font-weight: 400;\">Traces and Spans<\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">When an inference call is made, Opik automatically tracks cost metrics as well as logs all the data about the OpenAI model and inference call easily through the built-in integration. Using one of the Opik<\/span> <a href=\"https:\/\/www.comet.com\/docs\/opik\/tracing\/integrations\/overview\"><span style=\"font-weight: 400;\">integrations<\/span><\/a> <span style=\"font-weight: 400;\">is the easiest way to get started with <a href=\"https:\/\/www.comet.com\/site\/blog\/llm-observability\/\">LLM observability<\/a> if you\u2019re building with one of the providers they have listed. Using the<\/span> <span style=\"font-weight: 400;\">@track<\/span> <span style=\"font-weight: 400;\">decorator allows you to track not just LLM calls but any function call in your application, and it is often used in conjunction with the integrations.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"277\" src=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image4-1024x277.png\" alt=\"\" class=\"wp-image-12873\" srcset=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image4-1024x277.png 1024w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image4-300x81.png 300w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image4-768x208.png 768w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image4-1536x416.png 1536w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image4.png 1999w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">Logging the traces and spans provides visibility into your inputs and outputs of every call. This ability to look under the hood is not only excellent during development, but it is useful in production too. I can use this to pinpoint and debug issues, and the metrics I\u2019ve defined in my monitoring strategy are going to be calculated and assigned to traces and spans to give us the full picture.&nbsp;<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"330\" src=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image8-1024x330.png\" alt=\"\" class=\"wp-image-12877\" srcset=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image8-1024x330.png 1024w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image8-300x97.png 300w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image8-768x248.png 768w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image8-1536x496.png 1536w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image8.png 1999w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-metric-monitoring\"><span style=\"font-weight: 400;\">Metric Monitoring<\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">Here is my monitoring metrics strategy for this specific application.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><b>Cost<\/b><\/td><td><b>Quality<\/b><\/td><td><b>Custom Output<\/b><\/td><\/tr><tr><td>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Number of Traces<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Duration<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Token Usage<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Estimated Cost<\/span><\/li>\n<\/ul>\n<\/td><td>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Hallucination<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Moderation<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">User Feedback Score<\/span><\/li>\n<\/ul>\n<\/td><td><span style=\"font-weight: 400;\">Custom <\/span><i><span style=\"font-weight: 400;\">\u201cLLM as a Judge\u201d <\/span><\/i><span style=\"font-weight: 400;\">metric for recipe accuracy&nbsp;<\/span><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cost-metrics-0\">Cost Metrics<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">The Opik OpenAI integration<\/span> <a href=\"https:\/\/www.comet.com\/docs\/opik\/tracing\/cost_tracking\"><span style=\"font-weight: 400;\">automatically tracks<\/span><\/a> <span style=\"font-weight: 400;\">the cost metrics I care about as it\u2019s been designed to track and monitor costs for your LLM applications by measuring token usage across all traces. I automatically see metrics for duration and cost on the span and trace levels. This allows me to see right away if a specific call is costing me too much, and pinpoint exactly where this occurs within the trace.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"670\" src=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image2-1024x670.png\" alt=\"\" class=\"wp-image-12871\" srcset=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image2-1024x670.png 1024w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image2-300x196.png 300w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image2-768x502.png 768w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image2-1536x1004.png 1536w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image2.png 1999w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">Then, you can use the Opik dashboard to review costs at three levels: spans, traces, and projects. Each level provides different insights into your application&#8217;s cost structure. Awesome so I can see it on an individual trace, which will allow me to pinpoint a problematic call in prod, but i also want to monitor it over time and being able to visualize it would help quite a bit with keeping tabs on my robots in prod.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"883\" src=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image11-1024x883.png\" alt=\"\" class=\"wp-image-12880\" srcset=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image11-1024x883.png 1024w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image11-300x259.png 300w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image11-768x662.png 768w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image11-1536x1324.png 1536w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image11.png 1828w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-quality-metrics-0\">Quality Metrics<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">Opik allows you to create metrics for hallucination<\/span> <a href=\"https:\/\/www.comet.com\/docs\/opik\/evaluation\/metrics\/hallucination\"><span style=\"font-weight: 400;\">hallucination<\/span><\/a><span style=\"font-weight: 400;\"> and <\/span><a href=\"https:\/\/www.comet.com\/docs\/opik\/evaluation\/metrics\/moderation\"><span style=\"font-weight: 400;\">moderation<\/span><\/a> <span style=\"font-weight: 400;\">easily. These can be configured as online metrics to evaluate inference events. The configuration can be done<\/span> <a href=\"https:\/\/www.comet.com\/docs\/opik\/production\/rules\"><span style=\"font-weight: 400;\">through the UI<\/span><\/a><span style=\"font-weight: 400;\"> , or <\/span><a href=\"https:\/\/www.comet.com\/docs\/opik\/evaluation\/metrics\/custom_metric\"><span style=\"font-weight: 400;\">programmatically<\/span><\/a><span style=\"font-weight: 400;\">. <\/span><span style=\"font-weight: 400;\">Notice that these metrics are evaluated in real time with each trace that is logged to the Opik system. They appear in the \u201cfeedback scores\u201d tab so they can be evaluated alongside the logged inputs and outputs.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"330\" src=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image8-1024x330.png\" alt=\"\" class=\"wp-image-12877\" srcset=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image8-1024x330.png 1024w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image8-300x97.png 300w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image8-768x248.png 768w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image8-1536x496.png 1536w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image8.png 1999w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">To test if these metrics will assist me in identifying potential issues and applying the proper guardrails to the system, I had to ask my application for a few unsavory recipes. Notice that our online evaluation metrics for Moderation caught the most troublesome of these, while the Recipe Quality metric flagged another.&nbsp;<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"85\" src=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image9-1024x85.png\" alt=\"\" class=\"wp-image-12878\" srcset=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image9-1024x85.png 1024w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image9-300x25.png 300w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image9-768x63.png 768w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image9-1536x127.png 1536w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image9.png 1999w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-custom-output-metrics-0\">Custom Output Metrics<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">Because this is a recipe generator, I have some specific concerns about the output. I want to make sure the recipe proportions, cooktime, and techniques are all reasonably accurate. How do I measure and test for that, and how do I get a numeric metric to monitor with written text output?<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">Easy. The answer is LLM as a judge. If you&#8217;re not already familiar with LLM as a Judge metrics, I\u2019ll give a quick recap. It is the wild concept of using another call to an LLM to judge the output of your LLM. The LLM as a Judge metric uses a prompt to force a metric to be returned to score, or \u201cjudge\u201d the content of the output. Because the metric is actually just a prompt, it is completely customizable.&nbsp;<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"514\" src=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image6-1024x514.png\" alt=\"\" class=\"wp-image-12875\" srcset=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image6-1024x514.png 1024w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image6-300x151.png 300w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image6-768x386.png 768w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image6.png 1294w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">This may seem like a strange way to create a metric, especially to any of my mathematically minded colleagues, and it is. But it is also creative and customizable. And these evaluations can return more than just a metric, you can also instruct it to provide a reason or the score it assigned, which assists developers in debugging issues. So we should just use it with knowledge of its limitations due to LLM\u2019s known limitations to make direct mathematical calculations.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">My Recipe Quality metric is a totally custom metric that was lightning fast to implement in Opik. Using the \u201crules\u201d functionality, I was able to design a perfectly tuned to catch potential issues that could arise for my project. I had fun being creative and gave my metric the personality and asked it to judge the recipe based on what Gordon Ramesy may think<\/span><span style=\"font-weight: 400;\">.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"825\" height=\"1024\" src=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image3-825x1024.png\" alt=\"\" class=\"wp-image-12872\" srcset=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image3-825x1024.png 825w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image3-242x300.png 242w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image3-768x954.png 768w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image3-1237x1536.png 1237w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/image3.png 1300w\" sizes=\"auto, (max-width: 825px) 100vw, 825px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">LLM as a Judge metrics can&nbsp; be expensive to implement on all your production traces. ButOpik addresses this by allowing the user to select a sampling rate, making it efficient to apply these at scale.&nbsp;<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-adding-observability-to-your-llm-application\"><span style=\"font-weight: 400;\">Adding Observability to your LLM Application<\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">I hope this article has helped demonstrate the importance of considering custom monitoring strategies beyond what we\u2019d traditionally consider in the context of software monitoring, and provided so easy copy-paste code to get you started on your own monitoring strategy. T<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">The real-time monitoring I just discussed is just one piece of the puzzle when we\u2019re thinking about monitoring and improving your LLM application. <\/span><a href=\"https:\/\/www.comet.com\/docs\/opik\/tracing\/annotate_traces\"><span style=\"font-weight: 400;\">Annotating and labeling output<\/span><\/a><span style=\"font-weight: 400;\"> with human feedback and leveraging it to retrain your model or refine your application is also key. Implementing guardrails to take specific action with metrics breaching a desired threshold is another thing to consider.&nbsp;&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">If you use the simple cost\/quality\/custom-output monitoring strategy I laid out in this article for your own project, or implement some different form of monitoring with Opik, I\u2019d love to see your approach. You can connect with me on LI and Twitter, and share your work, or drop comments on this post to start the discussion.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">I can\u2019t wait to see what you build!<\/span><span style=\"font-weight: 400;\"> \ud83d\ude80\ud83d\udcab<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>So, you\u2019re building an AI application on top of an LLM, and you\u2019re planning on setting it live in production. And thanks to the proliferation of frameworks and APIs, you\u2019re able to prototype, test, and deploy faster than ever. Before you go to production, however, you realize you still have one problem to solve: How [&hellip;]<\/p>\n","protected":false},"author":25,"featured_media":12933,"comment_status":"closed","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":[65,6,7],"tags":[],"coauthors":[226],"class_list":["post-12869","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-llmops","category-machine-learning","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>A Simple Recipe for LLM Observability - Comet<\/title>\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\/bertscore-for-llm-evaluation\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A Simple Recipe for LLM Observability\" \/>\n<meta property=\"og:description\" content=\"So, you\u2019re building an AI application on top of an LLM, and you\u2019re planning on setting it live in production. And thanks to the proliferation of frameworks and APIs, you\u2019re able to prototype, test, and deploy faster than ever. Before you go to production, however, you realize you still have one problem to solve: How [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.comet.com\/site\/blog\/bertscore-for-llm-evaluation\/\" \/>\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=\"2025-02-19T15:29:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-27T20:04:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/header-image-recipebot.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1033\" \/>\n\t<meta property=\"og:image:height\" content=\"513\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Claire Longo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@KaiserFrose\" \/>\n<meta name=\"twitter:site\" content=\"@Cometml\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Claire Longo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutes\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"A Simple Recipe for LLM Observability - Comet","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\/bertscore-for-llm-evaluation\/","og_locale":"en_US","og_type":"article","og_title":"A Simple Recipe for LLM Observability","og_description":"So, you\u2019re building an AI application on top of an LLM, and you\u2019re planning on setting it live in production. And thanks to the proliferation of frameworks and APIs, you\u2019re able to prototype, test, and deploy faster than ever. Before you go to production, however, you realize you still have one problem to solve: How [&hellip;]","og_url":"https:\/\/www.comet.com\/site\/blog\/bertscore-for-llm-evaluation\/","og_site_name":"Comet","article_publisher":"https:\/\/www.facebook.com\/cometdotml","article_published_time":"2025-02-19T15:29:14+00:00","article_modified_time":"2025-10-27T20:04:50+00:00","og_image":[{"width":1033,"height":513,"url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/header-image-recipebot.png","type":"image\/png"}],"author":"Claire Longo","twitter_card":"summary_large_image","twitter_creator":"@KaiserFrose","twitter_site":"@Cometml","twitter_misc":{"Written by":"Claire Longo","Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.comet.com\/site\/blog\/bertscore-for-llm-evaluation\/#article","isPartOf":{"@id":"https:\/\/www.comet.com\/site\/blog\/a-simple-recipe-for-llm-observability\/"},"author":{"name":"Caleb Kaiser","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/baa7ccdd5a25dfa5618749d6c504d203"},"headline":"A Simple Recipe for LLM Observability","datePublished":"2025-02-19T15:29:14+00:00","dateModified":"2025-10-27T20:04:50+00:00","mainEntityOfPage":{"@id":"https:\/\/www.comet.com\/site\/blog\/a-simple-recipe-for-llm-observability\/"},"wordCount":2540,"publisher":{"@id":"https:\/\/www.comet.com\/site\/#organization"},"image":{"@id":"https:\/\/www.comet.com\/site\/blog\/bertscore-for-llm-evaluation\/#primaryimage"},"thumbnailUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/header-image-recipebot.png","articleSection":["LLMOps","Machine Learning","Tutorials"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.comet.com\/site\/blog\/a-simple-recipe-for-llm-observability\/","url":"https:\/\/www.comet.com\/site\/blog\/bertscore-for-llm-evaluation\/","name":"A Simple Recipe for LLM Observability - Comet","isPartOf":{"@id":"https:\/\/www.comet.com\/site\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.comet.com\/site\/blog\/bertscore-for-llm-evaluation\/#primaryimage"},"image":{"@id":"https:\/\/www.comet.com\/site\/blog\/bertscore-for-llm-evaluation\/#primaryimage"},"thumbnailUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/header-image-recipebot.png","datePublished":"2025-02-19T15:29:14+00:00","dateModified":"2025-10-27T20:04:50+00:00","breadcrumb":{"@id":"https:\/\/www.comet.com\/site\/blog\/bertscore-for-llm-evaluation\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.comet.com\/site\/blog\/bertscore-for-llm-evaluation\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/blog\/bertscore-for-llm-evaluation\/#primaryimage","url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/header-image-recipebot.png","contentUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/header-image-recipebot.png","width":1033,"height":513},{"@type":"BreadcrumbList","@id":"https:\/\/www.comet.com\/site\/blog\/bertscore-for-llm-evaluation\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.comet.com\/site\/"},{"@type":"ListItem","position":2,"name":"A Simple Recipe for LLM Observability"}]},{"@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\/baa7ccdd5a25dfa5618749d6c504d203","name":"Caleb Kaiser","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/image\/3a75e34ba4e2ba18dd960aae0d6d022a","url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2024\/01\/cropped-Caleb-Kaiser-96x96.jpeg","contentUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2024\/01\/cropped-Caleb-Kaiser-96x96.jpeg","caption":"Caleb Kaiser"},"sameAs":["https:\/\/x.com\/KaiserFrose"],"url":"https:\/\/www.comet.com\/site\/blog\/author\/calebcomet-com\/"}]}},"jetpack_featured_media_url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/02\/header-image-recipebot.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/12869","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\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/comments?post=12869"}],"version-history":[{"count":3,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/12869\/revisions"}],"predecessor-version":[{"id":18178,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/12869\/revisions\/18178"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/media\/12933"}],"wp:attachment":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/media?parent=12869"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/categories?post=12869"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/tags?post=12869"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/coauthors?post=12869"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}