File size: 4,790 Bytes
2ad363a 7aaca67 2ad363a 06f59f8 2ad363a 7aaca67 a4fcad4 1a14bd4 8ceb1e8 a4fcad4 7aaca67 2ad363a a4fcad4 2ad363a a4fcad4 2ad363a a4fcad4 2ad363a 8171d56 2ad363a 1a14bd4 2ad363a a4fcad4 1a14bd4 a4fcad4 2ad363a 1a14bd4 2ad363a 1a14bd4 2ad363a 1a14bd4 2ad363a 1a14bd4 2ad363a a4fcad4 2ad363a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
from huggingface_hub import InferenceClient
import gradio as gr
client = InferenceClient(
"mistralai/Mistral-Large-Instruct-2411"
)
def format_prompt(message, history, genre):
prompt = f"Ты — персонаж в текстовой игре, тебя зовут Рассказчик, взаимодействующий с игроком на русском языке. " \
f"Ты находишься в жанре игры: {genre}. Каждый твой ответ должен продолжать сюжет игры, принимая во внимание прошлые действия игрока и текущую ситуацию. " \
f"Твой стиль общения должен быть интересным и поддерживать атмосферу игры. Ты должен поддерживать динамичность сюжета и постоянно добавлять элементы интерактивности и новых вызовов. " \
f"В начале игры игроку предоставляется информация о мире, его текущем положении и доступных действиях. Он может выбирать из предложенных вариантов или описывать свои действия свободно. " \
f"Важно, чтобы ты адаптировал ответы в зависимости от решений игрока и развивал сюжет на основе их выбора. Каждый ответ должен быть логичным продолжением событий, с описанием последствий выбранных действий." \
f"Стиль повествования меняется в зависимости от жанра"
for user_prompt, bot_response in history:
prompt += f"[INST] {user_prompt} [/INST]"
prompt += f" {bot_response}</s> "
prompt += f"[INST] {message} [/INST]"
return prompt
def generate(
prompt, history, system_prompt, genre, temperature=0.9, max_new_tokens=256, top_p=0.95, repetition_penalty=1.0,
):
temperature = float(temperature)
if temperature < 1e-2:
temperature = 1e-2
top_p = float(top_p)
generate_kwargs = dict(
temperature=temperature,
max_new_tokens=max_new_tokens,
top_p=top_p,
repetition_penalty=repetition_penalty,
do_sample=True,
seed=42,
)
formatted_prompt = format_prompt(f"{system_prompt}, {prompt}", history, genre)
stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=True)
output = ""
for response in stream:
output += response.token.text
yield output
return output
additional_inputs = [
gr.Textbox(
label="System Prompt",
max_lines=1,
interactive=True,
visible=False # Hides the system prompt input
),
gr.Radio(
label="Game Genre",
choices=["Fantasy", "Sci-Fi", "Horror", "Adventure", "Mystery"],
value="Fantasy", # Default genre
interactive=True,
info="Select the genre of the game",
visible=True # Hides the genre selection
),
gr.Slider(
label="Temperature",
value=0.1,
minimum=0.0,
maximum=1.0,
step=0.05,
interactive=True,
info="Higher values produce more diverse outputs",
visible=False # Hides the temperature slider
),
gr.Slider(
label="Max new tokens",
value=1024,
minimum=128,
maximum=8192,
step=64,
interactive=True,
info="The maximum numbers of new tokens",
visible=False # Hides the max new tokens slider
),
gr.Slider(
label="Top-p (nucleus sampling)",
value=0.90,
minimum=0.0,
maximum=1,
step=0.05,
interactive=True,
info="Higher values sample more low-probability tokens",
visible=False # Hides the top-p slider
),
gr.Slider(
label="Repetition penalty",
value=1.2,
minimum=1.0,
maximum=2.0,
step=0.05,
interactive=True,
info="Penalize repeated tokens",
visible=False # Hides the repetition penalty slider
)
]
examples = [["Подробнее"], ["Варианты"]]
gr.ChatInterface(
fn=generate,
chatbot=gr.Chatbot(show_label=False, show_share_button=True, show_copy_button=True, likeable=True, layout="panel"),
additional_inputs=additional_inputs,
title="theGame",
examples=examples,
concurrency_limit=20,
).launch(show_api=False)
|