NewtonBot / start-newton.py
Kolyadual's picture
Upload folder using huggingface_hub
9250542 verified
#!/usr/bin/env python3
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from sentence_transformers import SentenceTransformer
import json
import numpy as np
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
MODEL_PATH = os.path.join(BASE_DIR, "model")
KB_PATH = os.path.join(BASE_DIR, "knowledge/full_knowledge.json")
with open(KB_PATH, "r", encoding="utf-8") as f:
kb_data = json.load(f)
questions = [item["title"] for item in kb_data]
answers = [item["text"] for item in kb_data]
sent_model = SentenceTransformer('all-MiniLM-L6-v2')
question_embeddings = sent_model.encode(questions)
print("Загрузка... (может занять 1–3 минуты)")
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
model = AutoModelForCausalLM.from_pretrained(
MODEL_PATH,
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
device_map="auto"
)
print("Newton Bot готов! Введите 'выход', чтобы завершить.\n")
def find_best_answer(query, top_k=1):
query_emb = sent_model.encode([query])
scores = np.dot(question_embeddings, query_emb.T).flatten()
best_idx = np.argsort(scores)[-top_k:][::-1]
if scores[best_idx[0]] > 0.3: # порог схожести
return answers[best_idx[0]]
return None
def generate_response(prompt):
messages = [
{"role": "system", "content": "Ты — Newton Bot: умный, краткий и точный ассистент с душой, мыслями, добротой и осознанием всего."},
{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
outputs = model.generate(
**inputs,
max_new_tokens=256,
do_sample=True,
temperature=0.7,
top_p=0.92,
pad_token_id=tokenizer.eos_token_id
)
response = tokenizer.decode(outputs[0][len(inputs.input_ids[0]):], skip_special_tokens=True)
return response.strip()
if __name__ == "__main__":
print("Newton Bot: Привет! Я ваш локальный ИИ-ассистент созданный Kolyadual. Задавайте вопросы и не стесняйтесь!")
while True:
user_input = input("\nВы: ").strip()
if user_input.lower() in ["выход", "quit", "exit"]:
print("Удачи! [Newton Bot завершает работу....]")
break
# Сначала ищем в вашей базе
known_answer = find_best_answer(user_input)
if known_answer:
print(f"[Из базы знаний] {known_answer}")
else:
print("Думаю...")
reply = generate_response(user_input)
print(f"Newton Bot: {reply}")