| import gradio as gr |
| import pandas as pd |
| from huggingface_hub import InferenceClient |
|
|
| client = InferenceClient("Qwen/Qwen2.5-7B-Instruct") |
|
|
| |
| books = pd.read_csv("knowledge_base.csv") |
| books = books[["Title", "Author", "Genre", "Age_Range", "Description"]] |
| books = books.dropna(subset=["Title", "Author", "Genre", "Description"]) |
|
|
| def search_books(ques, max_givenbooks=5): |
| """Searches the dataframe for rows matching keywords in the user's message. Looks across Title, Genre, and Description columns. """ |
| if not ques: |
| return "" |
| |
| ques = str(ques).lower() |
| keywords = ques.split() |
| matches = pd.Series(False, index=books.index) |
|
|
| for word in keywords: |
| matches = matches | ( |
| books["Title"].str.lower().str.contains(word, na=False) | |
| books["Genre"].str.lower().str.contains(word, na=False) | |
| books["Description"].str.lower().str.contains(word, na=False) |
| ) |
|
|
| matched_books = books[matches].head(max_givenbooks) |
| if matched_books.empty: |
| return "No exact matches found in the catalog for this description." |
| |
| results_in = "Available books in our catalog matching your request:\n" |
| for idx, row in matched_books.iterrows(): |
| results_in += f" - **Title** : {row['Title']} | **Author** : {row['Author']} | **Genre** : {row['Genre']} | **Age** : {row['Age_Range']}\n" |
| results_in += f" *Description* : {row['Description']}\n\n" |
| return results_in |
| def respond(message, history): |
| catalog_info = search_books(message) |
|
|
| instructions = f"""You are the BookBuddy, who is a specialized book recommendation chatbot. |
| Your goal is to recommend books to the user based on what they want. Use the catalog from our database to answer the user. |
| Prioritize the recommending books from this list if they match the user's perferences: |
| |
| {catalog_info}""" |
| |
| messages = [{"role": "system", "content": instructions}] |
| if history: |
| messages.extend(history) |
| |
| messages.append({"role": "user", "content": message}) |
| |
| response = client.chat_completion( |
| messages=messages, |
| max_tokens=220 |
| ) |
| |
| return response.choices[0].message.content.strip() |
|
|
| with gr.Blocks( |
| theme=gr.themes.Soft(primary_hue="pink"), |
| css=""" |
| body { |
| background-color: #ffccc7; |
| } |
| """ |
| ) as demo: |
|
|
| gr.Image("BookBuddy.png", show_label=False) |
|
|
| gr.Markdown( |
| """ |
| # π BookBuddy AI |
| ### Your personal AI book recommender powered, BookBuddy. Ask for genres, moods, or books you love. |
| """ |
| ) |
|
|
| chatbot = gr.ChatInterface( |
| fn=respond, |
| examples=[ |
| "I want a sad romance book", |
| "Give me a fantasy book for teens", |
| "Something like The Hunger Games", |
| "A mystery with twists", |
| "I liked Harry Potter, what should I read?", |
| "I'm 15 and love contemporary books, what should I read?", |
| "Recommend a fast-paced dystopian story", |
| "Give me a book that will make me cry" |
| ] |
| ) |
|
|
| gr.Markdown( |
| """ |
| <div style="text-align:center; padding-top:15px; color:#2d2d3b;"> |
| βA reader lives a thousand lives before they die.β β George R.R. Martin βπ |
| </div> |
| """ |
| ) |
|
|
| demo.launch(share=True) |