DocUA commited on
Commit
fec53cf
·
1 Parent(s): c98d14c

Add comment for gen LP

Browse files
Files changed (2) hide show
  1. main.py +11 -174
  2. prompts.py +12 -5
main.py CHANGED
@@ -429,7 +429,7 @@ LEGAL_POSITION_SCHEMA = {
429
  }
430
 
431
 
432
- def generate_legal_position(court_decision_text, user_question):
433
  """
434
  Генерує правову позицію на основі тексту судового рішення.
435
 
@@ -447,13 +447,17 @@ def generate_legal_position(court_decision_text, user_question):
447
  temperature=0
448
  )
449
 
 
 
 
 
 
 
 
450
  # Формування повідомлень для чату
451
  messages = [
452
  ChatMessage(role="system", content=SYSTEM_PROMPT),
453
- ChatMessage(
454
- role="user",
455
- content=LEGAL_POSITION_PROMPT.format(court_decision_text=court_decision_text)
456
- ),
457
  ]
458
 
459
  # Отримання відповіді від моделі
@@ -489,179 +493,11 @@ def generate_legal_position(court_decision_text, user_question):
489
  }
490
 
491
 
492
- # def create_gradio_interface():
493
- # with gr.Blocks() as app:
494
- # gr.Markdown("# Аналізатор релевантних Правових Позицій Верховного Суду для нового судового рішення")
495
- #
496
- # with gr.Row():
497
- # url_input = gr.Textbox(label="URL судового рішення:")
498
- # question_input = gr.Textbox(label="Уточнююче питання для аналізу:")
499
- #
500
- # with gr.Row():
501
- # generate_position_button = gr.Button("Генерувати короткий зміст позиції суду")
502
- # search_with_ai_button = gr.Button("Пошук із ШІ", interactive=False)
503
- # # search_without_ai_button = gr.Button("Пошук без ШІ")
504
- # analyze_button = gr.Button("Аналіз", interactive=False)
505
- #
506
- # position_output = gr.Markdown(label="Короткий зміст позиції суду за введеним рішенням")
507
- # search_output = gr.Markdown(label="Результат пошуку")
508
- # analysis_output = gr.Markdown(label="Результат аналізу")
509
- #
510
- # # Два об'єкти стану для зберігання legal_position_json та nodes
511
- # state_lp_json = gr.State()
512
- # state_nodes = gr.State()
513
- #
514
- # async def generate_position_action(url):
515
- # try:
516
- # court_decision_text = extract_court_decision_text(url)
517
- # legal_position_json = generate_legal_position(court_decision_text, "")
518
- # position_output_content = f"**Короткий зміст позиції суду за введеним рішенням:**\n *{legal_position_json['title']}*: \n{legal_position_json['text']} **Категорія:** \n{legal_position_json['category']} ({legal_position_json['proceeding']})\n\n"
519
- # return position_output_content, legal_position_json
520
- # except Exception as e:
521
- # return f"Error during position generation: {str(e)}", None
522
- #
523
- # async def search_with_ai_action(legal_position_json):
524
- # try:
525
- # query_text = legal_position_json["title"] + ': ' + legal_position_json["text"] + ': ' + legal_position_json["proceeding"] + ': ' + legal_position_json["category"]
526
- # nodes = await retriever_bm25.aretrieve(query_text)
527
- #
528
- # sources_output = "\n **Результати пошуку (наявні правові позиції ВСУ):** \n\n"
529
- # for index, node in enumerate(nodes, start=1):
530
- # source_title = node.node.metadata.get('title')
531
- # doc_ids = node.node.metadata.get('doc_id')
532
- # lp_ids = node.node.metadata.get('lp_id')
533
- # links = get_links_html(doc_ids)
534
- # links_lp = get_links_html_lp(lp_ids)
535
- # sources_output += f"\n[{index}] *{source_title}* {links_lp} 👉 Score: {node.score} {links}\n"
536
- #
537
- # return sources_output, nodes
538
- # except Exception as e:
539
- # return f"Error during search: {str(e)}", None
540
- #
541
- # async def search_without_ai_action(url):
542
- # try:
543
- # court_decision_text = extract_court_decision_text(url)
544
- # nodes = await retriever_bm25.aretrieve(court_decision_text)
545
- #
546
- # search_output_content = f"**Результати пошуку (наявні правові позиції ВСУ):** \n\n"
547
- # for index, node in enumerate(nodes, start=1):
548
- # source_title = node.node.metadata.get('title', 'Невідомий заголовок')
549
- # doc_ids = node.node.metadata.get('doc_id')
550
- # links = get_links_html(doc_ids)
551
- # search_output_content += f"\n[{index}] *{source_title}* 👉 Score: {node.score} {links}\n"
552
- #
553
- # return search_output_content, nodes
554
- # except Exception as e:
555
- # return f"Error during search: {str(e)}", None
556
- #
557
- # async def analyze_action(legal_position_json, question, nodes):
558
- # try:
559
- # # Використання з OpenAI
560
- # workflow = PrecedentAnalysisWorkflow(
561
- # provider=ModelProvider.OPENAI,
562
- # model_name=ModelName.GPT4_MINI
563
- # )
564
- #
565
- # # # Використання з Anthropic
566
- # # workflow_anthropic = PrecedentAnalysisWorkflow(
567
- # # provider=ModelProvider.ANTHROPIC,
568
- # # model_name=ModelName.CLAUDE3_SONNET
569
- # # )
570
- #
571
- # # Формуємо єдиний текст запиту з legal_position_json
572
- # query = (
573
- # f"{legal_position_json['title']}: "
574
- # f"{legal_position_json['text']}: "
575
- # f"{legal_position_json['proceeding']}: "
576
- # f"{legal_position_json['category']}"
577
- # )
578
- #
579
- # # Запускаємо workflow і отримуємо текст аналізу
580
- # response_text = await workflow.run(
581
- # query=query,
582
- # question=question,
583
- # nodes=nodes
584
- # )
585
- #
586
- # # Формуємо вивід
587
- # output = f"**Аналіз ШІ:**\n{response_text}\n\n"
588
- # output += "**Наявні в базі Правові Позицій Верховного Суду:**\n\n"
589
- #
590
- # # Розбиваємо текст відповіді на рядки
591
- # analysis_lines = response_text.split('\n')
592
- #
593
- # # Проходимо по кожному рядку аналізу
594
- # for line in analysis_lines:
595
- # if line.startswith('* ['):
596
- # # З кожного рядка отримуємо індекс
597
- # index = line[3:line.index(']')] # Витягуємо індекс з "* [X]"
598
- #
599
- # # Знаходимо відповідний node за індексом
600
- # node = nodes[int(index) - 1]
601
- # source_node = node.node
602
- #
603
- # source_title = source_node.metadata.get('title', 'Невідомий заголовок')
604
- # source_text_lp = node.text
605
- # doc_ids = source_node.metadata.get('doc_id')
606
- # lp_id = source_node.metadata.get('lp_id')
607
- #
608
- # links = get_links_html(doc_ids)
609
- # links_lp = get_links_html_lp(lp_id)
610
- #
611
- # output += f"[{index}]: *{source_title}* | {source_text_lp} | {links_lp} | {links}\n\n"
612
- #
613
- # return output
614
- #
615
- # except Exception as e:
616
- # return f"Error during analysis: {str(e)}"
617
- #
618
- # # Підключаємо функції до кнопок з оновленими входами та виходами
619
- # generate_position_button.click(
620
- # fn=generate_position_action,
621
- # inputs=url_input,
622
- # outputs=[position_output, state_lp_json]
623
- # )
624
- # generate_position_button.click(
625
- # fn=lambda: gr.update(interactive=True),
626
- # inputs=None,
627
- # outputs=search_with_ai_button
628
- # )
629
- #
630
- # search_with_ai_button.click(
631
- # fn=search_with_ai_action,
632
- # inputs=state_lp_json,
633
- # outputs=[search_output, state_nodes]
634
- # )
635
- # search_with_ai_button.click(
636
- # fn=lambda: gr.update(interactive=True),
637
- # inputs=None,
638
- # outputs=analyze_button
639
- # )
640
- #
641
- # # search_without_ai_button.click(
642
- # # fn=search_without_ai_action,
643
- # # inputs=url_input,
644
- # # outputs=[search_output, state_nodes]
645
- # # )
646
- # # search_without_ai_button.click(
647
- # # fn=lambda: gr.update(interactive=True),
648
- # # inputs=None,
649
- # # outputs=analyze_button
650
- # # )
651
- #
652
- # analyze_button.click(
653
- # fn=analyze_action,
654
- # inputs=[state_lp_json, question_input, state_nodes],
655
- # outputs=analysis_output
656
- # )
657
- #
658
- # return app
659
-
660
  def create_gradio_interface():
661
  async def generate_position_action(url):
662
  try:
663
  court_decision_text = extract_court_decision_text(url)
664
- legal_position_json = generate_legal_position(court_decision_text, "")
665
  position_output_content = f"**Короткий зміст позиції суду за введеним рішенням:**\n *{legal_position_json['title']}*: \n{legal_position_json['text']} **Категорія:** \n{legal_position_json['category']} ({legal_position_json['proceeding']})\n\n"
666
  return position_output_content, legal_position_json
667
  except Exception as e:
@@ -741,6 +577,7 @@ def create_gradio_interface():
741
  gr.Markdown("# Аналізатор релевантних Правових Позицій Верховного Суду для нового судового рішення")
742
 
743
  with gr.Row():
 
744
  url_input = gr.Textbox(label="URL судового рішення:")
745
  question_input = gr.Textbox(label="Уточнююче питання для аналізу:")
746
 
 
429
  }
430
 
431
 
432
+ def generate_legal_position(court_decision_text, comment_input):
433
  """
434
  Генерує правову позицію на основі тексту судового рішення.
435
 
 
447
  temperature=0
448
  )
449
 
450
+ # Формування повідомлень для чату
451
+ # Формуємо контент з урахуванням коментаря
452
+ content = LEGAL_POSITION_PROMPT.format(
453
+ court_decision_text=court_decision_text,
454
+ comment=comment_input if comment_input else "Коментар відсутній"
455
+ )
456
+
457
  # Формування повідомлень для чату
458
  messages = [
459
  ChatMessage(role="system", content=SYSTEM_PROMPT),
460
+ ChatMessage(role="user", content=content),
 
 
 
461
  ]
462
 
463
  # Отримання відповіді від моделі
 
493
  }
494
 
495
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
496
  def create_gradio_interface():
497
  async def generate_position_action(url):
498
  try:
499
  court_decision_text = extract_court_decision_text(url)
500
+ legal_position_json = generate_legal_position(court_decision_text, comment_input)
501
  position_output_content = f"**Короткий зміст позиції суду за введеним рішенням:**\n *{legal_position_json['title']}*: \n{legal_position_json['text']} **Категорія:** \n{legal_position_json['category']} ({legal_position_json['proceeding']})\n\n"
502
  return position_output_content, legal_position_json
503
  except Exception as e:
 
577
  gr.Markdown("# Аналізатор релевантних Правових Позицій Верховного Суду для нового судового рішення")
578
 
579
  with gr.Row():
580
+ comment_input = gr.Textbox(label="Коментар до формування короткого змісту судового рішення:")
581
  url_input = gr.Textbox(label="URL судового рішення:")
582
  question_input = gr.Textbox(label="Уточнююче питання для аналізу:")
583
 
prompts.py CHANGED
@@ -12,25 +12,32 @@ LEGAL_POSITION_PROMPT = """Дотримуйся цих інструкцій.
12
  {court_decision_text}
13
  </court_decision>
14
 
15
- 2. Уважно прочитай та проаналізуй текст наданого судового рішення. Зверни увагу на:
 
 
 
 
 
16
  - Юридичну суть рішення
17
  - Основне правове обґрунтування
18
  - Головні юридичні міркування
 
19
 
20
- 3. На основі аналізу сформулюй короткий зміст позиції суду, дотримуючись таких вказівок:
21
  - Будь чіткими, точними та обґрунтованими
22
  - Використовуй відповідну юридичну термінологію
23
  - Зберігай стислість, але повністю передай суть судового рішення
24
  - Уникай додаткових пояснень чи коментарів
25
  - Спробуй узагальнювати та уникати специфічної інформації (наприклад, імен або назв) під час подачі результатів
26
  - Використовуйте лише українську мову
 
27
 
28
- 4. Створи короткий заголовок, який відображає основну суть судового рішення та зазнач його категорію.
29
 
30
- 5. Додатково визнач тип судочинства, до якої відноситься дане рішення.
31
  Використовуй лише один із цих типів: 'Адміністративне судочинство', 'Кримінальне судочинство', 'Цивільне судочинство', 'Господарське судочинство'
32
 
33
- 6. Відформатуй відповідь у форматі JSON:
34
 
35
  {{
36
  "title": "Заголовок судового рішення",
 
12
  {court_decision_text}
13
  </court_decision>
14
 
15
+ 2. Врахуй наступний коментар щодо формування правової позиції:
16
+ <comment>
17
+ {comment}
18
+ </comment>
19
+
20
+ 3. Уважно прочитай та проаналізуй текст наданого судового рішення. Зверни увагу на:
21
  - Юридичну суть рішення
22
  - Основне правове обґрунтування
23
  - Головні юридичні міркування
24
+ - Аспекти, зазначені в коментарі
25
 
26
+ 4. На основі аналізу сформулюй короткий зміст позиції суду, дотримуючись таких вказівок:
27
  - Будь чіткими, точними та обґрунтованими
28
  - Використовуй відповідну юридичну термінологію
29
  - Зберігай стислість, але повністю передай суть судового рішення
30
  - Уникай додаткових пояснень чи коментарів
31
  - Спробуй узагальнювати та уникати специфічної інформації (наприклад, імен або назв) під час подачі результатів
32
  - Використовуйте лише українську мову
33
+ - Врахуй аспекти та зауваження з коментаря при формуванні позиції
34
 
35
+ 5. Створи короткий заголовок, який відображає основну суть судового рішення та зазнач його категорію.
36
 
37
+ 6. Додатково визнач тип судочинства, до якої відноситься дане рішення.
38
  Використовуй лише один із цих типів: 'Адміністративне судочинство', 'Кримінальне судочинство', 'Цивільне судочинство', 'Господарське судочинство'
39
 
40
+ 7. Відформатуй відповідь у форматі JSON:
41
 
42
  {{
43
  "title": "Заголовок судового рішення",