83 lines
3.4 KiB
SQL
83 lines
3.4 KiB
SQL
-- =====================================================
|
|
-- LLM SCHEMA - USER MEMORY TABLE
|
|
-- =====================================================
|
|
-- Description: Persistent memory about users for personalization
|
|
-- Schema: llm
|
|
-- Author: Database Agent
|
|
-- Date: 2025-12-06
|
|
-- =====================================================
|
|
|
|
CREATE TABLE llm.user_memory (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
|
|
-- Tipo de memoria
|
|
memory_type llm.memory_type NOT NULL,
|
|
|
|
-- Contenido
|
|
key VARCHAR(200) NOT NULL,
|
|
value TEXT NOT NULL,
|
|
|
|
-- Importancia
|
|
importance_score DECIMAL(3,2) DEFAULT 0.50 CHECK (importance_score >= 0.00 AND importance_score <= 1.00),
|
|
|
|
-- Fuente
|
|
source_conversation_id UUID REFERENCES llm.conversations(id) ON DELETE SET NULL,
|
|
extracted_from TEXT, -- Fragmento del que se extrajo la memoria
|
|
extraction_method VARCHAR(50) DEFAULT 'llm', -- llm, manual, system
|
|
|
|
-- Validez
|
|
is_active BOOLEAN DEFAULT true,
|
|
expires_at TIMESTAMPTZ,
|
|
|
|
-- Confirmación (algunas memorias pueden requerir confirmación del usuario)
|
|
requires_confirmation BOOLEAN DEFAULT false,
|
|
confirmed_by_user BOOLEAN DEFAULT false,
|
|
confirmed_at TIMESTAMPTZ,
|
|
|
|
-- Metadata
|
|
metadata JSONB,
|
|
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
|
|
-- Constraints
|
|
CONSTRAINT unique_user_memory_key UNIQUE(user_id, memory_type, key)
|
|
);
|
|
|
|
-- Índices
|
|
CREATE INDEX idx_memory_user ON llm.user_memory(user_id);
|
|
CREATE INDEX idx_memory_type ON llm.user_memory(memory_type);
|
|
CREATE INDEX idx_memory_active ON llm.user_memory(is_active) WHERE is_active = true;
|
|
CREATE INDEX idx_memory_importance ON llm.user_memory(importance_score DESC);
|
|
CREATE INDEX idx_memory_conversation ON llm.user_memory(source_conversation_id);
|
|
CREATE INDEX idx_memory_expires ON llm.user_memory(expires_at) WHERE expires_at IS NOT NULL;
|
|
|
|
-- Comentarios
|
|
COMMENT ON TABLE llm.user_memory IS 'Persistent memory about users for LLM personalization and context';
|
|
COMMENT ON COLUMN llm.user_memory.memory_type IS 'Type of memory: fact, preference, context, goal, or constraint';
|
|
COMMENT ON COLUMN llm.user_memory.key IS 'Memory identifier (e.g., "favorite_symbol", "trading_goal", "risk_limit")';
|
|
COMMENT ON COLUMN llm.user_memory.value IS 'Memory content (e.g., "BTCUSDT", "save for house", "max 5% per trade")';
|
|
COMMENT ON COLUMN llm.user_memory.importance_score IS 'Importance weight (0.00-1.00) for retrieval prioritization';
|
|
COMMENT ON COLUMN llm.user_memory.extracted_from IS 'Original text from which memory was extracted';
|
|
COMMENT ON COLUMN llm.user_memory.requires_confirmation IS 'Whether this memory needs explicit user confirmation';
|
|
|
|
-- Ejemplos de memorias por tipo:
|
|
COMMENT ON COLUMN llm.user_memory.memory_type IS
|
|
'Memory type examples:
|
|
- fact: "trading_since" = "2020", "max_loss_experienced" = "15%"
|
|
- preference: "favorite_indicator" = "RSI", "avoids_margin_trading" = "true"
|
|
- context: "recent_portfolio_loss" = "trying to recover", "learning_focus" = "risk management"
|
|
- goal: "monthly_target" = "5% return", "learning_goal" = "master technical analysis"
|
|
- constraint: "max_risk_per_trade" = "2%", "no_trading_during_work" = "9am-5pm"';
|
|
|
|
-- Ejemplo de metadata JSONB:
|
|
COMMENT ON COLUMN llm.user_memory.metadata IS
|
|
'Example: {
|
|
"confidence": 0.85,
|
|
"last_mentioned": "2025-12-05T10:30:00Z",
|
|
"mention_count": 5,
|
|
"related_memories": ["mem_123", "mem_456"],
|
|
"tags": ["trading_style", "risk_management"]
|
|
}';
|