async fixes
Browse files- app.py +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(
|
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(
|
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 года направила в банки заявление на истребование кредитной документации заказным письмом с уведомлением,
|