trantuan1701 commited on
Commit
602e9df
·
1 Parent(s): cb3dc75

initialize project

Browse files
.env ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ GEMINI_API_KEY = "AIzaSyDRgb6N56-HBjPZCMmnXAOqvYta3Nj8uDE"
2
+ QDRANT_HOST = "https://033ce04b-e260-4fe0-bbc2-18a7da667877.us-east-1-0.aws.cloud.qdrant.io:6333"
3
+ QDRANT_API_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3MiOiJtIiwiZXhwIjoxNzUxMzg3ODc2fQ.EaPH-fBeSqVYldZvK6ncaX9s0rmEwrEDao3lRW8f6BI"
Dockerfile ADDED
File without changes
app.py ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from chatbot.core import get_chat_response
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
+ user_input = st.chat_input("Nhập tin nhắn của bạn...")
33
+
34
+ if user_input:
35
+ # Hiển thị tin nhắn của user
36
+ st.session_state.messages.append({"role": "user", "content": user_input})
37
+ with st.chat_message("user"):
38
+ st.markdown(user_input)
39
+
40
+ # Gọi chatbot để lấy phản hồi
41
+ response = get_chat_response(user_input)
42
+
43
+ # Hiển thị phản hồi của chatbot
44
+ st.session_state.messages.append({"role": "assistant", "content": response})
45
+ with st.chat_message("assistant"):
46
+ st.markdown(response)
chatbot/.DS_Store ADDED
Binary file (6.15 kB). View file
 
chatbot/__pycache__/core.cpython-310.pyc ADDED
Binary file (1.68 kB). View file
 
chatbot/__pycache__/core.cpython-312.pyc ADDED
Binary file (2.11 kB). View file
 
chatbot/__pycache__/core.cpython-313.pyc ADDED
Binary file (2.09 kB). View file
 
chatbot/__pycache__/llm.cpython-310.pyc ADDED
Binary file (1.5 kB). View file
 
chatbot/__pycache__/llm.cpython-312.pyc ADDED
Binary file (1.89 kB). View file
 
chatbot/__pycache__/llm.cpython-313.pyc ADDED
Binary file (1.97 kB). View file
 
chatbot/__pycache__/memory.cpython-310.pyc ADDED
Binary file (279 Bytes). View file
 
chatbot/__pycache__/memory.cpython-312.pyc ADDED
Binary file (304 Bytes). View file
 
chatbot/__pycache__/memory.cpython-313.pyc ADDED
Binary file (298 Bytes). View file
 
chatbot/__pycache__/metadata_selfquery.cpython-310.pyc ADDED
Binary file (670 Bytes). View file
 
chatbot/__pycache__/metadata_selfquery.cpython-312.pyc ADDED
Binary file (792 Bytes). View file
 
chatbot/__pycache__/metadata_selfquery.cpython-313.pyc ADDED
Binary file (768 Bytes). View file
 
chatbot/__pycache__/prompts.cpython-310.pyc ADDED
Binary file (6.83 kB). View file
 
chatbot/__pycache__/prompts.cpython-312.pyc ADDED
Binary file (7.26 kB). View file
 
chatbot/__pycache__/prompts.cpython-313.pyc ADDED
Binary file (7.24 kB). View file
 
chatbot/__pycache__/retrieval.cpython-310.pyc ADDED
Binary file (2.88 kB). View file
 
chatbot/__pycache__/retrieval.cpython-312.pyc ADDED
Binary file (4.6 kB). View file
 
chatbot/__pycache__/retrieval.cpython-313.pyc ADDED
Binary file (4.58 kB). View file
 
chatbot/core.py ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from .llm import gemini_llm
2
+ from .retrieval import load_vectordb
3
+ from .memory import memory
4
+ from .prompts import chat_prompt, classification_prompt, category_tree_json
5
+ from langchain.chains import ConversationalRetrievalChain
6
+ from .metadata_selfquery import metadata_field_info
7
+ from langchain.retrievers.self_query.base import SelfQueryRetriever
8
+ from langchain.retrievers.self_query.qdrant import QdrantTranslator
9
+
10
+
11
+ vector_store = load_vectordb()
12
+
13
+ def classify_query(query):
14
+ response = gemini_llm.invoke(classification_prompt.format(query=query, category_tree=category_tree_json))
15
+ return response
16
+
17
+ retriever = SelfQueryRetriever.from_llm(
18
+ llm=gemini_llm,
19
+ vectorstore=vector_store,
20
+ document_contents="Thông tin sản phẩm gồm mô tả ngắn và danh mục phân cấp, giá mà khách hàng tìm kiếm",
21
+ metadata_field_info=metadata_field_info,
22
+ structured_query_translator= QdrantTranslator(metadata_key="metadata"),
23
+ search_type="similarity",
24
+ search_kwargs={"k": 10, "score_threshold": 0.3}
25
+ )
26
+
27
+ qa_chain = ConversationalRetrievalChain.from_llm(
28
+ llm=gemini_llm,
29
+ retriever=retriever,
30
+ memory=memory,
31
+ return_source_documents= False,
32
+ combine_docs_chain_kwargs={"prompt": chat_prompt},
33
+ output_key="result"
34
+ )
35
+
36
+ def get_chat_response(user_input: str) -> str:
37
+ classified_query = classify_query(user_input)
38
+ response = qa_chain({"question": classified_query})
39
+
40
+ memory.save_context({"input": classified_query}, {"output": response["result"]})
41
+ print(classified_query)
42
+ return response["result"]
chatbot/init.py ADDED
File without changes
chatbot/llm.py ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import google.generativeai as genai
2
+ from langchain.llms.base import LLM
3
+ from typing import Optional, List
4
+ from config import GEMINI_API_KEY, MODEL_NAME
5
+
6
+ genai.configure(api_key=GEMINI_API_KEY)
7
+
8
+ class GeminiWrapper(LLM):
9
+ """Wrapper để sử dụng Gemini với LangChain."""
10
+
11
+ model: str = MODEL_NAME
12
+
13
+ def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
14
+ """Gửi prompt đến Gemini và trả về kết quả."""
15
+ model = genai.GenerativeModel(self.model)
16
+ response = model.generate_content(prompt)
17
+ return response.text if response and hasattr(response, 'text') else "Không có phản hồi từ Gemini."
18
+
19
+ @property
20
+ def _identifying_params(self) -> dict:
21
+ """Trả về tham số nhận diện của mô hình."""
22
+ return {"model": self.model}
23
+
24
+ @property
25
+ def _llm_type(self) -> str:
26
+ return "gemini"
27
+
28
+ gemini_llm = GeminiWrapper()
chatbot/memory.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ from langchain.memory import ConversationBufferMemory
2
+
3
+ memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
chatbot/metadata_selfquery.py ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ from langchain.chains.query_constructor.base import AttributeInfo
2
+
3
+ metadata_field_info = [
4
+ AttributeInfo(name="L1", description="Danh mục cấp 1", type="string", example="Chuyên dụng, Dân dụng"),
5
+ AttributeInfo(name="L2", description="Danh mục cấp 2", type="string", example="Đèn LED, Đèn bàn, Bình - Phích nước"),
6
+ AttributeInfo(name="L3", description="Danh mục cấp 3", type="string"),
7
+ AttributeInfo(name="Price", description="Khoảng giá của sản phẩm người dùng muốn", type="float", is_filterable=True, is_numerical=True),
8
+ ]
chatbot/prompts.py ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from langchain.prompts import PromptTemplate
2
+ from .llm import gemini_llm
3
+ from langchain_core.prompts import ChatPromptTemplate
4
+ import json
5
+
6
+ chat_prompt = PromptTemplate(
7
+ input_variables=["context", "question"],
8
+ template="""
9
+ Bạn là trợ lý AI bán hàng của **Rạng Đông Store**, chuyên hỗ trợ khách hàng tìm kiếm và lựa chọn các sản phẩm chiếu sáng và gia dụng chất lượng cao.
10
+
11
+ ### Danh mục sản phẩm chính:
12
+ 1. **Đèn LED**
13
+ - Đèn LED chiếu sáng dân dụng
14
+ - Đèn LED chiếu sáng chuyên dụng
15
+ - Đèn LED nông nghiệp
16
+ - Đèn LED ngư nghiệp
17
+ - Đèn bàn học, đèn chống cận
18
+
19
+ 2. **Bình và Phích nước**
20
+ - Bình giữ nhiệt
21
+ - Phích nước
22
+
23
+ 3. **Thiết bị chiếu sáng**
24
+ - Đèn LED Downlight
25
+ - Đèn LED âm trần
26
+ - Đèn LED năng lượng mặt trời
27
+ - Hệ thống điện năng lượng mặt trời
28
+
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.
37
+
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`.
44
+ - Nếu là **bình giữ nhiệt hoặc phích nước**, hãy nêu rõ:
45
+ `Giá`, `Dung tích`, `Thời gian giữ nhiệt`.
46
+
47
+ ---
48
+
49
+ ### Câu hỏi từ khách hàng:
50
+ {question}
51
+
52
+ ---
53
+
54
+ ### Thông tin sản phẩm có sẵn:
55
+ {context}
56
+
57
+ ---
58
+
59
+ ### Phản hồi:
60
+ """
61
+ )
62
+
63
+
64
+
65
+ category_tree = {
66
+ "Chuyên dụng": {
67
+ "Chiếu sáng chuyên dụng": {
68
+ "Hệ thống điện năng lượng mặt trời": [
69
+ "Hệ thống hòa lưới",
70
+ "Hệ thống hòa lưới có lưu trữ"
71
+ ],
72
+ "Đèn LED chiếu sáng Đường phố": [],
73
+ "Đèn LED ngư nghiệp": [
74
+ "Đèn Led chiếu boong",
75
+ "Đèn Led chiếu mạn",
76
+ "Đèn Led chế biến thủy sản",
77
+ "Đèn Led câu mực",
78
+ "Đèn Led sinh hoạt",
79
+ "Đèn thả chìm",
80
+ "Đèn tàu cá"
81
+ ],
82
+ "Đèn LED nông nghiệp": [
83
+ "Smart Farm",
84
+ "Đèn Led chuyên dụng cho Hoa Cúc",
85
+ "Đèn Led chuyên dụng cho Thanh Long",
86
+ "Đèn Led chuyên dụng cho Tảo",
87
+ "Đèn Led chuyên dụng cho chăn nuôi gia cầm",
88
+ "Đèn Led chuyên dụng cho cây xanh trong nhà",
89
+ "Đèn Led chuyên dụng cho nhà kính, nhà màng",
90
+ "Đèn Led chuyên dụng cho nuôi cấy mô",
91
+ "Đèn Led chuyên dụng trồng rau",
92
+ "Đèn Led chuyên dụng đông trùng hạ thảo",
93
+ "Đèn Led thông minh đa năng"
94
+ ],
95
+ "Đèn chiếu sáng lớp học": [],
96
+ "Đèn năng lượng mặt trời": [
97
+ "Bộ lưu điện năng lượng mặt trời",
98
+ "Bộ sạc điện cho acquy",
99
+ "Đèn pha năng lượng mặt trời"
100
+ ]
101
+ },
102
+ "Chiếu sáng ứng dụng": {
103
+ "Giải Pháp Chiếu Sáng Nông Nghiệp": [],
104
+ "Giải Pháp Chiếu Sáng Trung Tâm Thương Mại": []
105
+ },
106
+ "Thiết Bị Điện": {
107
+ "Đèn Bắt Muỗi": []
108
+ }
109
+ },
110
+ "Dân dụng": {
111
+ "Bình - Phích nước": {
112
+ "Bình Nước": [
113
+ "Bình Nước Cầm Tay",
114
+ "Bình Nước Giữ Nhiệt"
115
+ ],
116
+ "Bộ Sưu Tập Giới Hạn": [],
117
+ "Phích Nước": [
118
+ "Phích Cao Cấp",
119
+ "Phích Cầm Tay",
120
+ "Phích Nước Truyền Thống",
121
+ "Phích Ủ",
122
+ "Ruột Phích"
123
+ ]
124
+ },
125
+ "Siêu Khuyến Mãi": {
126
+ "Hot Combo 🔥": [],
127
+ "Siêu Sale": []
128
+ },
129
+ "Thiết Bị Điện": {
130
+ "Thiết Bị Khác": [],
131
+ "Đèn Bắt Muỗi": [],
132
+ "Ấm Siêu Tốc": [],
133
+ "Ổ Cắm": [
134
+ "Ổ Cắm Kéo Dài",
135
+ "Ổ Cắm Âm Tường"
136
+ ]
137
+ },
138
+ "Đèn LED THÔNG MINH": {
139
+ "Smart BLE": [
140
+ "Bảng Điều Khiển",
141
+ "Bộ Điều Khiển Trung Tâm",
142
+ "Công Tắc Thông Minh",
143
+ "Cảm Biến Thông Minh",
144
+ "Thiết Bị Thông Minh",
145
+ "Đèn LED Dây Thông Minh",
146
+ "Đèn LED Panel Khổ Lớn Thông Minh",
147
+ "Đèn LED Tracklight Thông Minh",
148
+ "Đèn LED Âm Trần Thông Minh",
149
+ "Đèn LED Ốp Trần Thông Minh"
150
+ ],
151
+ "Smart Local": [],
152
+ "Smart RF": [],
153
+ "Smart WF": [
154
+ "Công tắc thông minh",
155
+ "Cảm biến thông minh",
156
+ "Đèn LED panel khổ lớn thông minh",
157
+ "Đèn LED âm trần thông minh",
158
+ "Đèn LED ốp trần thông minh",
159
+ "Ổ cắm thông minh"
160
+ ]
161
+ },
162
+ "Đèn LED": {
163
+ "Bộ đèn LED": [
164
+ "Bộ Đèn LED",
165
+ "Bộ Đèn LED T5",
166
+ "Bộ Đèn LED Tube T8"
167
+ ],
168
+ "Máng Đèn": [],
169
+ "Phụ kiện đèn": [],
170
+ "Đèn LED Bulb": [
171
+ "LED Bulb lưu điện",
172
+ "Đèn LED Bulb Tròn",
173
+ "Đèn LED Bulb Trụ"
174
+ ],
175
+ "Đèn LED Chiếu pha": [],
176
+ "Đèn LED Chỉ dẫn - Khẩn cấp": [],
177
+ "Đèn LED Dây": [],
178
+ "Đèn LED Gắn Tường": [],
179
+ "Đèn LED Khác": [],
180
+ "Đèn LED Linear": [],
181
+ "Đèn LED NLMT": [
182
+ "Đèn Chiếu Sáng Trong Nhà NLMT",
183
+ "Đèn Pha Năng Lượng Mặt Trời",
184
+ "Đèn Sân Vườn NLMT",
185
+ "Đèn Đường Năng Lượng Mặt Trời"
186
+ ],
187
+ "Đèn LED Nhà Xưởng": [
188
+ "Bộ Đèn Chống Nổ",
189
+ "Bộ Đèn Chống Ẩm",
190
+ "Đèn LED Chỉ Dẫn",
191
+ "Đèn LED Highbay",
192
+ "Đèn LED Khẩn Cấp"
193
+ ],
194
+ "Đèn LED Panel Khổ Lớn": [],
195
+ "Đèn LED Tracklight": [
196
+ "Đèn LED Ray",
197
+ "Đèn LED Tracklight"
198
+ ],
199
+ "Đèn LED Tube": [
200
+ "Bóng LED Tube Nhôm Nhựa",
201
+ "Bóng LED Tube Thủy Tinh Bọc Nhựa"
202
+ ],
203
+ "Đèn LED Âm Trần": [
204
+ "Đèn LED Panel",
205
+ "Đèn LED Âm Trần Downlight"
206
+ ],
207
+ "Đèn LED Ốp trần": [
208
+ "Đèn LED Nổi Trần",
209
+ "Đèn LED Ốp Trần Tròn",
210
+ "Đèn LED Ốp Trần Vuông"
211
+ ],
212
+ "Đèn LED Ốp tường": []
213
+ },
214
+ "Đèn bàn": {
215
+ "Đèn bàn học": [],
216
+ "Đèn bàn văn phòng - làm việc": []
217
+ }
218
+ }
219
+ }
220
+
221
+
222
+ category_tree_json = json.dumps(category_tree, ensure_ascii=False, indent=2)
223
+
224
+
225
+ classification_prompt = ChatPromptTemplate.from_messages([
226
+ ("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. "
227
+ "Dưới đây là danh mục sản phẩm:\n\n"
228
+ "{category_tree}\n\n"
229
+ "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"
230
+ "Và giá thấp nhất khách hàng mua, giá cao nhất khách hàng mua"),
231
+ ("human", "Câu hỏi: {query}. Hãy trả về danh mục thích hợp."
232
+ "Trả lời theo định dạng sau: {query}, L1:... - L2:....")
233
+ ])
chatbot/retrieval.py ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import qdrant_client
2
+ from langchain.vectorstores import Qdrant
3
+ from langchain_huggingface import HuggingFaceEmbeddings
4
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
5
+ 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):
14
+ if not os.path.exists(file_path):
15
+ raise FileNotFoundError(f"File not found: {file_path}")
16
+ with open(file_path, "r", encoding="utf-8") as f:
17
+ return json.load(f)
18
+
19
+
20
+ def load_data(filepath):
21
+ products = load_json(filepath)
22
+
23
+ documents = []
24
+ for p in products:
25
+ text = f"""
26
+ URL: {p.get("url", "Không có thông tin")},
27
+ Tên: {p.get("product_name", "Không có tên")},
28
+ Mã sản phẩm: {p.get("product_id", "Không có mã")},
29
+ Model: {p.get("model", "Không có model")},
30
+ Giá gốc: {p.get("old_price", "Không có giá")} VND,
31
+ Giá KM: {p.get("price", "Không có giá")} VND,
32
+ Giảm giá: {p.get("discount_rate", "Không có thông tin")},
33
+ Mô tả: {p.get("description", "Không có mô tả")},
34
+ Thông số kỹ thuật: {json.dumps(p.get("specifications", {}), ensure_ascii=False)}
35
+ """
36
+ text = re.sub(r'\n\s*', ' ', text)
37
+ documents.append(Document(page_content=text,
38
+ metadata={"L1": p.get("L1", "N/A"),
39
+ "L2": p.get("L2", "N/A"),
40
+ "L3": p.get("L3", "N/A"),
41
+ "L4": p.get("L4", "N/A"),
42
+ "SKU": p.get("SKU", "N/A"),
43
+ "Price": p.get("price", "N/A")}))
44
+
45
+ return documents
46
+
47
+
48
+ client = qdrant_client.QdrantClient(
49
+ QDRANT_HOST,
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):
56
+ vectors_config = qdrant_client.http.models.VectorParams(
57
+ size=EMBEDDING_SIZE,
58
+ distance=qdrant_client.http.models.Distance.COSINE,
59
+ )
60
+
61
+ client.create_collection(
62
+ collection_name= QDRANT_COLECTION_NAME,
63
+ vectors_config=vectors_config,
64
+ )
65
+ vector_store = Qdrant(
66
+ client=client,
67
+ collection_name=QDRANT_COLECTION_NAME,
68
+ embeddings=embedding_model,
69
+ content_payload_key="page_content",
70
+ metadata_payload_key="metadata",
71
+ )
72
+ vector_store.add_documents(load_data("data/rangdong.json"))
73
+ else:
74
+ vector_store = Qdrant(
75
+ client=client,
76
+ collection_name=QDRANT_COLECTION_NAME,
77
+ embeddings=embedding_model,
78
+ content_payload_key="page_content",
79
+ metadata_payload_key="metadata",
80
+ )
81
+ return vector_store
config.py ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import google.generativeai as genai
2
+ from langchain.llms.base import LLM
3
+ from typing import List, Optional
4
+ from dotenv import load_dotenv
5
+ import os
6
+
7
+ load_dotenv()
8
+
9
+ 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
+
16
+ EMBEDDING_MODEL = "sentence-transformers/all-MiniLM-L6-v2"
17
+ EMBEDDING_SIZE = 384
data/rangdong.json ADDED
The diff for this file is too large to render. See raw diff
 
requirements.txt ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ numpy
3
+ tqdm
4
+ google-generativeai
5
+ streamlit
6
+ transformers==4.35.2
7
+ sentence-transformers==2.2.2
8
+ langchain>=0.1.7
9
+ langchain-community>=0.0.23
10
+ langsmith>=0.1.0
11
+ tf-keras
12
+ lark-parser
13
+ qdrant_client
14
+ lark
15
+ langchain_huggingface