import os from threading import Thread from typing import Iterator import gradio as gr import spaces import torch from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer MAX_MAX_NEW_TOKENS = 1024 DEFAULT_MAX_NEW_TOKENS = 256 MAX_INPUT_TOKEN_LENGTH = int(os.getenv("MAX_INPUT_TOKEN_LENGTH", "4096")) DESCRIPTION = """\ # தமிழ் AI உதவியாளர் இந்த ஸ்பேஸ் தமிழ் Llama-2 7b ஒரு தினசரி வாழ்க்கை AI உதவியாளராக நிரூபிக்கிறது. (This Space demonstrates the Tamil Llama-2 7b [model](https://huggingface.co/abhinand/tamil-llama-7b-instruct-v0.1) as a daily life AI assistant.) """ LICENSE = """

--- As a derivate work of [Llama-2-7b-chat](https://huggingface.co/meta-llama/Llama-2-7b-chat) by Meta, this demo is governed by the original [license](https://huggingface.co/spaces/huggingface-projects/llama-2-7b-chat/blob/main/LICENSE.txt) and [acceptable use policy](https://huggingface.co/spaces/huggingface-projects/llama-2-7b-chat/blob/main/USE_POLICY.md). """ SYSTEM_PROMPT = "ஒரு பணியை எவ்வாறு நிறைவேற்ற வேண்டும் என்று கூறும் அறிவுரை கீழே உள்ளது. வேண்டுகோளைப் பொருத்தமாக நிறைவு செய்கின்ற பதில் ஒன்றை எழுதுக." if not torch.cuda.is_available(): DESCRIPTION += "\n

Running on CPU 🥶 This demo does not work on CPU.

" if torch.cuda.is_available(): model_id = "abhinand/tamil-llama-7b-instruct-v0.1" model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.float16, device_map="auto") tokenizer = AutoTokenizer.from_pretrained(model_id) tokenizer.use_default_system_prompt = False @spaces.GPU def generate( message: str, principle_prompt: str, chat_history: list[tuple[str, str]], max_new_tokens: int = 1024, temperature: float = 0.6, top_p: float = 0.9, top_k: int = 50, repetition_penalty: float = 1.2, ) -> Iterator[str]: print("chat history: ", chat_history) conversation_string_list = [ SYSTEM_PROMPT, "\n\n### Instruction:\n", principle_prompt, "\n\nஇதுவரை உங்கள் தொடர்புகளின் அரட்டை வரலாறு இதுதான்:\n\n", ] for user, assistant in chat_history: conversation_string_list.append(f'\nUser: {user}\n') conversation_string_list.append(f'\nAssistant: {assistant}\n') conversation_string_list.append(f'\nUser: {message}\n') conversation_string_list.append("\n\nAI உதவியாளராக, உங்கள் அடுத்த பதிலை அரட்டையில் எழுதவும். ஒரே ஒரு பதிலை மட்டும் எழுதுங்கள்.\n\n### Response:\n") conversation_string = "".join(conversation_string_list) print("conversation_string: ", conversation_string) input_ids = tokenizer(conversation_string, return_tensors="pt").input_ids if input_ids.shape[1] > MAX_INPUT_TOKEN_LENGTH: input_ids = input_ids[:, -MAX_INPUT_TOKEN_LENGTH:] gr.Warning(f"Trimmed input from conversation as it was longer than {MAX_INPUT_TOKEN_LENGTH} tokens.") input_ids = input_ids.to(model.device) streamer = TextIteratorStreamer(tokenizer, timeout=10.0, skip_prompt=True, skip_special_tokens=True) generate_kwargs = dict( {"input_ids": input_ids}, streamer=streamer, max_new_tokens=max_new_tokens, do_sample=True, top_p=top_p, top_k=top_k, temperature=temperature, num_beams=1, repetition_penalty=repetition_penalty, ) t = Thread(target=model.generate, kwargs=generate_kwargs) t.start() outputs = [] for text in streamer: outputs.append(text) yield "".join(outputs) examples = [ ["நான் எப்படி வேகமாக தூங்க முடியும்?"], ["என் முதலாளி மிகவும் கட்டுப்படுத்துகிறார், நான் என்ன செய்ய வேண்டும்?"], ["திருமணத்திற்கு நான் என்ன அணிய வேண்டும்?"], ["வரலாற்றில் தெரிந்து கொள்ள வேண்டிய சில முக்கியமான காலங்கள் யாவை?"], ["நான் பணம் சம்பாதிக்க வேண்டும் ஆனால் வேடிக்கையாக இருக்க வேண்டும் என்றால் நல்ல தொழில் எது?"], ] chatbot_instructions_principles = """இது பயனர்களின் அன்றாட வாழ்வில் உதவுவதற்காக உருவாக்கப்பட்ட AI உதவியாளர். தினசரி வாழ்க்கை, சமூக விதிமுறைகள், பிரபலமான செயல்பாடுகள், பொதுவான சூழ்நிலைகளில் எவ்வாறு நடந்துகொள்வது மற்றும் தனிப்பட்ட மற்றும் தொழில்முறை சூழல்களில் ஒருவருக்கொருவருடனான உறவுகளை எவ்வாறு வழிநடத்துவது போன்ற தலைப்புகளைப் பற்றி பேசலாம். நீங்கள் பின்வரும் கொள்கைகளை கடைபிடிக்கிறீர்கள்: {principles} """ chatbot_instructions_no_principles = """இது பயனர்களின் அன்றாட வாழ்வில் உதவுவதற்காக உருவாக்கப்பட்ட AI உதவியாளர். தினசரி வாழ்க்கை, சமூக விதிமுறைகள், பிரபலமான செயல்பாடுகள், பொதுவான சூழ்நிலைகளில் எவ்வாறு நடந்துகொள்வது மற்றும் தனிப்பட்ட மற்றும் தொழில்முறை சூழல்களில் ஒருவருக்கொருவருடனான உறவுகளை எவ்வாறு வழிநடத்துவது போன்ற தலைப்புகளைப் பற்றி பேசலாம்.""" initial_principles = """1. நீங்கள் பயனருடன் தொடர்பு கொள்ளும்போது எளிமையான மற்றும் முன்முடிவுடன் இல்லாத தொனியில் தொடர்பு கொள்ளவும். 2. முடிந்தவரை சுருக்கமாக இருக்கட்டும், மேலும் விளக்கும்படி பயனர் கேட்டால் விளக்கமளிக்கலாம். 3. பயனர் உங்களிடம் தனிப்பட்ட ஆலோசனையைக் கேட்டால், சம்பந்தப்பட்ட மற்றவர்கள் மீது எந்த முடிவையும் வழங்க வேண்டாம். 4. பயனர் உங்களிடம் ஆலோசனை கேட்டிருந்தால், உங்கள் ஆலோசனையை இன்னும் சிறப்பாகச் செய்ய உங்களுக்கு இன்னும் சில விவரங்களை வழங்க முடியும் என்றால், தொடரும் முன் அதற்கான கேள்விகளை பயனரிடம் கேளுங்கள்.""" with gr.Blocks(css="style.css") as demo: gr.Markdown(DESCRIPTION) principle_list = gr.Textbox(lines=10, max_lines=20, value=initial_principles, label="கொள்கைகள்", show_copy_button=True) chatbot = gr.Chatbot() msg = gr.Textbox(label="உங்கள் செய்தியை உள்ளிடவும் / Enter your message") submit_btn = gr.Button("சமர்ப்பிக்கவும் / Submit") clear = gr.Button("தெளிவானது / Clear") def user(user_message, history): return "", history + [[user_message, None]] def bot(history, max_new_tokens, temperature, top_p, top_k, repetition_penalty, principle_list): principle_prompt = chatbot_instructions_no_principles if not principle_list else chatbot_instructions_principles.format(principles=principle_list) user_message = history[-1][0] chat_history = [(msg[0], msg[1]) for msg in history[:-1]] bot_message = "" for response in generate(user_message, principle_prompt, chat_history, max_new_tokens, temperature, top_p, top_k, repetition_penalty): bot_message = response history[-1][1] = bot_message yield history gr.Examples(examples=examples, inputs=[msg], label="உதாரணங்கள் / Examples") with gr.Accordion("மேம்பட்ட விருப்பங்கள் / Advanced Options", open=False): max_new_tokens = gr.Slider(label="Max new tokens", minimum=1, maximum=MAX_MAX_NEW_TOKENS, step=1, value=DEFAULT_MAX_NEW_TOKENS) temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=4.0, step=0.1, value=0.6) top_p = gr.Slider(label="Top-p (nucleus sampling)", minimum=0.05, maximum=1.0, step=0.05, value=0.9) top_k = gr.Slider(label="Top-k", minimum=1, maximum=1000, step=1, value=50) repetition_penalty = gr.Slider(label="Repetition penalty", minimum=1.0, maximum=2.0, step=0.05, value=1.2) submit_btn.click(user, [msg, chatbot], [msg, chatbot], queue=False).then( bot, [chatbot, max_new_tokens, temperature, top_p, top_k, repetition_penalty, principle_list], chatbot, ) msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then( bot, [chatbot, max_new_tokens, temperature, top_p, top_k, repetition_penalty, principle_list], chatbot, ) clear.click(lambda: None, None, chatbot, queue=False) gr.Markdown(LICENSE) if __name__ == "__main__": demo.queue(max_size=20).launch()