semantic-search-api / experiments /threshold_analysis.py
TarunikaHF's picture
fix(lint): resolve ruff linting errors to fix CI pipeline
58eff11
Raw
History Blame Contribute Delete
3.22 kB
import requests
import time
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
BASE_URL = "http://127.0.0.1:8000"
queries = [
"What causes global warming?",
"Why does climate change happen?",
"Reasons for global warming",
"How do rockets reach space?",
"How does a spacecraft launch?",
"How does 3D graphics rendering work?",
"Explain computer graphics rendering"
]
results = []
def run_queries():
print("\nRunning query experiments...\n")
for q in queries:
start = time.time()
r = requests.post(
f"{BASE_URL}/query",
json={"query": q}
)
latency = time.time() - start
data = r.json()
results.append({
"query": q,
"cache_hit": data["cache_hit"],
"similarity": data.get("similarity_score", 0),
"cluster": data["dominant_cluster"],
"latency": latency
})
def visualize_cache_hits():
df = pd.DataFrame(results)
hits = df["cache_hit"].sum()
misses = len(df) - hits
plt.figure()
plt.bar(["Cache Hits", "Cache Misses"], [hits, misses])
plt.title("Semantic Cache Performance")
plt.ylabel("Number of Queries")
plt.show()
def visualize_latency():
df = pd.DataFrame(results)
hit_latency = df[df["cache_hit"]]["latency"]
miss_latency = df[~df["cache_hit"]]["latency"]
plt.figure()
# Safeguard against empty data arrays causing Matplotlib to crash
data_to_plot = []
labels = []
if not hit_latency.empty:
data_to_plot.append(hit_latency)
labels.append("Cache Hit")
if not miss_latency.empty:
data_to_plot.append(miss_latency)
labels.append("Cache Miss")
if data_to_plot:
plt.boxplot(data_to_plot, labels=labels)
plt.title("Latency Comparison")
plt.ylabel("Response Time (seconds)")
plt.show()
def visualize_clusters():
df = pd.DataFrame(results)
plt.figure()
clusters = df["cluster"]
x = np.arange(len(clusters))
plt.scatter(x, clusters)
plt.title("Query Cluster Distribution")
plt.xlabel("Query Index")
plt.ylabel("Dominant Cluster")
plt.show()
def threshold_experiment():
thresholds = [0.95, 0.90, 0.85, 0.80, 0.70]
hit_rates = []
for t in thresholds:
requests.patch(
f"{BASE_URL}/cache/threshold",
params={"threshold": t}
)
requests.delete(f"{BASE_URL}/cache")
local_hits = 0
for q in queries:
r = requests.post(
f"{BASE_URL}/query",
json={"query": q}
)
data = r.json()
if data["cache_hit"]:
local_hits += 1
hit_rates.append(local_hits / len(queries))
plt.figure()
plt.plot(thresholds, hit_rates, marker="o")
plt.title("Similarity Threshold vs Cache Hit Rate")
plt.xlabel("Similarity Threshold")
plt.ylabel("Cache Hit Rate")
plt.gca().invert_xaxis()
plt.show()
if __name__ == "__main__":
run_queries()
visualize_cache_hits()
visualize_latency()
visualize_clusters()
threshold_experiment()