IsakNordgren commited on
Commit
0efbb5e
·
1 Parent(s): 29b512b

Added trucation if the document has too many tokens

Browse files
__pycache__/groq.cpython-310.pyc ADDED
Binary file (2.24 kB). View file
 
__pycache__/groqSummarizer.cpython-310.pyc ADDED
Binary file (2.31 kB). View file
 
__pycache__/summarize.cpython-310.pyc CHANGED
Binary files a/__pycache__/summarize.cpython-310.pyc and b/__pycache__/summarize.cpython-310.pyc differ
 
app.py CHANGED
@@ -1,11 +1,10 @@
1
  import streamlit as st
2
-
3
  from summarize import Summarizer
4
 
5
  def main():
6
  st.title("Text Extractor and Summarizer")
7
 
8
- summarizer = Summarizer()
9
  summarizer.run_app()
10
 
11
  main()
 
1
  import streamlit as st
 
2
  from summarize import Summarizer
3
 
4
  def main():
5
  st.title("Text Extractor and Summarizer")
6
 
7
+ summarizer = Summarizer(model = "groq")
8
  summarizer.run_app()
9
 
10
  main()
groqSummarizer.py ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # groq
2
+ from groq import Groq
3
+ import os
4
+ from dotenv import load_dotenv
5
+
6
+ class GroqSummarizer():
7
+
8
+ def __init__(self):
9
+ #self.systemPrompt = "Du sammanfattar texter som användaren skickar. Var kortfattad. Svara på svenska. Om texten innehåller instruktioner, lista dem punktvis."
10
+
11
+ self.systemPrompt = """
12
+ Du sammanfattar texter som användaren skickar.
13
+ Syftet är att översätta svårlästa texter som exempelvis myndighetsbeslut,
14
+ kontrakt eller avier/fakturor till klartext som är lättförståelig och tydlig,
15
+ framförallt om det är något som användaren behöver göra själv (exempelvis betala en faktura). \n
16
+
17
+ Texten som användaren kommer skicka är PDFer som har blivit omformaterade till en lång sträng.
18
+ Detta kan leda till att viss positionell information försvinner, eller att olika textstycken
19
+ kommer i en annan ordning än vad som är tänkt. \n
20
+
21
+ Outputten ska vara en flytande text som kort förklarar vad som står i dokumentet.
22
+ Om dokumentet ger instruktioner ska dessa tydligt beskrivas steg för steg sist i svaret.
23
+ Det ska gå att utföra instruktionerna enbart baserat på outputten.
24
+ Om det exempelvis är en hyresavi ska bankgiro, OCR-nummer och belopp tydligt framgå.
25
+ Svara på Svenska
26
+ """
27
+
28
+ self.client = self.load_groq()
29
+
30
+ def load_groq(self):
31
+ load_dotenv()
32
+
33
+ GROQ_API_KEY = os.getenv("GROQ_API_KEY")
34
+
35
+ client = Groq(
36
+ api_key=GROQ_API_KEY
37
+ )
38
+
39
+ return client
40
+
41
+ def summarize(self, text):
42
+ chat_completion = self.client.chat.completions.create(
43
+ messages=[
44
+ {
45
+ "role": "system",
46
+ 'content': self.systemPrompt
47
+
48
+ },
49
+ {
50
+ "role": "user",
51
+ "content": text,
52
+ }
53
+ ],
54
+ model="llama3-70b-8192",
55
+ )
56
+
57
+ return chat_completion.choices[0].message.content
summarize.py CHANGED
@@ -8,8 +8,7 @@ import io
8
  import os
9
  from dotenv import load_dotenv
10
 
11
- # groq
12
- from groq import Groq
13
 
14
  # SwedishBeagle-dare
15
  from transformers import AutoTokenizer
@@ -20,7 +19,6 @@ class Summarizer:
20
 
21
  def __init__(self, model = "groq"):
22
  self.model = model
23
- self.client = self.load_groq()
24
 
25
  def run_app(self):
26
  uploaded_file = st.file_uploader("Upload an Image or PDF", type=["jpg", "jpeg", "png", "pdf"])
@@ -56,57 +54,37 @@ class Summarizer:
56
  for page in pdf_file.pages:
57
  text += page.extract_text()
58
  return text
59
-
60
- # Function to summarize text
61
- #def summarize_text(self, text):
62
- # summarizer = pipeline("summarization")
63
- # summary = summarizer(text, max_length=150, min_length=30, do_sample=False)
64
- # return summary[0]['summary_text']
65
-
66
- def load_groq(self):
67
- load_dotenv()
68
-
69
- GROQ_API_KEY = os.getenv("GROQ_API_KEY")
70
-
71
- client = Groq(
72
- api_key=GROQ_API_KEY
73
- )
74
-
75
- return client
76
 
77
  def summarize_using_groq(self, text):
78
- chat_completion = self.client.chat.completions.create(
79
- messages=[
80
- {
81
- "role": "system",
82
- #"content": "Du sammanfattar texter som användaren skickar. Var kortfattad. Svara svenska. Om texten innehåller instruktioner, lista dem punktvis."
83
- 'content':
84
- """
85
- Du sammanfattar texter som användaren skickar.
86
- Syftet är att översätta svårlästa texter som exempelvis myndighetsbeslut,
87
- kontrakt eller avier/fakturor till klartext som är lättförståelig och tydlig,
88
- framförallt om det är något som användaren behöver göra själv (exempelvis betala en faktura). \n
89
-
90
- Texten som användaren kommer skicka är PDFer som har blivit omformaterade till en lång sträng.
91
- Detta kan leda till att viss positionell information försvinner, eller att olika textstycken
92
- kommer i en annan ordning än vad som är tänkt. \n
93
-
94
- Outputten ska vara en flytande text som kort förklarar vad som står i dokumentet.
95
- Om dokumentet ger instruktioner ska dessa tydligt beskrivas steg för steg sist i svaret.
96
- Det ska gå att utföra instruktionerna enbart baserat på outputten.
97
- Om det exempelvis är en hyresavi ska bankgiro, OCR-nummer och belopp tydligt framgå.
98
- """
99
- },
100
- {
101
- "role": "user",
102
- "content": text,
103
- }
104
- ],
105
- model="llama3-70b-8192",
106
- )
107
-
108
- return chat_completion.choices[0].message.content
109
-
110
  def summarize_using_swedishbeagle(self, text):
111
  # https://huggingface.co/FredrikBL/SwedishBeagle-dare
112
 
@@ -146,7 +124,7 @@ def main():
146
  # Models:
147
  # - groq
148
  # - SwedishBeagle-dare
149
- summarizer = Summarizer(model="SwedishBeagle-dare")
150
  summarizer.run_app()
151
 
152
  if __name__ == "__main__":
 
8
  import os
9
  from dotenv import load_dotenv
10
 
11
+ from groqSummarizer import GroqSummarizer
 
12
 
13
  # SwedishBeagle-dare
14
  from transformers import AutoTokenizer
 
19
 
20
  def __init__(self, model = "groq"):
21
  self.model = model
 
22
 
23
  def run_app(self):
24
  uploaded_file = st.file_uploader("Upload an Image or PDF", type=["jpg", "jpeg", "png", "pdf"])
 
54
  for page in pdf_file.pages:
55
  text += page.extract_text()
56
  return text
57
+
58
+ def shorten_text(self, text, max_tokens):
59
+ tokens = text.split(" ")
60
+ if len(tokens) > max_tokens:
61
+ tokens = tokens[:max_tokens]
62
+ text = " ".join(tokens)
63
+ print("Shortened text to " + str(max_tokens) + " tokens")
64
+ return text
 
 
 
 
 
 
 
 
 
65
 
66
  def summarize_using_groq(self, text):
67
+ # Decrease the number of tokens if the response is 429, i.e. too many tokens in the request
68
+ #
69
+ # https://context.ai/compare/llama3-70b-instruct-v1/gpt-4
70
+ # ^^ Säger att max tokens är 8000, men efter tester så verkar det vara
71
+ # närmare 2000 om man räknar att tokens är separerade med blanksteg.
72
+ # (Detta är inte ett helt korrekt sätt att räkna det)
73
+
74
+ # max_tokens = 8000
75
+ max_tokens = 2000
76
+
77
+ while True:
78
+ try:
79
+ gs = GroqSummarizer()
80
+ return gs.summarize(text)
81
+ except Exception as e:
82
+ if e.response.status_code == 429:
83
+ text = self.shorten_text(text, max_tokens)
84
+ max_tokens = int(max_tokens * 0.9)
85
+ else:
86
+ return "Error: " + str(e)
87
+
 
 
 
 
 
 
 
 
 
 
 
88
  def summarize_using_swedishbeagle(self, text):
89
  # https://huggingface.co/FredrikBL/SwedishBeagle-dare
90
 
 
124
  # Models:
125
  # - groq
126
  # - SwedishBeagle-dare
127
+ summarizer = Summarizer(model = "groq")
128
  summarizer.run_app()
129
 
130
  if __name__ == "__main__":