|
|
import gradio as gr |
|
|
from huggingface_hub import InferenceClient |
|
|
|
|
|
""" |
|
|
For more information on `huggingface_hub` Inference API support, please check the docs: https://huggingface.co/docs/huggingface_hub/v0.22.2/en/guides/inference |
|
|
""" |
|
|
client = InferenceClient("HuggingFaceH4/zephyr-7b-beta") |
|
|
|
|
|
def create_system_prompt(agent_type, personality, expertise_level, language): |
|
|
base_prompt = f"""You are a {agent_type} movie recommendation agent with the following characteristics: |
|
|
- Personality: {personality} |
|
|
- Expertise Level: {expertise_level} |
|
|
- Language: {language} |
|
|
|
|
|
Your role is to: |
|
|
1. Understand user preferences and mood |
|
|
2. Provide personalized movie recommendations |
|
|
3. Explain why you're recommending specific movies |
|
|
4. Maintain a {personality} tone throughout the conversation |
|
|
5. Consider the user's expertise level ({expertise_level}) when explaining |
|
|
|
|
|
Please respond in {language}.""" |
|
|
return base_prompt |
|
|
|
|
|
def respond( |
|
|
message, |
|
|
history: list[tuple[str, str]], |
|
|
agent_type, |
|
|
personality, |
|
|
expertise_level, |
|
|
language, |
|
|
max_tokens, |
|
|
temperature, |
|
|
top_p, |
|
|
genre, |
|
|
mood, |
|
|
): |
|
|
|
|
|
system_message = create_system_prompt(agent_type, personality, expertise_level, language) |
|
|
messages = [{"role": "system", "content": system_message}] |
|
|
|
|
|
|
|
|
enhanced_message = f"Genre: {genre}\nMood: {mood}\nUser request: {message}" |
|
|
|
|
|
for val in history: |
|
|
if val[0]: |
|
|
messages.append({"role": "user", "content": val[0]}) |
|
|
if val[1]: |
|
|
messages.append({"role": "assistant", "content": val[1]}) |
|
|
|
|
|
messages.append({"role": "user", "content": enhanced_message}) |
|
|
|
|
|
response = "" |
|
|
for message in client.chat_completion( |
|
|
messages, |
|
|
max_tokens=max_tokens, |
|
|
stream=True, |
|
|
temperature=temperature, |
|
|
top_p=top_p, |
|
|
): |
|
|
token = message.choices[0].delta.content |
|
|
response += token |
|
|
yield response |
|
|
|
|
|
def reset_chat(): |
|
|
return None |
|
|
|
|
|
def show_settings_changed_info(agent_type, personality, expertise_level, language): |
|
|
return f""" |
|
|
New Agent Settings: |
|
|
- Type: {agent_type} |
|
|
- Personality: {personality} |
|
|
- Expertise Level: {expertise_level} |
|
|
- Response Language: {language} |
|
|
|
|
|
Chat has been reset. Please start a new conversation with the updated settings. |
|
|
""" |
|
|
|
|
|
""" |
|
|
For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface |
|
|
""" |
|
|
|
|
|
with gr.Blocks() as demo: |
|
|
gr.Markdown(""" |
|
|
# π¬ Personalized Movie Recommender |
|
|
|
|
|
Welcome to your personalized movie recommendation system! |
|
|
Tell us your preferred genres and current mood, and we'll recommend the perfect movies for you. |
|
|
""") |
|
|
|
|
|
with gr.Row(): |
|
|
with gr.Column(scale=2): |
|
|
chatbot = gr.Chatbot( |
|
|
height=600, |
|
|
show_copy_button=True, |
|
|
avatar_images=("π€", "π¬"), |
|
|
bubble_full_width=False |
|
|
) |
|
|
with gr.Row(): |
|
|
msg = gr.Textbox( |
|
|
placeholder="What kind of movie are you looking for?", |
|
|
show_label=False, |
|
|
container=False |
|
|
) |
|
|
with gr.Row(): |
|
|
submit = gr.Button("Get Recommendations", variant="primary", size="sm") |
|
|
clear = gr.Button("Clear Chat", size="sm") |
|
|
|
|
|
with gr.Column(scale=1): |
|
|
with gr.Group(): |
|
|
gr.Markdown("### π― Recommendation Settings") |
|
|
genre = gr.Dropdown( |
|
|
choices=["Action", "Comedy", "Drama", "Romance", "Thriller", "Sci-Fi", "Fantasy", "Animation"], |
|
|
label="Preferred Genres", |
|
|
multiselect=True |
|
|
) |
|
|
mood = gr.Dropdown( |
|
|
choices=["Exciting", "Emotional", "Suspenseful", "Relaxing", "Mysterious"], |
|
|
label="Current Mood", |
|
|
multiselect=True |
|
|
) |
|
|
|
|
|
with gr.Group(): |
|
|
gr.Markdown("### π€ Agent Settings") |
|
|
agent_type = gr.Dropdown( |
|
|
choices=["Expert", "Friend", "Film Critic", "Curator"], |
|
|
label="Agent Type", |
|
|
value="Expert" |
|
|
) |
|
|
personality = gr.Dropdown( |
|
|
choices=["Friendly", "Professional", "Humorous", "Emotional", "Objective"], |
|
|
label="Personality", |
|
|
value="Friendly" |
|
|
) |
|
|
expertise_level = gr.Dropdown( |
|
|
choices=["Beginner", "Intermediate", "Expert"], |
|
|
label="Explanation Level", |
|
|
value="Intermediate" |
|
|
) |
|
|
language = gr.Dropdown( |
|
|
choices=["English", "Korean", "Japanese"], |
|
|
label="Response Language", |
|
|
value="English" |
|
|
) |
|
|
|
|
|
with gr.Group(): |
|
|
gr.Markdown("### βοΈ Advanced Settings") |
|
|
max_tokens = gr.Slider( |
|
|
minimum=1, |
|
|
maximum=2048, |
|
|
value=512, |
|
|
step=1, |
|
|
label="Max Tokens" |
|
|
) |
|
|
temperature = gr.Slider( |
|
|
minimum=0.1, |
|
|
maximum=4.0, |
|
|
value=0.7, |
|
|
step=0.1, |
|
|
label="Temperature" |
|
|
) |
|
|
top_p = gr.Slider( |
|
|
minimum=0.1, |
|
|
maximum=1.0, |
|
|
value=0.95, |
|
|
step=0.05, |
|
|
label="Top-p" |
|
|
) |
|
|
|
|
|
|
|
|
for component in [agent_type, personality, expertise_level, language]: |
|
|
component.change( |
|
|
fn=show_settings_changed_info, |
|
|
inputs=[agent_type, personality, expertise_level, language], |
|
|
outputs=gr.Info() |
|
|
).then( |
|
|
fn=reset_chat, |
|
|
outputs=chatbot |
|
|
) |
|
|
|
|
|
submit.click( |
|
|
respond, |
|
|
inputs=[ |
|
|
msg, |
|
|
chatbot, |
|
|
agent_type, |
|
|
personality, |
|
|
expertise_level, |
|
|
language, |
|
|
max_tokens, |
|
|
temperature, |
|
|
top_p, |
|
|
genre, |
|
|
mood, |
|
|
], |
|
|
outputs=chatbot, |
|
|
).then( |
|
|
lambda: "", |
|
|
None, |
|
|
msg, |
|
|
queue=False |
|
|
) |
|
|
|
|
|
clear.click(lambda: None, None, chatbot, queue=False) |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
demo.launch() |
|
|
|