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()