Query using MemRL's value-driven retrieval. This method: 1. Uses MemRL's retrieve_query for value-aware memory retrieval 2. Applies Q-value based ranking with ε-greedy exploration 3. Constructs prompt with retrieved memories 4. Generates response using the tr
(
self,
question: str,
system_message: Optional[str] = None,
**kwargs
)
| 723 | ) |
| 724 | |
| 725 | def query( |
| 726 | self, |
| 727 | question: str, |
| 728 | system_message: Optional[str] = None, |
| 729 | **kwargs |
| 730 | ) -> AgentResponse: |
| 731 | """Query using MemRL's value-driven retrieval. |
| 732 | |
| 733 | This method: |
| 734 | 1. Uses MemRL's retrieve_query for value-aware memory retrieval |
| 735 | 2. Applies Q-value based ranking with ε-greedy exploration |
| 736 | 3. Constructs prompt with retrieved memories |
| 737 | 4. Generates response using the tracked LLM client |
| 738 | """ |
| 739 | start_time = time.time() |
| 740 | |
| 741 | # Truncate question if needed |
| 742 | bounded_question = self._truncate_to_tokens(question, self.max_question_tokens) |
| 743 | |
| 744 | # Retrieve memories using MemRL's value-driven retrieval |
| 745 | retrieved_memories: List[Dict[str, Any]] = [] |
| 746 | retrieval_result: Dict[str, Any] = {} |
| 747 | |
| 748 | try: |
| 749 | # Use MemRL's retrieve_query which combines similarity and Q-value |
| 750 | result = self._memory_service.retrieve_query( |
| 751 | task_description=bounded_question, |
| 752 | k=self.candidate_top_k, |
| 753 | threshold=self.similarity_threshold, |
| 754 | ) |
| 755 | |
| 756 | # retrieve_query returns (result_dict, sim_list) tuple |
| 757 | retrieval_result, _ = result |
| 758 | |
| 759 | # Extract selected memories from result |
| 760 | selected = retrieval_result.get("selected", []) |
| 761 | for mem in selected[:self.retrieve_num]: |
| 762 | # Extract content from memory object |
| 763 | content = self._extract_memory_content(mem) |
| 764 | |
| 765 | retrieved_memories.append({ |
| 766 | "memory": content[:self.query_memory_item_tokens * 4], # Rough char limit |
| 767 | "memory_id": mem.get("memory_id"), |
| 768 | "similarity": mem.get("similarity", 0.0), |
| 769 | "q_value": mem.get("q_estimate", self.initial_q), |
| 770 | "score": mem.get("score", 0.0), |
| 771 | "type": "memrl_value_driven", |
| 772 | }) |
| 773 | |
| 774 | except Exception as e: |
| 775 | logger.warning(f"[MemRL] Retrieval failed: {e}, falling back to empty context") |
| 776 | retrieval_result = {"selected": [], "candidates": [], "simmax": 0.0} |
| 777 | |
| 778 | retrieval_time = time.time() - start_time |
| 779 | |
| 780 | # Calculate token budget for memory context |
| 781 | system_tokens = self._llm_client.count_tokens(system_message) if system_message else 0 |
| 782 | reserved_tokens = self.max_tokens + 500 |
nothing calls this directly
no test coverage detected