(self, summary_for_new_pages, keywords_for_new_pages, pages_to_insert,
similarity_threshold=0.6, keyword_similarity_alpha=1.0)
| 186 | # No save here, it's an internal operation often followed by other ops that save |
| 187 | |
| 188 | def insert_pages_into_session(self, summary_for_new_pages, keywords_for_new_pages, pages_to_insert, |
| 189 | similarity_threshold=0.6, keyword_similarity_alpha=1.0): |
| 190 | if not self.sessions: # If no existing sessions, just add as a new one |
| 191 | print("MidTermMemory: No existing sessions. Adding new session directly.") |
| 192 | return self.add_session(summary_for_new_pages, pages_to_insert, keywords_for_new_pages) |
| 193 | |
| 194 | new_summary_vec = get_embedding( |
| 195 | summary_for_new_pages, |
| 196 | model_name=self.embedding_model_name, |
| 197 | **self.embedding_model_kwargs |
| 198 | ) |
| 199 | new_summary_vec = normalize_vector(new_summary_vec) |
| 200 | |
| 201 | best_sid = None |
| 202 | best_overall_score = -1 |
| 203 | |
| 204 | for sid, existing_session in self.sessions.items(): |
| 205 | existing_summary_vec = np.array(existing_session["summary_embedding"], dtype=np.float32) |
| 206 | semantic_sim = float(np.dot(existing_summary_vec, new_summary_vec)) |
| 207 | |
| 208 | # Keyword similarity (Jaccard index based) |
| 209 | existing_keywords = set(existing_session.get("summary_keywords", [])) |
| 210 | new_keywords_set = set(keywords_for_new_pages) |
| 211 | s_topic_keywords = 0 |
| 212 | if existing_keywords and new_keywords_set: |
| 213 | intersection = len(existing_keywords.intersection(new_keywords_set)) |
| 214 | union = len(existing_keywords.union(new_keywords_set)) |
| 215 | if union > 0: |
| 216 | s_topic_keywords = intersection / union |
| 217 | |
| 218 | overall_score = semantic_sim + keyword_similarity_alpha * s_topic_keywords |
| 219 | |
| 220 | if overall_score > best_overall_score: |
| 221 | best_overall_score = overall_score |
| 222 | best_sid = sid |
| 223 | |
| 224 | if best_sid and best_overall_score >= similarity_threshold: |
| 225 | print(f"MidTermMemory: Merging pages into session {best_sid}. Score: {best_overall_score:.2f} (Threshold: {similarity_threshold})") |
| 226 | target_session = self.sessions[best_sid] |
| 227 | |
| 228 | processed_new_pages = [] |
| 229 | for page_data in pages_to_insert: |
| 230 | page_id = page_data.get("page_id", generate_id("page")) # Use existing or generate new ID |
| 231 | |
| 232 | # 检查是否已有embedding,避免重复计算 |
| 233 | if "page_embedding" in page_data and page_data["page_embedding"]: |
| 234 | print(f"MidTermMemory: Reusing existing embedding for page {page_id}") |
| 235 | inp_vec = page_data["page_embedding"] |
| 236 | # 确保embedding是normalized的 |
| 237 | if isinstance(inp_vec, list): |
| 238 | inp_vec_np = np.array(inp_vec, dtype=np.float32) |
| 239 | if np.linalg.norm(inp_vec_np) > 1.1 or np.linalg.norm(inp_vec_np) < 0.9: # 检查是否需要重新normalize |
| 240 | inp_vec = normalize_vector(inp_vec_np).tolist() |
| 241 | else: |
| 242 | print(f"MidTermMemory: Computing new embedding for page {page_id}") |
| 243 | full_text = f"User: {page_data.get('user_input','')} Assistant: {page_data.get('agent_response','')}" |
| 244 | inp_vec = get_embedding( |
| 245 | full_text, |
no test coverage detected