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