Parcourir la source

feat(memory): two-tier memory - persistent voiceprint + session context

- load_conversation_hist(): returns OpenAI-format messages for self.hist
- On reconnection, persistent history restored as real conversation messages
- Both system prompt context AND message-level history injected
- self.hist capped at 20 turns
wenhongquan il y a 3 semaines
Parent
commit
e1a9225a6e
2 fichiers modifiés avec 23 ajouts et 5 suppressions
  1. 16 1
      asr_agent/voiceprint.py
  2. 7 4
      asr_agent/worker.py

+ 16 - 1
asr_agent/voiceprint.py

@@ -273,7 +273,7 @@ def save_conversation(speaker_id: str, speaker_name: str, user_query: str, reply
 
 
 def load_conversation_context(speaker_id: str | None, speaker_name: str | None, limit: int = 5) -> str:
-    """Retrieve recent conversation history for a speaker."""
+    """Retrieve recent conversation history as formatted text for system prompt."""
     if not speaker_id:
         return ""
     with _MEM_LOCK:
@@ -290,3 +290,18 @@ def load_conversation_context(speaker_id: str | None, speaker_name: str | None,
         if history:
             return "以下是之前和该用户的对话记录,请参考上下文回应:\n" + "\n".join(history)
     return ""
+
+
+def load_conversation_hist(speaker_id: str, limit: int = 6) -> list[dict]:
+    """Return conversation history as OpenAI message list for self.hist."""
+    with _MEM_LOCK:
+        if not _MEMORY_LOADED:
+            _load_memories()
+        entries = _MEMORY.get(speaker_id, [])
+        hist = []
+        for e in entries[-limit:]:
+            q, r = e.get("query", ""), e.get("reply", "")
+            if q and r:
+                hist.append({"role": "user", "content": q})
+                hist.append({"role": "assistant", "content": r})
+    return hist

+ 7 - 4
asr_agent/worker.py

@@ -648,11 +648,14 @@ class Worker:
                 if speaker_name:
                     logger.info("VP: identified %s (sim=%.3f)", speaker_name, _sim)
                     await self._send({"type": "speaker", "name": speaker_name, "confidence": round(_sim, 3)})
-                    # Restore conversation history from persistent memory
+                    # Restore persistent conversation history into current session
                     try:
-                        hist_data = load_conversation_context(speaker_id, speaker_name, limit=10)
-                        if hist_data:
-                            logger.info("Loaded %d history turns for %s", hist_data.count("用户:"), speaker_name)
+                        from voiceprint import load_conversation_hist
+                        loaded = load_conversation_hist(speaker_id, limit=6)
+                        if loaded:
+                            self.hist = loaded + self.hist
+                            self.hist[:] = self.hist[-20:]
+                            logger.info("Restored %d turns for %s", len(loaded), speaker_name)
                     except Exception:
                         pass
                 else: