11# memos/reranker/strategies/single_turn.py
22from __future__ import annotations
3+
34import re
5+
46from typing import Any
5- from collections import defaultdict
6- from copy import deepcopy
7+
78from .base import BaseRerankerStrategy
8- from .dialogue_common import DialogueRankingTracker , strip_memory_tags , extract_content
9+ from .dialogue_common import DialogueRankingTracker
10+
911
1012_TAG1 = re .compile (r"^\s*\[[^\]]*\]\s*" )
1113
14+
1215class ConcatBackgroundStrategy (BaseRerankerStrategy ):
1316 """
1417 Concat background strategy.
15-
18+
1619 This strategy processes dialogue pairs by concatenating background and
1720 user and assistant messages into single strings for ranking. Each dialogue pair becomes a
1821 separate document for ranking.
19- """
22+ """
2023
2124 def prepare_documents (
2225 self ,
@@ -27,33 +30,33 @@ def prepare_documents(
2730 ) -> tuple [DialogueRankingTracker , dict [str , Any ], list [str ]]:
2831 """
2932 Prepare documents based on single turn concatenation strategy.
30-
33+
3134 Args:
3235 query: The search query
3336 graph_results: List of graph results
3437 top_k: Maximum number of items to return
35-
38+
3639 Returns:
37- tuple[DialogueRankingTracker, dict[str, Any], list[str]]:
40+ tuple[DialogueRankingTracker, dict[str, Any], list[str]]:
3841 - Tracker: DialogueRankingTracker instance
3942 - original_items: Dict mapping memory_id to original TextualMemoryItem
4043 - documents: List of text documents ready for ranking
4144 """
42-
45+
4346 original_items = {}
4447 tracker = DialogueRankingTracker ()
4548 documents = []
4649 for item in graph_results :
4750 memory = getattr (item , "memory" , None )
4851 if isinstance (memory , str ):
4952 memory = _TAG1 .sub ("" , memory )
50-
53+
5154 background = ""
5255 if hasattr (item , "metadata" ) and hasattr (item .metadata , "background" ):
5356 background = getattr (item .metadata , "background" , "" )
5457 if not isinstance (background , str ):
5558 background = ""
56-
59+
5760 documents .append (f"{ memory } \n { background } " )
5861 return tracker , original_items , documents
5962
@@ -68,26 +71,24 @@ def reconstruct_items(
6871 ) -> list [tuple [Any , float ]]:
6972 """
7073 Reconstruct TextualMemoryItem objects from ranked dialogue pairs.
71-
74+
7275 Args:
7376 ranked_indices: List of dialogue pair indices sorted by relevance
7477 scores: Corresponding relevance scores
7578 tracker: DialogueRankingTracker instance
7679 original_items: Dict mapping memory_id to original TextualMemoryItem
7780 top_k: Maximum number of items to return
78-
81+
7982 Returns:
8083 List of (reconstructed_memory_item, aggregated_score) tuples
8184 """
82- graph_results = kwargs .get ("graph_results" , None )
83- documents = kwargs .get ("documents" , None )
85+ graph_results = kwargs .get ("graph_results" )
86+ documents = kwargs .get ("documents" )
8487 reconstructed_items = []
8588 for idx in ranked_indices :
8689 item = graph_results [idx ]
8790 item .memory = f"{ item .memory } \n { documents [idx ]} "
8891 reconstructed_items .append ((item , scores [idx ]))
89-
92+
9093 reconstructed_items .sort (key = lambda x : x [1 ], reverse = True )
9194 return reconstructed_items [:top_k ]
92-
93-
0 commit comments