Spaces:
Sleeping
Sleeping
File size: 4,563 Bytes
5e7630e 7552761 5e7630e 7552761 5e7630e 4a98fd9 5e7630e 4a98fd9 5e7630e |
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 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
import streamlit as st
from transformers import LlamaTokenizerFast
from peft import AutoPeftModelForCausalLM
import torch
from io import BytesIO
# ------------------------------------------------
# Model ve tokenizer'ı sadece bir kez yükleyelim:
# ------------------------------------------------
@st.cache_resource
def load_model_and_tokenizer():
tokenizer = LlamaTokenizerFast.from_pretrained("anilguleroglu/cllm-0.0.2-chat-final")
model = AutoPeftModelForCausalLM.from_pretrained("anilguleroglu/cllm-0.0.2-chat-final")
return model, tokenizer
model, tokenizer = load_model_and_tokenizer()
# ------------------------------------------------
# Metin üretim fonksiyonu
# ------------------------------------------------
def generate_text(prompt, max_length=1024):
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(
inputs.input_ids,
attention_mask=inputs.attention_mask,
max_length=max_length,
num_return_sequences=1,
eos_token_id=tokenizer.eos_token_id,
pad_token_id=tokenizer.eos_token_id,
do_sample=True,
top_k=10,
top_p=0.9,
temperature=0.3,
repetition_penalty=1.3
)
response = tokenizer.decode(outputs[0], skip_special_tokens=False)
print(len(response))
keyword = "<|start_header_id|> assistant<|end_header_id|>"
print("RESPONSE:")
print(response)
# Anahtar kelimeden sonrasını çıkarma
if keyword in response:
extracted_content = response.split(keyword, 1)[1].strip().replace("<|eot_id|>","")
return extracted_content
else:
response
# ------------------------------------------------
# Chat için prompt oluşturma fonksiyonu
# (system mesajını eklemek isteğe bağlı;
# bu örnekte system mesajı "apply_chat_template"
# fonksiyonuna elle eklenebilir.)
# ------------------------------------------------
def build_prompt(system_message, chat_history):
"""
system_message: string
chat_history: [
{"role":"user", "content":"..."},
{"role":"assistant", "content":"..."},
...
]
"""
# System mesajını chat'in başına eklemek için:
# (İsterseniz LlamaTokenizerFast'in 'apply_chat_template'
# metodunu da kullanabilirsiniz.)
# Bu örnekte basit bir şekilde kendimiz birleştiriyoruz:
chat_history = [{"role": "system", "content": system_message}] + chat_history
return tokenizer.apply_chat_template(chat_history, tokenize=False, add_generation_prompt=True)
# ------------------------------------------------
# Streamlit Arayüzü
# ------------------------------------------------
def main():
st.title("CLLM-0.0.2 Chat")
# Session state'de system mesajı ve konuşmaları tutalım
if "system_message" not in st.session_state:
st.session_state["system_message"] = ""
if "messages" not in st.session_state:
st.session_state["messages"] = [] # {"role":"user"/"assistant", "content":...}
# System mesajı giriş alanı
st.session_state["system_message"] = st.text_area(
"System Mesajı (konuşmayı resetleseniz de kaybolmaz)",
st.session_state["system_message"],
height=100
)
# Reset buttonu
if st.button("Konuşmayı Sıfırla"):
st.session_state["messages"] = []
# Mevcut konuşmayı ekranda göster
st.subheader("Konuşma Geçmişi")
for msg in st.session_state["messages"]:
if msg["role"] == "user":
with st.chat_message("user"):
st.write(msg["content"])
else:
with st.chat_message("assistant"):
st.write(msg["content"])
# Kullanıcı girişi
user_input = st.chat_input(placeholder="Mesajınızı yazın ve Enter'a basın...")
if user_input:
# 1) Kullanıcı mesajını ekle
st.session_state["messages"].append({"role": "user", "content": user_input})
# 2) Prompt'u oluştur
prompt = build_prompt(st.session_state["system_message"], st.session_state["messages"])
# 3) Modelden cevap al
with st.chat_message("assistant"):
with st.spinner("Model cevap üretiyor..."):
generated_text = generate_text(prompt)
# 5) Asistan cevabını kaydet
st.session_state["messages"].append({"role": "assistant", "content": generated_text})
# 6) Ekrana yaz
st.write(generated_text)
# PDF Download
st.divider()
if __name__ == "__main__":
main() |