perbon commited on
Commit
5d20be3
·
verified ·
1 Parent(s): 2fe95da

Upload generator_llm_pinecone.py

Browse files
Files changed (1) hide show
  1. generator_llm_pinecone.py +220 -0
generator_llm_pinecone.py ADDED
@@ -0,0 +1,220 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
3
+ from transformers import StoppingCriteriaList, StoppingCriteria
4
+ import warnings
5
+ from ragas import evaluate
6
+ from datasets import Dataset
7
+ from ragas.metrics import (
8
+ faithfulness,
9
+ answer_relevancy,
10
+ context_recall,
11
+ context_precision,
12
+ )
13
+ import os
14
+ import pandas as pd
15
+ from sentence_transformers import SentenceTransformer
16
+ from pinecone import Pinecone
17
+ import warnings
18
+
19
+ warnings.filterwarnings("ignore", category=UserWarning)
20
+
21
+ # Initialize Variables
22
+ # model_name = "AI-Sweden-Models/gpt-sw3-126m-instruct"
23
+ model_name = "AI-Sweden-Models/gpt-sw3-1.3b-instruct"
24
+ # model_name = "AI-Sweden-Models/gpt-sw3-6.7b-v2-instruct"
25
+
26
+
27
+ with open("language_model\pinecone\key.txt", "r") as f:
28
+ os.environ["OPENAI_API_KEY"] = f.read().strip()
29
+
30
+ device = "cuda:0" if torch.cuda.is_available() else "cpu"
31
+
32
+ # Initialize Tokenizer & Model
33
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
34
+ model = AutoModelForCausalLM.from_pretrained(model_name)
35
+ model.eval()
36
+ model.to(device)
37
+
38
+ document_encoder_model = SentenceTransformer("KBLab/sentence-bert-swedish-cased")
39
+
40
+
41
+ def read_file(file_path: str) -> str:
42
+ """Read the contents of a file."""
43
+ with open(file_path, "r") as file:
44
+ return file.read()
45
+
46
+
47
+ # Note: 'index1' has been pre-created in the pinecone console
48
+ # read the pinecone api key from a file
49
+ pinecone_api_key = read_file("language_model\pinecone\pincecone_api_key.txt")
50
+ pc = Pinecone(api_key=pinecone_api_key)
51
+ index = pc.Index("index1")
52
+
53
+
54
+ questions = [
55
+ "Har ett barn rätt att få veta ifall det tillkommit genom insemination eller befruktning utanför kroppen som har utförts med andra könsceller än föräldrarnas egna?",
56
+ "Vem ska anses vara förälder till barnet om modern är gift med en kvinna?",
57
+ "Hur går det till ifall en man vill avsäga sig faderskapet till ett barn som han fått på grund av att han var gift med kvinnan som födde barnet?",
58
+ "Vem får adoptera i Sverige?",
59
+ "Får ett gift par adoptera på egen hand?",
60
+ "Får man adoptera ett barn som fyllt 12 år utan barnets samtycke?",
61
+ "Måste man försörja sina barn livet ut?",
62
+ "Om en TV-reparatör har sönder min Tv-apparat, blir denna då ersättningsskyldig för detta?",
63
+ "Vem äger rätten till ett fotografi?",
64
+ "Hur mycket lagstadgat semester har man i Sverige?",
65
+ "Min dotter är över 19 år och hon går i gymnasieskolan. Jag är förälder men inte vårdnadshavare för henne. Hon bor inte hos mig utan hos sin mamma. Är jag fortfarande underhållsskyldig?",
66
+ "Min son är adopterad och har börjat undra varför han inte är lik sina syskon, borde jag förklara för honom att han är adopterad? När och hur borde jag göra det?",
67
+ "Min före detta man som efter vår skilsmässa inte längre har vårdnanden för våra barn kräver att jag ska betala för resorna bär barnen besöker honom. Kan detta verkligen stämma? Det handlar inte om kostnaden från min sida, utan att det känns som han gör allt för att bråka med mig och pallar inte vika mig hela tiden för honom!",
68
+ "Mina barn är så irriterande, får jag lov att slå dem som straff?",
69
+ "Om jag vill göra en rymdresa med mina barn till månen, måste jag då be om min mans tillåtelse?",
70
+ ]
71
+
72
+ ground_truths = [
73
+ "Ja. Ett barn som har tillkommit genom en sådan insemination eller befruktning utanför kroppen som har utförts med andra könsceller än föräldrarnas egna har rätt att av sina föräldrar få veta det. Föräldrarna ska så snart det är lämpligt upplysa barnet om att han eller hon har tillkommit genom en sådan behandling.",
74
+ "Om modern är gift med en kvinna eller är registrerad partner vid barnets födelse, ska hennes make eller registrerade partner anses som barnets förälder.",
75
+ "Vill en man som på grund av äktenskap ska anses som far till ett barn att rätten ska förklara att han inte är far till barnet, ska han väcka talan om detta mot barnet eller, om barnet har avlidit, barnets arvingar.",
76
+ "Den som har fyllt 18 år får adoptera.",
77
+ "Nej, makar och sambor får endast adoptera gemensamt.",
78
+ "Nej, den som har fyllt 12 år får adopteras endast om han eller hon samtycker till adoptionen.",
79
+ "Nej, underhållsskyldigheten upphör när barnet fyller arton år. Går barnet i skolan efter denna tidpunkt, är föräldrarna underhållsskyldiga under den tid som skolgången pågår, dock längst intill dess barnet fyller tjugoett år. Till skolgång räknas studier i grundskolan eller gymnasieskolan och annan jämförlig grundutbildning.",
80
+ "Jag har ingen information om detta.",
81
+ "Den som har skapat ett litterärt eller konstnärligt verk har upphovsrätt till verket, exempel på verk är fotografiskt verk eller något annat alster av bildkonst.",
82
+ "Enligt semesterlagen har alla anställda rätt till 25 dagars semester under ett år.",
83
+ "Ja, du är underhållsskyldig. Eftersom en förälder skall fullgöra sin underhållsskyldighet genom att betala underhållsbidrag till barnet även om föräldern inte har vårdnaden om barnet och inte heller varaktigt bor tillsammans med barnet. Därtill, är en förälder underhållsskyldig även efter arton år fyllda om barnet i skolan ( studier i grundskolan eller gymnasieskolan och annan jämförlig grundutbildning) efter denna tidpunkt, dock längst intill dess barnet fyller tjugoett år.",
84
+ "Ett barn som är adopterat har rätt att av sina föräldrar få veta det. Föräldrarna ska så snart det är lämpligt upplysa barnet om att han eller hon är adopterad.",
85
+ "Ja, det stämmer. Om barnet bor tillsammans med endast en förälder, skall den föräldern ta del i kostnaderna för de resor som föranleds av barnets behov av umgänge med den andra föräldern. Det skall ske efter vad som är skäligt med hänsyn till föräldrarnas ekonomiska förmåga och övriga omständigheter.",
86
+ "Nej, barnaga har varit förbjudet i Sverige sen 1979.",
87
+ "Ja, enligt lagen måste båda föräldrarna vara överrens innan rymdresor med barnen görs.",
88
+ ]
89
+
90
+
91
+ def query_pincecone_namespace(
92
+ vector_databse_index: Pinecone, q_embedding: str, namespace: str
93
+ ) -> str:
94
+ result = vector_databse_index.query(
95
+ namespace=namespace,
96
+ vector=q_embedding.tolist(),
97
+ top_k=1,
98
+ include_values=True,
99
+ include_metadata=True,
100
+ )
101
+ results = []
102
+ for match in result.matches:
103
+ results.append(match.metadata["paragraph"])
104
+ return results[0]
105
+
106
+
107
+ def generate_prompt(prompt: str) -> str:
108
+ """Generates a prompt for the GPT-3 model"""
109
+ start_token = "<|endoftext|><s>"
110
+ end_token = "<s>"
111
+ return f"{start_token}\nUser:\n{prompt}\n{end_token}\nBot:\n".strip()
112
+
113
+
114
+ def encode_query(query: str) -> torch.Tensor:
115
+ """Encode the query using the model's tokenizer"""
116
+ return document_encoder_model.encode(query)
117
+
118
+
119
+ class StopOnTokenCriteria(StoppingCriteria):
120
+ def __init__(self, stop_token_id):
121
+ self.stop_token_id = stop_token_id
122
+
123
+ def __call__(self, input_ids, scores, **kwargs):
124
+ return input_ids[0, -1] == self.stop_token_id
125
+
126
+
127
+ stop_on_token_criteria = StopOnTokenCriteria(stop_token_id=tokenizer.bos_token_id)
128
+ answers = []
129
+ contexts = []
130
+
131
+
132
+ # på ett sakligt, kortfattat och formellt vis. Svara
133
+ def run_rag_system(with_rag=True):
134
+ for question in questions:
135
+ if with_rag:
136
+ query = query_pincecone_namespace(
137
+ vector_databse_index=index,
138
+ q_embedding=encode_query(query=question),
139
+ namespace="ns-parent-balk",
140
+ )
141
+ prompt = (
142
+ "Besvara följande fråga med max tre meningar och använd och referera till den kontext med lagar du fått nedan: \n"
143
+ + "Fråga: \n"
144
+ + question
145
+ + "\n"
146
+ + "Kontext: \n"
147
+ + query
148
+ )
149
+ else:
150
+ prompt = (
151
+ "Besvara följande fråga med max tre meningar. \n"
152
+ + "Fråga: \n"
153
+ + question
154
+ )
155
+
156
+ prompt = generate_prompt(prompt=prompt)
157
+ print(prompt)
158
+ print("-" * 50)
159
+
160
+ # # Convert prompt to tokens
161
+ input_ids = tokenizer(prompt, return_tensors="pt")["input_ids"].to(device)
162
+
163
+ # Genqerate tokens based om prompt
164
+ generated_token_ids = model.generate(
165
+ inputs=input_ids,
166
+ max_new_tokens=200,
167
+ do_sample=False,
168
+ temperature=0.3,
169
+ top_p=1,
170
+ stopping_criteria=StoppingCriteriaList([stop_on_token_criteria]),
171
+ )[0]
172
+
173
+ # Decode the generated tokens
174
+ print("Generated answer: ")
175
+ print("#" * 50)
176
+ generated_text = tokenizer.decode(generated_token_ids[len(input_ids[0]) : -1])
177
+
178
+ if with_rag:
179
+ contexts.append([query.strip()])
180
+ answers.append(generated_text.strip())
181
+ print(generated_text)
182
+
183
+
184
+ run_rag_system(with_rag=True)
185
+ data = {
186
+ "question": questions,
187
+ "answer": answers,
188
+ "contexts": contexts,
189
+ "ground_truth": ground_truths,
190
+ }
191
+
192
+ # Convert dict to dataset
193
+ dataset = Dataset.from_dict(data)
194
+
195
+ result = evaluate(
196
+ dataset=dataset,
197
+ metrics=[
198
+ context_precision,
199
+ context_recall,
200
+ faithfulness,
201
+ answer_relevancy,
202
+ ],
203
+ )
204
+
205
+ df = result.to_pandas()
206
+ print(df)
207
+ df.to_csv("ragas_results_two_documents.csv")
208
+ print("Results saved to ragas_results_two_documents.csv")
209
+
210
+ answers = []
211
+ run_rag_system(with_rag=False)
212
+ data = {
213
+ "question": questions,
214
+ "answer": answers,
215
+ "ground_truth": ground_truths,
216
+ }
217
+
218
+ # create data frama from dict data
219
+ df = pd.DataFrame(data)
220
+ df.to_csv("gpt_results_no_rag.csv")