Skip to content

Commit 1135a26

Browse files
author
yuan.wang
committed
add try catch logic in server router, add dedup logic in explicit pref
1 parent c13c0ee commit 1135a26

File tree

4 files changed

+81
-54
lines changed

4 files changed

+81
-54
lines changed

src/memos/api/routers/server_router.py

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -388,36 +388,44 @@ def search_memories(search_req: APISearchRequest):
388388
search_mode = search_req.mode
389389

390390
def _search_text():
391-
if search_mode == SearchMode.FAST:
392-
formatted_memories = fast_search_memories(
393-
search_req=search_req, user_context=user_context
394-
)
395-
elif search_mode == SearchMode.FINE:
396-
formatted_memories = fine_search_memories(
397-
search_req=search_req, user_context=user_context
398-
)
399-
elif search_mode == SearchMode.MIXTURE:
400-
formatted_memories = mix_search_memories(
401-
search_req=search_req, user_context=user_context
402-
)
403-
else:
404-
logger.error(f"Unsupported search mode: {search_mode}")
405-
raise HTTPException(status_code=400, detail=f"Unsupported search mode: {search_mode}")
406-
return formatted_memories
391+
try:
392+
if search_mode == SearchMode.FAST:
393+
formatted_memories = fast_search_memories(
394+
search_req=search_req, user_context=user_context
395+
)
396+
elif search_mode == SearchMode.FINE:
397+
formatted_memories = fine_search_memories(
398+
search_req=search_req, user_context=user_context
399+
)
400+
elif search_mode == SearchMode.MIXTURE:
401+
formatted_memories = mix_search_memories(
402+
search_req=search_req, user_context=user_context
403+
)
404+
else:
405+
logger.error(f"Unsupported search mode: {search_mode}")
406+
raise HTTPException(status_code=400, detail=f"Unsupported search mode: {search_mode}")
407+
return formatted_memories
408+
except Exception as e:
409+
logger.error("Error in search_text: %s; traceback: %s", e, traceback.format_exc())
410+
return []
407411

408412
def _search_pref():
409413
if os.getenv("ENABLE_PREFERENCE_MEMORY", "false").lower() != "true":
410414
return []
411-
results = naive_mem_cube.pref_mem.search(
412-
query=search_req.query,
413-
top_k=search_req.pref_top_k,
414-
info={
415-
"user_id": search_req.user_id,
416-
"session_id": search_req.session_id,
417-
"chat_history": search_req.chat_history,
418-
},
419-
)
420-
return [_format_memory_item(data) for data in results]
415+
try:
416+
results = naive_mem_cube.pref_mem.search(
417+
query=search_req.query,
418+
top_k=search_req.pref_top_k,
419+
info={
420+
"user_id": search_req.user_id,
421+
"session_id": search_req.session_id,
422+
"chat_history": search_req.chat_history,
423+
},
424+
)
425+
return [_format_memory_item(data) for data in results]
426+
except Exception as e:
427+
logger.error("Error in _search_pref: %s; traceback: %s", e, traceback.format_exc())
428+
return []
421429

422430
with ContextThreadPoolExecutor(max_workers=2) as executor:
423431
text_future = executor.submit(_search_text)

src/memos/memories/textual/prefer_text_memory/adder.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,10 @@ def _judge_dup_with_text_mem(self, new_pref: MilvusVecDBItem) -> bool:
109109
new_preference = {"id": new_pref.id, "memory": new_pref.payload["preference"]}
110110

111111
prompt = NAIVE_JUDGE_DUP_WITH_TEXT_MEM_PROMPT.replace(
112-
"{new_preference}", json.dumps(new_preference)
113-
).replace("{retrieved_memories}", json.dumps(text_mem_recalls))
112+
"{new_preference}", json.dumps(new_preference, ensure_ascii=False)
113+
).replace(
114+
"{retrieved_memories}", json.dumps(text_mem_recalls, ensure_ascii=False)
115+
)
114116
try:
115117
response = self.llm_provider.generate([{"role": "user", "content": prompt}])
116118
response = response.strip().replace("```json", "").replace("```", "").strip()
@@ -142,7 +144,7 @@ def _dedup_explicit_pref_by_textual(
142144
self, new_prefs: list[MilvusVecDBItem]
143145
) -> list[MilvusVecDBItem]:
144146
"""Deduplicate explicit preferences by textual memory."""
145-
if os.getenv("PREF_DEDUP_EXP_BY_TEXTUAL", "false").lower() != "true":
147+
if os.getenv("DEDUP_PREF_EXP_BY_TEXTUAL", "false").lower() != "true" or not self.text_mem:
146148
return new_prefs
147149
dedup_prefs = []
148150
with ContextThreadPoolExecutor(max_workers=max(1, min(len(new_prefs), 5))) as executor:
@@ -205,8 +207,11 @@ def _update_memory_op_trace(
205207
]
206208

207209
rsp = self._judge_update_or_add_trace_op(
208-
new_mems=json.dumps(new_mem_inputs),
209-
retrieved_mems=json.dumps(retrieved_mem_inputs) if retrieved_mem_inputs else "",
210+
new_mems=json.dumps(new_mem_inputs, ensure_ascii=False),
211+
retrieved_mems=
212+
json.dumps(retrieved_mem_inputs, ensure_ascii=False)
213+
if retrieved_mem_inputs
214+
else "",
210215
)
211216
if not rsp:
212217
dedup_rsp = self._dedup_explicit_pref_by_textual(new_vec_db_items)
@@ -293,8 +298,11 @@ def _update_memory_fine(
293298
if mem.payload.get("preference", None)
294299
]
295300
rsp = self._judge_update_or_add_fine(
296-
new_mem=json.dumps(new_mem_input),
297-
retrieved_mems=json.dumps(retrieved_mem_inputs) if retrieved_mem_inputs else "",
301+
new_mem=json.dumps(new_mem_input, ensure_ascii=False),
302+
retrieved_mems=
303+
json.dumps(retrieved_mem_inputs, ensure_ascii=False)
304+
if retrieved_mem_inputs
305+
else "",
298306
)
299307
need_update = rsp.get("need_update", False) if rsp else False
300308
need_update = (

src/memos/memories/textual/prefer_text_memory/retrievers.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ def retrieve(
119119
if pref.payload.get("preference", None)
120120
]
121121

122+
# store explicit id and score, use it after reranker
123+
explicit_id_scores = {item.id: item.score for item in explicit_prefs}
124+
122125
reranker_map = {
123126
"naive": self._naive_reranker,
124127
"original_text": self._original_text_reranker,
@@ -131,4 +134,9 @@ def retrieve(
131134
query=query, prefs_mem=implicit_prefs_mem, prefs=implicit_prefs, top_k=top_k
132135
)
133136

137+
# filter explicit mem by score bigger than threshold
138+
explicit_prefs_mem = [
139+
item for item in explicit_prefs_mem if explicit_id_scores.get(item.id, 0) >= 0.2
140+
]
141+
134142
return explicit_prefs_mem + implicit_prefs_mem

src/memos/vec_dbs/milvus.py

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -236,29 +236,32 @@ def search(
236236
"sparse": self._sparse_search,
237237
"hybrid": self._hybrid_search,
238238
}
239+
try:
240+
results = search_func_map[search_type](
241+
collection_name=collection_name,
242+
query_vector=query_vector,
243+
query=query,
244+
top_k=top_k,
245+
filter=expr,
246+
)
239247

240-
results = search_func_map[search_type](
241-
collection_name=collection_name,
242-
query_vector=query_vector,
243-
query=query,
244-
top_k=top_k,
245-
filter=expr,
246-
)
247-
248-
items = []
249-
for hit in results[0]:
250-
entity = hit.get("entity", {})
251-
252-
items.append(
253-
MilvusVecDBItem(
254-
id=str(entity.get("id")),
255-
memory=entity.get("memory"),
256-
original_text=entity.get("original_text"),
257-
vector=entity.get("vector"),
258-
payload=entity.get("payload", {}),
259-
score=1 - float(hit["distance"]),
248+
items = []
249+
for hit in results[0]:
250+
entity = hit.get("entity", {})
251+
252+
items.append(
253+
MilvusVecDBItem(
254+
id=str(entity.get("id")),
255+
memory=entity.get("memory"),
256+
original_text=entity.get("original_text"),
257+
vector=entity.get("vector"),
258+
payload=entity.get("payload", {}),
259+
score=1 - float(hit["distance"]),
260+
)
260261
)
261-
)
262+
except Exception as e:
263+
logger.error("Error in _%s_search: %s", search_type, e)
264+
return []
262265

263266
logger.info(f"Milvus search completed with {len(items)} results.")
264267
return items

0 commit comments

Comments
 (0)