Редактировать history_manager.py
This commit is contained in:
@@ -6,6 +6,8 @@
|
|||||||
- Сжатие длинной истории с помощью иерархического резюмирования.
|
- Сжатие длинной истории с помощью иерархического резюмирования.
|
||||||
- Форматирование истории в список сообщений для передачи в LLM.
|
- Форматирование истории в список сообщений для передачи в LLM.
|
||||||
- Сохранение новых сообщений в историю.
|
- Сохранение новых сообщений в историю.
|
||||||
|
- Обрезка сообщений до лимита символов.
|
||||||
|
- Пагинация при получении истории.
|
||||||
|
|
||||||
Используется в RAGOrchestrator для управления контекстом диалога.
|
Используется в RAGOrchestrator для управления контекстом диалога.
|
||||||
"""
|
"""
|
||||||
@@ -56,20 +58,35 @@ class HistoryManager:
|
|||||||
self,
|
self,
|
||||||
user_jid: str,
|
user_jid: str,
|
||||||
room_jid: Optional[str] = None,
|
room_jid: Optional[str] = None,
|
||||||
limit: int = 100
|
limit: int = 100,
|
||||||
|
offset: int = 0
|
||||||
) -> List[Dict[str, str]]:
|
) -> List[Dict[str, str]]:
|
||||||
"""
|
"""
|
||||||
Получает историю диалога из БД.
|
Получает историю диалога из БД с поддержкой пагинации.
|
||||||
|
|
||||||
Аргументы:
|
Аргументы:
|
||||||
user_jid: JID пользователя (без ресурса)
|
user_jid: JID пользователя (без ресурса)
|
||||||
room_jid: JID комнаты (None для личного чата)
|
room_jid: JID комнаты (None для личного чата)
|
||||||
limit: максимальное количество сообщений
|
limit: максимальное количество сообщений для возврата
|
||||||
|
offset: смещение (количество пропускаемых сообщений)
|
||||||
|
|
||||||
Возвращает:
|
Возвращает:
|
||||||
List[Dict[str, str]]: список сообщений с ключами 'role' и 'content'
|
List[Dict[str, str]]: список сообщений с ключами 'role' и 'content'
|
||||||
"""
|
"""
|
||||||
raw_history: List[Dict[str, Any]] = await self.db.get_history(user_jid, room_jid, limit=limit)
|
# Так как PostgresService.get_history не поддерживает offset,
|
||||||
|
# мы запрашиваем на offset больше записей, а затем обрезаем.
|
||||||
|
# Это неэффективно для больших offset, но допустимо для умеренных значений.
|
||||||
|
# В будущем следует добавить поддержку offset в PostgresService.
|
||||||
|
fetch_limit = limit + offset
|
||||||
|
raw_history: List[Dict[str, Any]] = await self.db.get_history(
|
||||||
|
user_jid, room_jid, limit=fetch_limit
|
||||||
|
)
|
||||||
|
# Применяем offset и limit
|
||||||
|
if offset > 0:
|
||||||
|
raw_history = raw_history[offset:offset + limit]
|
||||||
|
else:
|
||||||
|
raw_history = raw_history[:limit]
|
||||||
|
|
||||||
# Преобразуем в формат, ожидаемый LLM
|
# Преобразуем в формат, ожидаемый LLM
|
||||||
return [
|
return [
|
||||||
{"role": rec['role'], "content": rec['content']}
|
{"role": rec['role'], "content": rec['content']}
|
||||||
@@ -177,7 +194,7 @@ class HistoryManager:
|
|||||||
room_jid: Optional[str] = None
|
room_jid: Optional[str] = None
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
Сохраняет одно сообщение в историю диалога.
|
Сохраняет одно сообщение в историю диалога с обрезкой до лимита символов.
|
||||||
|
|
||||||
Аргументы:
|
Аргументы:
|
||||||
user_jid: JID пользователя
|
user_jid: JID пользователя
|
||||||
@@ -185,6 +202,12 @@ class HistoryManager:
|
|||||||
content: текст сообщения
|
content: текст сообщения
|
||||||
room_jid: JID комнаты (None для личного чата)
|
room_jid: JID комнаты (None для личного чата)
|
||||||
"""
|
"""
|
||||||
|
# Получаем лимит из конфига или используем значение по умолчанию
|
||||||
|
max_len: int = getattr(self.config, 'max_history_message_length', 10000)
|
||||||
|
if len(content) > max_len:
|
||||||
|
content = content[:max_len] + "..."
|
||||||
|
logger.debug(f"Сообщение обрезано до {max_len} символов")
|
||||||
|
|
||||||
await self.db.add_history(user_jid, role, content, room_jid)
|
await self.db.add_history(user_jid, role, content, room_jid)
|
||||||
logger.debug(f"Сохранено сообщение {role} для {user_jid} (room={room_jid})")
|
logger.debug(f"Сохранено сообщение {role} для {user_jid} (room={room_jid})")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user