| suggest_aggregations_llm |
function |
py |
datascience |
1.0.0 |
impure |
def suggest_aggregations_llm(profile: dict, candidates: dict, max_aggs: int = 4, model: str = "claude-haiku-4-5-20251001") -> dict |
MUST-11.1 del capitulo AGREGACION del AutomaticEDA (grupo eda). Dado el TableProfile de una tabla y los candidatos cuantitativos de select_groupby_keys ({group_keys:[{col,cardinality,score}], measures:[str], pivots:[{index,columns,value}]}), con UNA sola llamada al LLM elige y ordena las K agregaciones (GROUP BY categorica x medidas numericas) y los pivots MAS INFORMATIVOS para un analisis de grupos, con una razon corta cada uno, evitando la explosion combinatoria (no todo contra todo). Privacidad/coste: NO envia filas crudas, solo el resumen AGREGADO de los candidatos (tabla, columnas categoricas con cardinalidad/score, medidas, pivots). Reusa ask_llm del grupo claude-direct (API directa con token OAuth de Claude). Impura, dict-no-throw: NUNCA lanza y SIEMPRE devuelve algo usable; si el LLM falla, el JSON no parsea o no hay seleccion valida, cae a un fallback determinista construido desde los candidatos (source='fallback'). Toda columna que el LLM invente se descarta. |
| eda |
| claude-direct |
| llm |
| aggregation |
| groupby |
| pivot |
| datascience |
| automatic-eda |
|
| name |
desc |
| profile |
TableProfile del grupo eda. Solo se usa profile['table'] para nombrar la tabla en el prompt; puede ir vacio o sin esa clave (se usa '(tabla sin nombre)'). |
|
| name |
desc |
| candidates |
Salida de select_groupby_keys: {group_keys:[{col, cardinality, score}], measures:[str], pivots:[{index, columns, value}]}. group_keys = columnas categoricas candidatas para GROUP BY; measures = columnas numericas a agregar (sum/avg); pivots = cruces index x columns -> value sugeridos. Cualquier columna que el LLM elija debe existir aqui o se descarta. None o no-dict se trata como vacio. |
|
| name |
desc |
| max_aggs |
Tope de agregaciones a devolver. Default 4. Valores <1 o no-int se normalizan a 4. Limita tanto la seleccion del LLM como el fallback determinista, para evitar la explosion combinatoria. |
|
| name |
desc |
| model |
id del modelo Anthropic a usar en la unica llamada. Default 'claude-haiku-4-5-20251001' (haiku, coste bajo, ~2-3s). Para razones mas finas, pasar p.ej. 'claude-opus-4-8'. |
|
|
dict dict-no-throw: {status:'ok', source:'llm'|'fallback', aggregations:[{group_by:str, measures:[str], why:str}], pivots:[{index:str, columns:str, value:str|None, why:str}], note:str}. source=='llm' si el LLM produjo al menos una agregacion valida (columnas existentes en candidates); en cualquier otro caso (LLM caido, JSON invalido, seleccion vacia, sin candidatos) source=='fallback' y aggregations/pivots se derivan de candidates con why='selección cuantitativa (sin LLM)'. NUNCA lanza. |
| ask_llm_py_core |
| select_groupby_keys_py_datascience |
|
|
|
false |
error_go_core |
|
true |
| test_extract_json_object |
| test_extract_json_wrapped_in_fences_and_junk |
| test_extract_json_non_json_returns_none |
| test_validate_aggregations_drops_invalid_columns |
| test_llm_path_uses_selection |
| test_llm_path_respects_max_aggs |
| test_llm_invented_column_is_discarded |
| test_fallback_on_empty_llm_response |
| test_fallback_on_unparseable_response |
| test_fallback_respects_max_aggs |
| test_fallback_when_llm_raises |
| test_no_candidates_returns_empty_fallback |
| test_non_dict_candidates_does_not_raise |
|
python/functions/datascience/suggest_aggregations_llm_test.py |
python/functions/datascience/suggest_aggregations_llm.py |