From fe162d32d6ee1320f6a4f9cec97bc2f0a420e278 Mon Sep 17 00:00:00 2001 From: "jinli.yl" Date: Wed, 23 Jul 2025 11:55:01 +0800 Subject: [PATCH] rm recall experience op --- TODO.md | 4 +- .../op/retriever/build_query_op.py | 12 +- .../op/retriever/recall_experience_op.py | 104 ------------------ .../op/vector_store/recall_vector_store_op.py | 5 +- 4 files changed, 17 insertions(+), 108 deletions(-) delete mode 100644 experiencemaker/op/retriever/recall_experience_op.py diff --git a/TODO.md b/TODO.md index 6fdf4a5e..f2442871 100644 --- a/TODO.md +++ b/TODO.md @@ -25,4 +25,6 @@ 4. 周四下午和兆洋对一下 # 锦鲤 -1. LOGO更加简洁 agent <-> experience \ No newline at end of file +1. LOGO更加简洁 agent <-> experience +2. default等名字的说明 +3. 查看所有的op代码 \ No newline at end of file diff --git a/experiencemaker/op/retriever/build_query_op.py b/experiencemaker/op/retriever/build_query_op.py index 6fac6903..97d5e63d 100644 --- a/experiencemaker/op/retriever/build_query_op.py +++ b/experiencemaker/op/retriever/build_query_op.py @@ -20,8 +20,17 @@ class BuildQueryOp(BaseOp): if enable_llm_build and enable_llm_build.lower() == "true": execution_process = merge_messages_content(request.messages) query = self.prompt_format(prompt_name="query_build", execution_process=execution_process) + else: - query = request.messages[-1].content + context_parts = [] + message_summaries = [] + for message in request.messages[-3:]: # Last 3 messages + content = message.content[:200] + "..." if len(message.content) > 200 else message.content + message_summaries.append(f"- {message.role.value}: {content}") + if message_summaries: + context_parts.append("Recent messages:\n" + "\n".join(message_summaries)) + + query = "\n\n".join(context_parts) else: raise RuntimeError("query or messages is required!") @@ -30,3 +39,4 @@ class BuildQueryOp(BaseOp): from experiencemaker.op.vector_store.recall_vector_store_op import RecallVectorStoreOp self.context.set_context(RecallVectorStoreOp.SEARCH_QUERY, query) + self.context.set_context(RecallVectorStoreOp.SEARCH_MESSAGE, request.messages) diff --git a/experiencemaker/op/retriever/recall_experience_op.py b/experiencemaker/op/retriever/recall_experience_op.py deleted file mode 100644 index 51a03329..00000000 --- a/experiencemaker/op/retriever/recall_experience_op.py +++ /dev/null @@ -1,104 +0,0 @@ -from typing import List -from loguru import logger -from pydantic import Field - -from experiencemaker.op import OP_REGISTRY -from experiencemaker.op.base_op import BaseOp -from experiencemaker.schema.message import Message -from experiencemaker.schema.vector_node import VectorNode -from experiencemaker.schema.request import RetrieverRequest - - -@OP_REGISTRY.register() -class RecallExperienceOp(BaseOp): - """ - Recall relevant experiences from vector store based on query - """ - current_path: str = __file__ - - # Configuration parameters - - def execute(self): - """Execute recall operation""" - request: RetrieverRequest = self.context.request - retrieve_top_k = self.op_params.get("retrieve_top_k",15) - query_enhancement = self.op_params.get("query_enhancement",False) - logger.info(request) - - # Extract query and messages from request - query = getattr(request, 'query', None) - messages = getattr(request, 'messages', None) - - # Store in context for downstream ops - self.context.set_context("query", request.query) - self.context.set_context("messages", request.messages) - - try: - # Build retrieval query - retrieval_query = self._build_retrieve_query(query, messages, query_enhancement) - logger.info(f"Built retrieval query: {retrieval_query}") - - # Retrieve experiences from vector store - recalled_experiences = self._retrieve_experiences(request.workspace_id, retrieval_query, retrieve_top_k) - - logger.info(f"Recalled {len(recalled_experiences)} experiences") - - # Store results in context for downstream ops - self.context.set_context("recalled_experiences", recalled_experiences) - self.context.set_context("retrieval_query", retrieval_query) - - except Exception as e: - logger.error(f"Error in recall operation: {e}") - self.context.set_context("recalled_experiences", []) - - def _build_retrieve_query(self, query: str, messages: List[Message] = None, query_enhancement = False) -> str: - """Build retrieval query from query and messages""" - # Use the original query as base - base_query = query - - # Optionally enhance with current step context if enabled - if query_enhancement and messages: - current_context = self._extract_context(messages) - if current_context: - base_query = f"{base_query} {current_context}" - - return base_query - - def _retrieve_experiences(self, workspace_id: str, query: str, retrieve_top_k: int) -> List[VectorNode]: - """Retrieve experiences from vector store""" - if not query: - logger.warning("Empty query provided for vector retrieval") - return [] - - try: - retrieved_nodes = self.vector_store.search( - workspace_id=workspace_id, - query=query, - top_k=retrieve_top_k - ) - - logger.info(f"Vector retrieval found {len(retrieved_nodes)} candidates") - return retrieved_nodes - - except Exception as e: - logger.exception(f"Error in vector retrieval: {e}") - return [] - - def _extract_context(self, messages: List[Message]) -> str: - """Extract relevant context from messages for query enhancement""" - if not messages: - return "" - - context_parts = [] - - # Add recent steps if available - recent_messages = messages[-3:] # Last 3 messages - message_summaries = [] - for message in recent_messages: - content = message.content[:200] + "..." if len(message.content) > 200 else message.content - message_summaries.append(f"- {message.role.value}: {content}") - - if message_summaries: - context_parts.append("Recent messages:\n" + "\n".join(message_summaries)) - - return "\n\n".join(context_parts) \ No newline at end of file diff --git a/experiencemaker/op/vector_store/recall_vector_store_op.py b/experiencemaker/op/vector_store/recall_vector_store_op.py index 8f877c7c..a92eef03 100644 --- a/experiencemaker/op/vector_store/recall_vector_store_op.py +++ b/experiencemaker/op/vector_store/recall_vector_store_op.py @@ -13,6 +13,7 @@ from experiencemaker.schema.vector_node import VectorNode @OP_REGISTRY.register() class RecallVectorStoreOp(BaseOp): SEARCH_QUERY = "search_query" + SEARCH_MESSAGE = "search_message" def execute(self): # get query @@ -43,5 +44,5 @@ class RecallVectorStoreOp(BaseOp): logger.info(f"after filter by threshold_score size={len(experience_list)}") # set response - request: RetrieverResponse = self.context.response - request.experience_list = experience_list + response: RetrieverResponse = self.context.response + response.experience_list = experience_list