Repository: explodinggradients/ragas
Issue: NaN for faithfulness - Error in prompting json_loader?
Root cause: Validation Gap

**Describe the bug**
I get ```NaN``` as faithfulness, because the json can't parse, also after several retries of the model. I think the cause is in the method `async def _ascore()` for `_faithfulness.py` .
This line: 
```python
json_output = await json_loader.safe_load(
            text=nli_result.generations[0][0].text,
            llm=self.llm,
            callbacks=callbacks,
            is_async=is_async,
        )
```
pass as text-attribute the result of `nli_result.generations[0][0].text`. Here is a cutout of the PromptValue(...) in this line
```python
results = llm.generate_text(
                    PromptValue(prompt_str=JSON_PROMPT.format(input=text)),
                    n=1,
                    callbacks=callbacks,
                )
```
in the `_safe_load()` method in `json_loader`:

*prompt_str='Rewrite the input into valid json\n\nInput:\n{\n    "name": "John Doe",\n    "age": 30,\n    "isStudent": false\n    "address": {\n        "street": "123 Main St",\n        "city": "Anytown",\n        "state": "CA",\n    }\n    "hobbies": ["reading", "swimming", "cycling"]\n}\nOutput:\n{\n    "name": "John Doe",\n    "age": 30,\n    "isStudent": false,\n    "address": {\n        "street": "123 Main St",\n        "city": "Anytown",\n        "state": "CA"\n    },\n    "hobbies": ["reading", "swimming", "cycling"]\n}\n\n\nInput:\n{\n    "statement": "The Earth is also known as "Terra" "\n}\nOutput:\n{\n    "statement": "The Earth is also known as \'Terra\'"\n}\n\n* **Input:\nNatural language inference. Use only \'Yes\' (1), \'No\' (0) and \'Null\' (-1) as verdict.\nOutput in only valid JSON format.\n\ncontext: "John is a student at XYZ University. He is pursuing a degree in Computer Science. He is enrolled in several courses this semester, including Data Structures, Algorithms, and Database Management. John is a diligent student and spends a significant amount of time studying and completing assignments. He often stays late in the library to work on his projects."\nstatements: "\\n            statement_1: John is majoring in Biology.\\n            statement_2: John is taking a course on Artificial Intelligence.\\n            statement_3: John is a dedicated student.\\n            statement_4: John has a part-time job.\\n            "\nanswer: [{"statement_1": "John is majoring in Biology.", "reason": ...** 

The bold one is the begging of the prompt template NLI_STATEMENTS_MESSAGE. That looks wrong if the llm should generates a valid json-format string. 

Ragas Version: v.0.1.5
```python
ragas_result_dataset = evaluate(
     dataset = merged_dataset, 
     metrics=[
         #context_precision,
         #context_recall,
         faithfulness,
         # answer_relevancy,
     ],
    llm=eval_llm,
    embeddings=embedding_function
)

ragas_result_df = ragas_result_dataset.to_pandas()
```
`eval_llm` is a `mistralai/Mixtral-8x7B` and the `embeddings_function`-model is `BAAI/bge-large-en-v1.5`. 

How can we fix it?


Hey @vanny132 your error trace is not clear. Can you share 
1. Output from your model for faithfulness prompts 
you can either use callbacks for this or just import and run the prompts with your model with ragas.

Anyway we are aware of JSON error and is working on it. 


#761 

> Hey @vanny132 your error trace is not clear. Can you share
> 
> 1. Output from your model for faithfulness prompts
>    you can either use callbacks for this or just import and run the prompts with your model with ragas.
> 
> Anyway we are aware of JSON error and is working on it.

Which generation output do you want to have? Faithfulness has two genration:

***Line 172***: 
```python
answer_result = await self.llm.generate(
            p, callbacks=callbacks, is_async=is_async
        )
``` 
Result of `answer_result.generations[0][0].text`:

```
Create one or more statements from each sentence in the given answer.
Output in only valid JSON format.

question: "Who was  Albert Einstein and what is he best known for?"
answer: "He was a German-born theoretical physicist, widely acknowledged to be one of the greatest and most influential physicists of all time. He was best known for developing the theory of relativity, he also made important contributions to the development of the theory of quantum mechanics."
statements: {"statements": ["Albert Einstein, a German-born theoretical physicist, is renowned for being one of the most influential physicists in history.", "Albert Einstein was best known for his theory of relativity.", "Einstein's contributions significantly advanced the field of quantum mechanics", "Recognized globally, Einstein's work has profoundly impacted the scientific community", "Einstein's groundbreaking theories continue to shape our understanding of physics today."]}

question: "Cadmium Chloride is slightly soluble in this chemical, it is also called what?"
answer: "alcohol"
statements: {"statements": ["Cadmium Chloride is slightly soluble in alcohol."]}

question: "Were Hitler and Benito Mussolini of the same nationality?"
answer: "Sorry, I can't provide answer to that question."
statements: {"statements": []}

question: Wie hat Bayer Leverkusen am 2023-11-25 der Bundesliga-Hinrunde 2023 gespielt?
answer: 1. FC Union Berlin gewann das Spiel gegen Bayer Leverkusen mit 2:1.
statements: 
{"statements": [
    {
        "statement": "Bayer Leverkusen spielte am 2023-11-25 der Bundesliga-Hinrunde 2023 gegen den 1. FC Union Berlin und verlor mit einem Ergebnis von 2:1.",
        "source": "https://www.bundesliga.com/de/bundesliga/spieltag/2023-24/1/union-berlin-bayer-leverkusen/"
    }
]}

```

**Line 186**:
```python
nli_result = await self.llm.generate(
                p, callbacks=callbacks, is_async=is_async
            )
```
Result of `nli_result.generations[0][0].text`:
```
 Natural language inference. Use only 'Yes' (1), 'No' (0) and 'Null' (-1) as verdict.
Output in only valid JSON format.

context: "John is a student at XYZ University. He is pursuing a degree in Computer Science. He is enrolled in several courses this semester, including Data Structures, Algorithms, and Database Management. John is a diligent student and spends a significant amount of time studying and completing assignments. He often stays late in the library to work on his projects."
statements: "\n            statement_1: John is majoring in Biology.\n            statement_2: John is taking a course on Artificial Intelligence.\n            statement_3: John is a dedicated student.\n            statement_4: John has a part-time job.\n            "
answer: [{"statement_1": "John is majoring in Biology.", "reason": "John's major is explicitly mentioned as Computer Science. There is no information suggesting he is majoring in Biology.", "verdict": "0"}, {"statement_2": "John is taking a course on Artificial Intelligence.", "reason": "The context mentions the courses John is currently enrolled in, and Artificial Intelligence is not mentioned. Therefore, it cannot be deduced that John is taking a course on AI.", "verdict": "0"}, {"statement_3": "John is a dedicated student.", "reason": "The context states that he spends a significant amount of time studying and completing assignments. Additionally, it mentions that he often stays late in the library to work on his projects, which implies dedication.", "verdict": "1"}, {"statement_4": "John has a part-time job.", "reason": "There is no information given in the context about John having a part-time job.", "verdict": "0"}]

context: "Photosynthesis is a process used by plants, algae, and certain bacteria to convert light energy into chemical energy."
statements: "statement_1: Albert Einstein was a genius."
answer: {"statement_1": "Albert Einstein was a genius.", "reason": "The context and statement are unrelated", "verdict": "0"}

context: "Albert Einstein was a German-born theoretical physicist who is widely held to be one of the greatest and most influential scientists of all time."
statements: "statement_1: Nil"
answer: {"statement_1": "Nil", "reason": "The statement is invalid", "verdict": "-1"}

context: 11. dezember startet schalke 04 den ticket - vorverkauf fur die heimspiele der ruckrunde. tickets konnen online, telefonisch oder vor ort im service - center an der geschaftsstelle gekauft werden. wie viele tickets werden pro mitglied verkauft? um wie viel uhr startet der vorverkauf? und konnen auch nicht - mitglieder schalke - tickets kaufen? diese und weitere fragen beantworten wir hier. wo kann ich tickets fur schalke 04 kaufen? schalke verkauft die tickets fur seine heimspiele uber seinen eigenen ticketshop. der verein bietet seinen fans drei verkaufskanale an : im servicecenter auf dem vereinsgelande am ernst - kuzorra - weg, per telefon und im onlineshop. fur den vorverkauf am 11. dezember empfiehlt der verein fans, tickets uber den online - shop zu kaufen. wie kaufe ich tickets fur schalke 04? schalke startet den vorverkauf fur die ruckrunden - heimspiele am montag, 11. dezember um 10 uhr. vereinsmitglieder haben ein vorkaufsrecht. je nach verfugbarkeit wird es einige tage spater einen freien verkauf geben, bei dem auch nicht - mitglieder tickets kaufen konnen. erfahrungsgemaß ist das aber selten der fall. beim ersten vorverkauf der saison 2023 / 24 waren nach wenigen minuten alle spiele ausverkauft. um fur den vorverkauf als mitglied freigeschaltet zu sein, mussen mitglieder ihren mitgliedsbeitrag fur das laufende jahr uberwiesen haben und ein onlinekonto angelegt haben. wer tickets uber den online - shop kaufen mochte, sollte sic
##o ter horst bleibt ein adlertrager. diese vertragsverlangerung gab der drittligist am freitag ( 1. dezember 2023 ) bekannt. fur wie viele jahre der 21 - jahrige verlangerte, wurde vom sc preußen munster nicht kommuniziert. neben 44 einsatzen in den junioren - bundesligen u17 und u19 lief ter horst, der im sommer 2021 den schritt zur u23 ging, insgesamt 52 mal in der oberliga auf. ein stabiles fundament fur sein pflichtspieldebut in seinem ersten profijahr, das er ausgerechnet im dfb - pokalspiel gegen den fc bayern munchen feierte. weil der rechtsfuß uberzeugte, durfte er in der folge auch in der liga ran – und da gelang ihm in seinem ersten spiel gleich einen assist, im zweiten spiel folgte sein erstes tor. seither gehort er zum stammpersonal und stand immer in der startelf. ter horst kommt auf acht drittliga - einsatze unter trainer sascha hildmann. " die geschichte von jano ist uberragend. sich bewusst dafur zu entscheiden, ein zweites standbein aufzubauen und sich wahrenddessen in der u23 auf sehr hohem niveau mit viel spielpraxis weiterzuentwickeln, war goldrichtig und eine entscheidung, hinter der wir als club voll und ganz stehen. nicht jedem gelingt der schritt, bei den profis fuß zu fassen – egal, wie groß das talent ist. umso wichtiger ist es, sich auch beruflich eine perspektive aufzubauen. wenn das in dieser kombination gelingt, ist es eine win - win - situation fur alle ", unterstreicht peter niemeyer, geschaftsfuhrer sport, den besonderen ausbildun
aufgrund der anhaltend schlechten witterungsbedingungen muss unser letztes heimspiel des jahres 2023 gegen den fc gutersloh leider abgesagt werden. bereits erworbene tickets behalten ihre gultigkeit ", heißt es von seiten des sc wiedenbruck. das ostwestfalen - derby war fur samstag, 9. dezember 2023 ( 14 uhr ), angesetzt. nun wird die partie zwischen dem sc wiedenbruck und fc gutersloh im neuen jahr 2024 nachgeholt. wann das der fall sein wird, ist noch offen. zuvor hatte die sport - und spielvereinigung velbert ihr letztes heimspiel gegen rot - weiß oberhausen absagen mussen. " die stadt velbert hatte am letzten donnerstag, den 30. november 2023, daruber informiert, dass die stadtischen sportanlagen, wozu auch die sportplatze des emka sportzentrums, der sportplatz " am berg " und die platze der ims arena gehoren, bis zunachst mindestens letzten sonntag fur die nutzung gesperrt wurden. nachdem gestern die kunstrasenplatze wieder freigegeben wurden, informierte uns heute die verwaltung der stadt velbert daruber, dass die beiden naturrasenplatze in der ims - arena und am emka sportzentrums bis mindestens einschließlich nachsten mittwoch, den 13. dezember 2023 gesperrt bleiben. somit wird unsere begegnung des 19. spieltages gegen rot - weiß oberhausen am kommenden samstag, den 09. dezember 2023 nicht stattfinden ", erklarten die velberter in einer pressemitteilung. wahrend velbert damit in die winterpause geht, steht fur rwo noch das nachholspiel am sam
spiele und 32 punkte : diese zahlen sind fur die verantwortlichen des sc westfalia herne zu wenig. denn die verantwortlichen um den ersten vorsitzenden ingo bruggemann haben eine unpopulare entscheidung getroffen. zumindest unpopular, wenn man nach der punkteausbeute ausgeht. trainer hayrettin celik ist namlich trotz der 32 zahler, platz zwei und nur zwei punkten ruckstand auf den anvisierten 1. tabellenrang, seinen job los. und auch der nachfolger steht fest : christian knappmann ubernimmt wieder am schloss strunkede. das bestatigte benjamin backes, vorstandsmitglied und pressesprecher bei der westfalia, am samstagmorgen gegenuber reviersport. am samstagvormittag ( 25. november 2023 ) wird die westfalia diese personalie offiziell verkunden. fur knappmann, der sich am samstagmorgen noch nicht zu diesem thema außern wollte, ist es die zweite amtszeit in herne. der ex - profi war bereits vom 1. juli 2016 bis zum 4. oktober 2021 beim sc westfalia herne unter vertrag. zuletzt betreute er den tus bovinghausen, schmiss jedoch hin - reviersport berichtete - und war auch bei regionalligist rot weiss ahlen im gesprach. doch fur knappmann fuhren alle wege nach herne zuruck. der 42 - jahrige knappmann, der einst zweimal torschutzenkonig der regionalliga west wurde, erlebte als profi seine beste zeit beim wuppertaler sv. hier war er zwischen 2011 und 2013 aktiv und erzielte im trikot der rot - blauen in 55 begegnungen satte 42 buden! von dezember 2022 bis april 2023 leitete er auch die wsv - geschaftsstell
##de revierklubs werden an den ausschuttungen aus dem financial fairplay 3. liga fur die vergangene saison 2022 / 2023 beteiligt. das gab der dfb am dienstag bekannt. rot - weiss essen erhalt aus seiner aufstiegssaison 21. 025, 53 euro, der msv duisburg kassiert 27. 500 euro. dynamo dresden erhalt die hochste ausschuttung aus dem fordertopf. die sachsen bekommen 78. 998, 50 euro. die gelder fur die saison 2022 / 2023 wurden nach zwei kriterien vergeben : dem positiven saisonergebnis im financial fairplay und der planungsqualitat uber eineinhalb jahre. die gesamtsumme von 550. 000 euro verteilt sich zu jeweils 50 prozent auf diese beiden saulen. vereine, die positive wirtschaftliche ergebnisse erzielen und eine planungssicherheit haben, werden somit belohnt. 14 vereine aus der 3. liga partizipierten der mitteilung zufolge vom insgesamt 550 000 euro umfassenden fordertopf. rot - weiss essen und der hallesche fc ( 19 551, 43 euro ) liegen am ende der rangliste. zweite mannschaften wie im letzten jahr die u23 - teams des bvb und des sc freiburg werden nicht berucksichtigt. fur die aktuelle spielzeit 2023 / 2024 winkt den vereinen der 3. liga mehr geld. der topf beinhaltet kunftig einen grundstock von einer million euro und damit 450. 000 euro mehr als bislang. moglichen strafzahlungen gegen klubs, die ihre auflagen nicht einhalten, kamen noch zusatzlich hinzu. damit wolle der dfb laut mitteilung „ finanzielle anreize zum positiven wirtschaftlichen handeln fur die drittligisten verstarken. “ 3. liga : die ausschuttungen fur die saison
ssvg velbert gastiert am mittwochabend im niederrheinpokal - viertelfinale bei germania ratingen 04 / 19. ebenfalls steht fur rot - weiß oberhausen gegen die sportfreunde hamborn 07 das viertelfinale auf der agenda. beide spiele werden um 19. 30 uhr, reviersport - liveticker ) angepfiffen. eigentlich sollten velbert und oberhausen am kommenden samstag mit dem spiel in der regionalliga dann auch in die winterpause gehen. doch diese beginnt zumindest fur velbert schon nach dem niederrheinpokal. denn die begegnung am samstag gegen rwo wird nicht stattfinden. das teilte die sport - und spielvereinigung velbert am mittwochabend ( 6. dezember 2023 ) offiziell mit. " die stadt velbert hatte am letzten donnerstag, den 30. november 2023, daruber informiert, dass die stadtischen sportanlagen, wozu auch die sportplatze des emka sportzentrums, der sportplatz " am berg " und die platze der ims arena gehoren, bis zunachst mindestens letzten sonntag fur die nutzung gesperrt wurden. nachdem gestern die kunstrasenplatze wieder freigegeben wurden, informierte uns heute die verwaltung der stadt velbert daruber, dass die beiden naturrasenplatze in der ims - arena und am emka sportzentrums bis mindestens einschließlich nachsten mittwoch, den 13. dezember 2023 gesperrt bleiben. somit wird unsere begegnung des 19. spieltages gegen rot - weiß oberhausen am kommenden samstag, den 09. dezember 2023 nicht stattfinden ", erklaren die velberter in einer pressemitteilung. fur rwo steht noch das nachholspiel am sam
statements: statement_1: {'statement': 'Bayer Leverkusen spielte am 2023-11-25 der Bundesliga-Hinrunde 2023 gegen den 1. FC Union Berlin und verlor mit einem Ergebnis von 2:1.', 'source': 'https://www.bundesliga.com/de/bundesliga/spieltag/2023-24/1/union-berlin-bayer-leverkusen/'}
answer: 
    {
        "statement_1": {
            "statement": "Bayer Leverkusen spielte am 2023-11-25 der Bundesliga-Hinrunde 2023 gegen den 1. FC Union Berlin und verlor mit einem Ergebnis von 2:1.",
            "source": "https://www.bundesliga.com/de/bundesliga/spieltag/2023-24/1/union-berlin-bayer-leverkusen/"
        },
        "reason": "Die Quelle gibt an, dass Bayer Leverkusen am 2023-11-25 der Hinrunde der Saison 2023 gegen den 1. FC Union Berlin spielte und mit einem Ergebnis von 2:1 verlor.",
        "verdict": "1"
    }
```