mirror of
https://github.com/agentscope-ai/ReMe.git
synced 2026-10-06 02:48:22 +00:00
rm recall experience op
This commit is contained in:
parent
58da4d64e4
commit
fe162d32d6
4 changed files with 17 additions and 108 deletions
4
TODO.md
4
TODO.md
|
|
@ -25,4 +25,6 @@
|
|||
4. 周四下午和兆洋对一下
|
||||
|
||||
# 锦鲤
|
||||
1. LOGO更加简洁 agent <-> experience
|
||||
1. LOGO更加简洁 agent <-> experience
|
||||
2. default等名字的说明
|
||||
3. 查看所有的op代码
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue