trantuan1701 commited on
Commit
c598e5f
·
1 Parent(s): bd95364

Add FAQs processing

Browse files
app.py CHANGED
@@ -1,58 +1,93 @@
1
  import streamlit as st
2
  from chatbot.core import get_chat_response, memory, cmp
3
 
4
- # Cấu hình giao diện Streamlit
5
  st.set_page_config(page_title="RangDong Chatbot", layout="wide")
6
 
7
- # Tiêu đề ứng dụng
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  st.markdown(
9
- """
10
- <style>
11
- .title {
12
- text-align: center;
13
- font-size: 2em;
14
- font-weight: bold;
15
- }
16
- </style>
17
- <h1 class="title">RangDong Sale Assistant</h1>
18
- """,
19
  unsafe_allow_html=True
20
  )
21
 
22
- # Khởi tạo session state để lưu lịch sử chat
23
  if "messages" not in st.session_state:
24
  st.session_state.messages = []
25
 
26
- # Hiển thị lịch sử chat
27
- for message in st.session_state.messages:
28
- with st.chat_message(message["role"]):
29
- st.markdown(message["content"])
30
-
31
- # Ô nhập liệu chat
32
-
33
- user_input = st.chat_input("Nhập tin nhắn của bạn...")
34
 
 
 
35
 
36
  if user_input:
37
- # Hiển thị tin nhắn của user
38
  st.session_state.messages.append({"role": "user", "content": user_input})
39
  with st.chat_message("user"):
40
  st.markdown(user_input)
41
 
42
- # Gọi chatbot để lấy phản hồi
43
- response = get_chat_response(user_input)
 
 
 
 
44
 
45
- # Hiển thị phản hồi của chatbot
46
  st.session_state.messages.append({"role": "assistant", "content": response})
47
  with st.chat_message("assistant"):
48
  st.markdown(response)
49
 
50
- if memory.cache:
51
- cmp_button = st.button("So sánh các sản phẩm tương đồng")
52
-
53
- if cmp_button:
54
- response = cmp()
 
 
 
 
 
55
 
56
- st.session_state.messages.append({"role": "assistant", "content": response})
 
57
  with st.chat_message("assistant"):
58
- st.markdown(response)
 
 
1
  import streamlit as st
2
  from chatbot.core import get_chat_response, memory, cmp
3
 
4
+ # === Page configuration must be the first Streamlit command ===
5
  st.set_page_config(page_title="RangDong Chatbot", layout="wide")
6
 
7
+ # --- Global CSS for styling ---
8
+ st.markdown("""
9
+ <style>
10
+ /* Title styling */
11
+ .title {
12
+ text-align: center;
13
+ font-size: 2.5rem;
14
+ font-weight: 700;
15
+ margin-bottom: 1rem;
16
+ }
17
+
18
+ /* Chat container padding */
19
+ .chat-container .stChatMessage {
20
+ padding: 0.5rem 1rem;
21
+ border-radius: 0.75rem;
22
+ margin-bottom: 0.5rem;
23
+ }
24
+
25
+ /* Compare button styling */
26
+ .custom-cmp .stButton>button {
27
+ background-color: #0072C3;
28
+ color: white;
29
+ font-size: 1rem;
30
+ padding: 0.75rem 1.5rem;
31
+ border-radius: 0.5rem;
32
+ font-weight: 600;
33
+ border: none;
34
+ width: 100%;
35
+ max-width: 300px;
36
+ margin: 1rem auto;
37
+ display: block;
38
+ }
39
+ </style>
40
+ """, unsafe_allow_html=True)
41
+
42
+ # --- Application title ---
43
  st.markdown(
44
+ '<h1 class="title">RangDong Sale Assistant</h1>',
 
 
 
 
 
 
 
 
 
45
  unsafe_allow_html=True
46
  )
47
 
48
+ # --- Initialize chat history in session state ---
49
  if "messages" not in st.session_state:
50
  st.session_state.messages = []
51
 
52
+ # --- Display chat history ---
53
+ for msg in st.session_state.messages:
54
+ with st.chat_message(msg["role"]):
55
+ st.markdown(msg["content"])
 
 
 
 
56
 
57
+ # --- Chat input box ---
58
+ user_input = st.chat_input("Trợ lý ảo Rạng Đông có thể giúp được gì cho bạn...")
59
 
60
  if user_input:
61
+ # 1) Hiển thị ngay tin nhắn user
62
  st.session_state.messages.append({"role": "user", "content": user_input})
63
  with st.chat_message("user"):
64
  st.markdown(user_input)
65
 
66
+ # 2) Spinner-Only placeholder cho response
67
+ spinner = st.empty()
68
+ with spinner:
69
+ with st.spinner("Rạng Đông Chatbot đang suy nghĩ..."):
70
+ response = get_chat_response(user_input)
71
+ spinner.empty()
72
 
73
+ # 3) Hiển thị bubble mới lưu lại
74
  st.session_state.messages.append({"role": "assistant", "content": response})
75
  with st.chat_message("assistant"):
76
  st.markdown(response)
77
 
78
+ # --- Compare button + spinner-only ---
79
+ if any(m["role"] == "user" for m in st.session_state.messages) and memory.cache:
80
+ st.markdown('<div class="custom-cmp">', unsafe_allow_html=True)
81
+ if st.button("So sánh các sản phẩm tương tự", key="cmp_button"):
82
+ # Spinner-only placeholder
83
+ spinner_cmp = st.empty()
84
+ with spinner_cmp:
85
+ with st.spinner("Đang so sánh các sản phẩm..."):
86
+ cmp_response = cmp()
87
+ spinner_cmp.empty()
88
 
89
+ # Show new compare bubble
90
+ st.session_state.messages.append({"role": "assistant", "content": cmp_response})
91
  with st.chat_message("assistant"):
92
+ st.markdown(cmp_response)
93
+ st.markdown('</div>', unsafe_allow_html=True)
chatbot/__pycache__/core.cpython-310.pyc CHANGED
Binary files a/chatbot/__pycache__/core.cpython-310.pyc and b/chatbot/__pycache__/core.cpython-310.pyc differ
 
chatbot/__pycache__/llm.cpython-310.pyc CHANGED
Binary files a/chatbot/__pycache__/llm.cpython-310.pyc and b/chatbot/__pycache__/llm.cpython-310.pyc differ
 
chatbot/__pycache__/prompts.cpython-310.pyc CHANGED
Binary files a/chatbot/__pycache__/prompts.cpython-310.pyc and b/chatbot/__pycache__/prompts.cpython-310.pyc differ
 
chatbot/__pycache__/retrieval.cpython-310.pyc CHANGED
Binary files a/chatbot/__pycache__/retrieval.cpython-310.pyc and b/chatbot/__pycache__/retrieval.cpython-310.pyc differ
 
chatbot/core.py CHANGED
@@ -1,5 +1,5 @@
1
  from .llm import gemini_llm
2
- from .retrieval import load_vectordb
3
  from .prompts import chat_prompt_no_memory, chat_prompt_memory, classification_prompt, category_tree_json
4
  from langchain.chains import RetrievalQA
5
  from .metadata_selfquery import metadata_field_info
@@ -21,7 +21,7 @@ retriever = SelfQueryRetriever.from_llm(
21
  metadata_field_info=metadata_field_info,
22
  structured_query_translator= QdrantTranslator(metadata_key="metadata"),
23
  search_type="similarity",
24
- search_kwargs={"k": 10}
25
  )
26
 
27
  qa_chain1 = RetrievalQA.from_chain_type(
@@ -49,8 +49,75 @@ qa_chain2 = MyCustomMemoryRetrievalChain(
49
  # output_key="result"
50
  # )
51
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  def get_chat_response(user_input: str) -> str:
 
53
  restriction = classify_query(user_input.strip())
 
 
 
 
 
 
 
 
 
54
 
55
  if memory.related_to_cache(user_input):
56
  print("Liên quan tới câu trước")
@@ -63,7 +130,6 @@ def get_chat_response(user_input: str) -> str:
63
  memory.restrict = restriction
64
  print("Không liên quan tới câu trước")
65
  response = qa_chain1({"query": classified_query})
66
- print(restriction)
67
  memory.add(user_input, response["result"])
68
  print(memory.restrict)
69
  return response["result"]
 
1
  from .llm import gemini_llm
2
+ from .retrieval import load_vectordb, retrieve_top_k_faqs
3
  from .prompts import chat_prompt_no_memory, chat_prompt_memory, classification_prompt, category_tree_json
4
  from langchain.chains import RetrievalQA
5
  from .metadata_selfquery import metadata_field_info
 
21
  metadata_field_info=metadata_field_info,
22
  structured_query_translator= QdrantTranslator(metadata_key="metadata"),
23
  search_type="similarity",
24
+ search_kwargs={"k": 6}
25
  )
26
 
27
  qa_chain1 = RetrievalQA.from_chain_type(
 
49
  # output_key="result"
50
  # )
51
 
52
+ def find_best_match_llm(user_question, candidates):
53
+ options = "\n".join(
54
+ f"{i+1}. Q: {c['question']}\n A: {c['answer']}"
55
+ for i, c in enumerate(candidates)
56
+ )
57
+ print(options)
58
+
59
+ prompt = f"""
60
+ Bạn là một trợ lý thông minh. Nhiệm vụ của bạn là:
61
+ - Kiểm tra xem trong danh sách FAQ dưới đây có mục nào có ngữ nghĩa tương đương với câu hỏi của người dùng hay không.
62
+ - Nếu tìm được, chỉ trả về số thứ tự (1, 2, 3, …) của mục FAQ phù hợp nhất.
63
+ - Trong mọi trường hợp khác (không tìm thấy FAQ phù hợp, hoặc người dùng yêu cầu giới thiệu sản phẩm), chỉ trả về đúng một chữ “KHÔNG”.
64
+
65
+ Câu hỏi của người dùng:
66
+ \"{user_question}\"
67
+
68
+ Danh sách FAQ đã đánh số:
69
+ {options}
70
+
71
+ Hãy chỉ trả về:
72
+ - Một số nguyên (1, 2, 3, …) tương ứng với mục FAQ phù hợp nhất,
73
+ - Hoặc “KHÔNG” (viết hoa) nếu không có FAQ phù hợp hoặc user hỏi về giới thiệu sản phẩm.
74
+ """
75
+
76
+
77
+ response = gemini_llm.invoke(prompt)
78
+ return response
79
+
80
+ def get_faq_answer(user_question):
81
+ top_k = retrieve_top_k_faqs(user_question, k=5, threshold = 0.6)
82
+ if not top_k:
83
+ return None
84
+ match_index = find_best_match_llm(user_question, top_k)
85
+ if match_index.strip().upper() == "KHÔNG":
86
+ return None
87
+
88
+ try:
89
+ idx = int(match_index) - 1
90
+ matched = top_k[idx]
91
+ print(matched)
92
+ except (ValueError, IndexError):
93
+ print(match_index)
94
+ return "Đã có lỗi khi xử lý kết quả. Vui lòng thử lại."
95
+
96
+ final_prompt = (
97
+ 'Bạn là một trợ lý ảo bán hàng của Rạng Đông'
98
+ 'Câu hỏi của khách hàng: "' + user_question + '"\n\n'
99
+ 'Dưới đây là câu hỏi đã khớp trong cơ sở dữ liệu:\n'
100
+ f'"{matched["question"]}"\n\n'
101
+ 'Câu trả lời là:\n'
102
+ f'"{matched["answer"]}"\n\n'
103
+ 'Hãy trả lời cho khách hàng một cách lịch sự nhất có thể. Xưng hộ mình - bạn.'
104
+ )
105
+
106
+ return gemini_llm.invoke(final_prompt)
107
+
108
+
109
  def get_chat_response(user_input: str) -> str:
110
+ faq_response = get_faq_answer(user_input)
111
  restriction = classify_query(user_input.strip())
112
+ if faq_response:
113
+ print("FAQ")
114
+ if len(memory.restrict) < 7:
115
+ memory.restrict = restriction
116
+ memory.add(user_input, faq_response)
117
+ print(faq_response)
118
+ return faq_response
119
+
120
+
121
 
122
  if memory.related_to_cache(user_input):
123
  print("Liên quan tới câu trước")
 
130
  memory.restrict = restriction
131
  print("Không liên quan tới câu trước")
132
  response = qa_chain1({"query": classified_query})
 
133
  memory.add(user_input, response["result"])
134
  print(memory.restrict)
135
  return response["result"]
chatbot/prompts.py CHANGED
@@ -29,8 +29,7 @@ Bạn là trợ lý AI bán hàng của **Rạng Đông Store**, chuyên hỗ tr
29
  ---
30
 
31
  ### Nhiệm vụ của bạn:
32
- - Cố gắng cung cấp nhiều sản phẩm nhất từ danh sách đưa ra.
33
- - Nếu không có dữ liệu về L3, hãy hỏi rõ nhu cầu của khách hàng.
34
  - Cung cấp cho khách hàng thông tin về các sản phẩm liên quan sau. (`{context}`).
35
  - Tư vấn nhiều lựa chọn phù hợp nếu có thể.
36
  - Không bịa đặt hoặc suy diễn nếu không tìm thấy sản phẩm phù hợp – hãy xin lỗi khách hàng một cách chuyên nghiệp.
@@ -38,6 +37,7 @@ Bạn là trợ lý AI bán hàng của **Rạng Đông Store**, chuyên hỗ tr
38
  ---
39
 
40
  ### Yêu cầu khi phản hồi:
 
41
  - Mỗi sản phẩm gợi ý cần **đính kèm URL** (rất quan trọng).
42
  - Nếu là **đèn chiếu sáng**, hãy nêu rõ:
43
  `Giá`, `Công suất`, `Góc chiếu`, `Độ rọi`.
@@ -224,7 +224,7 @@ category_tree_json = json.dumps(category_tree, ensure_ascii=False, indent=2)
224
 
225
 
226
  classification_prompt = ChatPromptTemplate.from_messages([
227
- ("system", "Bạn là một trợ lý AI giúp phân loại sản phẩm dựa trên danh mục có sẵn. "
228
  "Dưới đây là danh mục sản phẩm:\n\n"
229
  "{category_tree}\n\n"
230
  "Hãy đọc câu hỏi của khách hàng và xác định danh mục thích hợp L1, L2, L3"
@@ -233,7 +233,7 @@ classification_prompt = ChatPromptTemplate.from_messages([
233
  "Trả lời theo định dạng sau: L1(Nếu xác định được):... - L2(Nếu xác định được):.... -L3(Nếu xác định được):... - Giá thấp nhất(Nếu xác định được):... - Giá cao nhất(nếu xác định được):..."
234
  "Nếu chỉ có thông tin về giá vẫn trả lời Giá thấp nhất:.. - Giá cao nhât:...."
235
  "Nếu không tìm được yếu tố nào thì bỏ trống (không cần ghi yếu tố không tìm thấy ví dụ (L1: ... - Giá thấp nhất 100 000))"
236
- "Nếu không tìm thấy danh mục nào phù hợp trả về nội dung sau: '...'")
237
  ])
238
 
239
 
@@ -257,6 +257,7 @@ Hãy dựa vào các thông tin trên để đưa ra câu trả lời chính xá
257
 
258
 
259
  ### Yêu cầu khi phản hồi:
 
260
  - Mỗi sản phẩm gợi ý cần **đính kèm URL** (rất quan trọng).
261
  - Nếu là **đèn chiếu sáng**, hãy nêu rõ:
262
  `Giá`, `Công suất`, `Góc chiếu`, `Độ rọi`.
 
29
  ---
30
 
31
  ### Nhiệm vụ của bạn:
32
+ - Cố gắng cung cấp thông tin thật hữu ích giúp khách hàng mua hàng từ danh sách đưa ra.
 
33
  - Cung cấp cho khách hàng thông tin về các sản phẩm liên quan sau. (`{context}`).
34
  - Tư vấn nhiều lựa chọn phù hợp nếu có thể.
35
  - Không bịa đặt hoặc suy diễn nếu không tìm thấy sản phẩm phù hợp – hãy xin lỗi khách hàng một cách chuyên nghiệp.
 
37
  ---
38
 
39
  ### Yêu cầu khi phản hồi:
40
+ - Xưng hô mình bạn.
41
  - Mỗi sản phẩm gợi ý cần **đính kèm URL** (rất quan trọng).
42
  - Nếu là **đèn chiếu sáng**, hãy nêu rõ:
43
  `Giá`, `Công suất`, `Góc chiếu`, `Độ rọi`.
 
224
 
225
 
226
  classification_prompt = ChatPromptTemplate.from_messages([
227
+ ("system", "Bạn là một trợ lý AI giúp phân loại sản phẩm dựa trên danh mục có sẵn và trả lời theo định dạng cố định "
228
  "Dưới đây là danh mục sản phẩm:\n\n"
229
  "{category_tree}\n\n"
230
  "Hãy đọc câu hỏi của khách hàng và xác định danh mục thích hợp L1, L2, L3"
 
233
  "Trả lời theo định dạng sau: L1(Nếu xác định được):... - L2(Nếu xác định được):.... -L3(Nếu xác định được):... - Giá thấp nhất(Nếu xác định được):... - Giá cao nhất(nếu xác định được):..."
234
  "Nếu chỉ có thông tin về giá vẫn trả lời Giá thấp nhất:.. - Giá cao nhât:...."
235
  "Nếu không tìm được yếu tố nào thì bỏ trống (không cần ghi yếu tố không tìm thấy ví dụ (L1: ... - Giá thấp nhất 100 000))"
236
+ "Nếu không tìm thấy danh mục nào phù hợp trả về nội dung sau, tuyệt đối không trả lời gì khác: '...'")
237
  ])
238
 
239
 
 
257
 
258
 
259
  ### Yêu cầu khi phản hồi:
260
+ - Xưng hộ mình - bạn
261
  - Mỗi sản phẩm gợi ý cần **đính kèm URL** (rất quan trọng).
262
  - Nếu là **đèn chiếu sáng**, hãy nêu rõ:
263
  `Giá`, `Công suất`, `Góc chiếu`, `Độ rọi`.
chatbot/retrieval.py CHANGED
@@ -6,8 +6,8 @@ from langchain.schema import Document
6
  import os
7
  import json
8
  import re
9
- from config import EMBEDDING_MODEL, QDRANT_HOST, QDRANT_API_KEY, QDRANT_COLECTION_NAME, EMBEDDING_SIZE
10
-
11
  embedding_model = HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL)
12
 
13
  def load_json(file_path):
@@ -50,6 +50,47 @@ client = qdrant_client.QdrantClient(
50
  api_key = QDRANT_API_KEY,
51
  )
52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  def load_vectordb():
54
  collections_info = client.get_collections()
55
  if not any(col.name == QDRANT_COLECTION_NAME for col in collections_info.collections):
@@ -79,3 +120,23 @@ def load_vectordb():
79
  metadata_payload_key="metadata",
80
  )
81
  return vector_store
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  import os
7
  import json
8
  import re
9
+ from config import EMBEDDING_MODEL, QDRANT_HOST, QDRANT_API_KEY, QDRANT_COLECTION_NAME, EMBEDDING_SIZE, QDRANT_FAQ_COLLECTION_NAME
10
+ from qdrant_client.http.models import VectorParams, Distance, PointStruct
11
  embedding_model = HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL)
12
 
13
  def load_json(file_path):
 
50
  api_key = QDRANT_API_KEY,
51
  )
52
 
53
+ def load_faq_vectordb():
54
+ existing = client.get_collections().collections
55
+ if not any(col.name == QDRANT_FAQ_COLLECTION_NAME for col in existing):
56
+ client.recreate_collection(
57
+ collection_name=QDRANT_FAQ_COLLECTION_NAME,
58
+ vectors_config=VectorParams(
59
+ size=EMBEDDING_SIZE,
60
+ distance=Distance.COSINE
61
+ )
62
+ )
63
+
64
+ with open("data/FAQ.json", "r", encoding="utf-8") as f:
65
+ faqs = json.load(f)
66
+
67
+ points = []
68
+ for idx, faq in enumerate(faqs):
69
+ vec = embedding_model.embed_query(faq["Question"])
70
+ points.append(PointStruct(
71
+ id=idx,
72
+ vector=vec,
73
+ payload={
74
+ "Câu hỏi": faq["Question"],
75
+ "Câu trả lời": faq["Answer"]
76
+ }
77
+ ))
78
+
79
+ client.upsert(
80
+ collection_name= QDRANT_FAQ_COLLECTION_NAME,
81
+ points=points
82
+ )
83
+
84
+ return Qdrant(
85
+ client=client,
86
+ collection_name=QDRANT_FAQ_COLLECTION_NAME,
87
+ embeddings=embedding_model,
88
+ content_payload_key="Câu hỏi",
89
+ metadata_payload_key="Câu trả lời"
90
+ )
91
+
92
+
93
+
94
  def load_vectordb():
95
  collections_info = client.get_collections()
96
  if not any(col.name == QDRANT_COLECTION_NAME for col in collections_info.collections):
 
120
  metadata_payload_key="metadata",
121
  )
122
  return vector_store
123
+
124
+ def retrieve_top_k_faqs(user_question, k=5, threshold = 0.5):
125
+ query_vector = embedding_model.embed_query(user_question)
126
+ search_results = client.search(
127
+ collection_name= QDRANT_FAQ_COLLECTION_NAME,
128
+ query_vector=query_vector,
129
+ limit=k
130
+ )
131
+ return [
132
+ {
133
+ "question": hit.payload["Câu hỏi"],
134
+ "answer": hit.payload["Câu trả lời"],
135
+ "score": hit.score
136
+ }
137
+ for hit in search_results
138
+ if hit.score >= threshold
139
+ ]
140
+
141
+
142
+
config.py CHANGED
@@ -10,6 +10,7 @@ GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
10
  QDRANT_HOST = os.getenv("QDRANT_HOST")
11
  QDRANT_API_KEY = os.getenv("QDRANT_API_KEY")
12
 
 
13
  QDRANT_COLECTION_NAME = "my_collection"
14
  MODEL_NAME = "gemini-2.0-flash"
15
 
 
10
  QDRANT_HOST = os.getenv("QDRANT_HOST")
11
  QDRANT_API_KEY = os.getenv("QDRANT_API_KEY")
12
 
13
+ QDRANT_FAQ_COLLECTION_NAME = "faq_collection"
14
  QDRANT_COLECTION_NAME = "my_collection"
15
  MODEL_NAME = "gemini-2.0-flash"
16
 
data/FAQ.json ADDED
@@ -0,0 +1,306 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "Question":"Giới thiệu về Rạng Đông",
4
+ "Answer":" Sứ mệnh: Doanh nghiệp tiên phong cung cấp hệ thống giải pháp đồng bộ dựa trên công nghệ lõi chiếu sáng và IoT, đi đầu trong chuyển đổi kép (số và xanh), góp phần kiến tạo ngôi nhà thông minh, thành phố thông minh, nông nghiệp công nghệ cao và chính xác, thúc đẩy cuộc sống xanh, thông minh, hạnh phúc, phát triển bền vững; đồng sáng tạo giá trị cùng cổ đông, nhân viên, khách hàng và đối tác; đồng hành cùng dân tộc xây dựng Việt Nam phồn vinh - thịnh vượng.\n Tầm nhìn 2030: Đến năm 2030 trở thành doanh nghiệp công nghệ cao, thương hiệu Rạng Đông vươn tầm khu vực và quốc tế. Thực hiện thành công Tiên phong chuyển đổi kép (số và xanh), dẫn đầu các không gian tăng trưởng mới: smart home, smart city, smart farm tại Việt Nam. Phát triển nhanh và bền vững với tốc độ tăng trưởng hàng năm từ 20-25%. Đưa Rạng Đông vào TOP 100 doanh nghiệp Việt Nam đạt doanh thu tầm tỷ đô, lợi nhuận trên 100 triệu đô la. Thu nhập bình quân hệ số 1 đạt 2000 đô la\/người\/tháng.\n Giá trị cốt lõi: Đoàn kết, chủ động, sáng tạo, tốc độ và chuyên nghiệp"
5
+ },
6
+ {
7
+ "Question":"Ngành nghề chính của Rạng Đông là gì?",
8
+ "Answer":"Hiện nay, Rạng Đông đang có 9 ngành nghề chính, bao gồm: Sản xuất kinh doanh các sản phẩm Bóng đèn, vật tư thiết bị điện, dụng cụ chiếu sáng, sản phẩm thủy tinh và các loại phích nước; Dịch vụ khoa học kỹ thuật và chuyển giao công nghệ; Xuất nhập khẩu trực tiếp; Tư vấn và thiết kế chiếu sáng trong dân dụng, công nghiệp (không bao gồm dịch vụ thiết kế công trình); Sửa chữa và lắp đặt thiết bị chiếu sáng trong dân dụng, công nghiệp;Dịch vụ quảng cáo thương mại; Dịch vụ vận chuyển hàng hoá; Kinh doanh bất động sản, quyền sử dụng đất thuộc chủ sở hữu, chủ sử dụng hoặc đi thuê; Tư vấn, môi giới, đấu giá bất động sản, đấu giá quyền sử dụng đất."
9
+ },
10
+ {
11
+ "Question":"Hệ thống phân phối và đại lý Rạng Đông",
12
+ "Answer":"Rạng Đông tự hào là nhà cung cấp hệ thống giải pháp chiếu sáng xanh, thông minh và sản phẩm chất lượng cao tại 65 tỉnh thành trong nước và hơn 40 quốc gia trên thế giới"
13
+ },
14
+ {
15
+ "Question":"Ứng dụng của mình tên là gì? Tìm kiếm tải đâu?",
16
+ "Answer":"- Ứng dụng bên em tên \"RalliSmart\" a\/c có thể tìm kiếm trên CHPlay và AppStore. - Hoặc nếu a\/c còn HDSD của sản phẩm thì có quét mã QR dẫn đến link tải ứng dụng trên đó\""
17
+ },
18
+ {
19
+ "Question":"Mã xác thực gửi về chậm, hoặc không thấy ( trong TH xóa HC, thiết bị, đổi mật khẩu, tạo tài khoản)?",
20
+ "Answer":"- A\/c không thấy hoặc nhận mã xác thực về chậm trong trường hợp nào ạ: Đăng ký tài khoản, Đổi mật khẩu, xóa HC - Trong trường hợp Đăng ký tạo tài khoản: A\/c vui lòng kiểm tra lại thông tin đăng ký (mail\/ SĐT) chưa chính xác. - Nếu đã điền đúng thông tin mail\/ SDT đăng ký tài mà vẫn chưa thấy mã xác nhận được gửi về. A\/c vui lòng nhấn yêu cầu gửi lại mã xác nhận. Nguyên nhân có thể do máy chủ xử lý hoặc đường truyền mạng của a\/c bị chậm"
21
+ },
22
+ {
23
+ "Question":"Tôi đăng nhập tài khoản ứng dụng của mình trên thiết bị khác nhưng vào thấy trắng trơn, không hiển thị thiết bị, nhóm, tầng phòng, cảnh đã cài đặt trước đó",
24
+ "Answer":"Trường hợp 1: Có thể ứng dụng chưa load được dữ liệu trê hệ thống. Xử lý tình trạng này a\/c vào ứng dụng. Tại mục “Cài đặt” bạn chọn “Đồng bộ”. Việc này sẽ giúp ứng dụng load dữ liệu về ứng dụng trên máy mới của bạn. \nTrường hợp 2: A\/c có chia sẽ, chuyển quyền điều khiển thiết bị trong nhà của mình cho tài khoản nào khác không ạ. A\/c vui lòng kiểm tra bằng cách vào ứng dụng > \"Cài đặt\" > kéo sang tab \"Tài khoản\" > chọn \"Chia sẻ\": Tại mục này anh chị hoàn toàn có thể kiểm tra tài khoản đang giữ quyền admin điều khiển thiết bị của nhà. Nếu a\/c được chia sẻ quyền user thì liên hệ admin để thêm quyền điều khiển thiết bị."
25
+ },
26
+ {
27
+ "Question":"Khách hàng phản ánh việc bật đèn bằng công tắc không sáng",
28
+ "Answer":"A\/c trư��c đó đã có tắt đèn bằng bảng cảnh hay remote không ạ?\n - Trường hợp 1: (Nếu khách hàng trả lời có): Do đèn đang nhớ trạng thái cuối cùng được điều khiển là tắt (điều khiển trên app hoặc điều khiển bảng cảnh). \n+ A\/c có thẻ sử dụng app hoặc remote để bật đèn \n+ Nếu a\/c muốn bật bằng công tắc cơ thì a\/c thao tác (bât\/tắt) công tắc nối nguồn điện với thiết bị 2 lần. (đèn downlight, tracklight,... ) thời gian tắt -> bật cách nhau khoảng 2s. Còn đối với panel khổ lớn thì thời gian tắt -> bật là 5s \n- Trường hợp 2: A\/c thử cách trường hợp 1 mà chưa được thì có thể cho lỗi việc đấu nối thiết bị, phần đấu của thiết bị với nguồn điện có thể bị lỏng \n- Trường hợp 3: Nếu anh chị kiểm tra không bị những trường hợp trên thì a\/c cho em xin thông tin để bộ phận kỹ thuật"
29
+ },
30
+ {
31
+ "Question":"Không điều khiển được thiết bị đèn trên app",
32
+ "Answer":"- A\/c vui lòng kiểm tra đã cấp nguồn điện cho thiết bị chưa ạ? - A\/c có thể kiểm tra đèn led báo hiệu trên HC - Home controller (Bộ điều khiển trung tâm) hoặc vào app> \"Cài đặt\" > \"Thông tin HC\".\n + Cách 1: Nếu led trên HC không sáng tại vạch internet hoặc \"Thông tin HC\" trên app ở trạng thái mất kết nối: A\/c vui lòng kiểm tra lại đường truyền mạng đang cấp cho HC. Nếu kết nối wifi anh chị vui lòng cài đặt lại mạng cho HC. \n+ Cách 2: Nếu khách muốn sử dụng điều khiển trên app mà không cài lại mạng (do mất mạng ...): Để điều khiển đèn trên app khi mất mạng internet thì a\/c kết nối wifi của điện thaoị đến wifi của HC phát ra - Wifi có dạng RD_HCxxxx với x là 4 ký tự cuối trên mã MAC HC. Và chuyển trạng thái kết nối của app điện thoại sáng auto .(Mở app>Cài đặt> kéo sang tab \"Tài khoản\" > chuyển \"Loại kết nối\" sang \"Auto\""
33
+ },
34
+ {
35
+ "Question":"Nhà mất mạng thì điều khiển hệ thống BLE như nào?",
36
+ "Answer":"- Khi nhà bị mất mạng internet thì hệ thống đèn BLE vẫn có thể hoạt động bình thường. Đây là một ưu điểm vượt trội hơn so với hệ thống đèn wifi. Khi mất mạng internet: Người dùng vẫn có thể điều khiển hệ thống đèn thông qua bảng điều khiển cảnh bình thường. \n- Nếu muốn điều khiển hệ thống đèn trên điện thoại, a\/c sẽ chuyển sang trạng thái kết nối local. ( + A\/c thực hiện nhấn giữ nút config bên trái HC cho đến khi đèn led internet sáng lên. \n+ Khi đó HC sẽ tự động phát ra wifi của HC,người dùng kết nối với wifi đó.\n + Tiếp theo, người dùng mở ứng dụng lên, chọn vào mục “cài đặt” =>” Loại kết nối” => “ auto”.( Lưu ý: cần chờ khoảng 1 phút để app có thể kết nối tới HC) - Điều khiển bằng công tắc thường"
37
+ },
38
+ {
39
+ "Question":"Với hệ thống đèn bình thường mà muốn điều khiển qua hệ thống và không muốn thay đèn thì hệ thống mình cần lắp đặt thêm sản phẩm gì?",
40
+ "Answer":"- Để sử dụng a\/c cần 1 bộ Home controller (HC) - Bộ điều khiển trung tâm và bộ switch on\/off. Một bộ switch tải được tối đa 150W tải LED a\/c cần phải xem xét công suất của phần tải nối với bộ Switch"
41
+ },
42
+ {
43
+ "Question":"Nhà lắp đặt sản phẩm BLE nhưng có một số đèn trang trí không muốn thay nhưng muốn điều khiển cùng hệ thống thiết bị BLE thì làm như nào?",
44
+ "Answer":"- Với những đèn như đèn trùm trang trí,.. a\/c không muốn thay thế mà vấn điều khiển cùng hệ thống thì bên em có bộ Switch on\/off. Nếu đèn nhà anh chị sông suất dưới 150W thì hoàn toàn có thể sử dụng switch on\/off để điều khiển"
45
+ },
46
+ {
47
+ "Question":"Khách hàng mua thiết bị đèn BLE không mua HC được không? (Vì đèn sử dụng cài đặt nâng cao bảng cảnh, cảm biến không cần HC vẫn điều khiển được)",
48
+ "Answer":"- Tuy có thể điều khiển được, nhưng khi khách hàng muốn thay đổi kịch bản hay sửa thay thế hoặc thêm thiết bị BLE thì phải có HC mới thay đổi được."
49
+ },
50
+ {
51
+ "Question":"Hệ thống có thể kết nối điều khiển bao nhiêu thiết bị đèn?",
52
+ "Answer":"- Hiện tại, hệ thống có thể kết nối và điều khiển lên tới 200 thiết bị."
53
+ },
54
+ {
55
+ "Question":"Hệ thống có thể điều khiển bao nhiêu nhóm đèn cùng lúc?",
56
+ "Answer":"- Trong 1 kịch bản có thể điều khiển tối đa 10 nhóm thiết bị đầu cùng lúc và số đèn trong một nhóm không bị giới hạn"
57
+ },
58
+ {
59
+ "Question":"Tôi muốn điều khiển thiết bị đèn thì có những cách điều khiển nào?",
60
+ "Answer":"- Có 3 cách để điều khiển thiết bị: \n+ Sử dụng bảng điều khiển cảnh \n+ Điều khiển qua ứng dụng Rallismart trên điện thoại \n+ Điều khiển bằng giọng nói qua loa Google Home ( hoặc qua ứng dụng Google Home)"
61
+ },
62
+ {
63
+ "Question":"Tôi muốn chia sẻ tài khoản RalliSmart cho người khác thì làm như nào?",
64
+ "Answer":"- Để chia sẻ tài khoản điều khiển thiết bị, a\/c thao tác theo những bước như sau: \n+ A\/c mở ứng dụng Rallismart =>” cài đặt” =>” tài khoản” =>” chia sẻ”. \n+ Sau khi vào mục chia sẻ, nhập tài khoản của người bạn muốn chia sẻ. \nỞ đây, người dùng cho thể phân cấp người sử dụng và phân quyền giới hạn quyền với tài khoản mà bạn muốn chia sẻ( chỉ xem thông tin hoặc chỉ điều khiển 1 số thiết bị, nhóm, cảnh nhất định)"
65
+ },
66
+ {
67
+ "Question":"Tôi muốn chia sẻ tài khoản cho người khác nhưng không muốn cho tất cả các quyền điều khiển thì làm như nào?",
68
+ "Answer":"- A\/c mở ứng dụng Rallismart => cài đặt => tài khoản => chia sẻ. \n- Sau khi vào mục chia sẻ, chọn vào tài khoản mà bạn muốn phân quyền..Ở đây, a\/c cho thể phân cấp người sử dụng và phân quyền giới hạn quyền với tài khoản mà bạn muốn chia sẻ( chỉ xem thông tin hoặc chỉ điều khiển 1 số thiết bị, nhóm, cảnh nhất định)"
69
+ },
70
+ {
71
+ "Question":"HC không phát ra wifi?",
72
+ "Answer":"- Wifi do HC phát ra thường có tên dưới dạng RD_HCXXXX với 4X là 4 ký tự cuối của mã MAC trên HC. Để HC phát ra wifi thì bạn ấn giữ nút config (nút trên thân bên phải của HC) khoảng 2s cho đến khi đèn led trên vạch internet tren HC nháy sáng thì bạn bỏ tay ra."
73
+ },
74
+ {
75
+ "Question":"Công tắc cảnh có mấy loại?",
76
+ "Answer":"Có 2 loại: \n- Công tắc dùng nguồn AC: có loại mặt hình chữ nhật và hình vuông \n- loại này gắn tường dùng khu vực gần lối đi, công tắc\n - Công tắc dùng PIN DC: loại này sẽ thuận tiện cho a\/c khi có thể để bàn di chuyển giữa các khu vực dễ dàng"
77
+ },
78
+ {
79
+ "Question":"Chế độ kết nối auto và server khác nhau như thế nào?",
80
+ "Answer":"- Ở chế độ auto: Khi điều khiển hệ thống qua ứng dụng trên smartphone : lệnh điều khiển sẽ ưu tiên được gửi trực tiếp đến cho HC xử lý Trong Trường hợp điện thoại và HC cùng kết nối mạng Wifi, kết nối khác mạng Wifi lệnh điều khiển sẽ được gửi lên server sau đó server sẽ gửi lệnh xuống HC thông qua internet\n- Ở chế độ server: Khi điều khiển hệ thống qua ứng dụng trên smartphone : lệnh điều khiển sẽ được gửi đến server sau đó đẩy xuống HC qua mạng internet cho HC xử lý."
81
+ },
82
+ {
83
+ "Question":"Nhà tôi mới chuyển mạng wifi nên giờ làm sao để HC bắt được mạng wifi mới?",
84
+ "Answer":"- Các bước tương tự như cấu hình HC với mạng wifi: a\/c vào \"Cài đặt\" > \"Thông tin HC\" > \"Cài đặt\" > \"Cài đặt lại mạng\" > chờ 15s rồi ấn \"Tiếp tục\" > kết nối đến wifi do HC phát ra > Chọn mạng wifi muốn HC kết nối tới và điện mật khẩu > chờ HC tự cấu hình trong giây lát. \n- Hoặc A\/c Thực hiện cấu hình lại mạng theo HDSD đi kèm với thiết bị HC hoặc truy cập website của Rạng Đông để xem hướng dẫn chi tiết."
85
+ },
86
+ {
87
+ "Question":"Cách reset một số thiết bị BLE",
88
+ "Answer":"Cảm biến ánh sáng\/ chuyển động: thực hiện nhấn nút config nhanh 5 lần liên tiếp sau đó ấn giữ nút config 2s cho đến khi đèn sáng. Khi đó đèn sẽ sáng đỏ 5 lần liên tiếp báo hiệu reset thành công. Sau khi đèn led báo nháy 5 lần tiếp tục ấn giữ nút config cho đến khi led báo nháy sáng 1 lần."
89
+ },
90
+ {
91
+ "Question":"Nếu muốn đui đèn cảm biến\/ công tắc cảm biến hoạt động cả ngày lẫn đêm thì mức sáng như thế nào?",
92
+ "Answer":"Cài đặt mức sáng tối đa 2000lux, thì cảm biến ánh sáng sẽ mặc định điều kiện bật đèn khi có chuyển động"
93
+ },
94
+ {
95
+ "Question":"Đấu nối guồn điện cho đui đèn cảm biến và công tắc cảm biến có cần đúng sơ đồ đấu nối không?",
96
+ "Answer":"Bắt buộc đấu nối đúng các dây L ( nóng), N( nguội) theo như sơ đồ đấu nối sau thiết bị. Để đảm bảo an toàn điện và hoạt động của thiết bị"
97
+ },
98
+ {
99
+ "Question":"Đui đèn cảm biến\/ công tắc cảm biến có thể lắp đặt ngoài trời hay không?",
100
+ "Answer":"Có thể lắp ở các vị trí như mái hiên, có che chắn tránh nước mưa, ánh nắng chiếu trực tiếp vào thiết bị.Vì sẽ ảnh hưởng đến chất lượng và tính năng sản phẩm"
101
+ },
102
+ {
103
+ "Question":"Vì sao cảm biến không được nhạy? Lúc có người đến thì không sáng, hoặc người đến một lúc rồi mới sáng, hoặc người rời đi rồi mà không tắt? Lắp vô rồi bật điện lên cứ sáng mãi không chịu tắt, thử nhiều vị trí mà vẫn không tắt, không khác gì bóng thắp sáng bình thường",
104
+ "Answer":"- Cảm biến không nhạy có nhiều nguyên nhân, tuy nhiên 1 nguyên nhân hay gặp là do hướng lắp đặt và hướng di chuyển của người song song với nhau, dẫn tới tia cảm biển không cắt chuyển động. Dẫn tới không kích hoạt đèn khi có người di chuyển vào phạm vi cần cảm biến.\n - Trường hợp đã thử nhiều vị trí mà thiết bị vẫn không nhạy, vui lòng liên hệ RĐ để được bảo hành.\n - Thiết bị cảm biến hoạt trên điều kiện và đếm ngược: hiểu đơn giản khi đáp ứng các điều kiện về ánh sáng và có chuyển động thì sẽ kích hoạt bật đèn sau đó đếm ngược thời gian tắt, nếu trong thời gian đó không có chuyển động, đếm ngược hết thời gian đèn sẽ tắt, mặc dù có người ở đó.Đây là cảm biến nhận diện không phải là cảm biến hiện diện"
105
+ },
106
+ {
107
+ "Question":"Có đèn Bulb cảm biến không?",
108
+ "Answer":"Rạng Đông đang có 2 loại bulb cảm biến 1 Model: A60.PIR\/9W Đèn tích hợp cảm biến hồng ngoại PIR và cảm biến ánh sáng. Khi ánh sáng môi trường < 80 lux và phát hiện có chuyển động trong vùng hoạt động của cám biến, đèn tự động bật sáng. Sau 60s nếu không phát hiện chuyển động, đèn tự động tắt. Khi ánh sáng môi trường > 80 lux, đèn sẽ không tự động bật sáng khi phát hiện có chuyển động trong vùng hoạt động của cảm biến. 2.Bóng đèn LED BULB Cảm biến 9W Model: A60.RAD 9W Tích hợp khả năng cảm biến rada."
109
+ },
110
+ {
111
+ "Question":"Đèn LED Bulb cấu tạo như thế nào?",
112
+ "Answer":"Đèn LED bulb gồm: 1. Đuôi cài ( E27 là chuẩn phổ biến) 2.Heatsink ( phần vỏ tản nhiệt) nhôm nhựa hoặc nhôm đúc tùy loại. 3. Mạch PCB (LED + driver) với driver liền hoặc rời. 4.Cover ( dạng tròn hoặc Trụ)"
113
+ },
114
+ {
115
+ "Question":"Đèn Bulb hay bị rơi cover đèn khi sử dụng?",
116
+ "Answer":"Nguyên nhân chính của việc rớt cover đèn do khách hàng sử dụng trong chao chóa, đèn om nhiệt làm lão hóa keo dán, gây nứt heatsink và rớt cover ( chụp) đèn.Khuyến cáo về yêu cầu sử dụng cho khách hàng."
117
+ },
118
+ {
119
+ "Question":"Bóng đèn LED bulb có cảm biến Rada sáng mãi không tắt? Hoặc lắp trong phòng nhưng đi phía ngoài hành lang vẫn sáng? Nguyên nhân?",
120
+ "Answer":"Đèn Bulb sử dụng cảm biến Rada có độ nhạy cao, phạm vi quét lớn, có khả năng xuyên tường hoặc vật liệu mỏng.Không phân biệt người vật, nên trường hợp này, cần tìm hiểu kĩ vị trí lắp đặt của KH.Vì khả năng vẫn có chuyển động ( quạt hút, cành cây,...) trong phạm vi quét của cảm biến nên đèn duy trì trạng thái không tắt."
121
+ },
122
+ {
123
+ "Question":"Cách lựa chọn thay thế đèn compact Truyền thống sang đèn LED Bulb như thế nào?",
124
+ "Answer":"Khi khách hàng muốn thay thế đèn compact sang đèn LED bulb, cần xem công suất đèn cũ là bao nhiêu W? sau đó giảm đi 50% thì sẽ lựa chọn được đèn LED bulb thay thế tương đương."
125
+ },
126
+ {
127
+ "Question":"Rạng Đông có đèn kẹp bình không?",
128
+ "Answer":"Rạng Đông có 1 số dòng led Bulb kẹp bình như sau: Model: LED A60N1 12-24VDC 9W Model: LED TR70N1 12-24VDC\/12W Model: A60N1\/9W.DCV2 Model: TR70N1\/12W.DCV2"
129
+ },
130
+ {
131
+ "Question":"Đèn bulb kẹp bình Rạng Đông có thể sử dụng dùng 24V không?",
132
+ "Answer":"Các loại đèn kẹp bình DC Rạng đông có thể sử dụng bình có điện áp 1 chiều từ 12-24V, Tùy theo công bố dải ��iện áp của sản phẩm trên bao bì, khách hàng lựa chọn bình ắc quy phù hợp,nếu sử dụng bình có điện áp lớn hoặc nhỏ hơn dải điện áp công bố sẽ gây hư hỏng đèn và không được bảo hành của NSX"
133
+ },
134
+ {
135
+ "Question":"Đèn kẹp bình của Rạng Đông có sử dụng cho điện năng lượng mặt trời được không?",
136
+ "Answer":"Điện năng lượng mặt trời dùng để thắp sáng cần được lưu trữ vào các thiết bị lưu trữ như pin hoặc Ắc quy, nếu đảm bảo các thông số về dải điện áp hoạt động cho phép của đèn thì hoàn toàn có thể sủ dụng được. Tránh sử dụng điện NLMT đã converter qua điện AC sử dụng cho đèn Kẹp bình"
137
+ },
138
+ {
139
+ "Question":"Rạng Đông có đèn bulb nào chống ẩm không?",
140
+ "Answer":"Hiện tại các dòng đèn bulb dùng cho chiếu sáng dân dụng đều chỉ đạt IP 20 nên không đáp ứng được tính năng chống ẩm.Quý khách có thể sử dụng các loại đèn có đáp ứng tính năng chống ẩm như đèn Pha, đèn Highbay HB03, Bộ tube led chống ẩm..."
141
+ },
142
+ {
143
+ "Question":"Đèn LED bulb Rạng Đông có sử dụng với Dimmer được không?",
144
+ "Answer":"Tất cả các dòng bóng LED bulb dùng trong chiếu sáng dân dụng của Rạng đông đều không được sử dụng với dimmer được, nếu sử dụng sẽ gây hư hỏng giảm tuổi thọ và không được bảo hành bởi NSX."
145
+ },
146
+ {
147
+ "Question":"Rạng Đông có đèn bulb RGB hay không?",
148
+ "Answer":"- Khách hàng có nhu cầu có thể tham khảo các dòng LED bulb smart của Rạng đông Model: LED A60 RGBW\/9W.WF Model: A60.BLE.RGBCW\/9W - Đèn có khả năng điều khiển từ xa,thông minh qua app điẹn thoại với các tính năng :Tắt mở,Hẹn giờ tắt mở dimming, CCT, đổi màu RGB theo nhu cầu."
149
+ },
150
+ {
151
+ "Question":"Đèn LED bulb cảm biến có công suất lớn không?",
152
+ "Answer":"- Đèn bulb cảm biến rạng đông chỉ có 2 cấp công suất là 9 và 15W, Nếu khách có nhu cầu sử dụng chức năng cảm biến cho đèn công suất có thể kết hợp bóng led bulb công suất cao cùng - Có công tắc cảm biến: Model: CT01.PIR 300W - Và đuôi đèn cảm biến: Model: ĐCB01.PIR E27\/300W"
153
+ },
154
+ {
155
+ "Question":"Đèn LED bulb lắp trong chao đèn âm trần bị chớp tắt, nguyên nhân?",
156
+ "Answer":"- Khuyến cáo của sản phẩm đèn led bulb là KH không sử dụng trong chao chụp vì sẽ gây om nhiệt ( nhiệt khi đèn hoạt động không tản đi được) - Khi om nhiệt sẽ làm hư hỏng chip LED làm giảm độ sáng, hư hỏng các linh kiện, gây nên hiện tượng đèn mờ, đèn chớp tắt hoặc không sáng. 1 số đèn để nguội bật lại thì không chớp nữa là do trong mạch có linh kiện cảnh báo quá nhiệt cho người sử dụng .Khi để nguội sử dụng lại thì lại bị quá nhiệt nên đèn chớp để cảnh báo."
157
+ },
158
+ {
159
+ "Question":"Đèn LED Bulb 60W lắp trong chao chụp có đường kính 400mm, sử dụng khoảng 4 tiếng, đèn bị chớp, tắt đi bật lại thì không chớp, nhưng sử dụng thì bị chớp?",
160
+ "Answer":"- Khuyến cáo của sản phẩm đèn led bulb là KH không sử dụng trong chao chụp vì sẽ gây om nhiệt ( nhiệt khi đèn hoạt động không tản đi được) - Khi om nhiệt sẽ làm hư hỏng chip LED làm giảm độ sáng, hư hỏng các linh kiện, gây nên hiện tượng đèn mờ, đèn chớp tắt hoặc không sáng. 1 số đèn để nguội bật lại thì không chớp nữa là do trong mạch có linh kiện cảnh báo quá nhiệt cho người sử dụng .Khi để nguội sử dụng lại thì lại bị quá nhiệt nên đèn chớp để cảnh báo."
161
+ },
162
+ {
163
+ "Question":"Đền LED có thể lắp trong chụp đèn gắn tường có kính IP65 không?",
164
+ "Answer":"- Khuyến cáo của sản phẩm đèn led bulb là KH không sử dụng trong chao chụp vì sẽ gây om nhiệt ( nhiệt khi đèn hoạt động không tản đi được) - Khi om nhiệt sẽ làm hư hỏng chip LED làm giảm độ sáng, hư hỏng các linh kiện, gây nên hiện tượng đèn mờ, đèn chớp tắt hoặc không sáng. 1 số đèn để nguội bật lại thì không chớp nữa là do trong mạch có linh kiện cảnh báo quá nhiệt cho người sử dụng .Khi để nguội sử dụng lại thì lại bị quá nhiệt nên đèn chớp để cảnh báo."
165
+ },
166
+ {
167
+ "Question":"Đèn LED bulb có gây nhiễu các thiết bị liên lạc không?",
168
+ "Answer":"Các sản phẩm LED bulb Rạng đông đảm bảo tính năng chống nhiễu EMC , cơ bản không gây nhiễu lên các thiết bị khác.Tuy nhiên nếu sử dụng trên tàu cá cần lựa chọn bóng led Bulb chuyên dụng chống nhiễu cao như: - Bóng đèn LED BULB chuyên dụng cho tàu cá 30w Model: TR100.TC\/30W - Bóng đèn LED BULB chuyên dụng cho tàu cá 40w Model: TR120.TC\/40W"
169
+ },
170
+ {
171
+ "Question":"Đèn LEB bulb có tản nhiệt nhôm đúc và nhôm nhựa loại nào tốt hơn?",
172
+ "Answer":"Mỗi sản phẩm đều được nghiên cứu tính toán về khả năng tản nhiệt kĩ càng, Nhôm đúc hay nhôm nhựa đều đảm bảo các tính năng của sản phẩm như công bố của nhà sản xuất về tuổi thọ chất lượng.Khách hàng có thể lựa chọn theo nhu cầu cá nhân."
173
+ },
174
+ {
175
+ "Question":"Chính sách bảo hành của Rạng Đông như thế nào?",
176
+ "Answer":"Rạng Đông áp dụng chính sách bảo hành cho tất cả các sản phẩm mua tại hệ thống đại lý trên toàn quốc và trang web chính thức. Thời gian bảo hành tùy thuộc vào từng dòng sản phẩm, ví dụ:\nDòng sản phẩm đèn LED (bao gồm: Đèn LED âm trần downlight, Đèn LED panel, đèn LED bulb, Bóng đèn LED TUBE, Bộ đèn LED Tube, Đèn LED highbay, lowbay.đèn LED ỐP Trần, đèn LED chiếu pha, đèn LED gương, Đèn LED chiếu sáng khẩn cấp: 24 tháng\nDòng sản phẩm phích nước, Ấm siêu tốc: 6 tháng\nDòng sản phẩm đèn LED chiếu sáng đường: 5 năm\nĐèn bàn học LED: 24 tháng\nĐèn LED Năng lượng mặt trời: 24 tháng\nDòng Đèn LED Smart BLE, WIFI, RF: 24 Tháng"
177
+ },
178
+ {
179
+ "Question":"Địa điểm bảo hành sản phẩm của Rạng Đông ở đâu?",
180
+ "Answer":"Rạng Đông có trụ sở chính tại số 87 – 89, phố Hạ Đình, Phường Thanh Xuân Trung, Quận Thanh Xuân, Hà Nội, cùng với 7 chi nhánh tại Đà Nẵng, Nha Trang, Tây Nguyên, Biên Hòa, TP.HCM, Cần Thơ và Tiền Giang."
181
+ },
182
+ {
183
+ "Question":"Các sản phẩm đèn LED của Rạng Đông có những loại nào?",
184
+ "Answer":"Rạng Đông cung cấp đa dạng các sản phẩm đèn LED như:\n'- Đèn LED âm trần​\n- Đèn LED ốp nổiĐèn LED panel​\n- Đèn LED tuýp\n- Đèn LED chiếu pha\n- Đèn đường LED\n- Đèn LED nhà xưởng\n- Đèn LED khẩn cấp chỉ dẫn exit​\n- Đèn LED bulb"
185
+ },
186
+ {
187
+ "Question":"Chất lượng sản phẩm đèn LED Rạng Đông được đảm bảo như thế nào?",
188
+ "Answer":"Rạng Đông sử dụng chip LED Samsung thế hệ mới cho tất cả sản phẩm, đạt tiêu chuẩn của Hội Kỹ thuật Chiếu sáng Hoa Kỳ. Sản phẩm có hiệu suất phát quang 100 lm\/W, chỉ số hoàn màu >80, tuổi thọ cao và tiết kiệm điện năng."
189
+ },
190
+ {
191
+ "Question":"Rạng Đông có cung cấp dịch vụ tư vấn kỹ thuật và thiết kế chiếu sáng không?",
192
+ "Answer":"Có, Rạng Đông có phòng thiết kế chuyên tư vấn kỹ thuật, lên phương án chiếu sáng và tính toán độ lux chiếu sáng phù hợp cho các dự án nội và ngoại thất."
193
+ },
194
+ {
195
+ "Question":"Làm thế nào để mua sản phẩm Rạng Đông chính hãng?",
196
+ "Answer":"Bạn có thể mua sản phẩm Rạng Đông chính hãng tại các nhà phân phối và đại lý trên toàn quốc, hoặc truy cập trang web chính thức của Rạng Đông để đặt hàng trực tuyến."
197
+ },
198
+ {
199
+ "Question":"Rạng Đông có hỗ trợ giao hàng toàn quốc không?",
200
+ "Answer":"Có, Rạng Đông có hơn 60 nhà phân phối và đại lý trên toàn quốc, đảm bảo sản phẩm được giao đến tay người tiêu dùng một cách nhanh chóng và tiện lợi."
201
+ },
202
+ {
203
+ "Question":"Làm thế nào để liên hệ với Rạng Đông khi cần hỗ trợ?",
204
+ "Answer":"Bạn có thể liên hệ với Rạng Đông qua tổng đài 1900 2098 hoặc hotline 0898 109 810 để được nhân viên tư vấn hỗ trợ nhanh chóng và kịp thời."
205
+ },
206
+ {
207
+ "Question":"Rạng Đông có cung cấp sản phẩm phích nước truyền thống không?",
208
+ "Answer":"Có, ngoài các sản phẩm chiếu sáng, Rạng Đông còn phân phối sản phẩm phích nước truyền thống, đáp ứng nhu cầu đa dạng của khách hàng."
209
+ },
210
+ {
211
+ "Question":"Làm thế nào để đặt hàng trên trang web Rạng Đông Store?",
212
+ "Answer":"Bạn có thể đặt hàng theo các bước sau:​\nBước 1: Truy cập trang web Rạng Đông Store và chọn giao diện DÂN DỤNG hoặc CHUYÊN DỤNG.\nBước 2: Tìm sản phẩm cần mua thông qua thanh menu hoặc thanh tìm kiếm.\nBước 3: Chọn sản phẩm, điều chỉnh thông số và số lượng, sau đó thêm vào giỏ hàng.\nBước 4: Kiểm tra giỏ hàng và tiến hành thanh toán.\nBước 5: Cung cấp thông tin giao hàng và hoàn tất đơn hàng.\nChi tiết bạn có thể tham khảo tại : https:\/\/rangdongstore.vn\/chinh-sach\/huong-dan-dat-hang"
213
+ },
214
+ {
215
+ "Question":"Phương thức thanh toán nào được chấp nhận trên Rạng Đông Store?",
216
+ "Answer":"Rạng Đông Store chấp nhận các phương thức thanh toán như thanh toán khi nhận hàng (COD), chuyển khoản ngân hàng và thanh toán trực tuyến qua các cổng thanh toán được tích hợp trên trang web"
217
+ },
218
+ {
219
+ "Question":"Làm thế nào để hủy hoặc thay đổi đơn hàng sau khi đã đặt?",
220
+ "Answer":"Để hủy hoặc thay đổi đơn hàng, bạn nên liên hệ ngay với bộ phận chăm sóc khách hàng của Rạng Đông Store qua tổng đài 1900 2098 hoặc hotline 0898 109 810 để được hỗ trợ kịp thời"
221
+ },
222
+ {
223
+ "Question":"Tôi có thể gặp những sự cố gì khi đặt hàng trực tuyến và cách khắc phục?",
224
+ "Answer":"Một số sự cố phổ biến khi đặt hàng trực tuyến bao gồm:​\n- Không thêm được sản phẩm vào giỏ hàng: Kiểm tra kết nối internet hoặc thử lại sau.\n- Không nhận được email xác nhận đơn hàng: Kiểm tra thư mục spam hoặc liên hệ bộ phận chăm sóc khách hàng.\n- Thanh toán không thành công: Kiểm tra thông tin thanh toán hoặc thử phương thức khác."
225
+ },
226
+ {
227
+ "Question":"Làm thế nào để kiểm tra tình trạng đơn hàng đã đặt?",
228
+ "Answer":"Bạn có thể kiểm tra tình trạng đơn hàng bằng cách đăng nhập vào tài khoản trên Rạng Đông Store và truy cập phần \"Đơn hàng của tôi\". Nếu cần hỗ trợ thêm, liên hệ tổng đài 1900 2098 hoặc hotline 0898 109 810.​"
229
+ },
230
+ {
231
+ "Question":"Làm thế nào để phân biệt sản phẩm Rạng Đông chính hãng và hàng giả?",
232
+ "Answer":"Để đảm bảo mua được sản phẩm Rạng Đông chính hãng, bạn nên:​\n- Kiểm tra tem hologram trên sản phẩm.\n- Mua hàng tại các cửa hàng uy tín, đại lý chính thức hoặc trực tiếp từ nhà sản xuất."
233
+ },
234
+ {
235
+ "Question":"Làm thế nào để liên hệ với bộ phận chăm sóc khách hàng của Rạng Đông Store?",
236
+ "Answer":"Bạn có thể liên hệ với bộ phận chăm sóc khách hàng qua:​\n- Tổng đài: 1900 2098\n- Hotline: 0898 109 810\n- Email: [email protected] Thời gian phục vụ: 7h30 - 17h30."
237
+ },
238
+ {
239
+ "Question":"Rạng Đông có cung cấp giải pháp chiếu sáng cho nông nghiệp công nghệ cao không?",
240
+ "Answer":"Có, Rạng Đông cung cấp các giải pháp chiếu sáng chuyên dụng cho nông nghiệp công nghệ cao, bao gồm chiếu sáng cho cây hoa cúc, cây thanh long, ngư nghiệp và nuôi cấy mô."
241
+ },
242
+ {
243
+ "Question":"Rạng Đông có sản xuất các sản phẩm chiếu sáng cho văn phòng và tòa nhà không?",
244
+ "Answer":"Có, Rạng Đông cung cấp các giải pháp chiếu sáng chuyên dụng cho văn phòng và tòa nhà, giúp tạo môi trường làm việc hiệu quả và tiết kiệm năng lượng."
245
+ },
246
+ {
247
+ "Question":"Rạng Đông có các sản phẩm chiếu sáng sử dụng năng lượng mặt trời không?",
248
+ "Answer":"Có, Rạng Đông cung cấp các sản phẩm chiếu sáng sử dụng năng lượng mặt trời, bao gồm đèn đường năng lượng mặt trời và hệ thống điện năng lượng mặt trời áp mái."
249
+ },
250
+ {
251
+ "Question":"Làm thế nào để phân biệt bóng đèn Rạng Đông thật và giả?",
252
+ "Answer":"Để phân biệt bóng đèn Rạng Đông thật và giả, bạn có thể kiểm tra nhãn hiệu và logo trên sản phẩm, màu sắc bao bì, và tem hologram. Sản phẩm chính hãng thường có nhãn hiệu và logo rõ ràng, bao bì màu xanh lá cây và đỏ đặc trưng, cùng tem hologram trên bao bì hoặc sản phẩm."
253
+ },
254
+ {
255
+ "Question":"Rạng Đông có cung cấp các sản phẩm chiếu sáng cho nhà xưởng không?",
256
+ "Answer":"Có, Rạng Đông cung cấp các giải pháp chiếu sáng chuyên dụng cho nhà xưởng, giúp tăng hiệu suất công việc và tiết kiệm năng lượng."
257
+ },
258
+ {
259
+ "Question":"Rạng Đông có các sản phẩm chiếu sáng cho ngư nghiệp không?",
260
+ "Answer":"Có, Rạng Đông cung cấp các giải pháp chiếu sáng chuyên dụng cho ngư nghiệp, hỗ trợ hoạt động đánh bắt hiệu quả hơn."
261
+ },
262
+ {
263
+ "Question":"Rạng Đông có sản xuất các thiết bị điện khác ngoài đèn chiếu sáng không?",
264
+ "Answer":"Có, Rạng Đông sản xuất và cung cấp các thiết bị điện khác như aptomat, công tắc, ổ cắm điện, đèn pin, vợt bắt muỗi, đèn bắt muỗi và côn trùng, đèn bàn học bảo vệ thị lực, và các thiết bị cảm biến."
265
+ },
266
+ {
267
+ "Question":"Làm thế nào để tôi có thể gửi khiếu nại về sản phẩm hoặc dịch vụ của Rạng Đông?",
268
+ "Answer":"Bạn có thể gửi khiếu nại qua các kênh sau:​\n- Email: [email protected]\n- Hotline: 1900 2098 hoặc 0898 109 810\n- Địa chỉ: Số 87 - 89 Hạ Đình, Thanh Xuân, Hà Nội"
269
+ },
270
+ {
271
+ "Question":"Thời gian phản hồi khiếu nại của Rạng Đông là bao lâu?",
272
+ "Answer":"Bộ phận Chăm sóc khách hàng của Rạng Đông sẽ phản hồi trong vòng 5 ngày làm việc kể từ khi tiếp nhận khiếu nại.​"
273
+ },
274
+ {
275
+ "Question":"Tôi cần cung cấp thông tin gì khi gửi khiếu nại?",
276
+ "Answer":"Bạn cần cung cấp thông tin chi tiết về vấn đề gặp phải và các bằng chứng liên quan để Rạng Đông xác minh và giải quyết."
277
+ },
278
+ {
279
+ "Question":"Nếu khiếu nại của tôi không được giải quyết thỏa đáng, tôi có thể làm gì tiếp theo?",
280
+ "Answer":"Nếu Rạng Đông không thể giải quyết khiếu nại trong phạm vi thẩm quyền, vụ việc sẽ được chuyển đến cơ quan Nhà nước có thẩm quyền theo quy định pháp luật.​"
281
+ },
282
+ {
283
+ "Question":"Rạng Đông có cam kết bảo vệ thông tin cá nhân của khách hàng khi xử lý khiếu nại không?",
284
+ "Answer":"Có, Rạng Đông cam kết bảo mật thông tin cá nhân của khách hàng và chỉ sử dụng cho mục đích giải quyết khiếu nại."
285
+ },
286
+ {
287
+ "Question":"Thời gian lưu trữ thông tin cá nhân liên quan đến khiếu nại là bao lâu?",
288
+ "Answer":"Thông tin cá nhân sẽ được lưu trữ cho đến khi có yêu cầu hủy bỏ từ khách hàng hoặc theo quy định của pháp luật.​"
289
+ },
290
+ {
291
+ "Question":"Tôi có thể khiếu nại về việc vi phạm bảo mật thông tin cá nhân không?",
292
+ "Answer":"Có, bạn có quyền gửi khiếu nại liên quan đến việc bảo mật thông tin cá nhân. Rạng Đông sẽ xác minh và xử lý kịp thời nếu phản ánh là chính xác"
293
+ },
294
+ {
295
+ "Question":"Rạng Đông áp dụng các biện pháp nào đối với hành vi vi phạm điều khoản sử dụng?",
296
+ "Answer":"Rạng Đông có thể đình chỉ hoặc chấm dứt tài khoản, thu hồi tiền\/tài sản, áp dụng biện pháp dân sự hoặc cáo buộc hình sự đối với hành vi vi phạm.​"
297
+ },
298
+ {
299
+ "Question":"Rạng Đông có hỗ trợ giải quyết tranh chấp thông qua thương lượng hoặc hòa giải không?",
300
+ "Answer":"Có, Rạng Đông ưu tiên giải quyết tranh chấp thông qua thương lượng, hòa giải trước khi áp dụng các biện pháp pháp lý khác."
301
+ },
302
+ {
303
+ "Question":"Tôi có thể tìm thông tin chi tiết về chính sách giải quyết khiếu nại của Rạng Đông ở đâu?",
304
+ "Answer":"Bạn có thể tham khảo chi tiết chính sách giải quyết khiếu nại trên trang web chính thức của Rạng Đông tại: https:\/\/rangdongstore.vn\/chinh-sach\/chinh-sach-giai-quyet-don-khieu-nai"
305
+ }
306
+ ]
preprocessing_data.ipynb CHANGED
@@ -2,7 +2,7 @@
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
- "execution_count": 2,
6
  "id": "06013a58",
7
  "metadata": {},
8
  "outputs": [
@@ -10,80 +10,277 @@
10
  "name": "stderr",
11
  "output_type": "stream",
12
  "text": [
13
- "c:\\Users\\Admin\\anaconda3\\envs\\chatbot_py310\\lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
14
  " from .autonotebook import tqdm as notebook_tqdm\n"
15
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  },
17
  {
18
  "name": "stdout",
19
  "output_type": "stream",
20
  "text": [
21
- "WARNING:tensorflow:From c:\\Users\\Admin\\anaconda3\\envs\\chatbot_py310\\lib\\site-packages\\tf_keras\\src\\losses.py:2976: The name tf.losses.sparse_softmax_cross_entropy is deprecated. Please use tf.compat.v1.losses.sparse_softmax_cross_entropy instead.\n",
22
- "\n"
23
  ]
24
  }
25
  ],
26
  "source": [
 
 
 
 
 
 
27
  "from config import EMBEDDING_MODEL\n",
28
- "from langchain_huggingface import HuggingFaceEmbeddings\n",
29
  "\n",
30
- "embedding_model = HuggingFaceEmbeddings(model_name = EMBEDDING_MODEL)"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  ]
32
  },
33
  {
34
  "cell_type": "code",
35
- "execution_count": 5,
36
- "id": "3a2ac101",
37
  "metadata": {},
38
  "outputs": [],
39
  "source": [
40
- "sentence_1 = \"Giới thiệu về Rạng Đông\"\n",
41
- "sentence_2 = \"Cho tôi thông tin về Rạng Đông\"\n",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  "\n",
43
- "embedding_1 = embedding_model.embed_query(sentence_1)\n",
44
- "embedding_2 = embedding_model.embed_query(sentence_2)\n"
 
45
  ]
46
  },
47
  {
48
  "cell_type": "code",
49
- "execution_count": 6,
50
- "id": "50f111d8",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  "metadata": {},
52
  "outputs": [
 
 
 
 
 
 
 
 
53
  {
54
  "name": "stdout",
55
  "output_type": "stream",
56
  "text": [
57
- "Độ tương đồng giữa hai câu: 0.6130\n"
 
 
 
 
58
  ]
59
  }
60
  ],
61
  "source": [
62
- "from sklearn.metrics.pairwise import cosine_similarity\n",
63
- "import numpy as np\n",
64
- "\n",
65
- "similarity = cosine_similarity(\n",
66
- " [embedding_1],\n",
67
- " [embedding_2]\n",
68
- ")[0][0]\n",
69
- "\n",
70
- "print(f\"Độ tương đồng giữa hai câu: {similarity:.4f}\")\n"
71
  ]
72
  },
73
  {
74
  "cell_type": "code",
75
- "execution_count": 8,
76
- "id": "759170ce",
77
  "metadata": {},
78
  "outputs": [],
79
- "source": [
80
- "embedding_model2 = HuggingFaceEmbeddings(model_name =\"keepitreal/vietnamese-sbert\")"
81
- ]
82
  },
83
  {
84
  "cell_type": "code",
85
  "execution_count": null,
86
- "id": "0907798e",
87
  "metadata": {},
88
  "outputs": [],
89
  "source": []
 
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
+ "execution_count": 1,
6
  "id": "06013a58",
7
  "metadata": {},
8
  "outputs": [
 
10
  "name": "stderr",
11
  "output_type": "stream",
12
  "text": [
13
+ "/opt/anaconda3/envs/chatbot_env/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
14
  " from .autonotebook import tqdm as notebook_tqdm\n"
15
  ]
16
+ }
17
+ ],
18
+ "source": [
19
+ "from config import EMBEDDING_MODEL\n",
20
+ "from langchain_huggingface import HuggingFaceEmbeddings\n",
21
+ "\n",
22
+ "embedding_model = HuggingFaceEmbeddings(model_name = EMBEDDING_MODEL)"
23
+ ]
24
+ },
25
+ {
26
+ "cell_type": "code",
27
+ "execution_count": 26,
28
+ "id": "922bf9f7",
29
+ "metadata": {},
30
+ "outputs": [
31
+ {
32
+ "name": "stderr",
33
+ "output_type": "stream",
34
+ "text": [
35
+ "/var/folders/16/yn17n1916z32xtfrqrq39zj00000gn/T/ipykernel_82857/248899337.py:25: DeprecationWarning: `recreate_collection` method is deprecated and will be removed in the future. Use `collection_exists` to check collection existence and `create_collection` instead.\n",
36
+ " client.recreate_collection(\n"
37
+ ]
38
  },
39
  {
40
  "name": "stdout",
41
  "output_type": "stream",
42
  "text": [
43
+ " Đã upload toàn bộ câu hỏi từ FAQ.json vào Qdrant.\n"
 
44
  ]
45
  }
46
  ],
47
  "source": [
48
+ "import os\n",
49
+ "import json\n",
50
+ "from dotenv import load_dotenv\n",
51
+ "from qdrant_client import QdrantClient\n",
52
+ "from qdrant_client.http.models import Distance, VectorParams, PointStruct\n",
53
+ "from langchain.embeddings import HuggingFaceEmbeddings\n",
54
  "from config import EMBEDDING_MODEL\n",
 
55
  "\n",
56
+ "load_dotenv()\n",
57
+ "QDRANT_HOST = os.getenv(\"QDRANT_HOST\")\n",
58
+ "QDRANT_API_KEY = os.getenv(\"QDRANT_API_KEY\")\n",
59
+ "\n",
60
+ "embedding_model = HuggingFaceEmbeddings(model_name = EMBEDDING_MODEL)\n",
61
+ "\n",
62
+ "\n",
63
+ "client = QdrantClient(\n",
64
+ " url=QDRANT_HOST,\n",
65
+ " api_key=QDRANT_API_KEY\n",
66
+ ")\n",
67
+ "\n",
68
+ "client.recreate_collection(\n",
69
+ " collection_name=\"faq_collection\",\n",
70
+ " vectors_config=VectorParams(\n",
71
+ " size= 384,\n",
72
+ " distance=Distance.COSINE\n",
73
+ " )\n",
74
+ ")\n",
75
+ "\n",
76
+ "with open(\"data/FAQ.json\", \"r\", encoding=\"utf-8\") as f:\n",
77
+ " faqs = json.load(f)\n",
78
+ "\n",
79
+ "points = []\n",
80
+ "for idx, faq in enumerate(faqs):\n",
81
+ " vec = embedding_model.embed_query(faq[\"Question\"])\n",
82
+ " points.append(PointStruct(\n",
83
+ " id=idx,\n",
84
+ " vector=vec,\n",
85
+ " payload={\"Câu hỏi\": faq[\"Question\"], \"Câu trả lời\": faq[\"Answer\"]}\n",
86
+ " ))\n",
87
+ "\n",
88
+ "client.upsert(\n",
89
+ " collection_name=\"faq_collection\",\n",
90
+ " points=points\n",
91
+ ")\n",
92
+ "\n",
93
+ "print(\"✅ Đã upload toàn bộ câu hỏi từ FAQ.json vào Qdrant.\")\n"
94
+ ]
95
+ },
96
+ {
97
+ "cell_type": "code",
98
+ "execution_count": 34,
99
+ "id": "6a7a4e49",
100
+ "metadata": {},
101
+ "outputs": [
102
+ {
103
+ "name": "stderr",
104
+ "output_type": "stream",
105
+ "text": [
106
+ "/var/folders/16/yn17n1916z32xtfrqrq39zj00000gn/T/ipykernel_82857/1372710697.py:4: DeprecationWarning: `search` method is deprecated and will be removed in the future. Use `query_points` instead.\n",
107
+ " results = client.search(\n"
108
+ ]
109
+ },
110
+ {
111
+ "name": "stdout",
112
+ "output_type": "stream",
113
+ "text": [
114
+ "❓ Đèn bulb kẹp bình Rạng Đông có thể sử dụng dùng 24V không?\n",
115
+ "💡 Các loại đèn kẹp bình DC Rạng đông có thể sử dụng bình có điện áp 1 chiều từ 12-24V, Tùy theo công bố dải điện áp của sản phẩm trên bao bì, khách hàng lựa chọn bình ắc quy phù hợp,nếu sử dụng bình có điện áp lớn hoặc nhỏ hơn dải điện áp công bố sẽ gây hư hỏng đèn và không được bảo hành của NSX\n",
116
+ "📈 Score: 0.80096316\n",
117
+ "-----\n",
118
+ "❓ Rạng Đông có đèn kẹp bình không?\n",
119
+ "💡 Rạng Đông có 1 số dòng led Bulb kẹp bình như sau: Model: LED A60N1 12-24VDC 9W Model: LED TR70N1 12-24VDC/12W Model: A60N1/9W.DCV2 Model: TR70N1/12W.DCV2\n",
120
+ "📈 Score: 0.73507816\n",
121
+ "-----\n",
122
+ "❓ Đền LED có thể lắp trong chụp đèn gắn tường có kính IP65 không?\n",
123
+ "💡 - Khuyến cáo của sản phẩm đèn led bulb là KH không sử dụng trong chao chụp vì sẽ gây om nhiệt ( nhiệt khi đèn hoạt động không tản đi được) - Khi om nhiệt sẽ làm hư hỏng chip LED làm giảm độ sáng, hư hỏng các linh kiện, gây nên hiện tượng đèn mờ, đèn chớp tắt hoặc không sáng. 1 số đèn để nguội bật lại thì không chớp nữa là do trong mạch có linh kiện cảnh báo quá nhiệt cho người sử dụng .Khi để nguội sử dụng lại thì lại bị quá nhiệt nên đèn chớp để cảnh báo.\n",
124
+ "📈 Score: 0.702726\n",
125
+ "-----\n"
126
+ ]
127
+ }
128
+ ],
129
+ "source": [
130
+ "query = \"Đèn LED kẹp bình rạng ĐÔng tôi dùng loại 24V được không\"\n",
131
+ "query_vector = embedding_model.embed_query(query)\n",
132
+ "\n",
133
+ "results = client.search(\n",
134
+ " collection_name=\"faq_collection\",\n",
135
+ " query_vector=query_vector,\n",
136
+ " limit=3\n",
137
+ ")\n",
138
+ "\n",
139
+ "for res in results:\n",
140
+ " print(\"❓\", res.payload['Câu hỏi'])\n",
141
+ " print(\"💡\", res.payload['Câu trả lời'])\n",
142
+ " print(\"📈 Score:\", res.score)\n",
143
+ " print(\"-----\")\n"
144
+ ]
145
+ },
146
+ {
147
+ "cell_type": "code",
148
+ "execution_count": 36,
149
+ "id": "a028f015",
150
+ "metadata": {},
151
+ "outputs": [],
152
+ "source": [
153
+ "from chatbot.llm import gemini_llm "
154
  ]
155
  },
156
  {
157
  "cell_type": "code",
158
+ "execution_count": 54,
159
+ "id": "c80c4e25",
160
  "metadata": {},
161
  "outputs": [],
162
  "source": [
163
+ "def retrieve_top_k_faqs(user_question, k=5):\n",
164
+ " query_vector = embedding_model.embed_query(user_question)\n",
165
+ " search_results = client.search(\n",
166
+ " collection_name=\"faq_collection\",\n",
167
+ " query_vector=query_vector,\n",
168
+ " limit=k\n",
169
+ " )\n",
170
+ " return [\n",
171
+ " {\n",
172
+ " \"question\": hit.payload[\"Câu hỏi\"],\n",
173
+ " \"answer\": hit.payload[\"Câu trả lời\"],\n",
174
+ " \"score\": hit.score\n",
175
+ " }\n",
176
+ " for hit in search_results\n",
177
+ " ]\n"
178
+ ]
179
+ },
180
+ {
181
+ "cell_type": "code",
182
+ "execution_count": 69,
183
+ "id": "7a621084",
184
+ "metadata": {},
185
+ "outputs": [],
186
+ "source": [
187
+ "def find_best_match_llm(user_question, candidates):\n",
188
+ " options = \"\\n\".join(\n",
189
+ " f\"{i+1}. Q: {c['question']}\\n A: {c['answer']}\"\n",
190
+ " for i, c in enumerate(candidates)\n",
191
+ " )\n",
192
+ "\n",
193
+ " prompt = (\n",
194
+ " \"Bạn là một trợ lý thông minh. Câu hỏi của người dùng là:\\n\"\n",
195
+ " f\"\\\"{user_question}\\\"\\n\\n\"\n",
196
+ " \"Dưới đây là các câu hỏi và câu trả lời có thể phù hợp:\\n\"\n",
197
+ " f\"{options}\\n\\n\"\n",
198
+ " \"Trong số các câu hỏi trên, có câu hỏi nào giống về mặt ý nghĩa với câu hỏi của người dùng không?\\n\"\n",
199
+ " \"Nếu có, chỉ trả về một số (1, 2, 3, …) tương ứng với câu hỏi phù hợp nhất.\\n\"\n",
200
+ " \"Nếu không có, trả về đúng 'KHÔNG'.\"\n",
201
+ " )\n",
202
  "\n",
203
+ " response = gemini_llm.invoke(prompt)\n",
204
+ " print(response)\n",
205
+ " return response\n"
206
  ]
207
  },
208
  {
209
  "cell_type": "code",
210
+ "execution_count": 86,
211
+ "id": "4d763177",
212
+ "metadata": {},
213
+ "outputs": [],
214
+ "source": [
215
+ "def get_faq_answer(user_question):\n",
216
+ " top_k = retrieve_top_k_faqs(user_question, k=5)\n",
217
+ " match_index = find_best_match_llm(user_question, top_k)\n",
218
+ " print(match_index)\n",
219
+ " if match_index.strip().upper() == \"KHÔNG\":\n",
220
+ " return \"Không có trong FAQ\"\n",
221
+ "\n",
222
+ " try:\n",
223
+ " idx = int(match_index) - 1\n",
224
+ " matched = top_k[idx]\n",
225
+ " except (ValueError, IndexError):\n",
226
+ " return \"⚠️ Đã có lỗi khi xử lý kết quả. Vui lòng thử lại.\"\n",
227
+ " print(matched[\"question\"])\n",
228
+ " print(matched[\"answer\"])\n",
229
+ " final_prompt = (\n",
230
+ " 'Câu hỏi của khách hàng: \"' + user_question + '\"\\n\\n'\n",
231
+ " 'Dưới đây là câu hỏi đã khớp trong cơ sở dữ liệu:\\n'\n",
232
+ " f'\"{matched[\"question\"]}\"\\n\\n'\n",
233
+ " 'Câu trả lời là:\\n'\n",
234
+ " f'\"{matched[\"answer\"]}\"\\n\\n'\n",
235
+ " 'Hãy trả lời cho khách hàng một cách lịch sự và ngắn gọn nhất có thể.'\n",
236
+ " )\n",
237
+ "\n",
238
+ " return gemini_llm.invoke(final_prompt)\n"
239
+ ]
240
+ },
241
+ {
242
+ "cell_type": "code",
243
+ "execution_count": 89,
244
+ "id": "df4d405d",
245
  "metadata": {},
246
  "outputs": [
247
+ {
248
+ "name": "stderr",
249
+ "output_type": "stream",
250
+ "text": [
251
+ "/var/folders/16/yn17n1916z32xtfrqrq39zj00000gn/T/ipykernel_82857/149935573.py:3: DeprecationWarning: `search` method is deprecated and will be removed in the future. Use `query_points` instead.\n",
252
+ " search_results = client.search(\n"
253
+ ]
254
+ },
255
  {
256
  "name": "stdout",
257
  "output_type": "stream",
258
  "text": [
259
+ "KHÔNG\n",
260
+ "\n",
261
+ "KHÔNG\n",
262
+ "\n",
263
+ "Không có trong FAQ\n"
264
  ]
265
  }
266
  ],
267
  "source": [
268
+ "q = \"Đèn học\"\n",
269
+ "print(get_faq_answer(q))\n"
 
 
 
 
 
 
 
270
  ]
271
  },
272
  {
273
  "cell_type": "code",
274
+ "execution_count": null,
275
+ "id": "53ab51f6",
276
  "metadata": {},
277
  "outputs": [],
278
+ "source": []
 
 
279
  },
280
  {
281
  "cell_type": "code",
282
  "execution_count": null,
283
+ "id": "af23cb1c",
284
  "metadata": {},
285
  "outputs": [],
286
  "source": []