adowu commited on
Commit
760d83e
·
verified ·
1 Parent(s): 0bc4efa

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +18 -25
app.py CHANGED
@@ -4,7 +4,6 @@ import os
4
  from sentence_transformers import SentenceTransformer, util
5
  import torch
6
  from huggingface_hub import InferenceClient
7
- import asyncio
8
 
9
  # Load the Hugging Face token from environment variable
10
  HF_TOKEN = os.environ.get("HF_TOKEN")
@@ -22,12 +21,12 @@ def load_data(file_path):
22
  def load_model():
23
  return SentenceTransformer('distiluse-base-multilingual-cased-v1')
24
 
25
- async def generate_keywords(query):
26
  client = InferenceClient(token=HF_TOKEN)
27
 
28
  prompt = f"Na podstawie poniższego pytania, wygeneruj 3-5 słów kluczowych, które najlepiej opisują główne tematy i koncepcje prawne zawarte w pytaniu. Podaj tylko słowa kluczowe, oddzielone przecinkami.\n\nPytanie: {query}\n\nSłowa kluczowe:"
29
 
30
- response = await client.text_generation(
31
  model="Qwen/Qwen2.5-72B-Instruct",
32
  prompt=prompt,
33
  max_new_tokens=50,
@@ -38,7 +37,16 @@ async def generate_keywords(query):
38
  keywords = [keyword.strip() for keyword in response.split(',')]
39
  return keywords
40
 
41
- async def generate_ai_response(query, relevant_chunks):
 
 
 
 
 
 
 
 
 
42
  client = InferenceClient(token=HF_TOKEN)
43
 
44
  context = "Kontekst prawny:\n\n"
@@ -48,27 +56,15 @@ async def generate_ai_response(query, relevant_chunks):
48
 
49
  prompt = f"Jesteś asystentem prawniczym. Odpowiedz na poniższe pytanie na podstawie podanego kontekstu prawnego.\n\nKontekst: {context}\n\nPytanie: {query}\n\nOdpowiedź:"
50
 
51
- response = ""
52
- async for token in client.text_generation(
53
  model="Qwen/Qwen2.5-72B-Instruct",
54
  prompt=prompt,
55
  max_new_tokens=2048,
56
  temperature=0.5,
57
- top_p=0.7,
58
- stream=True
59
- ):
60
- response += token
61
- yield token
62
-
63
- def search_relevant_chunks(keywords, chunks, model, top_k=3):
64
- keyword_embedding = model.encode(keywords, convert_to_tensor=True)
65
- chunk_embeddings = model.encode([chunk['text'] for chunk in chunks], convert_to_tensor=True)
66
-
67
- cos_scores = util.pytorch_cos_sim(keyword_embedding, chunk_embeddings)
68
- top_results = torch.topk(cos_scores.mean(dim=0), k=top_k)
69
 
70
- return [chunks[idx] for idx in top_results.indices]
71
-
72
 
73
  def main():
74
  st.title("Chatbot Prawny z AI")
@@ -99,16 +95,13 @@ def main():
99
 
100
  # Generate keywords and search for relevant chunks
101
  with st.spinner("Analizuję pytanie i szukam odpowiednich informacji..."):
102
- keywords = asyncio.run(generate_keywords(prompt))
103
  relevant_chunks = search_relevant_chunks(keywords, chunks, model)
104
 
105
  # Generate AI response
106
  with st.chat_message("assistant"):
107
  message_placeholder = st.empty()
108
- full_response = ""
109
- for chunk in asyncio.run(generate_ai_response(prompt, relevant_chunks)):
110
- full_response += chunk
111
- message_placeholder.markdown(full_response + "▌")
112
  message_placeholder.markdown(full_response)
113
 
114
  st.session_state.messages.append({"role": "assistant", "content": full_response})
 
4
  from sentence_transformers import SentenceTransformer, util
5
  import torch
6
  from huggingface_hub import InferenceClient
 
7
 
8
  # Load the Hugging Face token from environment variable
9
  HF_TOKEN = os.environ.get("HF_TOKEN")
 
21
  def load_model():
22
  return SentenceTransformer('distiluse-base-multilingual-cased-v1')
23
 
24
+ def generate_keywords(query):
25
  client = InferenceClient(token=HF_TOKEN)
26
 
27
  prompt = f"Na podstawie poniższego pytania, wygeneruj 3-5 słów kluczowych, które najlepiej opisują główne tematy i koncepcje prawne zawarte w pytaniu. Podaj tylko słowa kluczowe, oddzielone przecinkami.\n\nPytanie: {query}\n\nSłowa kluczowe:"
28
 
29
+ response = client.text_generation(
30
  model="Qwen/Qwen2.5-72B-Instruct",
31
  prompt=prompt,
32
  max_new_tokens=50,
 
37
  keywords = [keyword.strip() for keyword in response.split(',')]
38
  return keywords
39
 
40
+ def search_relevant_chunks(keywords, chunks, model, top_k=3):
41
+ keyword_embedding = model.encode(keywords, convert_to_tensor=True)
42
+ chunk_embeddings = model.encode([chunk['text'] for chunk in chunks], convert_to_tensor=True)
43
+
44
+ cos_scores = util.pytorch_cos_sim(keyword_embedding, chunk_embeddings)
45
+ top_results = torch.topk(cos_scores.mean(dim=0), k=top_k)
46
+
47
+ return [chunks[idx] for idx in top_results.indices]
48
+
49
+ def generate_ai_response(query, relevant_chunks):
50
  client = InferenceClient(token=HF_TOKEN)
51
 
52
  context = "Kontekst prawny:\n\n"
 
56
 
57
  prompt = f"Jesteś asystentem prawniczym. Odpowiedz na poniższe pytanie na podstawie podanego kontekstu prawnego.\n\nKontekst: {context}\n\nPytanie: {query}\n\nOdpowiedź:"
58
 
59
+ response = client.text_generation(
 
60
  model="Qwen/Qwen2.5-72B-Instruct",
61
  prompt=prompt,
62
  max_new_tokens=2048,
63
  temperature=0.5,
64
+ top_p=0.7
65
+ )
 
 
 
 
 
 
 
 
 
 
66
 
67
+ return response
 
68
 
69
  def main():
70
  st.title("Chatbot Prawny z AI")
 
95
 
96
  # Generate keywords and search for relevant chunks
97
  with st.spinner("Analizuję pytanie i szukam odpowiednich informacji..."):
98
+ keywords = generate_keywords(prompt)
99
  relevant_chunks = search_relevant_chunks(keywords, chunks, model)
100
 
101
  # Generate AI response
102
  with st.chat_message("assistant"):
103
  message_placeholder = st.empty()
104
+ full_response = generate_ai_response(prompt, relevant_chunks)
 
 
 
105
  message_placeholder.markdown(full_response)
106
 
107
  st.session_state.messages.append({"role": "assistant", "content": full_response})