Skip to content

Commit b74b79d

Browse files
committedAug 24, 2024
Add generators
1 parent ba2a437 commit b74b79d

File tree

6 files changed

+107
-1
lines changed

6 files changed

+107
-1
lines changed
 

‎.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ env
44
output
55
__pycache__
66
.vscode
7-
openai_batches
7+
openai_batches
8+
models

‎src/common/names.py

+5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@
1212

1313
QA_MODEL_NAMES = ["radlab/polish-qa-v2", "timpal0l/mdeberta-v3-base-squad2"]
1414

15+
INST_MODEL_PATHS = [
16+
"../../models/Bielik-7B-Instruct-v0.1-q4",
17+
"../../models/Mistral-7B-Instruct-v0.2-q4",
18+
]
19+
1520
OPENAI_EMBEDDING_MODEL_NAMES = ["text-embedding-3-large"]
1621

1722
QUERY_PREFIX_MAP = {

‎src/generators/generator.py

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from abc import ABC, abstractmethod
2+
from common.passage import Passage
3+
4+
5+
class Generator(ABC):
6+
@abstractmethod
7+
def generate_answer(self, query: str, passages: list[Passage]) -> str:
8+
pass
+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from common.passage import Passage
2+
from generators.generator import Generator
3+
from mlx_lm import load, generate
4+
5+
6+
class InstructionGenerator(Generator):
7+
def __init__(self, model_name: str):
8+
self.model_name = model_name
9+
10+
model, tokenizer = load(model_name)
11+
12+
self.model = model
13+
self.tokenizer = tokenizer
14+
15+
def generate_answer(self, query: str, passages: list[Passage]) -> str:
16+
context = " ".join([passage.context for passage in passages]).replace("\n", " ")
17+
18+
prompt = f"""
19+
[INST]
20+
Wygeneruj krótką odpowiedź na pytanie wyłącznie na podstawie poniższego kontekstu:
21+
{context}
22+
23+
Pytanie: {query}
24+
[/INST]
25+
"""
26+
27+
response = generate(self.model, self.tokenizer, prompt=prompt, max_tokens=200)
28+
29+
stripped_response = (
30+
response.replace("<s>", "")
31+
.replace("</s>", "")
32+
.replace("[INST]", "")
33+
.replace("[/INST]", "")
34+
.strip()
35+
)
36+
37+
return stripped_response
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from common.passage import Passage
2+
from transformers import pipeline
3+
from generators.generator import Generator
4+
5+
6+
class QuestionAnsweringGenerator(Generator):
7+
def __init__(self, model_name: str):
8+
self.model_name = model_name
9+
10+
self.pipeline = pipeline("question-answering", model=model_name)
11+
12+
def generate_answer(self, query: str, passages: list[Passage]) -> str:
13+
context = " ".join([passage.context for passage in passages]).replace("\n", " ")
14+
15+
return self.pipeline(question=query, context=context)["answer"]

‎src/notebooks/00_test.ipynb

+40
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,46 @@
1111
"sys.path.append(\"../\")"
1212
]
1313
},
14+
{
15+
"cell_type": "code",
16+
"execution_count": 2,
17+
"metadata": {},
18+
"outputs": [],
19+
"source": [
20+
"from generators.instruction_generator import InstructionGenerator\n",
21+
"\n",
22+
"generator = InstructionGenerator(\"../../models/Mistral-7B-Instruct-v0.2-q4\")"
23+
]
24+
},
25+
{
26+
"cell_type": "code",
27+
"execution_count": 3,
28+
"metadata": {},
29+
"outputs": [
30+
{
31+
"name": "stdout",
32+
"output_type": "stream",
33+
"text": [
34+
"Model Hunter T.7A był wykorzystywany do szkolenia załóg samolotów w Royal Air Force po przebudowie z dodaniem systemu IFIS.\n"
35+
]
36+
}
37+
],
38+
"source": [
39+
"from common.passage import Passage\n",
40+
"\n",
41+
"\n",
42+
"query = \"W jakim sposób eksploatowano model T.7A?\"\n",
43+
"\n",
44+
"context = \"Z 55 zamówionych Hunterów T.7 45 trafiło do RAF-u, a pozostałych 10 do Royal Navy. Ponadto RAF dostał sześć maszyn przebudowanych z myśliwskich Hunterów F.4. Pięć maszyn zmodyfikowano przez dodanie systemu IFIS (OR946 Integrated Flight Instrumentation System) stosowanego na pokładach samolotów English Electric Lightning i Blackburn Buccaneer. Samoloty te zyskały nowe oznaczenie Hunter T.7A i były wykorzystywane do szkolenia załóg samolotów. Kolejna wersja Huntera oznaczona jako Hunter T.8 została pozbawiona części awioniki, ale wyposażona w hak do lądowania na lotniskowcach. Maszyny te nie były używane na morzu, a jedynie do ćwiczeń lądowania na lądzie. W 1957 opracowano kolejną wersję samolotu napędzaną nowszym i mocniejszym silnikiem Avon serii 200. Większa moc jednostki napędowej pozwoliła na zainstalowanie dwóch działek ADEN, ale tak wyposażona maszyna oznaczona jako Hunter T.66 nigdy nie weszła do służby w brytyjskich siłach zbrojnych. Jedna z maszyn tego typu oznaczona jako Hunter T.12 była testowana z awioniką ówcześnie projektowanego samolotu BAC TSR.2. Po zamknięciu projektu TSR.2 służyła ona w Royal Aircraft Establishment w Farnborough jako samolot testowy, między innymi do prób systemu fly by wire.\t\"\n",
45+
"\n",
46+
"passage = Passage('', '', context, 0, '', '')\n",
47+
"\n",
48+
"\n",
49+
"response = generator.generate_answer(query, [passage])\n",
50+
"\n",
51+
"print(response)"
52+
]
53+
},
1454
{
1555
"cell_type": "code",
1656
"execution_count": 3,

0 commit comments

Comments
 (0)
Please sign in to comment.