<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>article LLMOps for Data Scientists and AI Builders: A Quickstart on Databricks in Technical Blog</title>
    <link>https://community.databricks.com/t5/technical-blog/llmops-for-data-scientists-and-ai-builders-a-quickstart-on/ba-p/165491</link>
    <description>&lt;P&gt;Building an LLM-powered prototype is easy. A few lines of code, a hosted model, and you have an agent that classifies tickets, summarizes documents, or answers questions. The hard part comes after: measuring its quality, promoting only the versions you trust, deploying it the same way every time, and being able to show an auditor what it did in production.&lt;/P&gt;
&lt;P&gt;Many practitioners treat that operational layer as a chore. But once an LLM application touches real users, the organization needs what it has always needed from software: reproducibility, quality gates, controlled releases, and governance. That is what LLMOps gives you, and on Databricks, it stays light.&lt;/P&gt;
&lt;P&gt;This quickstart carries one small application through the whole lifecycle. The LLMOps Quickstart repository implements a customer support ticket classifier. Given the free text of a ticket, it returns one of five categories: billing, technical_issue, feature_request, account_management, or other. The classifier travels from raw data to a governed, running agent:&lt;/P&gt;
&lt;P&gt;Data ingestion → agent build → evaluation → approval → deployment → inference&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CarlosDip_0-1786539324356.png" style="width: 835px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29954iD7CF34C0A7751404/image-dimensions/835x157?v=v2" width="835" height="157" role="button" title="CarlosDip_0-1786539324356.png" alt="CarlosDip_0-1786539324356.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;The companion &lt;A href="https://community.databricks.com/t5/technical-blog/a-pragmatic-mlops-implementation-plan-on-databricks/ba-p/163033" target="_blank" rel="noopener"&gt;MLOps Quickstart&lt;/A&gt; follows the same shape for classic ML. This one is its LLM sibling, built on the latest tooling: an agent served as a Databricks App, a Unity AI Gateway model service for the LLM, and MLflow 3 GenAI evaluation.&lt;/P&gt;
&lt;P&gt;In this guide, we'll build a simple LLM-based classifier for support tickets. This is a common scenario for support teams, like a help-desk or IT. Then, we'll deploy that agent, using Databricks Apps, after confirming its quality using MLFlow's native tooling. All of this is then wrapped into a Declarative Automation Bundle (DAB) for easy redeployment into a production environment.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;What you should know first&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;The quickstart assumes you are comfortable with Python and the command line, the basics of Unity Catalog (catalogs, schemas, tables, grants), and running the Databricks CLI. You do not need prior MLflow, agent, or Declarative Automation Bundles experience. Each is introduced as you reach it. For a deeper grounding, see the Databricks Academy courses &lt;A href="https://customer-academy.databricks.com/learn/course/external/view/classroom/3640/devops-essentials-for-data-engineering" target="_blank" rel="noopener"&gt;DevOps Essentials for Data Engineering&lt;/A&gt; (CI/CD and bundles) and &lt;A href="https://customer-academy.databricks.com/learn/courses/5856/building-agentic-applications-on-databricks" target="_blank" rel="noopener"&gt;Building Agentic Applications on Databricks&lt;/A&gt; (agents, MLflow tracing, and evaluation).&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;What you'll need&lt;/STRONG&gt;&lt;/H2&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;The Databricks CLI and &lt;A href="https://docs.astral.sh/uv/getting-started/installation/" target="_blank" rel="noopener"&gt;uv&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;A workspace with Unity Catalog, Foundation Model APIs, Databricks Apps, and Unity AI Gateway model services enabled&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;Unity Catalog privileges for the identity the jobs and app run as. The jobs run on serverless compute, and its runtime identity needs the catalog and schema grants.&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;A model service for the LLM (more on this below)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;STRONG&gt;Step 1: Create a model service for the LLM&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;A Unity AI Gateway model service is a Unity Catalog securable that represents a governed LLM endpoint. The agent references it by its fully-qualified name, such as qs_catalog.default.claude-sonnet-5, and the AI Gateway routes the call. Because the service is a UC object, its access control, rate limits, and payload logging live in Unity Catalog rather than in the application. Governing the foundation model as a UC securable is the point: the same permission and audit model you use for tables now covers model access.&lt;/P&gt;
&lt;P&gt;During the model services beta you create the service once in the AI Gateway UI. Code creation is not available yet, so this is a one-time manual step. Create one for the model you want the agent to use.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Creating a Unity AI Gateway model service in the UI (Step 1)." style="width: 760px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29956i5E8D03A28CE38019/image-size/large?v=v2&amp;amp;px=999" role="button" title="create_model_service.gif" alt="Creating a Unity AI Gateway model service in the UI (Step 1)." /&gt;&lt;span class="lia-inline-image-caption" onclick="event.preventDefault();"&gt;Creating a Unity AI Gateway model service in the UI (Step 1).&lt;/span&gt;&lt;/span&gt;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Step 2: Clone and configure&lt;/STRONG&gt;&lt;/H2&gt;
&lt;LI-CODE lang="markup"&gt;$ git clone https://github.com/databricks-solutions/databricks-blogposts.git
$ cd databricks-blogposts/2026-06-llmops-quickstart&lt;/LI-CODE&gt;
&lt;P&gt;Settings are bundle variables with sensible defaults:&lt;/P&gt;
&lt;TABLE width="780px"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="125.969px"&gt;
&lt;P&gt;&lt;STRONG&gt;Variable&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="217.844px"&gt;
&lt;P&gt;&lt;STRONG&gt;Default&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="435.188px"&gt;
&lt;P&gt;&lt;STRONG&gt;Description&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="125.969px"&gt;
&lt;P&gt;catalog_name&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="217.844px"&gt;
&lt;P&gt;main&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="435.188px"&gt;
&lt;P&gt;Unity Catalog catalog (must already exist)&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="125.969px"&gt;
&lt;P&gt;schema_name&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="217.844px"&gt;
&lt;P&gt;llmops_quickstart&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="435.188px"&gt;
&lt;P&gt;UC schema (created for you)&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="125.969px"&gt;
&lt;P&gt;llm_model&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="217.844px"&gt;
&lt;P&gt;main.default.claude-sonnet-5&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="435.188px"&gt;
&lt;P&gt;Fully-qualified name of the model service the agent calls&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&lt;I&gt;&lt;SPAN&gt;'&lt;/SPAN&gt;&lt;/I&gt;main'&amp;nbsp;is a common catalog name, so you may already have one. To keep the quickstart self-contained and aligned with the MLOps Quickstart, point it at a dedicated catalog such as qs_catalog. If you don't want to modify the files, you can override at deploy time using '--var':&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;$ databricks bundle deploy \
  --var="catalog_name=qs_catalog" \
  --var="llm_model=qs_catalog.default.claude-sonnet-5"&lt;/LI-CODE&gt;
&lt;H2&gt;&lt;STRONG&gt;Step 3: Deploy the bundle&lt;/STRONG&gt;&lt;/H2&gt;
&lt;LI-CODE lang="markup"&gt;$ databricks bundle deploy --var="catalog_name=qs_catalog" --var="llm_model=qs_catalog.default.claude-sonnet-5"&lt;/LI-CODE&gt;
&lt;P&gt;A bundle (&lt;A href="https://docs.databricks.com/dev-tools/bundles/index.html" target="_blank" rel="noopener"&gt;&lt;I&gt;&lt;SPAN&gt;Declarative Automation Bundles&lt;/SPAN&gt;&lt;/I&gt;&lt;/A&gt;, or DABs) is a folder of YAML plus the notebooks and other files its jobs and apps need. deploy creates the schema, the MLflow experiment, the data-ingestion job, and the app. A separate prod target deploys the same setup against its own schema, and the same commands drop into a GitHub Actions or Azure DevOps pipeline.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Step 4: Ingest the data&lt;/STRONG&gt;&lt;/H2&gt;
&lt;LI-CODE lang="markup"&gt;$ databricks bundle run data_preprocessing_job --var="catalog_name=qs_catalog"&lt;/LI-CODE&gt;
&lt;P&gt;This writes 30 hand-labelled support tickets, six per category, to a Unity Catalog managed table named support_tickets. The set is deliberately small enough to read in one screen, and it doubles as the evaluation data. When you adapt the quickstart, this is the notebook you replace with your own data.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Step 5: The agent&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;The agent is a Databricks App: a small FastAPI server built on MLflow's GenAI agent server, with a single @invoke handler that takes a ticket and returns a category. A few things are worth calling out.&lt;/P&gt;
&lt;P&gt;The agent calls the LLM through the model service from Step 1. The call goes to the AI Gateway, which enforces governance and logs the request. The model service name comes from one environment variable, LLM_MODEL, so switching models is a one-line change, for example to an open model like qs_catalog.default.gpt-oss-120b.&lt;/P&gt;
&lt;P&gt;The handler is deliberately simple: build the prompt, call the model, return the category. One detail saves confusion when you swap in a reasoning model such as Claude Sonnet 5 or a GPT-5 variant. Those models can return their answer as a list of typed content blocks, a reasoning block followed by a text block, rather than a plain string. The agent concatenates the text blocks, so it works with both reasoning and non-reasoning models.&lt;/P&gt;
&lt;P&gt;Serving the agent as an app is the current recommendation for most agents. Model Serving with agents.deploy() still exists for special, custom cases, but an app gives you a first-class deployment surface, a service principal identity, and a place to add a UI later.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Step 6: Evaluate&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Evaluation is run as a uv task, this is important because these exact commands can be used on your CI/CD pipeline later.&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;$ uv sync
$ uv run agent-evaluate
&lt;/LI-CODE&gt;
&lt;P&gt;Evaluation uses mlflow.genai.evaluate, MLflow 3's tooling for GenAI, to run the agent over all 30 tickets with two scorers. The first, exact_match, is a small deterministic scorer: the predicted category must equal the labelled one. For a fixed set of classes this is the honest quality metric, and it is the gate. The second is the out-of-the-box Correctness LLM judge, included to show what MLflow's GenAI evaluation offers. It runs alongside but does not gate promotion. The Databricks Academy course &lt;A href="https://customer-academy.databricks.com/learn/courses/5856/building-agentic-applications-on-databricks" target="_blank" rel="noopener"&gt;&lt;I&gt;&lt;SPAN&gt;Building Agentic Applications on Databricks&lt;/SPAN&gt;&lt;/I&gt;&lt;/A&gt; covers agent evaluation in depth.&lt;/P&gt;
&lt;P&gt;Every prediction is captured as an MLflow Trace, so the evaluation run gives you a per-ticket table of inputs, outputs, expectations, and scores. That is the difference between knowing accuracy was 90% and being able to open the three tickets it missed and see why.&lt;/P&gt;
&lt;P&gt;Note that agent-evaluate exits with an error if exact-match accuracy is below the threshold, which defaults to 80%. That makes it a CI gate: a model that is not good enough stops the pipeline.&lt;I&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P&gt;&lt;I&gt;&lt;SPAN&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Inspecting an evaluation trace in the Experiments tab — inputs, outputs, expectations, and scorer results (Step 6)." style="width: 760px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29958i69638092F7D74D2A/image-size/large?v=v2&amp;amp;px=999" role="button" title="evaluation_traces.gif" alt="Inspecting an evaluation trace in the Experiments tab — inputs, outputs, expectations, and scorer results (Step 6)." /&gt;&lt;span class="lia-inline-image-caption" onclick="event.preventDefault();"&gt;Inspecting an evaluation trace in the Experiments tab — inputs, outputs, expectations, and scorer results (Step 6).&lt;/span&gt;&lt;/span&gt;&lt;/SPAN&gt;&lt;/I&gt;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Step 7: Approve and deploy&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Evaluation is an automated process, but human approval is the gold-standard for any GenAI application. Once you have reviewed the evaluation run and approved the model, deploy the app:&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;$  databricks apps deploy llmops-quickstart-classifier \
   --source-code-path "/Workspace/Users/&amp;lt;your-email-address&amp;gt;/.bundle/llmops-quickstart/dev/files"&lt;/LI-CODE&gt;
&lt;P&gt;Nothing reaches production until that approval. In a regulated setting the human step is often the whole point; here it is one deliberate command between a passing evaluation and live traffic.&lt;/P&gt;
&lt;P&gt;The deployed app exposes the classifier at /invocations. Every request to the LLM goes through the model service, so the AI Gateway governs and logs it. That log, in Unity Catalog, is your audit trail and the raw material for monitoring.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Step 8: Inference&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Send a ticket to the running app:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;import requests
from databricks.sdk import WorkspaceClient

w = WorkspaceClient()
app = w.apps.get("llmops-quickstart-classifier-dev")

resp = requests.post(
    f"{app.url}/invocations",
    headers={"Authorization": f"Bearer {w.config.oauth_token().access_token}"},
    json={"ticket": "I was billed twice for my annual plan."},
    timeout=60,
)
print(resp.json()["category"])   # billing

&lt;/LI-CODE&gt;
&lt;P&gt;For batch scoring, read support_tickets and call the app for each row.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Governance recap&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Working through the steps, you end up with a governed system without too much effort. The LLM is a Unity Catalog securable, so access, rate limits, and payload logging are managed in UC. The AI Gateway logs every request the agent makes. Evaluation is a quality gate in code, and a human approves before anything ships. A natural next step is data profiling (formerly Lakehouse Monitoring) on the logged traffic, for quality and drift tracking over time.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CarlosDip_3-1786539324356.png" style="width: 740px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29955i6F9A4EE29D291373/image-dimensions/740x501?v=v2" width="740" height="501" role="button" title="CarlosDip_3-1786539324356.png" alt="CarlosDip_3-1786539324356.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;LI-WRAPPER&gt;&lt;/LI-WRAPPER&gt;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Before you call it done&lt;/STRONG&gt;&lt;/H2&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;`databricks bundle validate` passes&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;The ingestion job wrote support_tickets&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;`uv run agent-evaluate` clears the threshold, with traces in the experiment&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;The app is deployed and /invocations returns a category&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;The model service shows the agent's traffic&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;The prod target deploys into its own schema&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;I&gt;&lt;/I&gt;&lt;LI-WRAPPER&gt;&lt;/LI-WRAPPER&gt;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Wrapping up&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;The point of the quickstart is not the ticket classifier. It is the skeleton around it. Once you have an agent served as an app, an LLM call governed through a model service, a GenAI evaluation gate, and a human approval step, you can drop in your own use case and keep the operational backbone.&lt;/P&gt;
&lt;P&gt;LLMOps does not have to be the bureaucratic part of the job. Databricks offers a wide suite of tools to facilitate deployment and development. The repo is public and runs end to end. Clone it, try it in your own workspace, and open an issue if you have questions.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;DISCLAIMER: &lt;/STRONG&gt;This code is provided as-is, for educational purposes, with best effort support, and not maintained for Production, aiming to be a reference for development. If you run into problems, open an issue on the GitHub repository.&lt;/P&gt;</description>
    <pubDate>Wed, 12 Aug 2026 17:09:14 GMT</pubDate>
    <dc:creator>CarlosDip</dc:creator>
    <dc:date>2026-08-12T17:09:14Z</dc:date>
    <item>
      <title>LLMOps for Data Scientists and AI Builders: A Quickstart on Databricks</title>
      <link>https://community.databricks.com/t5/technical-blog/llmops-for-data-scientists-and-ai-builders-a-quickstart-on/ba-p/165491</link>
      <description>&lt;P&gt;Building an LLM prototype is easy. Making it reproducible, measurable, and governed is the part that takes work. This quickstart carries one support-ticket classifier through the whole lifecycle on Databricks: an agent served as an App, its LLM governed through a Unity AI Gateway model service, and an MLflow 3 evaluation gate before anything ships.&lt;/P&gt;</description>
      <pubDate>Wed, 12 Aug 2026 17:09:14 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/llmops-for-data-scientists-and-ai-builders-a-quickstart-on/ba-p/165491</guid>
      <dc:creator>CarlosDip</dc:creator>
      <dc:date>2026-08-12T17:09:14Z</dc:date>
    </item>
  </channel>
</rss>

