Update app.py
Browse files
app.py
CHANGED
|
@@ -6,6 +6,7 @@ import sqlite3
|
|
| 6 |
import json
|
| 7 |
import numpy as np
|
| 8 |
import datetime
|
|
|
|
| 9 |
from langchain.chains import RetrievalQA
|
| 10 |
from langchain.schema import Document
|
| 11 |
from langchain_core.retrievers import BaseRetriever
|
|
@@ -37,19 +38,23 @@ uploaded_files = st.file_uploader(
|
|
| 37 |
"Upload JSON files in batches (any structure)", type="json", accept_multiple_files=True
|
| 38 |
)
|
| 39 |
|
| 40 |
-
# ---
|
| 41 |
def flatten_json_obj(obj, parent_key="", sep="."):
|
| 42 |
items = {}
|
| 43 |
if isinstance(obj, dict):
|
| 44 |
for k, v in obj.items():
|
| 45 |
new_key = f"{parent_key}{sep}{k}" if parent_key else k
|
| 46 |
-
# Entity extraction: add name from email
|
| 47 |
if (
|
| 48 |
k.lower() in {"customer", "user", "email", "username"} and
|
| 49 |
isinstance(v, str) and "@" in v
|
| 50 |
):
|
| 51 |
local = v.split("@")[0]
|
| 52 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
items.update(flatten_json_obj(v, new_key, sep=sep))
|
| 54 |
elif isinstance(obj, list):
|
| 55 |
for i, v in enumerate(obj):
|
|
@@ -155,7 +160,6 @@ def python_fuzzy_match(user_query, top_k=5):
|
|
| 155 |
results = []
|
| 156 |
for row in cursor.fetchall():
|
| 157 |
flat_text = row[4].lower()
|
| 158 |
-
# score = # of query terms present as substring in the flat_text
|
| 159 |
score = sum(any(term in flat_text for term in query_terms) for term in query_terms)
|
| 160 |
if score > 0:
|
| 161 |
results.append((score, row))
|
|
@@ -251,7 +255,6 @@ def send_message():
|
|
| 251 |
return
|
| 252 |
st.session_state.messages.append({"role": "user", "content": user_input})
|
| 253 |
with st.spinner("Thinking..."):
|
| 254 |
-
# Correct key: "query"
|
| 255 |
result = qa_chain({"query": user_input})
|
| 256 |
answer = result['result']
|
| 257 |
st.session_state.messages.append({"role": "assistant", "content": answer})
|
|
|
|
| 6 |
import json
|
| 7 |
import numpy as np
|
| 8 |
import datetime
|
| 9 |
+
import re
|
| 10 |
from langchain.chains import RetrievalQA
|
| 11 |
from langchain.schema import Document
|
| 12 |
from langchain_core.retrievers import BaseRetriever
|
|
|
|
| 38 |
"Upload JSON files in batches (any structure)", type="json", accept_multiple_files=True
|
| 39 |
)
|
| 40 |
|
| 41 |
+
# --- Enhanced Flattening: extract names from emails/user fields for LLM context
|
| 42 |
def flatten_json_obj(obj, parent_key="", sep="."):
|
| 43 |
items = {}
|
| 44 |
if isinstance(obj, dict):
|
| 45 |
for k, v in obj.items():
|
| 46 |
new_key = f"{parent_key}{sep}{k}" if parent_key else k
|
| 47 |
+
# Entity extraction: add name(s) from email/user
|
| 48 |
if (
|
| 49 |
k.lower() in {"customer", "user", "email", "username"} and
|
| 50 |
isinstance(v, str) and "@" in v
|
| 51 |
):
|
| 52 |
local = v.split("@")[0]
|
| 53 |
+
local_clean = re.sub(r'[^a-zA-Z0-9]', ' ', local)
|
| 54 |
+
parts = [part for part in local_clean.split() if part]
|
| 55 |
+
if parts:
|
| 56 |
+
items[new_key + "_name"] = parts[0]
|
| 57 |
+
items[new_key + "_all_names"] = " ".join(parts)
|
| 58 |
items.update(flatten_json_obj(v, new_key, sep=sep))
|
| 59 |
elif isinstance(obj, list):
|
| 60 |
for i, v in enumerate(obj):
|
|
|
|
| 160 |
results = []
|
| 161 |
for row in cursor.fetchall():
|
| 162 |
flat_text = row[4].lower()
|
|
|
|
| 163 |
score = sum(any(term in flat_text for term in query_terms) for term in query_terms)
|
| 164 |
if score > 0:
|
| 165 |
results.append((score, row))
|
|
|
|
| 255 |
return
|
| 256 |
st.session_state.messages.append({"role": "user", "content": user_input})
|
| 257 |
with st.spinner("Thinking..."):
|
|
|
|
| 258 |
result = qa_chain({"query": user_input})
|
| 259 |
answer = result['result']
|
| 260 |
st.session_state.messages.append({"role": "assistant", "content": answer})
|