Spaces:
Sleeping
Sleeping
File size: 1,558 Bytes
4028152 |
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 |
import time
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
import chromadb
from chromadb.config import Settings
class RAGPipeline:
def __init__(self):
self.tokenizer = AutoTokenizer.from_pretrained("aubmindlab/aragpt2-mega")
self.model = AutoModelForCausalLM.from_pretrained("aubmindlab/aragpt2-mega")
self.generator = pipeline("text-generation", model=self.model, tokenizer=self.tokenizer, device=0 if torch.cuda.is_available() else -1)
self.client = chromadb.Client(Settings(allow_reset=True))
self.collection = None
def build_index(self, passages):
self.client.reset()
self.collection = self.client.create_collection(name="documents")
documents = [p["text"] for p in passages]
metadatas = [{"source": p["source"]} for p in passages]
ids = [str(i) for i in range(len(documents))]
self.collection.add(documents=documents, metadatas=metadatas, ids=ids)
def generate_answer(self, question):
if not self.collection:
return "⚠️ لا يوجد فهرس معرف.", []
results = self.collection.query(query_texts=[question], n_results=3)
retrieved = [d for d in results['documents'][0]]
metadatas = results['metadatas'][0]
prompt = question + "\n" + "\n".join(retrieved)
result = self.generator(prompt, max_new_tokens=150, do_sample=True)[0]['generated_text']
return result, [f"{md['source']}: {text[:60]}..." for md, text in zip(metadatas, retrieved)] |