Chat-EUR-Lex / app.py
MattiaSangermano's picture
Updated disclaimer
c5d15b0
raw
history blame
7.07 kB
import gradio as gr
from EurLexChat import EurLexChat
import random
import string
from config import CONFIG, UI_USER, UI_PWD
from consts import JUSTICE_CELEXES, POLLUTION_CELEXES
from enum import Enum
from copy import deepcopy
def generate_random_string(length):
# Generate a random string of the specified length
# using letters and numbers
characters = string.ascii_letters + string.digits
random_string = ''.join(random.choice(characters) for _ in range(length))
return random_string
class ChatBot():
def __init__(self, config) -> None:
self.documents = []
self.config = deepcopy(config)
self.chat = EurLexChat(config=self.config)
def __deepcopy__(self, _):
return ChatBot(self.config)
class Versions(Enum):
AKN='Akoma Ntoso'
JUSTICE='Organisation of the legal system (1226) eurovoc'
POLLUTION='Pollution (2524) eurovoc'
BASIC='All eurovoc'
chat_init = EurLexChat(config=CONFIG)
justice_ids = chat_init.get_ids_from_celexes(JUSTICE_CELEXES)
pollution_ids = chat_init.get_ids_from_celexes(POLLUTION_CELEXES)
def reinit(version, bot):
bot.documents = []
config = deepcopy(CONFIG)
if version == Versions.AKN.value:
config['vectorDB']['kwargs']['collection_name'] += "-akn"
bot.chat = EurLexChat(config=config)
return clean_page(bot)
def remove_doc(btn, bot):
bot.documents.pop(btn)
new_accordions, new_texts = set_new_docs_ui(bot.documents)
return [*new_accordions, *new_texts, bot]
def get_answer(message, history, session_id, bot):
s = session_id
celex_type = Versions.BASIC.value
if celex_type == Versions.JUSTICE.value:
ids_list = justice_ids
elif celex_type == Versions.POLLUTION.value:
ids_list = pollution_ids
elif celex_type == Versions.BASIC.value or celex_type == Versions.AKN.value:
ids_list = None
else:
raise ValueError(f'Wrong celex_type: {celex_type}')
if len(history) == 0:
bot.documents = []
#docs.documents = chat.get_relevant_docs(question=message, ids_list=ids_list)
s = generate_random_string(7)
result = bot.chat.get_answer(s, message, bot.documents, ids_list=ids_list)
history.append((message, result.answer))
if result.new_documents:
bot.documents = result.new_documents
accordions, list_texts = set_new_docs_ui(bot.documents)
return ['', history, gr.Column(scale=1, visible=True), *accordions, *list_texts, s, bot]
def set_new_docs_ui(documents):
new_accordions = []
new_texts = []
for i in range(len(accordions)):
if i < len(documents):
new_accordions.append(gr.update(accordions[i].elem_id, label=f"{documents[i]['celex']}: {documents[i]['text'][:40]}...", visible=True, open=False))
new_texts.append(gr.update(list_texts[i].elem_id, value=f"{documents[i]['text']}...", visible=True))
else:
new_accordions.append(gr.update(accordions[i].elem_id, label="", visible=False))
new_texts.append(gr.update(list_texts[i].elem_id, value="", visible=False))
return new_accordions, new_texts
def clean_page(bot):
bot.documents = []
accordions, list_texts = set_new_docs_ui(bot.documents)
return ["", [], None, *accordions, *list_texts, gr.Column(visible=False), bot]
list_texts = []
accordions = []
states = []
delete_buttons = []
if CONFIG['vectorDB'].get('rerank'):
n_context_docs = CONFIG['vectorDB']['rerank']['kwargs']['top_n']
else:
n_context_docs = CONFIG['vectorDB']['retriever_args']['search_kwargs']['k']
block = gr.Blocks()
with block:
gr.Markdown("""
<h1><center>Chat-EUR-Lex prototype - Beta version</center></h1>
""")
bot = gr.State(value=ChatBot(CONFIG))
state = gr.State(value=None)
with gr.Row():
with gr.Column(scale=3):
# drop_down = gr.Dropdown(label='Choose a version', choices=[attribute.value for attribute in Versions], value=Versions.BASIC)
chatbot = gr.Chatbot()
with gr.Row():
message = gr.Textbox(scale=10,label='',placeholder='Write a message...', container=False)
submit = gr.Button("Send message", scale=1)
clear = gr.Button("Reset chat", scale=1)
with gr.Column(scale=1, visible=False) as col:
gr.Markdown("""<h3><center>Context documents</center></h3>""")
for i in range(n_context_docs):
with gr.Accordion(label="", elem_id=f'accordion_{i}', open=False) as acc:
list_texts.append(gr.Textbox("", elem_id=f'text_{i}', show_label=False, lines=10))
btn = gr.Button(f"Remove document")
delete_buttons.append(btn)
states.append(gr.State(i))
accordions.append(acc)
with gr.Row():
with gr.Column(scale=3):
gr.HTML("""""")
gr.HTML("""<div>
<h3>Disclaimer</h3>
<p><a href="https://github.com/Aptus-AI/chat-eur-lex/">Chat-EUR-Lex prototype</a> is a limited risk AI system realized by <a href="https://www.aptus.ai/">Aptus.AI</a> and the
<a href="https://www.igsg.cnr.it/en/">Institute of Legal Informatics and Judicial Systems (IGSG-CNR)</a>.
The prototype is an AI chatbot, therefore you are interacting with a machine, not with a human person. The prototype uses Aptus.AI RAG system and OpenAI GPT-4o language model. </p>
<p><a href="https://github.com/Aptus-AI/chat-eur-lex/">Chat-EUR-Lex project</a> is funded by the European Union within the framework of the NGI Search project under grant agreement No 101069364.
Views and opinions expressed are however those of the author(s) only and do not necessarily reflect those of the European Union or European Commission.
Contact us: <a href="mailto:chat-eur-lex@igsg.cnr.it">chat-eur-lex@igsg.cnr.it</a>.</p>
</div>""")
# drop_down.change(reinit, inputs=[drop_down, bot], outputs=[message, chatbot, state, *accordions, *list_texts, col])
clear.click(clean_page, inputs=[bot], outputs=[message, chatbot, state, *accordions, *list_texts, col, bot])
# message.submit(get_answer, inputs=[message, chatbot, state, drop_down, bot], outputs=[message, chatbot, col, *accordions, *list_texts, state, bot])
message.submit(get_answer, inputs=[message, chatbot, state, bot], outputs=[message, chatbot, col, *accordions, *list_texts, state, bot])
# submit.click(get_answer, inputs=[message, chatbot, state, drop_down, bot], outputs=[message, chatbot, col, *accordions, *list_texts, state, bot])
submit.click(get_answer, inputs=[message, chatbot, state, bot], outputs=[message, chatbot, col, *accordions, *list_texts, state, bot])
for i, b in enumerate(delete_buttons):
b.click(remove_doc, inputs=[states[i],bot], outputs=[*accordions, *list_texts, bot])
block.launch(debug=True, auth=(UI_USER, UI_PWD))