trading-platform-database/ddl/schemas/llm/tables/02-messages.sql

99 lines
3.1 KiB
SQL

-- =====================================================
-- LLM SCHEMA - MESSAGES TABLE
-- =====================================================
-- Description: Individual messages in conversations
-- Schema: llm
-- Author: Database Agent
-- Date: 2025-12-06
-- =====================================================
CREATE TABLE llm.messages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Conversación
conversation_id UUID NOT NULL REFERENCES llm.conversations(id) ON DELETE CASCADE,
-- Rol y contenido
role llm.message_role NOT NULL,
content TEXT NOT NULL,
-- Metadata de LLM
model_name VARCHAR(100), -- claude-opus-4-5, gpt-4, etc.
prompt_tokens INTEGER,
completion_tokens INTEGER,
total_tokens INTEGER,
-- Contexto utilizado
context_used JSONB, -- RAG context, market data, user profile, etc.
-- Tools/Functions llamadas
tool_calls JSONB, -- Function calls realizadas
tool_results JSONB, -- Resultados de tool calls
-- Metadata de procesamiento
response_time_ms INTEGER,
temperature DECIMAL(3,2),
-- Feedback del usuario
user_rating INTEGER CHECK (user_rating >= 1 AND user_rating <= 5),
user_feedback TEXT,
-- Referencias
references_symbols VARCHAR(20)[] DEFAULT '{}',
references_concepts TEXT[] DEFAULT '{}',
-- Metadata
metadata JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Índices
CREATE INDEX idx_messages_conversation ON llm.messages(conversation_id);
CREATE INDEX idx_messages_role ON llm.messages(role);
CREATE INDEX idx_messages_created ON llm.messages(created_at DESC);
CREATE INDEX idx_messages_conversation_created ON llm.messages(conversation_id, created_at ASC);
CREATE INDEX idx_messages_rated ON llm.messages(user_rating) WHERE user_rating IS NOT NULL;
-- Comentarios
COMMENT ON TABLE llm.messages IS 'Individual messages in LLM conversations';
COMMENT ON COLUMN llm.messages.role IS 'Message sender: user, assistant, system, or tool';
COMMENT ON COLUMN llm.messages.content IS 'Message text content';
COMMENT ON COLUMN llm.messages.model_name IS 'LLM model used to generate response';
COMMENT ON COLUMN llm.messages.context_used IS 'Context provided to LLM (RAG docs, market data, user profile)';
COMMENT ON COLUMN llm.messages.tool_calls IS 'Functions/tools called by LLM during response generation';
COMMENT ON COLUMN llm.messages.user_rating IS 'User satisfaction rating (1-5 stars)';
-- Ejemplo de context_used JSONB:
COMMENT ON COLUMN llm.messages.context_used IS
'Example: {
"market_data": {
"symbol": "BTCUSDT",
"price": 45234.12,
"change_24h": 0.0234
},
"user_profile": {
"risk_profile": "moderate",
"preferred_symbols": ["BTCUSDT", "ETHUSDT"]
},
"rag_documents": [
{"doc_id": "123", "relevance": 0.89, "snippet": "..."},
{"doc_id": "456", "relevance": 0.76, "snippet": "..."}
]
}';
-- Ejemplo de tool_calls JSONB:
COMMENT ON COLUMN llm.messages.tool_calls IS
'Example: [
{
"tool": "get_market_data",
"params": {"symbol": "BTCUSDT", "timeframe": "1h"},
"result": {...}
},
{
"tool": "calculate_indicator",
"params": {"indicator": "rsi", "period": 14},
"result": {"rsi": 65.42}
}
]';