|
import os |
|
from .amodel import AModel |
|
from huggingface_hub import InferenceClient |
|
import numpy as np |
|
|
|
|
|
class HuggingFaceModel(AModel): |
|
|
|
def __init__(self, llm_name:str, feature_name:str, temperature:float=0.0): |
|
self.llm_name:str = llm_name |
|
self.feature_name:str = feature_name |
|
self.temperature = temperature |
|
api_token = os.getenv("HUGGINGFACEHUB_API_TOKEN") |
|
try: |
|
self.model = InferenceClient(api_key=api_token) |
|
except: |
|
raise |
|
|
|
def ask_llm(self, question:str)->str: |
|
messages = [{"role": "user", "content": question}] |
|
try: |
|
resp = self.model.chat.completions.create( |
|
model=self.llm_name, |
|
messages=messages, |
|
max_tokens=2048, |
|
temperature=self.temperature, |
|
|
|
) |
|
return resp.choices[0].message.content |
|
except: |
|
raise |
|
|
|
def create_vector(self, chunk:str)->list[float]: |
|
try: |
|
resp = self.model.feature_extraction( |
|
text=chunk, |
|
|
|
model=self.feature_name, |
|
) |
|
if isinstance(resp, np.ndarray): |
|
return resp |
|
else: |
|
raise Exception("Error with embedding !") |
|
except: |
|
raise |
|
|
|
def create_vectors(self, chunks:list[str])->list[list[float]]: |
|
''' |
|
Pas de batch pour la création de vectors sur HuggingFace, on les passe un par un |
|
''' |
|
vectors = [] |
|
try: |
|
for chunk in chunks: |
|
v = self.create_vector(chunk) |
|
if not isinstance(v, np.ndarray): |
|
raise |
|
vectors.append(v.tolist()) |
|
return vectors |
|
except: |
|
raise |