muryshev commited on
Commit
c01b75e
·
1 Parent(s): 8097cbc

async fixes

Browse files
Files changed (2) hide show
  1. app.py +2 -2
  2. lib/llm_3_deepinfra.py +41 -42
app.py CHANGED
@@ -56,10 +56,10 @@ def upload_file():
56
 
57
  # Endpoint for uploading PDF and extracting text
58
  @app.route('/analize', methods=['POST'])
59
- def analize():
60
  # Get the text data from the request
61
  text_data = request.json.get('text')
62
- app_info = llm.getApplicationInfo(text_data)
63
  result = {
64
  "application": app_info,
65
  "debug": {}
 
56
 
57
  # Endpoint for uploading PDF and extracting text
58
  @app.route('/analize', methods=['POST'])
59
+ async def analize():
60
  # Get the text data from the request
61
  text_data = request.json.get('text')
62
+ app_info = await llm.getApplicationInfo(text_data)
63
  result = {
64
  "application": app_info,
65
  "debug": {}
lib/llm_3_deepinfra.py CHANGED
@@ -99,7 +99,7 @@ def create_headers():
99
  headers["Authorization"] = os.getenv("DEEPINFRA_API_KEY", None)
100
  return headers
101
 
102
- def create_messages(self, prompt, system_prompt = None):
103
  messages = []
104
 
105
  if system_prompt is not None:
@@ -107,7 +107,7 @@ def create_messages(self, prompt, system_prompt = None):
107
  messages.append({"role": "user", "content": prompt})
108
  return messages
109
 
110
- def create_request(self, prompt, system_prompt = None):
111
  request = {
112
  "stream": False,
113
  "model": os.getenv("DEEPINFRA_MODEL", "meta-llama/Llama-3.3-70B-Instruct-Turbo"),
@@ -129,7 +129,7 @@ async def getResponse(prompt):
129
  }
130
 
131
  async with httpx.AsyncClient() as client:
132
- request = create_request(prompt, system_prompt)
133
  response = await client.post(f"https://api.deepinfra.com/v1/openai/chat/completions", headers=create_headers(), json=request, timeout=httpx.Timeout(connect=5.0, read=60.0, write=180, pool=10))
134
  if response.status_code == 200:
135
  return response.json()["choices"][0]["message"]["content"]
@@ -137,10 +137,10 @@ async def getResponse(prompt):
137
  logging.error(f"Request failed: status code {response.status_code}")
138
  logging.error(response.text)
139
 
140
- def getCategoryFromLLM(prompt, categories) :
141
  category = ''
142
  for j in range(5) :
143
- result = getResponse(prompt)
144
  category = getCategory(result, categories)
145
  if category != '' :
146
  break
@@ -157,13 +157,13 @@ def getAccuracy(answers, trueanswers) :
157
 
158
  return count / len(trueanswers)
159
 
160
- def getAnswers(applications, prefix, categories, answers) :
161
  # print(categories)
162
  output = []
163
  for i in range(len(applications)) :
164
  text = applications[i]
165
  prompt = prefix + text
166
- category, response = getCategoryFromLLM(prompt, categories)
167
 
168
  answer = ''
169
  for j in range(len(categories)) :
@@ -182,7 +182,7 @@ def getAnswers(applications, prefix, categories, answers) :
182
 
183
  return output
184
 
185
- def getSector(application) :
186
 
187
  sectortext = ''
188
  for j in range(len(sectors)) :
@@ -210,14 +210,14 @@ def getSector(application) :
210
  # Список категорий:
211
  # ''' + sectortext + 'Заявление: ' + application + '/INST'
212
 
213
- sector, response = getCategoryFromLLM(prompt, sectors)
214
 
215
  if verbose :
216
  print(i, ':', sector)
217
 
218
  return sector
219
 
220
- def getProduct(application, sector) :
221
  product = ''
222
  # sector = appsectors[i]
223
  if sector != '' :
@@ -235,14 +235,14 @@ def getProduct(application, sector) :
235
  Ты всегда используешь такой формат ответа: "название категории". \n\
236
  Список категорий:\n' + producttext + '\nЗаявление: ' + application
237
 
238
- product, response = getCategoryFromLLM(prompt, subproducts)
239
 
240
  if verbose :
241
  print(product)
242
 
243
  return product
244
 
245
- def getProblem(application, sector, product) :
246
  problem = ''
247
  if sector != '' and product != '':
248
  subpproblems = problems[sector][product]
@@ -259,14 +259,14 @@ def getProblem(application, sector, product) :
259
  Ты всегда используешь такой формат ответа: "название категории". \n\
260
  Список категорий:\n' + problemtext + '\nЗаявление: ' + application
261
 
262
- problem, response = getCategoryFromLLM(prompt, subpproblems)
263
 
264
  if verbose :
265
  print(problem)
266
 
267
  return problem
268
 
269
- def getAuthor(application) :
270
  prefix = '''Ты мой помощник. Ты отвечаешь только на РУССКОМ языке. Ты не отвечаешь на вопросы, не комментируешь,
271
  не выражаешь эмоций, не выражаешь соображений по теме обращения.
272
  Ты извлекаешь информацию из заявления. Ты отвечаешь на МОЙ вопрос:
@@ -277,7 +277,7 @@ def getAuthor(application) :
277
 
278
  prompt = prefix + application
279
  # prompt = prefix + appdata.loc[i, 'Текст обращения обезличенный']
280
- response = getResponse(prompt)
281
  response = response.replace('.', '. ')
282
  name = 'не указан'
283
  if name not in response :
@@ -294,7 +294,7 @@ def getAuthor(application) :
294
 
295
  return name
296
 
297
- def checkContractNumber(application) :
298
  categories = ['да', 'нет']
299
  answers = ['да', 'нет']
300
 
@@ -306,11 +306,11 @@ def checkContractNumber(application) :
306
  Ты не комментируешь, не объясняешь, не выражаешь мысли, вообще ничего больше не говоришь.
307
  Заявление: '''
308
 
309
- ifcontract = getAnswers([application], prefix, categories, answers)
310
 
311
  return ifcontract[0]
312
 
313
- def checkIfIdentified(application) :
314
  сategories = ['нельзя', 'можно']
315
  answers = ['нет', 'да']
316
 
@@ -321,11 +321,11 @@ def checkIfIdentified(application) :
321
  Ты не комментируешь, не объясняешь, не выражаешь мысли, вообще ничего больше не говоришь.
322
  Жалоба: '''
323
 
324
- ifidentified = getAnswers([application], prefix, сategories, answers)
325
 
326
  return ifidentified[0]
327
 
328
- def checkIfPerson(application) :
329
  categories = ['физическое лицо', 'юридическое лицо']
330
  answers = ['Физ.лицо', 'Юр.лицо']
331
 
@@ -338,11 +338,11 @@ def checkIfPerson(application) :
338
  Ты не комментируешь, не обясняешь, не выражаешь мысли, вообще ничего больше не говоришь.
339
  Заявление: '''
340
 
341
- ifperson = getAnswers([application], prefix, categories, answers)
342
 
343
  return ifperson[0]
344
 
345
- def checkIfcomission(application) :
346
  categories = ['не касается', 'касается']
347
  answers = ['нет', 'да']
348
 
@@ -354,11 +354,11 @@ def checkIfcomission(application) :
354
  Ты не комментируешь, не объясняешь, не выражаешь мысли, вообще ничего больше не говоришь.
355
  Заявление: '''
356
 
357
- ifсomission = getAnswers([application], prefix, categories, answers)
358
 
359
  return ifсomission[0]
360
 
361
- def getContractData(application) :
362
  prefix = '''Ты мой помощник. Ты отвечаешь только на РУССКОМ языке. Ты не отвечаешь на вопросы, не комментируешь,
363
  не выражаешь эмоций, не выражаешь соображений по теме обращения.Ты выполняешь только эту задачу:
364
  ты извлекаешь из заявления только *номер ДОГОВОРА* и "дата ДОГОВОРА".
@@ -373,7 +373,7 @@ def getContractData(application) :
373
  Заявление: '''
374
 
375
  prompt = prefix + application
376
- response = getResponse(prompt)
377
  response = response.replace(';', '\n')
378
  response = response.replace('\\\\', '')
379
  l = response.split('\n')
@@ -394,7 +394,7 @@ def getContractData(application) :
394
 
395
  return result
396
 
397
- def getPersons(application) :
398
  # prefix = '''Ты мой помощник. Ты отвечаешь только на РУССКОМ языке. Ты сортируешь заявления клиентов. Ты не отвечаешь на вопросы, не комментируешь,
399
  # не выражаешь эмоций, не выражаешь соображений по теме заявления. Ты извлекаешь ВСЕ персональные данные из заявлений. Ты не анализируешь.
400
  # Ты выполняешь только эту задачу:
@@ -415,7 +415,7 @@ def getPersons(application) :
415
 
416
  prompt = prefix + application
417
  # prompt = prefix + appdata.loc[i, 'Текст обращения обезличенный']
418
- response = getResponse(prompt)
419
  response = response.replace('указаны.', 'указаны')
420
  response = response.replace('.', '. ')
421
  response = response.replace(';', '\n')
@@ -520,7 +520,7 @@ stoplist = ['микрофинансовые организации',
520
  'Страховщик',
521
  'Статьей 185']
522
 
523
- def getCompanies(application) :
524
  prefix = '''Ты мой помощник. Ты отвечаешь только на РУССКОМ языке. Ты извлекаешь информацию из заявления.
525
  Ты не отвечаешь на вопросы, не комментируешь, не выражаешь эмоций, не выражаешь соображений по теме заявления.
526
  Ты выполняешь только эту задачу: ты извлекаешь из заявления только *названия юридических ОРГАНИЗАЦИЙ*.
@@ -538,7 +538,7 @@ def getCompanies(application) :
538
  Заявление: '''
539
 
540
  prompt = prefix + application
541
- response = getResponse(prompt)
542
  l = response.split('Организация: ')
543
  ll = []
544
  for i in range(len(l)) :
@@ -575,19 +575,19 @@ def getCompanies(application) :
575
 
576
  return result
577
 
578
- def getApplicationInfo(application) :
579
- author = getAuthor(application)
580
- persons = getPersons(application)
581
- companies = getCompanies(application)
582
- contractdata = getContractData(application)
583
- sector = getSector(application)
584
- product = getProduct(application, sector)
585
- problem = getProblem(application, sector, product)
586
 
587
- ifcontract = checkContractNumber(application)
588
- ifidentified = checkIfIdentified(application)
589
- ifperson = checkIfPerson(application)
590
- ifcomission = checkIfcomission(application)
591
 
592
  app_info = {}
593
  app_info['Заявитель'] = author
@@ -618,7 +618,6 @@ def getApplicationInfo(application) :
618
  print('Проблема', problem)
619
 
620
  return app_info
621
-
622
  # application = '''Я, Кристенгоф Оксана Михайловна, заключила кредитный договор с ПАО Камабанк № 59875 и № 456835645645654
623
  # и договор на выдачу кредитной карты с ПАО "БСТ-Банк" №4567652124534235 и №4561254153412.
624
  # 12.08.2020 года направила в банки заявление на истребование кредитной документации заказным письмом с уведомлением,
 
99
  headers["Authorization"] = os.getenv("DEEPINFRA_API_KEY", None)
100
  return headers
101
 
102
+ def create_messages(prompt, system_prompt = None):
103
  messages = []
104
 
105
  if system_prompt is not None:
 
107
  messages.append({"role": "user", "content": prompt})
108
  return messages
109
 
110
+ def create_request(prompt, system_prompt = None):
111
  request = {
112
  "stream": False,
113
  "model": os.getenv("DEEPINFRA_MODEL", "meta-llama/Llama-3.3-70B-Instruct-Turbo"),
 
129
  }
130
 
131
  async with httpx.AsyncClient() as client:
132
+ request = create_request(None, prompt, system_prompt=None)
133
  response = await client.post(f"https://api.deepinfra.com/v1/openai/chat/completions", headers=create_headers(), json=request, timeout=httpx.Timeout(connect=5.0, read=60.0, write=180, pool=10))
134
  if response.status_code == 200:
135
  return response.json()["choices"][0]["message"]["content"]
 
137
  logging.error(f"Request failed: status code {response.status_code}")
138
  logging.error(response.text)
139
 
140
+ async def getCategoryFromLLM(prompt, categories) :
141
  category = ''
142
  for j in range(5) :
143
+ result = await getResponse(prompt)
144
  category = getCategory(result, categories)
145
  if category != '' :
146
  break
 
157
 
158
  return count / len(trueanswers)
159
 
160
+ async def getAnswers(applications, prefix, categories, answers) :
161
  # print(categories)
162
  output = []
163
  for i in range(len(applications)) :
164
  text = applications[i]
165
  prompt = prefix + text
166
+ category, response = await getCategoryFromLLM(prompt, categories)
167
 
168
  answer = ''
169
  for j in range(len(categories)) :
 
182
 
183
  return output
184
 
185
+ async def getSector(application) :
186
 
187
  sectortext = ''
188
  for j in range(len(sectors)) :
 
210
  # Список категорий:
211
  # ''' + sectortext + 'Заявление: ' + application + '/INST'
212
 
213
+ sector, response = await getCategoryFromLLM(prompt, sectors)
214
 
215
  if verbose :
216
  print(i, ':', sector)
217
 
218
  return sector
219
 
220
+ async def getProduct(application, sector) :
221
  product = ''
222
  # sector = appsectors[i]
223
  if sector != '' :
 
235
  Ты всегда используешь такой формат ответа: "название категории". \n\
236
  Список категорий:\n' + producttext + '\nЗаявление: ' + application
237
 
238
+ product, response = await getCategoryFromLLM(prompt, subproducts)
239
 
240
  if verbose :
241
  print(product)
242
 
243
  return product
244
 
245
+ async def getProblem(application, sector, product) :
246
  problem = ''
247
  if sector != '' and product != '':
248
  subpproblems = problems[sector][product]
 
259
  Ты всегда используешь такой формат ответа: "название категории". \n\
260
  Список категорий:\n' + problemtext + '\nЗаявление: ' + application
261
 
262
+ problem, response = await getCategoryFromLLM(prompt, subpproblems)
263
 
264
  if verbose :
265
  print(problem)
266
 
267
  return problem
268
 
269
+ async def getAuthor(application) :
270
  prefix = '''Ты мой помощник. Ты отвечаешь только на РУССКОМ языке. Ты не отвечаешь на вопросы, не комментируешь,
271
  не выражаешь эмоций, не выражаешь соображений по теме обращения.
272
  Ты извлекаешь информацию из заявления. Ты отвечаешь на МОЙ вопрос:
 
277
 
278
  prompt = prefix + application
279
  # prompt = prefix + appdata.loc[i, 'Текст обращения обезличенный']
280
+ response = await getResponse(prompt)
281
  response = response.replace('.', '. ')
282
  name = 'не указан'
283
  if name not in response :
 
294
 
295
  return name
296
 
297
+ async def checkContractNumber(application) :
298
  categories = ['да', 'нет']
299
  answers = ['да', 'нет']
300
 
 
306
  Ты не комментируешь, не объясняешь, не выражаешь мысли, вообще ничего больше не говоришь.
307
  Заявление: '''
308
 
309
+ ifcontract = await getAnswers([application], prefix, categories, answers)
310
 
311
  return ifcontract[0]
312
 
313
+ async def checkIfIdentified(application) :
314
  сategories = ['нельзя', 'можно']
315
  answers = ['нет', 'да']
316
 
 
321
  Ты не комментируешь, не объясняешь, не выражаешь мысли, вообще ничего больше не говоришь.
322
  Жалоба: '''
323
 
324
+ ifidentified = await getAnswers([application], prefix, сategories, answers)
325
 
326
  return ifidentified[0]
327
 
328
+ async def checkIfPerson(application) :
329
  categories = ['физическое лицо', 'юридическое лицо']
330
  answers = ['Физ.лицо', 'Юр.лицо']
331
 
 
338
  Ты не комментируешь, не обясняешь, не выражаешь мысли, вообще ничего больше не говоришь.
339
  Заявление: '''
340
 
341
+ ifperson = await getAnswers([application], prefix, categories, answers)
342
 
343
  return ifperson[0]
344
 
345
+ async def checkIfcomission(application) :
346
  categories = ['не касается', 'касается']
347
  answers = ['нет', 'да']
348
 
 
354
  Ты не комментируешь, не объясняешь, не выражаешь мысли, вообще ничего больше не говоришь.
355
  Заявление: '''
356
 
357
+ ifсomission = await getAnswers([application], prefix, categories, answers)
358
 
359
  return ifсomission[0]
360
 
361
+ async def getContractData(application) :
362
  prefix = '''Ты мой помощник. Ты отвечаешь только на РУССКОМ языке. Ты не отвечаешь на вопросы, не комментируешь,
363
  не выражаешь эмоций, не выражаешь соображений по теме обращения.Ты выполняешь только эту задачу:
364
  ты извлекаешь из заявления только *номер ДОГОВОРА* и "дата ДОГОВОРА".
 
373
  Заявление: '''
374
 
375
  prompt = prefix + application
376
+ response = await getResponse(prompt)
377
  response = response.replace(';', '\n')
378
  response = response.replace('\\\\', '')
379
  l = response.split('\n')
 
394
 
395
  return result
396
 
397
+ async def getPersons(application) :
398
  # prefix = '''Ты мой помощник. Ты отвечаешь только на РУССКОМ языке. Ты сортируешь заявления клиентов. Ты не отвечаешь на вопросы, не комментируешь,
399
  # не выражаешь эмоций, не выражаешь соображений по теме заявления. Ты извлекаешь ВСЕ персональные данные из заявлений. Ты не анализируешь.
400
  # Ты выполняешь только эту задачу:
 
415
 
416
  prompt = prefix + application
417
  # prompt = prefix + appdata.loc[i, 'Текст обращения обезличенный']
418
+ response = await getResponse(prompt)
419
  response = response.replace('указаны.', 'указаны')
420
  response = response.replace('.', '. ')
421
  response = response.replace(';', '\n')
 
520
  'Страховщик',
521
  'Статьей 185']
522
 
523
+ async def getCompanies(application) :
524
  prefix = '''Ты мой помощник. Ты отвечаешь только на РУССКОМ языке. Ты извлекаешь информацию из заявления.
525
  Ты не отвечаешь на вопросы, не комментируешь, не выражаешь эмоций, не выражаешь соображений по теме заявления.
526
  Ты выполняешь только эту задачу: ты извлекаешь из заявления только *названия юридических ОРГАНИЗАЦИЙ*.
 
538
  Заявление: '''
539
 
540
  prompt = prefix + application
541
+ response = await getResponse(prompt)
542
  l = response.split('Организация: ')
543
  ll = []
544
  for i in range(len(l)) :
 
575
 
576
  return result
577
 
578
+ async def getApplicationInfo(application) :
579
+ author = await getAuthor(application)
580
+ persons = await getPersons(application)
581
+ companies = await getCompanies(application)
582
+ contractdata = await getContractData(application)
583
+ sector = await getSector(application)
584
+ product = await getProduct(application, sector)
585
+ problem = await getProblem(application, sector, product)
586
 
587
+ ifcontract = await checkContractNumber(application)
588
+ ifidentified = await checkIfIdentified(application)
589
+ ifperson = await checkIfPerson(application)
590
+ ifcomission = await checkIfcomission(application)
591
 
592
  app_info = {}
593
  app_info['Заявитель'] = author
 
618
  print('Проблема', problem)
619
 
620
  return app_info
 
621
  # application = '''Я, Кристенгоф Оксана Михайловна, заключила кредитный договор с ПАО Камабанк № 59875 и № 456835645645654
622
  # и договор на выдачу кредитной карты с ПАО "БСТ-Банк" №4567652124534235 и №4561254153412.
623
  # 12.08.2020 года направила в банки заявление на истребование кредитной документации заказным письмом с уведомлением,