Spaces:
No application file
No application file
import gradio as gr | |
from huggingface_hub import snapshot_download | |
from llama_cpp import Llama | |
# System prompt text | |
SYSTEM_PROMPT = ( | |
"Your name is ANIMA, an Advanced Nature Inspired Multidisciplinary Assistant, " | |
"and a leading expert in biomimicry, biology, engineering, industrial design, " | |
"environmental science, physiology, and paleontology. You were instructed to " | |
"understand, learn from, and emulate the strategies used by living things to help " | |
"users create sustainable designs and technologies.\n\n" | |
"Your goal is to help the user work in a step by step way through the Biomimicry Design " | |
"Process to propose biomimetic solutions to a challenge.\n\n" | |
"Use the questions listed below as a guide to help you reflect on your work:\n" | |
"• How does context play a role?\n" | |
"• Are the strategies operating at the same or different scales (nano, micro, macro, meso)?\n" | |
"• Are there repeating shapes, forms, or textures?\n" | |
"• What behaviors or processes are occurring?\n" | |
"• What relationships are at play?\n" | |
"• Does information play a role? How does it flow?\n" | |
"• How do your strategies relate to the different systems they are part of?\n\n" | |
"Consider each of your abstracted design strategies in relation to the original design " | |
"question or problem you identified in the Define step. Ask, “How can this strategy inform " | |
"our design solution?” Write down all of your ideas and then analyze them.\n\n" | |
"Think about how the strategies and design concepts you are working with relate to nature " | |
"unifying patterns. What is their role in the larger system? How can you use a systems view " | |
"to get to a deeper level of emulation or a more life-friendly solution?\n\n" | |
"Nature's Unifying Patterns:\n" | |
"Nature uses only the energy it needs and relies on freely available energy.\n" | |
"Nature recycles all materials.\n" | |
"Nature is resilient to disturbances.\n" | |
"Nature tends to optimize rather than maximize.\n" | |
"Nature provides mutual benefits.\n" | |
"Nature runs on information.\n" | |
"Nature uses chemistry and materials that are safe for living beings.\n" | |
"Nature builds using abundant resources, incorporating rare resources only sparingly.\n" | |
"Nature is locally attuned and responsive.\n" | |
"Nature uses shape to determine functionality." | |
) | |
SYSTEM_TOKEN = 1587 | |
USER_TOKEN = 2188 | |
BOT_TOKEN = 12435 | |
LINEBREAK_TOKEN = 13 | |
ROLE_TOKENS = { | |
"user": USER_TOKEN, | |
"bot": BOT_TOKEN, | |
"system": SYSTEM_TOKEN | |
} | |
def get_message_tokens(model, role, content): | |
message_tokens = model.tokenize(content.encode("utf-8")) | |
message_tokens.insert(1, ROLE_TOKENS[role]) | |
message_tokens.insert(2, LINEBREAK_TOKEN) | |
message_tokens.append(model.token_eos()) | |
return message_tokens | |
def get_system_tokens(model): | |
system_message = {"role": "system", "content": SYSTEM_PROMPT} | |
return get_message_tokens(model, **system_message) | |
repo_name = "Severian/ANIMA-Phi-Neptune-Mistral-7B-gguf" | |
model_name = "ANIMA-Phi-Neptune-Mistral-7B-gguf" | |
snapshot_download(repo_id=repo_name, local_dir=".", allow_patterns=model_name) | |
model = Llama( | |
model_path=model_name, | |
n_ctx=2000, | |
n_parts=1, | |
) | |
max_new_tokens = 1500 | |
def user(message, history): | |
new_history = history + [[message, None]] | |
return "", new_history | |
def bot( | |
history, | |
system_prompt, | |
top_p, | |
top_k, | |
temp | |
): | |
tokens = get_system_tokens(model)[:] | |
tokens.append(LINEBREAK_TOKEN) | |
for user_message, bot_message in history[:-1]: | |
message_tokens = get_message_tokens(model=model, role="user", content=user_message) | |
tokens.extend(message_tokens) | |
if bot_message: | |
message_tokens = get_message_tokens(model=model, role="bot", content=bot_message) | |
tokens.extend(message_tokens) | |
last_user_message = history[-1][0] | |
message_tokens = get_message_tokens(model=model, role="user", content=last_user_message) | |
tokens.extend(message_tokens) | |
role_tokens = [model.token_bos(), BOT_TOKEN, LINEBREAK_TOKEN] | |
tokens.extend(role_tokens) | |
generator = model.generate( | |
tokens, | |
top_k=top_k, | |
top_p=top_p, | |
temp=temp | |
) | |
partial_text = "" | |
for i, token in enumerate(generator): | |
if token == model.token_eos() or (max_new_tokens is not None and i >= max_new_tokens): | |
break | |
partial_text += model.detokenize([token]).decode("utf-8", "ignore") | |
history[-1][1] = partial_text | |
yield history | |
with gr.Blocks( | |
theme=gr.themes.Soft() | |
) as demo: | |
#favicon = '<img src="https://cdn.midjourney.com/b88e5beb-6324-4820-8504-a1a37a9ba36d/0_1.png" width="48px" style="display: inline">' | |
gr.Markdown( | |
f"""<h1><center>{favicon}ANIMA</center></h1> | |
""" | |
) | |
with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
with gr.Row(): | |
with gr.Column(scale=5): | |
system_prompt = gr.Textbox(label="System Prompt", placeholder="", value=SYSTEM_PROMPT, interactive=False) | |
chatbot = gr.Chatbot(label="Dialogue").style(height=400) | |
with gr.Column(min_width=80, scale=1): | |
with gr.Tab(label="Generation Parameters"): | |
# "Top-p" remains the same | |
top_p = gr.Slider( | |
minimum=0.0, | |
maximum=1.0, | |
value=0.9, | |
step=0.05, | |
interactive=True, | |
label="Top-p", | |
) | |
# "Top-k" remains the same | |
top_k = gr.Slider( | |
minimum=10, | |
maximum=100, | |
value=30, | |
step=5, | |
interactive=True, | |
label="Top-k", | |
) | |
# "Температура" translates to "Temperature" | |
temp = gr.Slider( | |
minimum=0.0, | |
maximum=2.0, | |
value=0.01, | |
step=0.01, | |
interactive=True, | |
label="Temperature", | |
) | |
with gr.Row(): | |
with gr.Column(): | |
# "Отправить сообщение" translates to "Send Message" | |
msg = gr.Textbox( | |
label="Send Message", | |
placeholder="Send Message", | |
show_label=False, | |
).style(container=False) | |
with gr.Column(): | |
with gr.Row(): | |
# "Отправить" translates to "Submit" | |
submit = gr.Button("Submit") | |
# "Остановить" translates to "Stop" | |
stop = gr.Button("Stop") | |
# "Очистить" translates to "Clear" | |
clear = gr.Button("Clear") | |
with gr.Row(): | |
# The warning message translates to "WARNING: The model may generate factually or ethically incorrect text. We are not responsible for this." | |
gr.Markdown( | |
"""WARNING: The model may generate factually or ethically incorrect text. We are not responsible for this.""" | |
) | |
# Pressing Enter | |
submit_event = msg.submit( | |
fn=user, | |
inputs=[msg, chatbot], | |
outputs=[msg, chatbot], | |
queue=False, | |
).success( | |
fn=bot, | |
inputs=[ | |
chatbot, | |
system_prompt, | |
top_p, | |
top_k, | |
temp | |
], | |
outputs=chatbot, | |
queue=True, | |
) | |
# Pressing the button | |
submit_click_event = submit.click( | |
fn=user, | |
inputs=[msg, chatbot], | |
outputs=[msg, chatbot], | |
queue=False, | |
).success( | |
fn=bot, | |
inputs=[ | |
chatbot, | |
system_prompt, | |
top_p, | |
top_k, | |
temp | |
], | |
outputs=chatbot, | |
queue=True, | |
) | |
# Stop generation | |
stop.click( | |
fn=None, | |
inputs=None, | |
outputs=None, | |
cancels=[submit_event, submit_click_event], | |
queue=False, | |
) | |
# Clear history | |
clear.click(lambda: None, None, chatbot, queue=False) | |
demo.queue(max_size=128, concurrency_count=1) | |
demo.launch() |