00:00:06.320 --> 00:00:08.240
Welcome to the Dashboard Effect Podcast.
00:00:08.320 --> 00:00:09.119
I'm Brick Thompson.
00:00:09.359 --> 00:00:10.240
And I'm Landon Oakes.
00:00:10.480 --> 00:00:27.039
Landon, this morning we wanted to talk about a concept that uh we've been dealing with for the last couple of years here, which is how do you get your business logic and your business rules to give you the same answers across different ways that people might access it?
00:00:27.280 --> 00:00:32.240
So, for example, you might have measures and KPIs and Power BI.
00:00:32.399 --> 00:00:39.679
Now you're starting to do natural language query or NLQ using your LLMs and MCP servers.
00:00:39.840 --> 00:00:42.640
Um maybe people are pulling things into Excel.
00:00:42.880 --> 00:00:50.880
Um, how do you make sure that people are getting the same answer to the same question across all of those different ways of accessing?
00:00:51.119 --> 00:00:53.280
So I thought we'd spend a few minutes and talk about that.
00:00:53.600 --> 00:00:54.479
Yeah, definitely.
00:00:54.719 --> 00:01:00.399
It's a uh big topic, but I mean at the end of the day, if you wouldn't summarize it into just a one sentence, right?
00:01:00.560 --> 00:01:03.439
Is you need, we'll see if this is one sentence.
00:01:03.759 --> 00:01:12.000
You need um a single place where your data is stored with that logic defined in there so that others get data from one spot.
00:01:12.159 --> 00:01:12.319
Yeah.
00:01:12.640 --> 00:01:16.159
So if you think about it, right, like I connect into my Excel file to this spot.
00:01:16.239 --> 00:01:22.159
We we do lake houses, but there's other tools you can build it in, Snowflake, uh, Databricks, what have you.
00:01:22.400 --> 00:01:27.840
Um I have my Excel file, I connect to this lake house, and it has a lot of that logic built into it.
00:01:27.920 --> 00:01:38.159
So the data I'm getting out that I want to make a pivot chart with, add to a PowerPoint, et cetera, is the same data that Power BI gets that your NLQ model gets.
00:01:38.239 --> 00:01:40.079
Um it's all fed from that source of truth.
00:01:40.400 --> 00:01:40.640
Yeah.
00:01:40.959 --> 00:01:54.959
Well, if you think about it in the medallion architecture, so you're going from raw data, sort of your your bronze through silver to gold to get it ready so that you can build nice semantic models for Power BI, let's say.
00:01:55.040 --> 00:02:00.079
Um and then we have a platinum layer, which gets it ready for an LLM.
00:02:00.159 --> 00:02:01.760
So you can do an LQ.
00:02:02.239 --> 00:02:06.079
Um still there's some nuances to that, which we've talked about.
00:02:06.239 --> 00:02:19.919
But um you're pushing, you're you're basically taking semantic business rules, getting that into the platinum layer, and pushing that all sort of upstream into the data lake house, into Delta Parquet files.
00:02:20.240 --> 00:02:21.759
Yeah, essentially, right?
00:02:21.840 --> 00:02:30.879
Like so if you're a company that has an established gold layer or if you had a data warehouse, whatever area that your Power BI reports read off of, right?
00:02:31.120 --> 00:02:39.840
When you make Power BI report, you're gonna have certain things you have to do in DAX or in your Power BI report, your whatever reporting tool you're using.
00:02:40.080 --> 00:02:44.319
Um and those are typically things that like need to change based on the user, right?
00:02:44.400 --> 00:02:55.520
So if you have security that the user needs, or when I go and I change a date slicer, it needs to automatically make sure it goes and picks the right minimum date to apply to another measure, right?
00:02:55.680 --> 00:02:59.439
So like things that change as somebody interacts with the report always needs to be up there.
00:02:59.599 --> 00:03:00.240
Yeah.
00:03:00.479 --> 00:03:06.639
Um but part of that also means that you'll have some of the metrics defined up there, like what is revenue, right?
00:03:06.719 --> 00:03:11.520
I have sum of revenue column where this is not equal to rate refund or something, right?
00:03:11.759 --> 00:03:12.719
Along those lines.
00:03:13.039 --> 00:03:29.919
So the platinum layer is kind of taking that business logic you put in your semantic model that's supporting your reporting, combining it with what you have in your gold layer, which is kind of like a further cleansed data, things that don't need to change at runtime, putting it into one spot.
00:03:30.080 --> 00:03:30.319
Yeah.
00:03:30.479 --> 00:03:33.680
Essentially, um that AI can go read from.
00:03:33.840 --> 00:03:37.759
It's all baked in there, and it has those metrics just right there for it.
00:03:37.840 --> 00:03:39.280
It doesn't need to be recreated every time.
00:03:39.599 --> 00:03:40.159
Yeah, yeah.
00:03:40.240 --> 00:04:00.719
And interestingly, the platinum layer sort of takes takes the result of all these different views and semantic models, and then we actually bake it back into a materialized table or the form of a table, conceptual table in the data lake house so that it's very performant and the LLM can find exactly what it needs to.
00:04:00.960 --> 00:04:03.759
You still have to define all the business rules, though.
00:04:04.159 --> 00:04:11.199
You know, the the example uh we come across and have used for years to illustrate this is what is revenue?
00:04:11.439 --> 00:04:27.279
You know, someone someone who's running sales might think of revenue differently than the CFO or or or the CEO, just you know, uh how they define what actually, as you said, what are you going to do with refunds or rebates or when do you take that out?
00:04:27.439 --> 00:04:31.279
Is that part of the revenue calculation, or are you doing it below that?
00:04:31.439 --> 00:04:32.240
Those types of things.
00:04:32.319 --> 00:04:46.319
And you've got to figure those things out for the individual business and then bake those into the semantic layer and then ultimately that platinum layer so that you're getting the same answers, say, from Power BI or from Claude if you're asking the same question.
00:04:46.720 --> 00:04:47.040
Yeah.
00:04:47.360 --> 00:04:49.839
Yeah, there's multiple ways you can do that, right?
00:04:50.079 --> 00:04:52.720
Um you know, a couple couple things.
00:04:52.800 --> 00:05:04.240
It's like you could technically have AI just essentially tell it, hey, if they ask for revenue, use this definition unless they specifically say something else, you know, so it always goes back to the same one.
00:05:04.480 --> 00:05:07.759
You could have it ask the user, hey, you said revenue.
00:05:07.920 --> 00:05:10.079
I don't know what kind you want here.
00:05:10.240 --> 00:05:11.199
Here are the options.
00:05:11.279 --> 00:05:11.360
Yeah.
00:05:11.600 --> 00:05:12.720
Here's what they mean.
00:05:12.959 --> 00:05:15.680
Um and you could even make it a little more automatic than that, right?
00:05:15.759 --> 00:05:18.240
Like you could even make it role-based, departmental-based.
00:05:18.319 --> 00:05:27.360
You know, if I log in from finance, this you know, the that modeling layer is smart enough to know, hey, I need this metric definition.
00:05:27.680 --> 00:05:30.720
Um there, you know, there's a lot of different ways you can slice and dice it.
00:05:31.040 --> 00:05:32.079
Yeah, that's so interesting.
00:05:32.160 --> 00:05:39.360
And some of that you're going to define in context files that can maybe do that role-based decision on which way to go.
00:05:39.600 --> 00:05:42.959
Maybe you've got some stuff even baked in into your MCP server.
00:05:43.199 --> 00:05:52.639
Certainly you have the different um measures in the lake house itself in you know, in that platinum layer, so that once it knows which one it's after, it can just go get it.
00:05:52.720 --> 00:05:52.800
Yeah.
00:05:53.040 --> 00:05:53.839
That type of thing.
00:05:54.240 --> 00:06:00.480
I mean, one of the things, cool things too, that I like, just speaking of like user-based, you know, permissioning, et cetera.
00:06:00.639 --> 00:06:01.680
This person gets different things.
00:06:01.759 --> 00:06:03.360
This person can see these things.
00:06:03.600 --> 00:06:13.680
Um if you're you know used to like for intra, for instance, security groups, et cetera, a lot of this kind of uses the same foundation, right?
00:06:13.839 --> 00:06:18.000
So like for our MCP servers, we use intro to authenticate to it.
00:06:18.160 --> 00:06:27.120
You know, you can build in your MCP server, hey, this group has access to these tools, this group has access to these tools, um, which is really nice, really cool.
00:06:27.279 --> 00:06:31.199
So it's not like we're completely recreating something.
00:06:31.279 --> 00:06:37.680
You know, a lot of a lot of the foundational pieces that we're all used to working with still work and they work well, um, which we do really like.
00:06:37.920 --> 00:06:46.399
The other cool thing, too, about having a platinum layer is, you know, okay, I we've been talking a lot about MCP server for NLQ, right?
00:06:46.480 --> 00:06:48.720
But there are other AI uses out there.
00:06:48.959 --> 00:06:56.079
So if I think about it, you know, I have my agent over here where people can talk to my data and get accurate kind of responses back.
00:06:56.319 --> 00:07:01.600
But I might want another agent that uses the data, you know, monitors for some event.
00:07:01.680 --> 00:07:04.000
It's gonna use the data to do something.
00:07:04.160 --> 00:07:11.680
Maybe it's actually posting to your source system, maybe it's sending out an email to a certain group of people with a deck that they can use.
00:07:11.839 --> 00:07:12.480
Who knows, right?
00:07:12.720 --> 00:07:14.240
There's tons of different things you can do.
00:07:14.480 --> 00:07:21.920
But the nice thing is is you now have your data in a good state where you're gonna get the same data as a person querying with the NLQ agent.
00:07:22.160 --> 00:07:22.399
Right.
00:07:22.639 --> 00:07:28.480
So, you know, you're gonna have a that siloing of I forgot to update a metric in this agent.
00:07:28.720 --> 00:07:31.279
So now they're giving me different responses.
00:07:31.439 --> 00:07:33.519
That's kind of gone because you're updating in one spot.
00:07:33.680 --> 00:07:33.839
Yes.
00:07:34.160 --> 00:07:34.879
They all get updated.
00:07:35.199 --> 00:07:35.920
That's so key.
00:07:36.000 --> 00:07:36.240
Yeah.
00:07:36.399 --> 00:07:40.079
And it becomes too cumbersome if you're having to remember to do it across systems.
00:07:40.160 --> 00:07:43.279
So you're trying to push it as far upstream as you can, basically.
00:07:43.439 --> 00:07:43.519
Yeah.
00:07:43.680 --> 00:07:46.720
And everybody else is feeding off of the business rules as it comes down.
00:07:47.120 --> 00:07:47.519
Exactly.
00:07:47.680 --> 00:07:47.839
Yeah.
00:07:48.079 --> 00:07:48.399
Yeah.
00:07:48.560 --> 00:07:49.120
Cool.
00:07:49.519 --> 00:07:49.839
All right.
00:07:50.000 --> 00:07:51.920
Well, I think that's it for this topic.
00:07:52.079 --> 00:07:53.839
Uh appreciate it, and I'll talk to you soon.
00:07:54.079 --> 00:07:54.399
Awesome.
00:07:54.560 --> 00:07:54.879
Thank you.
00:07:55.120 --> 00:07:55.680
All right.