If I read this correctly, some metrics also need an embedding model. The easiest way would be to put them in langchain wrappers as follows:
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
from langchain import HuggingFacePipeline
from langchain_community.embeddings import HuggingFaceEmbeddings
from ragas.metrics import (
answer_relevancy,
faithfulness,
context_recall,
context_precision,
)
from ragas import evaluate
# embedding model
embedding_model = HuggingFaceEmbeddings("my-model-id")
# evaluator
model_id = "my-evaluator-id"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
pipe = pipeline(
model=model,
tokenizer=tokenizer,
return_full_text=True, # langchain expects the full text
task='text-generation',
temperature=0.1,
repetition_penalty=1.1 # without this output begins repeating
)
evaluator = HuggingFacePipeline(pipeline=pipe)
# ragas
result = evaluate(
dataset=dataset,
llm=evaluator,
embeddings=embedding_model,
metrics=[
context_precision,
faithfulness,
answer_relevancy,
context_recall,
],
)
I had recently implemented something similar. You have to have sentence-transformers
and the latest version of transformers
installed, otherwise I got problems with sentence-transformers
.
But with the latest version of transformers
I had problems importing the pipeline
(some tensorflow error). But you can also create them yourself.
class CustomPipeline(Pipeline):
def _sanitize_parameters(self, **kwargs):
preprocess_kwargs = {}
return preprocess_kwargs, {}, {}
def preprocess(self, text):
return self.tokenizer(text, return_tensors="pt").to(self.device)
def _forward(self, inputs):
outputs = self.model.generate(**inputs)
return outputs
def postprocess(self, outputs):
outputs = self.tokenizer.decode(outputs[0])
return outputs
# init pipe
pipe = CustomPipelne(
model=model,
tokenizer=tokenizer,
return_full_text=True, # langchain expects the full text
task='text-generation',
temperature=0.1,
repetition_penalty=1.1
)
# langchain wrapper
evaluator = HuggingFacePipeline(pipeline=pipe)