Demos / backend /classes /galileo_platform.py
nikhile-galileo's picture
Adding finance protect demo
e68d535
raw
history blame
4.12 kB
from galileo_observe import ObserveWorkflows
import galileo_protect as gp
from pydantic import BaseModel
import promptquality as pq
from promptquality import CustomizedScorerName, Models
from dotenv import load_dotenv
import os
from datetime import datetime
from typing import Optional
load_dotenv()
class GalileoPlatformConfig(BaseModel):
"""Base configuration for Galileo platform."""
evaluate_project_name: str
observe_project_name: str
protect_project_name: str
protect_stage_name: str
class GalileoPlatform:
"""Implementation of Galileo Features"""
def __init__(self, config: GalileoPlatformConfig):
self.config = config
pq.login(api_key=os.getenv("GALILEO_API_KEY"))
self.evaluate_run = self.create_evaluate_run()
self.observe_logger = ObserveWorkflows(project_name=config.observe_project_name)
self.protect_stage_id = self.get_protect_stage()
def create_evaluate_run(self):
"""Create a Galileo Evaluate run."""
scorers = [
pq.Scorers.context_adherence_luna,
pq.Scorers.chunk_attribution_utilization_luna,
pq.Scorers.completeness_luna
]
evaluate_run = pq.EvaluateRun(
project_name=self.config.evaluate_project_name,
scorers=scorers,
)
return evaluate_run
def get_protect_stage(self):
"""Get or create a Galileo Protect stage."""
try:
protect_project = gp.get_project(
project_name=self.config.protect_project_name
)
except Exception as _:
protect_project = gp.create_project(name=self.config.protect_project_name)
protect_project_id = protect_project.id
try:
protect_stage = gp.get_stage(
project_id=protect_project_id, stage_name=self.config.protect_stage_name
)
except Exception as _:
protect_stage = gp.create_stage(
project_id=protect_project_id,
name=self.config.protect_stage_name,
)
return protect_stage.id
def run_protect(self, prompt: str, output: str, workflow: Optional[ObserveWorkflows] = None) -> dict:
"""Run Galileo Protect on input and output."""
response = gp.invoke(
payload=gp.Payload(input=prompt, output=output),
prioritized_rulesets=[
gp.Ruleset(
rules=[
gp.Rule(
metric=gp.RuleMetrics.context_adherence_luna,
operator=gp.RuleOperator.lte,
target_value=0.01,
),
],
action=gp.OverrideAction(
choices=["Sorry, the input is hallucinatory."]
),
),
gp.Ruleset(
rules=[
gp.Rule(
metric=gp.RuleMetrics.pii,
operator=gp.RuleOperator.any,
target_value=["email", "phone_number", "name"],
)
],
action=gp.OverrideAction(
choices=["Sorry, the output contains PII."]
),
),
# gp.Ruleset(
# rules=[
# gp.Rule(
# metric="deutsche_bank_company_pii_0",
# operator=gp.RuleOperator.gte,
# target_value=0.1,
# )
# ],
# action=gp.OverrideAction(
# choices=["Sorry, the output contains PII."]
# ),
# )
],
stage_id=self.protect_stage_id,
)
if workflow:
workflow.add_protect(
payload=gp.Payload(input=prompt, output=output),
response=response,
)
return dict(response)