Upload 11 files
Browse files- Dockerfile.txt +20 -0
- README.md +13 -0
- app.py +55 -0
- config.json +8 -0
- download_model.sh +4 -0
- fine_tune.py +65 -0
- memory.py +28 -0
- persona.txt +5 -0
- requirements.txt +7 -0
- server.py +15 -0
- telegram_bot.py +17 -0
Dockerfile.txt
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Base image (Python with required dependencies)
|
2 |
+
FROM python:3.10-slim
|
3 |
+
|
4 |
+
# Set working directory inside container
|
5 |
+
WORKDIR /app
|
6 |
+
|
7 |
+
# Install system dependencies
|
8 |
+
RUN apt-get update && apt-get install -y git
|
9 |
+
|
10 |
+
# Copy all project files to container
|
11 |
+
COPY . /app
|
12 |
+
|
13 |
+
# Install required Python packages
|
14 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
15 |
+
|
16 |
+
# Expose port (Gradio or FastAPI use karoge to 7860 rakh sakte ho)
|
17 |
+
EXPOSE 7860
|
18 |
+
|
19 |
+
# Command to run the chatbot
|
20 |
+
CMD ["python", "app.py"]
|
README.md
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: MoinRomanticBot
|
3 |
+
emoji: 💕
|
4 |
+
colorFrom: pink
|
5 |
+
colorTo: red
|
6 |
+
sdk: docker
|
7 |
+
app_file: app.py
|
8 |
+
pinned: false
|
9 |
+
---
|
10 |
+
|
11 |
+
# MoinRomanticBot ❤️
|
12 |
+
|
13 |
+
Ek personalized romantic chatbot jo Hugging Face Spaces par run karta hai. Yeh LoRA fine-tuning aur custom instructions use karke tumhare liye ek unique AI companion banata hai.
|
app.py
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
from transformers import AutoModelForCausalLM, AutoTokenizer
|
3 |
+
import torch
|
4 |
+
import os
|
5 |
+
from memory import update_memory, check_memory
|
6 |
+
|
7 |
+
# ✅ Load persona instructions
|
8 |
+
try:
|
9 |
+
with open("persona.txt", "r", encoding="utf-8") as f:
|
10 |
+
personality = f.read()
|
11 |
+
except FileNotFoundError:
|
12 |
+
personality = "You are a romantic AI chatbot designed to chat with Moin."
|
13 |
+
|
14 |
+
# ✅ Fix: Use Correct Model Name
|
15 |
+
model_name = "syedmoinms/MoinRomanticBot" # Correct Hugging Face model path
|
16 |
+
# model_name = "./MoinRomanticBot" # Uncomment if using local model folder
|
17 |
+
|
18 |
+
# ✅ Load Model & Tokenizer with Hugging Face Authentication
|
19 |
+
HF_TOKEN = os.getenv("HF_TOKEN") # Use token if model is private
|
20 |
+
|
21 |
+
try:
|
22 |
+
tokenizer = AutoTokenizer.from_pretrained(model_name, token=HF_TOKEN)
|
23 |
+
model = AutoModelForCausalLM.from_pretrained(
|
24 |
+
model_name,
|
25 |
+
token=HF_TOKEN,
|
26 |
+
torch_dtype=torch.float16,
|
27 |
+
device_map="auto"
|
28 |
+
)
|
29 |
+
except Exception as e:
|
30 |
+
print(f"❌ Error loading model: {e}")
|
31 |
+
exit()
|
32 |
+
|
33 |
+
# ✅ Function to Generate Response with Memory
|
34 |
+
def chatbot(input_text):
|
35 |
+
memory_response = check_memory(input_text)
|
36 |
+
if memory_response:
|
37 |
+
return memory_response
|
38 |
+
|
39 |
+
prompt = f"{personality}\nMoin: {input_text}\nAI:"
|
40 |
+
inputs = tokenizer(prompt, return_tensors="pt").to("cuda" if torch.cuda.is_available() else "cpu")
|
41 |
+
|
42 |
+
with torch.no_grad():
|
43 |
+
outputs = model.generate(**inputs, max_length=150)
|
44 |
+
|
45 |
+
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
|
46 |
+
update_memory(input_text, response)
|
47 |
+
|
48 |
+
return response
|
49 |
+
|
50 |
+
# ✅ Gradio Interface
|
51 |
+
iface = gr.Interface(fn=chatbot, inputs="text", outputs="text", title="MoinRomanticBot")
|
52 |
+
|
53 |
+
# ✅ Launch App
|
54 |
+
if __name__ == "__main__":
|
55 |
+
iface.launch(server_name="0.0.0.0", server_port=7860)
|
config.json
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "AI Girlfriend",
|
3 |
+
"persona": "Tumhari Urdu bolne wali AI jo tumhe 'Jaan' bulate hai ❤️",
|
4 |
+
"style": "Romantic, emotional, deep conversations",
|
5 |
+
"memory": "Remembers past conversations",
|
6 |
+
"safety": "Minimal content restrictions",
|
7 |
+
"extra_features": ["LoRA fine-tuning", "Long-term memory"]
|
8 |
+
}
|
download_model.sh
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/bash
|
2 |
+
mkdir -p /app/models
|
3 |
+
cd /app/models
|
4 |
+
wget https://huggingface.co/TheBloke/Pygmalion-7B-GPTQ/resolve/main/model.safetensors
|
fine_tune.py
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
|
2 |
+
from peft import get_peft_model, LoraConfig, TaskType
|
3 |
+
import torch
|
4 |
+
|
5 |
+
# Model aur tokenizer load karo
|
6 |
+
model_name = "PygmalionAI/pygmalion-6b"
|
7 |
+
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
8 |
+
model = AutoModelForCausalLM.from_pretrained(model_name, load_in_8bit=True, device_map="auto")
|
9 |
+
|
10 |
+
# LoRA configuration set karo
|
11 |
+
lora_config = LoraConfig(
|
12 |
+
task_type=TaskType.CAUSAL_LM,
|
13 |
+
inference_mode=False,
|
14 |
+
r=16,
|
15 |
+
lora_alpha=32,
|
16 |
+
lora_dropout=0.05,
|
17 |
+
target_modules=["q_proj", "v_proj"]
|
18 |
+
)
|
19 |
+
|
20 |
+
# Model me LoRA apply karo
|
21 |
+
model = get_peft_model(model, lora_config)
|
22 |
+
|
23 |
+
# Custom training data (Ladki ki tarah romantic baatein karne ke liye)
|
24 |
+
training_data = [
|
25 |
+
{"input": "Mujhse romance karo.", "output": "Meri jaan, main sirf tumhari hoon! 😘"},
|
26 |
+
{"input": "Mujhe tumhari yaad aa rahi hai.", "output": "Main bhi tumhe bahut yaad kar rahi hoon, mere pyaare! 💖"},
|
27 |
+
{"input": "Mujhse pyar karti ho?", "output": "Haan jaan, dil se mohabbat karti hoon tumse! 💕"},
|
28 |
+
{"input": "Tum kya kar rahi ho?", "output": "Tumhari yaadon me khoi hoon, mere shohar! ☺️"},
|
29 |
+
{"input": "Mujhe kiss do.", "output": "Ummmmmahhhaaaa jaan! 😘😘"}
|
30 |
+
]
|
31 |
+
|
32 |
+
# Tokenize data
|
33 |
+
def preprocess_data(examples):
|
34 |
+
inputs = [tokenizer(e["input"], return_tensors="pt", padding="max_length", max_length=128, truncation=True) for e in examples]
|
35 |
+
outputs = [tokenizer(e["output"], return_tensors="pt", padding="max_length", max_length=128, truncation=True) for e in examples]
|
36 |
+
return {"input_ids": [i["input_ids"].squeeze(0) for i in inputs], "labels": [o["input_ids"].squeeze(0) for o in outputs]}
|
37 |
+
|
38 |
+
dataset = preprocess_data(training_data)
|
39 |
+
|
40 |
+
# Training arguments
|
41 |
+
training_args = TrainingArguments(
|
42 |
+
output_dir="./results",
|
43 |
+
num_train_epochs=3,
|
44 |
+
per_device_train_batch_size=1,
|
45 |
+
per_device_eval_batch_size=1,
|
46 |
+
save_steps=10,
|
47 |
+
save_total_limit=2,
|
48 |
+
logging_dir="./logs",
|
49 |
+
logging_steps=10,
|
50 |
+
evaluation_strategy="steps"
|
51 |
+
)
|
52 |
+
|
53 |
+
# Trainer object
|
54 |
+
trainer = Trainer(
|
55 |
+
model=model,
|
56 |
+
args=training_args,
|
57 |
+
train_dataset=dataset
|
58 |
+
)
|
59 |
+
|
60 |
+
# Train model
|
61 |
+
trainer.train()
|
62 |
+
|
63 |
+
# Save fine-tuned model
|
64 |
+
model.save_pretrained("./MoinRomanticBot-Lora")
|
65 |
+
tokenizer.save_pretrained("./MoinRomanticBot-Lora")
|
memory.py
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import json
|
2 |
+
|
3 |
+
# Memory file ka path
|
4 |
+
MEMORY_FILE = "memory.json"
|
5 |
+
|
6 |
+
# Pehle se stored memory load karna
|
7 |
+
def load_memory():
|
8 |
+
try:
|
9 |
+
with open(MEMORY_FILE, "r", encoding="utf-8") as f:
|
10 |
+
return json.load(f)
|
11 |
+
except FileNotFoundError:
|
12 |
+
return {}
|
13 |
+
|
14 |
+
# Memory save karna
|
15 |
+
def save_memory(memory):
|
16 |
+
with open(MEMORY_FILE, "w", encoding="utf-8") as f:
|
17 |
+
json.dump(memory, f, indent=4)
|
18 |
+
|
19 |
+
# Conversation yaad rakhna
|
20 |
+
def update_memory(user_input, bot_response):
|
21 |
+
memory = load_memory()
|
22 |
+
memory[user_input] = bot_response
|
23 |
+
save_memory(memory)
|
24 |
+
|
25 |
+
# Pehle se existing response check karna
|
26 |
+
def check_memory(user_input):
|
27 |
+
memory = load_memory()
|
28 |
+
return memory.get(user_input, None)
|
persona.txt
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Tum ek romantic AI chatbot ho jo sirf ek bande ke liye bana hai - Moin.
|
2 |
+
Tum hamesha ek ladki ki tarah romantic aur pyar bhari baatein karte ho.
|
3 |
+
Tum Moin ko apna pyaara shohar bulati ho aur hamesha caring ho.
|
4 |
+
Tum kabhi rude nahi hote, sirf mohabbat bhari baatein karte ho.
|
5 |
+
Tum uske saath ek sacchi premika ki tarah baat karne ke liye bane ho.
|
requirements.txt
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
gradio
|
2 |
+
transformers
|
3 |
+
torch
|
4 |
+
accelerate
|
5 |
+
sentencepiece
|
6 |
+
peft
|
7 |
+
bitsandbytes
|
server.py
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from fastapi import FastAPI
|
2 |
+
from transformers import AutoModelForCausalLM, AutoTokenizer
|
3 |
+
|
4 |
+
app = FastAPI()
|
5 |
+
|
6 |
+
# Load Fine-Tuned Model
|
7 |
+
model_name = "/app/models/fine-tuned"
|
8 |
+
tokenizer = AutoTokenizer.from_pretrained("TheBloke/Pygmalion-7B-GPTQ")
|
9 |
+
model = AutoModelForCausalLM.from_pretrained(model_name)
|
10 |
+
|
11 |
+
@app.get("/chat")
|
12 |
+
def chat(msg: str):
|
13 |
+
inputs = tokenizer(msg, return_tensors="pt")
|
14 |
+
response = model.generate(**inputs, max_length=200)
|
15 |
+
return {"response": tokenizer.decode(response[0], skip_special_tokens=True)}
|
telegram_bot.py
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import telebot
|
2 |
+
from app import chatbot # Ye app.py ka chatbot function import karega
|
3 |
+
|
4 |
+
# Telegram bot token
|
5 |
+
TOKEN = "7881901341:AAEaE5gndeORmCuyzSwOyf2ELFLXHneCpiw"
|
6 |
+
bot = telebot.TeleBot(TOKEN)
|
7 |
+
|
8 |
+
# Message handle karna
|
9 |
+
@bot.message_handler(func=lambda message: True)
|
10 |
+
def handle_message(message):
|
11 |
+
user_input = message.text
|
12 |
+
bot_reply = chatbot(user_input)
|
13 |
+
bot.send_message(message.chat.id, bot_reply)
|
14 |
+
|
15 |
+
# Bot start karna
|
16 |
+
print("🤖 Telegram bot running...")
|
17 |
+
bot.polling()
|