VietCat commited on
Commit
c025e27
·
1 Parent(s): 273eb0a

update variables

Browse files
ENVIRONMENT_VARIABLES.md ADDED
@@ -0,0 +1,214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Environment Variables Configuration
2
+
3
+ ## Search Configuration
4
+
5
+ ### MATCH_COUNT
6
+ - **Description**: Số lượng documents tối đa được trả về từ vector search
7
+ - **Default**: `15`
8
+ - **Usage**: `MATCH_COUNT=20`
9
+ - **Impact**: Ảnh hưởng đến số lượng docs được query từ database
10
+
11
+ ### MAX_DOCS_TO_RERANK
12
+ - **Description**: Số lượng documents tối đa được rerank
13
+ - **Default**: `15`
14
+ - **Usage**: `MAX_DOCS_TO_RERANK=20`
15
+ - **Impact**: Ảnh hưởng đến số lượng docs được xử lý trong reranking
16
+
17
+ ## Logging Configuration
18
+
19
+ ### LOG_LEVEL
20
+ - **Description**: Mức độ logging (DEBUG, INFO, WARNING, ERROR, CRITICAL)
21
+ - **Default**: `DEBUG`
22
+ - **Usage**: `LOG_LEVEL=INFO`
23
+ - **Impact**: Ảnh hưởng đến số lượng logs được hiển thị
24
+
25
+ ## Facebook Configuration
26
+
27
+ ### FACEBOOK_APP_SECRET
28
+ - **Description**: Facebook App Secret
29
+ - **Required**: Yes
30
+ - **Usage**: `FACEBOOK_APP_SECRET=your_app_secret`
31
+
32
+ ### FACEBOOK_VERIFY_TOKEN
33
+ - **Description**: Facebook Webhook Verify Token
34
+ - **Required**: Yes
35
+ - **Usage**: `FACEBOOK_VERIFY_TOKEN=your_verify_token`
36
+
37
+ ## Supabase Configuration
38
+
39
+ ### SUPABASE_URL
40
+ - **Description**: Supabase project URL
41
+ - **Required**: Yes
42
+ - **Usage**: `SUPABASE_URL=https://your-project.supabase.co`
43
+
44
+ ### SUPABASE_KEY
45
+ - **Description**: Supabase service role key
46
+ - **Required**: Yes
47
+ - **Usage**: `SUPABASE_KEY=your_service_role_key`
48
+
49
+ ## Google Sheets Configuration
50
+
51
+ ### GOOGLE_SHEETS_CREDENTIALS_FILE
52
+ - **Description**: Path to Google Sheets credentials file
53
+ - **Required**: Yes (if not using GOOGLE_SHEETS_CREDENTIALS_JSON)
54
+ - **Usage**: `GOOGLE_SHEETS_CREDENTIALS_FILE=./credentials.json`
55
+
56
+ ### GOOGLE_SHEETS_CREDENTIALS_JSON
57
+ - **Description**: Google Sheets credentials as JSON string (alternative to credentials file)
58
+ - **Required**: Yes (if not using GOOGLE_SHEETS_CREDENTIALS_FILE)
59
+ - **Usage**: `GOOGLE_SHEETS_CREDENTIALS_JSON={"type":"service_account","project_id":"..."}`
60
+
61
+ ### GOOGLE_SHEETS_TOKEN_FILE
62
+ - **Description**: Path to Google Sheets token file
63
+ - **Required**: Yes
64
+ - **Usage**: `GOOGLE_SHEETS_TOKEN_FILE=./token.json`
65
+
66
+ ### CONVERSATION_SHEET_ID
67
+ - **Description**: Google Sheets ID for conversation logging
68
+ - **Required**: Yes
69
+ - **Usage**: `CONVERSATION_SHEET_ID=your_sheet_id`
70
+
71
+ ## Server Configuration
72
+
73
+ ### HOST
74
+ - **Description**: Server host address
75
+ - **Default**: `0.0.0.0`
76
+ - **Usage**: `HOST=127.0.0.1`
77
+
78
+ ### PORT
79
+ - **Description**: Server port
80
+ - **Default**: `8000`
81
+ - **Usage**: `PORT=7860`
82
+
83
+ ## LLM Configuration
84
+
85
+ ### LLM_PROVIDER
86
+ - **Description**: LLM provider (gemini, openai, etc.)
87
+ - **Default**: `gemini`
88
+ - **Usage**: `LLM_PROVIDER=gemini`
89
+
90
+ ### LLM_MODEL
91
+ - **Description**: LLM model name
92
+ - **Default**: `gemini-2.5-flash`
93
+ - **Usage**: `LLM_MODEL=gemini-2.0-flash-exp`
94
+
95
+ ### RERANK_PROVIDER
96
+ - **Description**: Rerank provider (defaults to LLM_PROVIDER if not set)
97
+ - **Default**: Uses LLM_PROVIDER value
98
+ - **Usage**: `RERANK_PROVIDER=gemini`
99
+
100
+ ### RERANK_MODEL
101
+ - **Description**: Rerank model name (defaults to LLM_MODEL if not set)
102
+ - **Default**: Uses LLM_MODEL value
103
+ - **Usage**: `RERANK_MODEL=gemini-2.0-flash-exp`
104
+
105
+ ## Embedding Configuration
106
+
107
+ ### EMBEDDING_PROVIDER
108
+ - **Description**: Embedding provider (gemini, openai, etc.)
109
+ - **Default**: `gemini`
110
+ - **Usage**: `EMBEDDING_PROVIDER=gemini`
111
+
112
+ ### EMBEDDING_MODEL
113
+ - **Description**: Embedding model name
114
+ - **Default**: `models/embedding-001`
115
+ - **Usage**: `EMBEDDING_MODEL=models/embedding-001`
116
+
117
+ ## Gemini Configuration
118
+
119
+ ### GEMINI_API_KEYS
120
+ - **Description**: Comma-separated list of Gemini API keys
121
+ - **Required**: Yes
122
+ - **Usage**: `GEMINI_API_KEYS=key1,key2,key3`
123
+
124
+ ### GEMINI_MODELS
125
+ - **Description**: Comma-separated list of Gemini models
126
+ - **Required**: Yes
127
+ - **Usage**: `GEMINI_MODELS=gemini-2.0-flash-exp,gemini-1.5-flash`
128
+
129
+ ### GEMINI_BASE_URL
130
+ - **Description**: Gemini API base URL
131
+ - **Default**: `https://generativelanguage.googleapis.com/v1`
132
+ - **Usage**: `GEMINI_BASE_URL=https://generativelanguage.googleapis.com/v1`
133
+
134
+ ## Example .env file
135
+
136
+ ```env
137
+ # Search Configuration
138
+ MATCH_COUNT=15
139
+ MAX_DOCS_TO_RERANK=15
140
+
141
+ # Logging Configuration
142
+ LOG_LEVEL=DEBUG
143
+
144
+ # Facebook Configuration
145
+ FACEBOOK_APP_SECRET=your_app_secret
146
+ FACEBOOK_VERIFY_TOKEN=your_verify_token
147
+
148
+ # Supabase Configuration
149
+ SUPABASE_URL=https://your-project.supabase.co
150
+ SUPABASE_KEY=your_service_role_key
151
+
152
+ # Google Sheets Configuration
153
+ GOOGLE_SHEETS_CREDENTIALS_FILE=./credentials.json
154
+ # GOOGLE_SHEETS_CREDENTIALS_JSON={"type":"service_account","project_id":"..."}
155
+ GOOGLE_SHEETS_TOKEN_FILE=./token.json
156
+ CONVERSATION_SHEET_ID=your_sheet_id
157
+
158
+ # Server Configuration
159
+ HOST=0.0.0.0
160
+ PORT=8000
161
+
162
+ # LLM Configuration
163
+ LLM_PROVIDER=gemini
164
+ LLM_MODEL=gemini-2.5-flash
165
+ RERANK_PROVIDER=gemini
166
+ RERANK_MODEL=gemini-2.5-flash
167
+
168
+ # Embedding Configuration
169
+ EMBEDDING_PROVIDER=gemini
170
+ EMBEDDING_MODEL=models/embedding-001
171
+
172
+ # Gemini Configuration
173
+ GEMINI_API_KEYS=key1,key2,key3
174
+ GEMINI_MODELS=gemini-2.0-flash-exp,gemini-1.5-flash
175
+ GEMINI_BASE_URL=https://generativelanguage.googleapis.com/v1
176
+ ```
177
+
178
+ ## Performance Tuning
179
+
180
+ ### Để tăng performance:
181
+ - Giảm `MATCH_COUNT` và `MAX_DOCS_TO_RERANK` xuống 10-12
182
+ - Set `LOG_LEVEL=INFO` để giảm log noise
183
+ - Sử dụng model nhẹ hơn: `LLM_MODEL=gemini-1.5-flash`
184
+
185
+ ### Để tăng accuracy:
186
+ - Tăng `MATCH_COUNT` và `MAX_DOCS_TO_RERANK` lên 20-25
187
+ - Set `LOG_LEVEL=DEBUG` để debug chi tiết hơn
188
+ - Sử dụng model mạnh hơn: `LLM_MODEL=gemini-2.0-flash-exp`
189
+
190
+ ## Provider Switching
191
+
192
+ ### Chuyển sang OpenAI:
193
+ ```env
194
+ LLM_PROVIDER=openai
195
+ LLM_MODEL=gpt-4
196
+ EMBEDDING_PROVIDER=openai
197
+ EMBEDDING_MODEL=text-embedding-ada-002
198
+ ```
199
+
200
+ ### Chuyển sang Cohere:
201
+ ```env
202
+ LLM_PROVIDER=cohere
203
+ LLM_MODEL=command
204
+ EMBEDDING_PROVIDER=cohere
205
+ EMBEDDING_MODEL=embed-english-v3.0
206
+ ```
207
+
208
+ ## Troubleshooting
209
+
210
+ ### Common Issues:
211
+ 1. **Missing API Keys**: Đảm bảo `GEMINI_API_KEYS` được set
212
+ 2. **Invalid Models**: Kiểm tra `GEMINI_MODELS` có đúng format không
213
+ 3. **Database Connection**: Verify `SUPABASE_URL` và `SUPABASE_KEY`
214
+ 4. **Facebook Webhook**: Check `FACEBOOK_APP_SECRET` và `FACEBOOK_VERIFY_TOKEN`
app/config.py CHANGED
@@ -37,6 +37,10 @@ class Settings(BaseSettings):
37
  # Logging Configuration
38
  log_level: str = os.getenv("LOG_LEVEL", "DEBUG") or "DEBUG"
39
 
 
 
 
 
40
  # Gemini Configuration
41
  # Hỗ trợ nhiều API key và model cho Gemini
42
  # Định nghĩa biến môi trường: GEMINI_API_KEYS="key1,key2,..."; GEMINI_MODELS="model1,model2,..."
 
37
  # Logging Configuration
38
  log_level: str = os.getenv("LOG_LEVEL", "DEBUG") or "DEBUG"
39
 
40
+ # Search Configuration
41
+ match_count: int = int(os.getenv("MATCH_COUNT", "15")) or 15
42
+ max_docs_to_rerank: int = int(os.getenv("MAX_DOCS_TO_RERANK", "15")) or 15
43
+
44
  # Gemini Configuration
45
  # Hỗ trợ nhiều API key và model cho Gemini
46
  # Định nghĩa biến môi trường: GEMINI_API_KEYS="key1,key2,..."; GEMINI_MODELS="model1,model2,..."
app/message_processor.py CHANGED
@@ -155,7 +155,7 @@ class MessageProcessor:
155
  hanh_vi_vi_pham = hanh_vi_vi_pham.replace(kw, "")
156
  hanh_vi_vi_pham = hanh_vi_vi_pham.strip()
157
  logger.info(f"[DEBUG] Phương tiện: {keywords} - Hành vi: {hanh_vi_vi_pham} - Mục đích: {muc_dich}")
158
- await self.channel.facebook.send_message(message=f"... đang tìm kiếm quy định liên quan đến {hanh_vi_vi_pham} .....")
159
  # 4. Update lại conversation với thông tin đầy đủ
160
  update_kwargs = {
161
  'conversation_id': conv['conversation_id'],
 
155
  hanh_vi_vi_pham = hanh_vi_vi_pham.replace(kw, "")
156
  hanh_vi_vi_pham = hanh_vi_vi_pham.strip()
157
  logger.info(f"[DEBUG] Phương tiện: {keywords} - Hành vi: {hanh_vi_vi_pham} - Mục đích: {muc_dich}")
158
+ # await self.channel.facebook.send_message(message=f"... đang tìm kiếm quy định liên quan đến {hanh_vi_vi_pham} .....")
159
  # 4. Update lại conversation với thông tin đầy đủ
160
  update_kwargs = {
161
  'conversation_id': conv['conversation_id'],
app/reranker.py CHANGED
@@ -28,6 +28,9 @@ class Reranker:
28
  self._cache_ttl = 3600 # 1 giờ
29
  self._max_cache_size = 200 # Tăng cache size
30
  self._cache_timestamps = {}
 
 
 
31
 
32
  def _get_cache_key(self, query: str, docs: List[Dict]) -> str:
33
  """Tạo cache key từ query và docs."""
@@ -220,7 +223,7 @@ class Reranker:
220
  return cached_result
221
 
222
  # Giới hạn số lượng docs để rerank - chỉ rerank top 15 docs có similarity cao nhất
223
- max_docs_to_rerank = 15
224
  docs_to_rerank = docs[:max_docs_to_rerank]
225
  logger.info(f"[RERANK] Will rerank {len(docs_to_rerank)} docs (limited to top {max_docs_to_rerank})")
226
 
 
28
  self._cache_ttl = 3600 # 1 giờ
29
  self._max_cache_size = 200 # Tăng cache size
30
  self._cache_timestamps = {}
31
+
32
+ # Sử dụng max_docs_to_rerank từ config
33
+ self.max_docs_to_rerank = settings.max_docs_to_rerank
34
 
35
  def _get_cache_key(self, query: str, docs: List[Dict]) -> str:
36
  """Tạo cache key từ query và docs."""
 
223
  return cached_result
224
 
225
  # Giới hạn số lượng docs để rerank - chỉ rerank top 15 docs có similarity cao nhất
226
+ max_docs_to_rerank = self.max_docs_to_rerank
227
  docs_to_rerank = docs[:max_docs_to_rerank]
228
  logger.info(f"[RERANK] Will rerank {len(docs_to_rerank)} docs (limited to top {max_docs_to_rerank})")
229
 
app/supabase_db.py CHANGED
@@ -6,6 +6,7 @@ import re
6
 
7
  from .utils import timing_decorator_sync
8
  from .constants import VEHICLE_KEYWORD_TO_COLUMN, VIETNAMESE_STOP_WORDS, VIETNAMESE_STOP_PHRASES
 
9
 
10
  def remove_stop_phrases(text, stop_phrases):
11
  for phrase in stop_phrases:
@@ -23,6 +24,8 @@ class SupabaseClient:
23
  Output: SupabaseClient instance.
24
  """
25
  self.client: Client = create_client(url, key)
 
 
26
 
27
  @timing_decorator_sync
28
  def get_page_token(self, page_id: str):
@@ -41,12 +44,15 @@ class SupabaseClient:
41
  return None
42
 
43
  @timing_decorator_sync
44
- def match_documents(self, embedding: List[float], match_count: int = 20, vehicle_keywords: Optional[List[str]] = None, user_question: str = '', min_rank_threshold: float = 0.001, rrf_k: int = 60):
45
  """
46
  Truy vấn vector similarity search qua RPC match_documents.
47
  Input: embedding (list[float]), match_count (int), vehicle_keywords (list[str] hoặc None)
48
  Output: list[dict] kết quả truy vấn.
49
  """
 
 
 
50
 
51
  # Chuẩn bị chuỗi truy vấn trong Python
52
  # Tách từ và nối bằng '|'
@@ -55,9 +61,7 @@ class SupabaseClient:
55
  Xử lý câu hỏi thô: tách từ, loại bỏ stop words,
56
  và trả về chuỗi text sạch để truyền vào RPC.
57
  """
58
- # Tách câu hỏi thành các từ (chuyển về chữ thường)
59
- words = user_question.lower().split()
60
-
61
  # Lọc bỏ các từ có trong danh sách stop words và nối thành chuỗi với dấu cách
62
  # 1. Loại bỏ stop phrase (từ ghép)
63
  cleaned_text = remove_stop_phrases(user_question.lower(), VIETNAMESE_STOP_PHRASES)
 
6
 
7
  from .utils import timing_decorator_sync
8
  from .constants import VEHICLE_KEYWORD_TO_COLUMN, VIETNAMESE_STOP_WORDS, VIETNAMESE_STOP_PHRASES
9
+ from .config import get_settings
10
 
11
  def remove_stop_phrases(text, stop_phrases):
12
  for phrase in stop_phrases:
 
24
  Output: SupabaseClient instance.
25
  """
26
  self.client: Client = create_client(url, key)
27
+ settings = get_settings()
28
+ self.default_match_count = settings.match_count
29
 
30
  @timing_decorator_sync
31
  def get_page_token(self, page_id: str):
 
44
  return None
45
 
46
  @timing_decorator_sync
47
+ def match_documents(self, embedding: List[float], match_count: Optional[int] = None, vehicle_keywords: Optional[List[str]] = None, user_question: str = '', min_rank_threshold: float = 0.001, rrf_k: int = 60):
48
  """
49
  Truy vấn vector similarity search qua RPC match_documents.
50
  Input: embedding (list[float]), match_count (int), vehicle_keywords (list[str] hoặc None)
51
  Output: list[dict] kết quả truy vấn.
52
  """
53
+ # Sử dụng match_count từ config nếu không được truyền vào
54
+ if match_count is None:
55
+ match_count = self.default_match_count
56
 
57
  # Chuẩn bị chuỗi truy vấn trong Python
58
  # Tách từ và nối bằng '|'
 
61
  Xử lý câu hỏi thô: tách từ, loại bỏ stop words,
62
  và trả về chuỗi text sạch để truyền vào RPC.
63
  """
64
+
 
 
65
  # Lọc bỏ các từ có trong danh sách stop words và nối thành chuỗi với dấu cách
66
  # 1. Loại bỏ stop phrase (từ ghép)
67
  cleaned_text = remove_stop_phrases(user_question.lower(), VIETNAMESE_STOP_PHRASES)