| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- # coding=utf-8
- """
- 智能体记忆服务
- 提供记忆的 CRUD 操作和检索功能
- """
- from typing import List, Optional
- from django.db.models import QuerySet
- from application.models.application_memory import ApplicationMemory, ApplicationMemoryType
- from common.utils.logger import maxkb_logger
- class ApplicationMemoryService:
- """智能体记忆服务"""
- @staticmethod
- def get_memories(application_id: str, memory_type: str = None,
- is_enabled: bool = True, limit: int = 100) -> QuerySet:
- """获取应用的记忆列表"""
- queryset = ApplicationMemory.objects.filter(
- application_id=application_id,
- is_enabled=is_enabled
- )
- if memory_type:
- queryset = queryset.filter(memory_type=memory_type)
- return queryset.order_by('-relevance_score', '-create_time')[:limit]
- @staticmethod
- def get_memory(memory_id: str) -> Optional[ApplicationMemory]:
- """获取单条记忆"""
- try:
- return ApplicationMemory.objects.get(id=memory_id)
- except ApplicationMemory.DoesNotExist:
- return None
- @staticmethod
- def create_memory(application_id: str, content: str,
- memory_type: str = ApplicationMemoryType.DIALOGUE,
- metadata: dict = None) -> ApplicationMemory:
- """创建记忆"""
- return ApplicationMemory.objects.create(
- application_id=application_id,
- content=content,
- memory_type=memory_type,
- metadata=metadata or {}
- )
- @staticmethod
- def update_memory(memory_id: str, content: str = None,
- memory_type: str = None, is_enabled: bool = None,
- relevance_score: float = None,
- metadata: dict = None) -> Optional[ApplicationMemory]:
- """更新记忆"""
- memory = ApplicationMemoryService.get_memory(memory_id)
- if not memory:
- return None
- if content is not None:
- memory.content = content
- if memory_type is not None:
- memory.memory_type = memory_type
- if is_enabled is not None:
- memory.is_enabled = is_enabled
- if relevance_score is not None:
- memory.relevance_score = relevance_score
- if metadata is not None:
- memory.metadata = metadata
- memory.save()
- return memory
- @staticmethod
- def delete_memory(memory_id: str) -> bool:
- """删除记忆"""
- memory = ApplicationMemoryService.get_memory(memory_id)
- if not memory:
- return False
- memory.delete()
- return True
- @staticmethod
- def batch_delete_memories(memory_ids: List[str]) -> int:
- """批量删除记忆"""
- return ApplicationMemory.objects.filter(id__in=memory_ids).delete()[0]
- @staticmethod
- def search_memories(application_id: str, query: str,
- limit: int = 10) -> List[ApplicationMemory]:
- """搜索记忆(简单文本匹配)"""
- return list(
- ApplicationMemory.objects.filter(
- application_id=application_id,
- is_enabled=True,
- content__icontains=query
- ).order_by('-relevance_score', '-create_time')[:limit]
- )
- @staticmethod
- def get_memory_context(application_id: str, query: str = None,
- max_tokens: int = 2000) -> str:
- """获取记忆上下文(用于注入到对话 prompt)"""
- memories = ApplicationMemoryService.get_memories(
- application_id=application_id,
- is_enabled=True
- )
- if query:
- # 如果有查询,优先返回相关记忆
- relevant = ApplicationMemoryService.search_memories(
- application_id=application_id,
- query=query
- )
- if relevant:
- memories = relevant
- context_parts = []
- current_tokens = 0
- for memory in memories:
- # 简单估算 token 数(中文约 1.5 字符/token)
- estimated_tokens = len(memory.content) / 1.5
- if current_tokens + estimated_tokens > max_tokens:
- break
- context_parts.append(memory.content)
- current_tokens += estimated_tokens
- return "\n".join(context_parts)
|