cf_menu_chatbot / app.py
pennywa's picture
Upload 6 files
2899806 verified
Raw
History Blame Contribute Delete
3.13 kB
import gradio as gr
from ai_waiter_chatbot import (
MENU_FILE,
TinyRetriever,
answer_without_rag,
load_menu_items,
)
from embedding_vis import (
build_embedding_figure,
build_embedding_figure_3d,
build_pyvis_network_html,
)
items = load_menu_items(MENU_FILE)
retriever = TinyRetriever(items)
def _answer_with_rag_top_k(user_query: str, top_k: int) -> str:
hits = retriever.retrieve(user_query, top_k=top_k)
if not hits:
return (
"With RAG: I could not find a direct match in the menu text. "
"Try asking about a category like pasta, salads, burgers, or cheesecakes."
)
lines = []
seen: set[tuple[str, str, str]] = set()
for h in hits:
key = (h.section, h.name, h.price)
if key in seen:
continue
seen.add(key)
lines.append(f"- {h.name} ({h.section}) {h.price}")
if len(lines) == top_k:
break
return "With RAG: Based on your menu file, here are relevant items:\n" + "\n".join(lines)
def ask_waiter(user_query: str, top_k: int):
query = (user_query or "").strip()
if not query:
return (
"Please enter a menu question.",
"Please enter a menu question.",
build_embedding_figure("menu", items, retriever, int(top_k)),
build_embedding_figure_3d("menu", items, retriever, int(top_k)),
build_pyvis_network_html("menu", items, retriever, int(top_k)),
)
no_rag = answer_without_rag(query)
with_rag = _answer_with_rag_top_k(query, int(top_k))
fig_2d = build_embedding_figure(query, items, retriever, int(top_k))
fig_3d = build_embedding_figure_3d(query, items, retriever, int(top_k))
pyvis_html = build_pyvis_network_html(query, items, retriever, int(top_k))
return no_rag, with_rag, fig_2d, fig_3d, pyvis_html
demo = gr.Interface(
fn=ask_waiter,
inputs=[
gr.Textbox(
lines=2,
label="Ask the AI Waiter",
placeholder="Example: What pasta dishes do you have under $26?",
),
gr.Slider(
minimum=1,
maximum=12,
value=6,
step=1,
label="Top-k retrievals",
),
],
outputs=[
gr.Textbox(label="Response 1: Without RAG"),
gr.Textbox(label="Response 2: With RAG"),
gr.Plot(label="Embedding Nodes (Interactive)"),
gr.Plot(label="3D Embedding Space (Interactive)"),
gr.HTML(label="PyVis Network Explorer"),
],
title="Cheesecake Factory AI Waiter (RAG vs No RAG)",
description=(
"Ask a question about the menu and compare responses. "
"The first response is generic (no retrieval). "
"The second response is retrieval-grounded from cheesecake_factory_menu.txt. "
"The 2D/3D plots color nodes by category and highlight retrieved nodes. "
"Use the PyVis graph to travel through node connections."
),
)
if __name__ == "__main__":
demo.launch()