eRAG-PDPA-v1 / app.py
amornpan's picture
Update app.py
9e188d0 verified
raw
history blame
11.2 kB
import streamlit as st
import requests
import base64
import os
import re
st.title("AI สนับสนุนความรู้ด้านกฏหมาย PDPA")
# st.markdown("""
# <h2 style="font-size:50px;">🤖</h2>
# <p> AI อัจฉริยะเพื่อการเรียนรู้พระราชบัญญัติคุ้มครองข้อมูลส่วนบุคคล (PDPA) ได้รับการออกแบบมาเพื่อช่วยให้ผู้ใช้งานเข้าถึงข้อมูลสำคัญได้อย่างรวดเร็วและเข้าใจง่าย โดยระบบสามารถค้นหาและวิเคราะห์ความหมายในเชิงบริบทได้อย่างลึกซึ้ง ทำให้สามารถเข้าใจความเชื่อมโยงและความหมายของข้อมูลได้อย่างแม่นยำ รองรับการเรียนรู้เชิงลึกในประเด็นเกี่ยวกับ PDPA และการคุ้มครองข้อมูลส่วนบุคคลได้อย่างมีประสิทธิภาพ</p>
# <p><i>Powered by NT Lahnmah</i></p>
# """, unsafe_allow_html=True)
st.write("### 🤖 AI อัจฉริยะเพื่อการเรียนรู้พระราชบัญญัติคุ้มครองข้อมูลส่วนบุคคล (PDPA) ได้รับการออกแบบมาเพื่อช่วยให้ผู้ใช้งานเข้าถึงข้อมูลสำคัญได้อย่างรวดเร็วและเข้าใจง่าย โดยระบบสามารถค้นหาและวิเคราะห์ความหมายในเชิงบริบทได้อย่างลึกซึ้ง ทำให้สามารถเข้าใจความเชื่อมโยงและความหมายของข้อมูลได้อย่างแม่นยำ รองรับการเรียนรู้เชิงลึกในประเด็นเกี่ยวกับ PDPA และการคุ้มครองข้อมูลส่วนบุคคลได้อย่างมีประสิทธิภาพ [Powered by NT Lahnmah]")
# st.subheader("🏷️ Tags")
# st.markdown("""
# - LLM&nbsp;&nbsp;&nbsp;RAG&nbsp;&nbsp;&nbsp;eRAG&nbsp;&nbsp;&nbsp;PDPA&nbsp;&nbsp;&nbsp;Machine Learning&nbsp;&nbsp;&nbsp;AI&nbsp;&nbsp;&nbsp;Data Privacy&nbsp;&nbsp;&nbsp;GenAI&nbsp;&nbsp;&nbsp;NT GenAI&nbsp;&nbsp;&nbsp;ntgenai&nbsp;&nbsp;&nbsp;lahnmah&nbsp;&nbsp;&nbsp;NT Thai GPT&nbsp;&nbsp;&nbsp;ntthaigpt&nbsp;&nbsp;&nbsp;medical&nbsp;&nbsp;&nbsp;medtech&nbsp;&nbsp;&nbsp;HealthGPT&nbsp;&nbsp;&nbsp;หลานม่า&nbsp;&nbsp;&nbsp;NT Academy
# """, unsafe_allow_html=True)
system_prompt = "คุณเป็นผู้ช่วยที่มีความรู้ด้านกฎหมาย พระราชบัญญัติคุ้มครองข้อมูลส่วนบุคคล (PDPA) และสามารถให้คำตอบที่เกี่ยวข้องเฉพาะตาม context ที่ได้รับ"
def clean_text_for_search(text):
return ' '.join(re.sub(r'P-\d+\s*$', '', text, flags=re.MULTILINE).split())
def create_highlighted_pdf(pdf_path, search_text, page_number):
try:
search_text = clean_text_for_search(search_text)
doc = fitz.open(pdf_path)
page = doc[int(page_number) - 1]
words = [word for word in search_text.split() if word]
for word in words:
if len(word) > 3:
text_instances = page.search_for(word)
for inst in text_instances:
highlight = page.add_highlight_annot(inst)
highlight.set_colors(stroke=(1, 1, 0))
highlight.update()
new_doc = fitz.open()
new_doc.insert_pdf(doc, from_page=int(page_number) - 1, to_page=int(page_number) - 1)
pdf_bytes = new_doc.write()
doc.close()
new_doc.close()
return pdf_bytes
except Exception as e:
st.error(f"Error in create_highlighted_pdf: {str(e)}")
return None
def format_file_size(size_in_bytes):
for unit in ['B', 'KB', 'MB', 'GB']:
if size_in_bytes < 1024:
return f"{size_in_bytes:.2f} {unit}"
size_in_bytes /= 1024
return f"{size_in_bytes:.2f} GB"
def display_search_result(result, index):
with st.expander(f"🔍 Search Result #{index + 1} (Score: {result['score']:.4f})"):
st.markdown("#### 📄 Document Information")
col1, col2 = st.columns(2)
with col1:
st.markdown("**File Details:**")
st.write(f"• File Name: {result['metadata']['file_name']}")
st.write(f"• Page: {result['metadata']['page_label']}")
st.write(f"• Type: {result['metadata']['file_type']}")
st.write(f"• Size: {format_file_size(result['metadata']['file_size'])}")
with col2:
st.markdown("**Dates:**")
st.write(f"• Created: {result['metadata']['creation_date']}")
st.write(f"• Modified: {result['metadata']['last_modified_date']}")
st.markdown("#### 📝 Content")
#st.markdown(f"```\n{result['text']}\n```")
st.markdown("""
<div style="background-color:#d3f9d8; padding: 10px;">
<h4>📝 Content</h4>
<pre>{}</pre>
</div>
""".format(result['text']), unsafe_allow_html=True)
try:
pdf_path = result['file_path']
if os.path.exists(pdf_path):
st.markdown("#### 📄 PDF Preview (with highlighted text)")
highlighted_pdf = create_highlighted_pdf(
pdf_path,
result['text'],
result['metadata']['page_label']
)
if highlighted_pdf:
base64_pdf = base64.b64encode(highlighted_pdf).decode('utf-8')
pdf_display = f'''
<iframe
src="data:application/pdf;base64,{base64_pdf}"
width="100%"
height="800px"
type="application/pdf"
style="border: 1px solid #ccc; border-radius: 5px;"
></iframe>
'''
st.markdown(pdf_display, unsafe_allow_html=True)
else:
st.error("Failed to create highlighted PDF")
except Exception as e:
st.error(f"Error displaying PDF: {str(e)}")
st.markdown("""
<style>
.stTextInput>div>div>input {
background-color: #d3f9d8; /* สีเขียวอ่อน */
color: black; /* สีข้อความเป็นสีดำ */
cursor: text; /* เคอร์เซอร์เป็นรูปเส้น */
caret-color: black; /* เปลี่ยนสีเคอร์เซอร์ให้เป็นสีดำ */
}
/* ปรับสีเคอร์เซอร์ให้เป็นสีดำเมื่อมีการคลิก (focus) */
.stTextInput>div>div>input:focus {
border-color: black; /* ขอบสีดำ */
outline-color: black; /* เส้นขอบสีดำ */
}
</style>
""", unsafe_allow_html=True)
# ฟอร์มสำหรับกรอกข้อมูล
with st.form(key="input_form"):
user_input = st.text_input("ป้อนคำ ข้อความ หรือประโยคที่ต้องการค้นหา:", value="ข้อมูลส่วนบุคคล คืออะไร มีกี่ประเภท", key="input")
submit_button = st.form_submit_button("Send")
# แสดงผลเมื่อปุ่ม 'Send' ถูกคลิก
if submit_button:
st.write(f"คุณป้อนข้อความ: {user_input}")
if submit_button and user_input:
try:
response = requests.post("http://113.53.253.50:8002/search", json={"query": user_input})
response.raise_for_status()
data = response.json()
search_results = data["results"]
st.markdown("### 🔎 Search Results")
for idx, result in enumerate(search_results):
display_search_result(result, idx)
except requests.RequestException as e:
st.error(f"Error: {str(e)}")
st.subheader("📄 ไฟล์เอกสารที่ใช้เป็นคลังข้อมูล PDPA")
st.markdown(
"""
- [FAQ-เกี่ยวกับการคุ้มครองข้อมูลส่วนบุคคล-PDPA.pdf](https://huggingface.co/spaces/amornpan/eRAG-PDPA-v1/blob/main/%E0%B9%80%E0%B8%AD%E0%B8%81%E0%B8%AA%E0%B8%B2%E0%B8%A3_PDPA/1.FAQ-%E0%B9%80%E0%B8%81%E0%B8%B5%E0%B9%88%E0%B8%A2%E0%B8%A7%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%84%E0%B8%B8%E0%B9%89%E0%B8%A1%E0%B8%84%E0%B8%A3%E0%B8%AD%E0%B8%87%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%A1%E0%B8%B9%E0%B8%A5%E0%B8%AA%E0%B9%88%E0%B8%A7%E0%B8%99%E0%B8%9A%E0%B8%B8%E0%B8%84%E0%B8%84%E0%B8%A5-PDPA.pdf) (1.13 MB)
- [1612025563SummaryPDPA_DigitalCouncilofThailand.pdf](https://huggingface.co/spaces/amornpan/eRAG-PDPA-v1/blob/main/%E0%B9%80%E0%B8%AD%E0%B8%81%E0%B8%AA%E0%B8%B2%E0%B8%A3_PDPA/1612025563SummaryPDPA_DigitalCouncilofThailand.pdf) (1.35 MB)
- [PDPA_Guideline_v_1.pdf](https://huggingface.co/spaces/amornpan/eRAG-PDPA-v1/blob/main/%E0%B9%80%E0%B8%AD%E0%B8%81%E0%B8%AA%E0%B8%B2%E0%B8%A3_PDPA/PDPA_Guideline_v_1.pdf) (10.7 MB)
- [T_0024.pdf](https://huggingface.co/spaces/amornpan/eRAG-PDPA-v1/blob/main/%E0%B9%80%E0%B8%AD%E0%B8%81%E0%B8%AA%E0%B8%B2%E0%B8%A3_PDPA/T_0024.pdf) (81.1 kB)
- [T_0026.pdf](https://huggingface.co/spaces/amornpan/eRAG-PDPA-v1/blob/main/%E0%B9%80%E0%B8%AD%E0%B8%81%E0%B8%AA%E0%B8%B2%E0%B8%A3_PDPA/T_0026.pdf) (82.6 kB)
- [T_0028.pdf](https://huggingface.co/spaces/amornpan/eRAG-PDPA-v1/blob/main/%E0%B9%80%E0%B8%AD%E0%B8%81%E0%B8%AA%E0%B8%B2%E0%B8%A3_PDPA/T_0028.pdf) (105 kB)
- [T_0032.pdf](https://huggingface.co/spaces/amornpan/eRAG-PDPA-v1/blob/main/%E0%B9%80%E0%B8%AD%E0%B8%81%E0%B8%AA%E0%B8%B2%E0%B8%A3_PDPA/T_0032.pdf) (103 kB)
""",
unsafe_allow_html=True
)
st.subheader("👤 Authors")
st.write("""
- Amornpan Phornchaicharoen (amornpan@gmail.com)
- Aekanun Thongtae (cto@bangkokfirsttech.com)
- Montita Somsoo (montita.fonn@gmail.com)
- Jiranuwat Songpad (jiranuwat.song64@gmail.com)
- Phongsatorn Somjai (ipongdev@gmail.com)
- Benchawan Wangphoomyai (benchaa.27@gmail.com)
""")