From ba2d2dbcaa75850f9ccd6a742d8e3a680dd72f3a Mon Sep 17 00:00:00 2001 From: acano Date: Wed, 18 Feb 2026 14:51:04 +0100 Subject: [PATCH] Implement feature X to enhance user experience and fix bug Y in module Z --- scratches/acano/es_ingestion.ipynb | 239 +++++++++++++++++++---------- 1 file changed, 157 insertions(+), 82 deletions(-) diff --git a/scratches/acano/es_ingestion.ipynb b/scratches/acano/es_ingestion.ipynb index 2cf276e..fe77465 100644 --- a/scratches/acano/es_ingestion.ipynb +++ b/scratches/acano/es_ingestion.ipynb @@ -2,21 +2,10 @@ "cells": [ { "cell_type": "code", - "execution_count": 15, + "execution_count": 1, "id": "0a8abbfa", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "import os\n", "import re\n", @@ -27,12 +16,18 @@ "import torch\n", "import torch.nn.functional as F\n", "from loguru import logger\n", - "from transformers import AutoTokenizer, AutoModel\n", + "from transformers import AutoTokenizer, AutoModel, AutoConfig\n", "from elasticsearch import Elasticsearch\n", "from elasticsearch.helpers import bulk\n", "import nltk\n", "from nltk.tokenize import sent_tokenize\n", - "nltk.download(\"punkt\", quiet=True)" + "nltk.download(\"punkt\", quiet=True)\n", + "\n", + "config = AutoConfig.from_pretrained(os.getenv(\"EMBEDDING_MODEL_NAME\"))\n", + "embedding_dim = config.hidden_size\n", + "\n", + "es_index = os.getenv(\"ELASTICSEARCH_INDEX\")\n", + "embedding_model_name = os.getenv(\"EMBEDDING_MODEL_NAME\")" ] }, { @@ -102,7 +97,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 5, "id": "9f360449", "metadata": {}, "outputs": [], @@ -140,13 +135,13 @@ "def semantic_chunking(\n", " text: str,\n", " embedding_model_name: str = os.getenv(\"EMBEDDING_MODEL_NAME\"),\n", - " similarity_threshold: float = 0.78,\n", + " similarity_threshold: float = 0.6,\n", " max_sentences_per_chunk: int = 12,\n", ") -> List[str]:\n", " sentences = [s.strip() for s in sent_tokenize(text) if s.strip()]\n", " if not sentences:\n", " return []\n", - " print(f\"Semantic chunking: {len(sentences)} sentences found\")\n", + " logger.info(f\"Semantic chunking: {len(sentences)} sentences found\")\n", " device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", "\n", " tokenizer = AutoTokenizer.from_pretrained(embedding_model_name)\n", @@ -164,6 +159,7 @@ "\n", " for i in range(1, len(sentences)):\n", " sim = float((vecs[i - 1] * vecs[i]).sum())\n", + " logger.info(f\"Similarity between sentence {i-1} and {i}: {sim:.4f}\")\n", " if sim < similarity_threshold or len(chunks[-1]) >= max_sentences_per_chunk:\n", " chunks.append([])\n", " chunks[-1].append(sentences[i])\n", @@ -235,7 +231,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "ff03c689", "metadata": {}, "outputs": [], @@ -243,16 +239,29 @@ "def index_chunks(\n", " es: Elasticsearch,\n", " index_name: str,\n", - " model: SentenceTransformer,\n", " chunks: List[Chunk],\n", + " embedding_model_name: str = os.getenv(\"EMBEDDING_MODEL_NAME\"),\n", " batch_size: int = 64,\n", ") -> None:\n", + " tokenizer = AutoTokenizer.from_pretrained(embedding_model_name)\n", + " model = AutoModel.from_pretrained(embedding_model_name)\n", + " device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", + " model.to(device)\n", + " model.eval()\n", + " \n", " def actions() -> Iterable[Dict[str, Any]]:\n", " # Embed in batches for speed\n", " for i in range(0, len(chunks), batch_size):\n", " batch = chunks[i:i + batch_size]\n", " texts = [c.text for c in batch]\n", - " vectors = model.encode(texts, normalize_embeddings=True).tolist()\n", + " \n", + " with torch.no_grad():\n", + " enc = tokenizer(texts, padding=True, truncation=True, return_tensors=\"pt\").to(device)\n", + " out = model(**enc)\n", + " mask = enc[\"attention_mask\"].unsqueeze(-1)\n", + " vecs = (out.last_hidden_state * mask).sum(1) / mask.sum(1).clamp(min=1e-9)\n", + " vecs = F.normalize(vecs, p=2, dim=1)\n", + " vectors = vecs.cpu().tolist()\n", "\n", " for c, v in zip(batch, vectors):\n", " yield {\n", @@ -272,101 +281,167 @@ " bulk(es, actions(), request_timeout=120)" ] }, + { + "cell_type": "markdown", + "id": "11c8a650", + "metadata": {}, + "source": [ + "### Test" + ] + }, { "cell_type": "code", - "execution_count": null, - "id": "7bcf0c87", + "execution_count": 18, + "id": "5cd83a73", "metadata": {}, "outputs": [], "source": [ - "es_url = os.environ.get(\"ES_URL\", \"http://localhost:9200\")\n", - "es_user = os.environ.get(\"ES_USER\")\n", - "es_pass = os.environ.get(\"ES_PASS\")\n", - "index_name = \"my_docs_v1\"\n", + "mapping = {\n", + " \"settings\": {\n", + " \"index\": {\n", + " \"number_of_shards\": 1\n", + " }\n", + " },\n", + " \"mappings\": {\n", + " \"properties\": {\n", + " \"doc_id\": { \"type\": \"keyword\" },\n", + " \"chunk_id\": { \"type\": \"integer\" },\n", + " \"text\": { \"type\": \"text\" },\n", + " \"source\": { \"type\": \"keyword\" },\n", + " \"metadata\": { \"type\": \"object\", \"enabled\": True },\n", + " \"embedding\": {\n", + " \"type\": \"dense_vector\",\n", + " \"dims\": embedding_dim,\n", + " \"index\": True,\n", + " \"similarity\": \"cosine\"\n", + " }\n", + " }\n", + " }\n", + "}\n", "\n", "es = Elasticsearch(\n", - " es_url,\n", - " basic_auth=(es_user, es_pass) if es_user and es_pass else None,\n", - " request_timeout=60,\n", + " os.getenv(\"ELASTICSEARCH_LOCAL_URL\"),\n", ")\n", "\n", - "# Pick a model with dims matching your index mapping.\n", - "model = SentenceTransformer(\"sentence-transformers/all-mpnet-base-v2\") # 768 dims\n", - "\n", - "# Example document\n", - "doc_text = \"\"\"\n", - "This is a sample document. Replace this with your PDF/HTML extraction output.\n", - "\"\"\"\n", - "chunks = build_chunks(\n", - " doc_text=doc_text,\n", - " source=\"local_demo\",\n", - " metadata={\"title\": \"Demo\", \"doc_id\": \"demo-001\"},\n", - ")\n", - "\n", - "index_chunks(es, index_name, model, chunks)\n", - "es.indices.refresh(index=index_name)\n", - "print(f\"Indexed {len(chunks)} chunks into {index_name}.\")" + "if es.indices.exists(index=es_index):\n", + " es.indices.delete(index=es_index)" ] }, { "cell_type": "code", - "execution_count": 24, - "id": "b1ba8e85", + "execution_count": 19, + "id": "c3510b3e", "metadata": {}, "outputs": [ { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "b763a493689549a180ab815567520c0a", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Loading weights: 0%| | 0/310 [00:00 \u001b[39m\u001b[32m419\u001b[39m \u001b[43mhf_hub_download\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 420\u001b[39m \u001b[43m \u001b[49m\u001b[43mpath_or_repo_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 421\u001b[39m \u001b[43m \u001b[49m\u001b[43mfilenames\u001b[49m\u001b[43m[\u001b[49m\u001b[32;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 422\u001b[39m \u001b[43m \u001b[49m\u001b[43msubfolder\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43msubfolder\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[43m==\u001b[49m\u001b[43m \u001b[49m\u001b[32;43m0\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43msubfolder\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 423\u001b[39m \u001b[43m \u001b[49m\u001b[43mrepo_type\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrepo_type\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 424\u001b[39m \u001b[43m \u001b[49m\u001b[43mrevision\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrevision\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 425\u001b[39m \u001b[43m \u001b[49m\u001b[43mcache_dir\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcache_dir\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 426\u001b[39m \u001b[43m \u001b[49m\u001b[43muser_agent\u001b[49m\u001b[43m=\u001b[49m\u001b[43muser_agent\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 427\u001b[39m \u001b[43m \u001b[49m\u001b[43mforce_download\u001b[49m\u001b[43m=\u001b[49m\u001b[43mforce_download\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 428\u001b[39m \u001b[43m \u001b[49m\u001b[43mproxies\u001b[49m\u001b[43m=\u001b[49m\u001b[43mproxies\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 429\u001b[39m \u001b[43m \u001b[49m\u001b[43mtoken\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtoken\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 430\u001b[39m \u001b[43m \u001b[49m\u001b[43mlocal_files_only\u001b[49m\u001b[43m=\u001b[49m\u001b[43mlocal_files_only\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 431\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 432\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/huggingface_hub/utils/_validators.py:85\u001b[39m, in \u001b[36mvalidate_hf_hub_args.._inner_fn\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 84\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m arg_name \u001b[38;5;129;01min\u001b[39;00m [\u001b[33m\"\u001b[39m\u001b[33mrepo_id\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mfrom_id\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mto_id\u001b[39m\u001b[33m\"\u001b[39m]:\n\u001b[32m---> \u001b[39m\u001b[32m85\u001b[39m \u001b[43mvalidate_repo_id\u001b[49m\u001b[43m(\u001b[49m\u001b[43marg_value\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 87\u001b[39m kwargs = smoothly_deprecate_legacy_arguments(fn_name=fn.\u001b[34m__name__\u001b[39m, kwargs=kwargs)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/huggingface_hub/utils/_validators.py:135\u001b[39m, in \u001b[36mvalidate_repo_id\u001b[39m\u001b[34m(repo_id)\u001b[39m\n\u001b[32m 134\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m REPO_ID_REGEX.match(repo_id):\n\u001b[32m--> \u001b[39m\u001b[32m135\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m HFValidationError(\n\u001b[32m 136\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mRepo id must use alphanumeric chars, \u001b[39m\u001b[33m'\u001b[39m\u001b[33m-\u001b[39m\u001b[33m'\u001b[39m\u001b[33m, \u001b[39m\u001b[33m'\u001b[39m\u001b[33m_\u001b[39m\u001b[33m'\u001b[39m\u001b[33m or \u001b[39m\u001b[33m'\u001b[39m\u001b[33m.\u001b[39m\u001b[33m'\u001b[39m\u001b[33m.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 137\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m The name cannot start or end with \u001b[39m\u001b[33m'\u001b[39m\u001b[33m-\u001b[39m\u001b[33m'\u001b[39m\u001b[33m or \u001b[39m\u001b[33m'\u001b[39m\u001b[33m.\u001b[39m\u001b[33m'\u001b[39m\u001b[33m and the maximum length is 96:\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 138\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m \u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mrepo_id\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m\u001b[33m.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 139\u001b[39m )\n\u001b[32m 141\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[33m\"\u001b[39m\u001b[33m--\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m repo_id \u001b[38;5;129;01mor\u001b[39;00m \u001b[33m\"\u001b[39m\u001b[33m..\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m repo_id:\n", + "\u001b[31mHFValidationError\u001b[39m: Repo id must use alphanumeric chars, '-', '_' or '.'. The name cannot start or end with '-' or '.' and the maximum length is 96: '[Chunk(doc_id='demo-001', chunk_id=0, text='El impacto de la computación distribuida en la investigación científica La computación distribuida ha transformado profundamente la manera en que se realiza investigación científica a gran escala. En lugar de depender de un único superordenador centralizado, hoy es posible coordinar miles de máquinas interconectadas que comparten tareas complejas. Este enfoque permite procesar volúmenes masivos de datos en tiempos significativamente menores. Uno de los casos más conocidos es el análisis genómico. La secuenciación del ADN genera cantidades enormes de información que deben procesarse y compararse. Gracias a sistemas distribuidos, los investigadores pueden analizar', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=1, text='es de información que deben procesarse y compararse. Gracias a sistemas distribuidos, los investigadores pueden analizar mutaciones, identificar patrones genéticos y acelerar el desarrollo de tratamientos personalizados. Además del ámbito médico, la física de partículas también se beneficia enormemente. Experimentos como los realizados en el CERN producen petabytes de datos que deben distribuirse entre centros de investigación de todo el mundo. Sin este modelo colaborativo y distribuido, muchos descubrimientos serían simplemente inviables. Limitaciones energéticas y sostenibilidad Sin embargo, la expansión de infraestructuras computacionales trae consigo desafíos importantes. Uno', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=2, text='ostenibilidad Sin embargo, la expansión de infraestructuras computacionales trae consigo desafíos importantes. Uno de los más relevantes es el consumo energético. Los centros de datos modernos requieren cantidades masivas de electricidad tanto para operar como para refrigerar los equipos. Este consumo ha impulsado investigaciones en eficiencia energética, arquitecturas más sostenibles y el uso de energías renovables. Algunas empresas tecnológicas ya están instalando centros de datos en regiones frías para reducir costes de refrigeración, mientras que otras exploran soluciones basadas en inteligencia artificial para optimizar el uso energético. La sostenibilidad se ha', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=3, text=' otras exploran soluciones basadas en inteligencia artificial para optimizar el uso energético. La sostenibilidad se ha convertido en un criterio estratégico, no solo económico sino también reputacional. Las organizaciones que no gestionan adecuadamente su huella de carbono pueden enfrentar críticas públicas y regulatorias. Modelos de lenguaje y aprendizaje profundo En paralelo, el desarrollo de modelos de lenguaje de gran escala ha redefinido la inteligencia artificial contemporánea. Estos modelos, entrenados con billones de parámetros, pueden generar texto coherente, traducir idiomas y resolver problemas complejos. El entrenamiento de estos sistemas', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=4, text=', pueden generar texto coherente, traducir idiomas y resolver problemas complejos. El entrenamiento de estos sistemas requiere infraestructuras distribuidas extremadamente potentes. El paralelismo de datos y el paralelismo de modelo permiten dividir la carga computacional entre múltiples GPUs o nodos especializados. Sin embargo, la fase de inferencia presenta retos distintos. Aunque es menos intensiva que el entrenamiento, la inferencia a gran escala —como en servicios públicos de IA— requiere optimización constante para reducir latencia y consumo de recursos. Técnicas de chunking y recuperación semántica En sistemas basados en recuperación aumentada', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=5, text=' consumo de recursos. Técnicas de chunking y recuperación semántica En sistemas basados en recuperación aumentada (RAG), el modo en que se fragmenta la información influye directamente en la calidad de las respuestas generadas. El chunking basado únicamente en longitud puede cortar ideas a la mitad, afectando la coherencia del contexto recuperado. Por otro lado, el semantic chunking intenta agrupar fragmentos de texto que comparten significado. Este enfoque utiliza embeddings para medir similitud y decidir dónde dividir el contenido. Un umbral de similitud demasiado bajo puede generar fragmentos excesivamente grandes y heterogéne', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=6, text=' contenido. Un umbral de similitud demasiado bajo puede generar fragmentos excesivamente grandes y heterogéneos. En cambio, un umbral demasiado alto puede producir fragmentos pequeños y perder contexto relevante. La calibración adecuada depende del dominio del texto, la longitud media de los párrafos y el modelo de embeddings utilizado. Agricultura vertical y urbanismo del futuro La agricultura vertical propone cultivar alimentos en estructuras urbanas de múltiples niveles. Esta técnica busca reducir la dependencia del transporte y optimizar el uso del espacio en ciudades densamente pobladas. Mediante sistemas hidropónicos y control automatizado de nutrientes, las plant', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=7, text=' en ciudades densamente pobladas. Mediante sistemas hidropónicos y control automatizado de nutrientes, las plantas pueden crecer sin suelo tradicional. Sensores distribuidos monitorizan humedad, temperatura y niveles de nutrientes en tiempo real. Además, la integración con energías renovables permite que estas instalaciones funcionen de manera más sostenible. En algunos casos, los edificios agrícolas se diseñan para integrarse arquitectónicamente en el entorno urbano. Aunque todavía enfrenta desafíos económicos, la agricultura vertical representa una posible solución para la seguridad alimentaria en megaciudades.', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'})]'.", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[31mOSError\u001b[39m Traceback (most recent call last)", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/transformers/models/auto/tokenization_auto.py:624\u001b[39m, in \u001b[36mAutoTokenizer.from_pretrained\u001b[39m\u001b[34m(cls, pretrained_model_name_or_path, *inputs, **kwargs)\u001b[39m\n\u001b[32m 623\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m624\u001b[39m config = \u001b[43mAutoConfig\u001b[49m\u001b[43m.\u001b[49m\u001b[43mfrom_pretrained\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 625\u001b[39m \u001b[43m \u001b[49m\u001b[43mpretrained_model_name_or_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtrust_remote_code\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtrust_remote_code\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\n\u001b[32m 626\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 627\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/transformers/models/auto/configuration_auto.py:1403\u001b[39m, in \u001b[36mAutoConfig.from_pretrained\u001b[39m\u001b[34m(cls, pretrained_model_name_or_path, **kwargs)\u001b[39m\n\u001b[32m 1401\u001b[39m code_revision = kwargs.pop(\u001b[33m\"\u001b[39m\u001b[33mcode_revision\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[32m-> \u001b[39m\u001b[32m1403\u001b[39m config_dict, unused_kwargs = \u001b[43mPreTrainedConfig\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget_config_dict\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpretrained_model_name_or_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1404\u001b[39m has_remote_code = \u001b[33m\"\u001b[39m\u001b[33mauto_map\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m config_dict \u001b[38;5;129;01mand\u001b[39;00m \u001b[33m\"\u001b[39m\u001b[33mAutoConfig\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m config_dict[\u001b[33m\"\u001b[39m\u001b[33mauto_map\u001b[39m\u001b[33m\"\u001b[39m]\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/transformers/configuration_utils.py:572\u001b[39m, in \u001b[36mPreTrainedConfig.get_config_dict\u001b[39m\u001b[34m(cls, pretrained_model_name_or_path, **kwargs)\u001b[39m\n\u001b[32m 571\u001b[39m \u001b[38;5;66;03m# Get config dict associated with the base config file\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m572\u001b[39m config_dict, kwargs = \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_get_config_dict\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpretrained_model_name_or_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 573\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m config_dict \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/transformers/configuration_utils.py:627\u001b[39m, in \u001b[36mPreTrainedConfig._get_config_dict\u001b[39m\u001b[34m(cls, pretrained_model_name_or_path, **kwargs)\u001b[39m\n\u001b[32m 625\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 626\u001b[39m \u001b[38;5;66;03m# Load from local folder or from cache or download from model Hub and cache\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m627\u001b[39m resolved_config_file = \u001b[43mcached_file\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 628\u001b[39m \u001b[43m \u001b[49m\u001b[43mpretrained_model_name_or_path\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 629\u001b[39m \u001b[43m \u001b[49m\u001b[43mconfiguration_file\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 630\u001b[39m \u001b[43m \u001b[49m\u001b[43mcache_dir\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcache_dir\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 631\u001b[39m \u001b[43m \u001b[49m\u001b[43mforce_download\u001b[49m\u001b[43m=\u001b[49m\u001b[43mforce_download\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 632\u001b[39m \u001b[43m \u001b[49m\u001b[43mproxies\u001b[49m\u001b[43m=\u001b[49m\u001b[43mproxies\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 633\u001b[39m \u001b[43m \u001b[49m\u001b[43mlocal_files_only\u001b[49m\u001b[43m=\u001b[49m\u001b[43mlocal_files_only\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 634\u001b[39m \u001b[43m \u001b[49m\u001b[43mtoken\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtoken\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 635\u001b[39m \u001b[43m \u001b[49m\u001b[43muser_agent\u001b[49m\u001b[43m=\u001b[49m\u001b[43muser_agent\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 636\u001b[39m \u001b[43m \u001b[49m\u001b[43mrevision\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrevision\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 637\u001b[39m \u001b[43m \u001b[49m\u001b[43msubfolder\u001b[49m\u001b[43m=\u001b[49m\u001b[43msubfolder\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 638\u001b[39m \u001b[43m \u001b[49m\u001b[43m_commit_hash\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcommit_hash\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 639\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 640\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m resolved_config_file \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/transformers/utils/hub.py:276\u001b[39m, in \u001b[36mcached_file\u001b[39m\u001b[34m(path_or_repo_id, filename, **kwargs)\u001b[39m\n\u001b[32m 226\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 227\u001b[39m \u001b[33;03mTries to locate a file in a local folder and repo, downloads and cache it if necessary.\u001b[39;00m\n\u001b[32m 228\u001b[39m \n\u001b[32m (...)\u001b[39m\u001b[32m 274\u001b[39m \u001b[33;03m```\u001b[39;00m\n\u001b[32m 275\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m276\u001b[39m file = \u001b[43mcached_files\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath_or_repo_id\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpath_or_repo_id\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfilenames\u001b[49m\u001b[43m=\u001b[49m\u001b[43m[\u001b[49m\u001b[43mfilename\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 277\u001b[39m file = file[\u001b[32m0\u001b[39m] \u001b[38;5;28;01mif\u001b[39;00m file \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m file\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/transformers/utils/hub.py:468\u001b[39m, in \u001b[36mcached_files\u001b[39m\u001b[34m(path_or_repo_id, filenames, cache_dir, force_download, proxies, token, revision, local_files_only, subfolder, repo_type, user_agent, _raise_exceptions_for_gated_repo, _raise_exceptions_for_missing_entries, _raise_exceptions_for_connection_errors, _commit_hash, **deprecated_kwargs)\u001b[39m\n\u001b[32m 467\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(e, \u001b[38;5;167;01mValueError\u001b[39;00m):\n\u001b[32m--> \u001b[39m\u001b[32m468\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mOSError\u001b[39;00m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00me\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01me\u001b[39;00m\n\u001b[32m 470\u001b[39m \u001b[38;5;66;03m# Now we try to recover if we can find all files correctly in the cache\u001b[39;00m\n", + "\u001b[31mOSError\u001b[39m: Repo id must use alphanumeric chars, '-', '_' or '.'. The name cannot start or end with '-' or '.' and the maximum length is 96: '[Chunk(doc_id='demo-001', chunk_id=0, text='El impacto de la computación distribuida en la investigación científica La computación distribuida ha transformado profundamente la manera en que se realiza investigación científica a gran escala. En lugar de depender de un único superordenador centralizado, hoy es posible coordinar miles de máquinas interconectadas que comparten tareas complejas. Este enfoque permite procesar volúmenes masivos de datos en tiempos significativamente menores. Uno de los casos más conocidos es el análisis genómico. La secuenciación del ADN genera cantidades enormes de información que deben procesarse y compararse. Gracias a sistemas distribuidos, los investigadores pueden analizar', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=1, text='es de información que deben procesarse y compararse. Gracias a sistemas distribuidos, los investigadores pueden analizar mutaciones, identificar patrones genéticos y acelerar el desarrollo de tratamientos personalizados. Además del ámbito médico, la física de partículas también se beneficia enormemente. Experimentos como los realizados en el CERN producen petabytes de datos que deben distribuirse entre centros de investigación de todo el mundo. Sin este modelo colaborativo y distribuido, muchos descubrimientos serían simplemente inviables. Limitaciones energéticas y sostenibilidad Sin embargo, la expansión de infraestructuras computacionales trae consigo desafíos importantes. Uno', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=2, text='ostenibilidad Sin embargo, la expansión de infraestructuras computacionales trae consigo desafíos importantes. Uno de los más relevantes es el consumo energético. Los centros de datos modernos requieren cantidades masivas de electricidad tanto para operar como para refrigerar los equipos. Este consumo ha impulsado investigaciones en eficiencia energética, arquitecturas más sostenibles y el uso de energías renovables. Algunas empresas tecnológicas ya están instalando centros de datos en regiones frías para reducir costes de refrigeración, mientras que otras exploran soluciones basadas en inteligencia artificial para optimizar el uso energético. La sostenibilidad se ha', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=3, text=' otras exploran soluciones basadas en inteligencia artificial para optimizar el uso energético. La sostenibilidad se ha convertido en un criterio estratégico, no solo económico sino también reputacional. Las organizaciones que no gestionan adecuadamente su huella de carbono pueden enfrentar críticas públicas y regulatorias. Modelos de lenguaje y aprendizaje profundo En paralelo, el desarrollo de modelos de lenguaje de gran escala ha redefinido la inteligencia artificial contemporánea. Estos modelos, entrenados con billones de parámetros, pueden generar texto coherente, traducir idiomas y resolver problemas complejos. El entrenamiento de estos sistemas', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=4, text=', pueden generar texto coherente, traducir idiomas y resolver problemas complejos. El entrenamiento de estos sistemas requiere infraestructuras distribuidas extremadamente potentes. El paralelismo de datos y el paralelismo de modelo permiten dividir la carga computacional entre múltiples GPUs o nodos especializados. Sin embargo, la fase de inferencia presenta retos distintos. Aunque es menos intensiva que el entrenamiento, la inferencia a gran escala —como en servicios públicos de IA— requiere optimización constante para reducir latencia y consumo de recursos. Técnicas de chunking y recuperación semántica En sistemas basados en recuperación aumentada', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=5, text=' consumo de recursos. Técnicas de chunking y recuperación semántica En sistemas basados en recuperación aumentada (RAG), el modo en que se fragmenta la información influye directamente en la calidad de las respuestas generadas. El chunking basado únicamente en longitud puede cortar ideas a la mitad, afectando la coherencia del contexto recuperado. Por otro lado, el semantic chunking intenta agrupar fragmentos de texto que comparten significado. Este enfoque utiliza embeddings para medir similitud y decidir dónde dividir el contenido. Un umbral de similitud demasiado bajo puede generar fragmentos excesivamente grandes y heterogéne', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=6, text=' contenido. Un umbral de similitud demasiado bajo puede generar fragmentos excesivamente grandes y heterogéneos. En cambio, un umbral demasiado alto puede producir fragmentos pequeños y perder contexto relevante. La calibración adecuada depende del dominio del texto, la longitud media de los párrafos y el modelo de embeddings utilizado. Agricultura vertical y urbanismo del futuro La agricultura vertical propone cultivar alimentos en estructuras urbanas de múltiples niveles. Esta técnica busca reducir la dependencia del transporte y optimizar el uso del espacio en ciudades densamente pobladas. Mediante sistemas hidropónicos y control automatizado de nutrientes, las plant', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=7, text=' en ciudades densamente pobladas. Mediante sistemas hidropónicos y control automatizado de nutrientes, las plantas pueden crecer sin suelo tradicional. Sensores distribuidos monitorizan humedad, temperatura y niveles de nutrientes en tiempo real. Además, la integración con energías renovables permite que estas instalaciones funcionen de manera más sostenible. En algunos casos, los edificios agrícolas se diseñan para integrarse arquitectónicamente en el entorno urbano. Aunque todavía enfrenta desafíos económicos, la agricultura vertical representa una posible solución para la seguridad alimentaria en megaciudades.', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'})]'.", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[31mHFValidationError\u001b[39m Traceback (most recent call last)", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/transformers/utils/hub.py:419\u001b[39m, in \u001b[36mcached_files\u001b[39m\u001b[34m(path_or_repo_id, filenames, cache_dir, force_download, proxies, token, revision, local_files_only, subfolder, repo_type, user_agent, _raise_exceptions_for_gated_repo, _raise_exceptions_for_missing_entries, _raise_exceptions_for_connection_errors, _commit_hash, **deprecated_kwargs)\u001b[39m\n\u001b[32m 417\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(full_filenames) == \u001b[32m1\u001b[39m:\n\u001b[32m 418\u001b[39m \u001b[38;5;66;03m# This is slightly better for only 1 file\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m419\u001b[39m \u001b[43mhf_hub_download\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 420\u001b[39m \u001b[43m \u001b[49m\u001b[43mpath_or_repo_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 421\u001b[39m \u001b[43m \u001b[49m\u001b[43mfilenames\u001b[49m\u001b[43m[\u001b[49m\u001b[32;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 422\u001b[39m \u001b[43m \u001b[49m\u001b[43msubfolder\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43msubfolder\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[43m==\u001b[49m\u001b[43m \u001b[49m\u001b[32;43m0\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43msubfolder\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 423\u001b[39m \u001b[43m \u001b[49m\u001b[43mrepo_type\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrepo_type\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 424\u001b[39m \u001b[43m \u001b[49m\u001b[43mrevision\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrevision\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 425\u001b[39m \u001b[43m \u001b[49m\u001b[43mcache_dir\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcache_dir\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 426\u001b[39m \u001b[43m \u001b[49m\u001b[43muser_agent\u001b[49m\u001b[43m=\u001b[49m\u001b[43muser_agent\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 427\u001b[39m \u001b[43m \u001b[49m\u001b[43mforce_download\u001b[49m\u001b[43m=\u001b[49m\u001b[43mforce_download\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 428\u001b[39m \u001b[43m \u001b[49m\u001b[43mproxies\u001b[49m\u001b[43m=\u001b[49m\u001b[43mproxies\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 429\u001b[39m \u001b[43m \u001b[49m\u001b[43mtoken\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtoken\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 430\u001b[39m \u001b[43m \u001b[49m\u001b[43mlocal_files_only\u001b[49m\u001b[43m=\u001b[49m\u001b[43mlocal_files_only\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 431\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 432\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/huggingface_hub/utils/_validators.py:85\u001b[39m, in \u001b[36mvalidate_hf_hub_args.._inner_fn\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 84\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m arg_name \u001b[38;5;129;01min\u001b[39;00m [\u001b[33m\"\u001b[39m\u001b[33mrepo_id\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mfrom_id\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mto_id\u001b[39m\u001b[33m\"\u001b[39m]:\n\u001b[32m---> \u001b[39m\u001b[32m85\u001b[39m \u001b[43mvalidate_repo_id\u001b[49m\u001b[43m(\u001b[49m\u001b[43marg_value\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 87\u001b[39m kwargs = smoothly_deprecate_legacy_arguments(fn_name=fn.\u001b[34m__name__\u001b[39m, kwargs=kwargs)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/huggingface_hub/utils/_validators.py:135\u001b[39m, in \u001b[36mvalidate_repo_id\u001b[39m\u001b[34m(repo_id)\u001b[39m\n\u001b[32m 134\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m REPO_ID_REGEX.match(repo_id):\n\u001b[32m--> \u001b[39m\u001b[32m135\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m HFValidationError(\n\u001b[32m 136\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mRepo id must use alphanumeric chars, \u001b[39m\u001b[33m'\u001b[39m\u001b[33m-\u001b[39m\u001b[33m'\u001b[39m\u001b[33m, \u001b[39m\u001b[33m'\u001b[39m\u001b[33m_\u001b[39m\u001b[33m'\u001b[39m\u001b[33m or \u001b[39m\u001b[33m'\u001b[39m\u001b[33m.\u001b[39m\u001b[33m'\u001b[39m\u001b[33m.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 137\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m The name cannot start or end with \u001b[39m\u001b[33m'\u001b[39m\u001b[33m-\u001b[39m\u001b[33m'\u001b[39m\u001b[33m or \u001b[39m\u001b[33m'\u001b[39m\u001b[33m.\u001b[39m\u001b[33m'\u001b[39m\u001b[33m and the maximum length is 96:\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 138\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m \u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mrepo_id\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m\u001b[33m.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 139\u001b[39m )\n\u001b[32m 141\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[33m\"\u001b[39m\u001b[33m--\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m repo_id \u001b[38;5;129;01mor\u001b[39;00m \u001b[33m\"\u001b[39m\u001b[33m..\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m repo_id:\n", + "\u001b[31mHFValidationError\u001b[39m: Repo id must use alphanumeric chars, '-', '_' or '.'. The name cannot start or end with '-' or '.' and the maximum length is 96: '[Chunk(doc_id='demo-001', chunk_id=0, text='El impacto de la computación distribuida en la investigación científica La computación distribuida ha transformado profundamente la manera en que se realiza investigación científica a gran escala. En lugar de depender de un único superordenador centralizado, hoy es posible coordinar miles de máquinas interconectadas que comparten tareas complejas. Este enfoque permite procesar volúmenes masivos de datos en tiempos significativamente menores. Uno de los casos más conocidos es el análisis genómico. La secuenciación del ADN genera cantidades enormes de información que deben procesarse y compararse. Gracias a sistemas distribuidos, los investigadores pueden analizar', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=1, text='es de información que deben procesarse y compararse. Gracias a sistemas distribuidos, los investigadores pueden analizar mutaciones, identificar patrones genéticos y acelerar el desarrollo de tratamientos personalizados. Además del ámbito médico, la física de partículas también se beneficia enormemente. Experimentos como los realizados en el CERN producen petabytes de datos que deben distribuirse entre centros de investigación de todo el mundo. Sin este modelo colaborativo y distribuido, muchos descubrimientos serían simplemente inviables. Limitaciones energéticas y sostenibilidad Sin embargo, la expansión de infraestructuras computacionales trae consigo desafíos importantes. Uno', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=2, text='ostenibilidad Sin embargo, la expansión de infraestructuras computacionales trae consigo desafíos importantes. Uno de los más relevantes es el consumo energético. Los centros de datos modernos requieren cantidades masivas de electricidad tanto para operar como para refrigerar los equipos. Este consumo ha impulsado investigaciones en eficiencia energética, arquitecturas más sostenibles y el uso de energías renovables. Algunas empresas tecnológicas ya están instalando centros de datos en regiones frías para reducir costes de refrigeración, mientras que otras exploran soluciones basadas en inteligencia artificial para optimizar el uso energético. La sostenibilidad se ha', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=3, text=' otras exploran soluciones basadas en inteligencia artificial para optimizar el uso energético. La sostenibilidad se ha convertido en un criterio estratégico, no solo económico sino también reputacional. Las organizaciones que no gestionan adecuadamente su huella de carbono pueden enfrentar críticas públicas y regulatorias. Modelos de lenguaje y aprendizaje profundo En paralelo, el desarrollo de modelos de lenguaje de gran escala ha redefinido la inteligencia artificial contemporánea. Estos modelos, entrenados con billones de parámetros, pueden generar texto coherente, traducir idiomas y resolver problemas complejos. El entrenamiento de estos sistemas', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=4, text=', pueden generar texto coherente, traducir idiomas y resolver problemas complejos. El entrenamiento de estos sistemas requiere infraestructuras distribuidas extremadamente potentes. El paralelismo de datos y el paralelismo de modelo permiten dividir la carga computacional entre múltiples GPUs o nodos especializados. Sin embargo, la fase de inferencia presenta retos distintos. Aunque es menos intensiva que el entrenamiento, la inferencia a gran escala —como en servicios públicos de IA— requiere optimización constante para reducir latencia y consumo de recursos. Técnicas de chunking y recuperación semántica En sistemas basados en recuperación aumentada', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=5, text=' consumo de recursos. Técnicas de chunking y recuperación semántica En sistemas basados en recuperación aumentada (RAG), el modo en que se fragmenta la información influye directamente en la calidad de las respuestas generadas. El chunking basado únicamente en longitud puede cortar ideas a la mitad, afectando la coherencia del contexto recuperado. Por otro lado, el semantic chunking intenta agrupar fragmentos de texto que comparten significado. Este enfoque utiliza embeddings para medir similitud y decidir dónde dividir el contenido. Un umbral de similitud demasiado bajo puede generar fragmentos excesivamente grandes y heterogéne', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=6, text=' contenido. Un umbral de similitud demasiado bajo puede generar fragmentos excesivamente grandes y heterogéneos. En cambio, un umbral demasiado alto puede producir fragmentos pequeños y perder contexto relevante. La calibración adecuada depende del dominio del texto, la longitud media de los párrafos y el modelo de embeddings utilizado. Agricultura vertical y urbanismo del futuro La agricultura vertical propone cultivar alimentos en estructuras urbanas de múltiples niveles. Esta técnica busca reducir la dependencia del transporte y optimizar el uso del espacio en ciudades densamente pobladas. Mediante sistemas hidropónicos y control automatizado de nutrientes, las plant', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=7, text=' en ciudades densamente pobladas. Mediante sistemas hidropónicos y control automatizado de nutrientes, las plantas pueden crecer sin suelo tradicional. Sensores distribuidos monitorizan humedad, temperatura y niveles de nutrientes en tiempo real. Además, la integración con energías renovables permite que estas instalaciones funcionen de manera más sostenible. En algunos casos, los edificios agrícolas se diseñan para integrarse arquitectónicamente en el entorno urbano. Aunque todavía enfrenta desafíos económicos, la agricultura vertical representa una posible solución para la seguridad alimentaria en megaciudades.', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'})]'.", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[31mOSError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[21]\u001b[39m\u001b[32m, line 10\u001b[39m\n\u001b[32m 1\u001b[39m chunks = build_chunks(\n\u001b[32m 2\u001b[39m doc_text=doc_text,\n\u001b[32m 3\u001b[39m source=\u001b[33m\"\u001b[39m\u001b[33mlocal_demo\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m (...)\u001b[39m\u001b[32m 7\u001b[39m overlap=\u001b[32m25\u001b[39m,\n\u001b[32m 8\u001b[39m )\n\u001b[32m---> \u001b[39m\u001b[32m10\u001b[39m \u001b[43mindex_chunks\u001b[49m\u001b[43m(\u001b[49m\u001b[43mes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mes_index\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43membedding_model_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mchunks\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 11\u001b[39m es.indices.refresh(index=es_index)\n\u001b[32m 12\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mIndexed \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlen\u001b[39m(chunks)\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m chunks into \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mes_index\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m.\u001b[39m\u001b[33m\"\u001b[39m)\n", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[8]\u001b[39m\u001b[32m, line 8\u001b[39m, in \u001b[36mindex_chunks\u001b[39m\u001b[34m(es, index_name, chunks, embedding_model_name, batch_size)\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mindex_chunks\u001b[39m(\n\u001b[32m 2\u001b[39m es: Elasticsearch,\n\u001b[32m 3\u001b[39m index_name: \u001b[38;5;28mstr\u001b[39m,\n\u001b[32m (...)\u001b[39m\u001b[32m 6\u001b[39m batch_size: \u001b[38;5;28mint\u001b[39m = \u001b[32m64\u001b[39m,\n\u001b[32m 7\u001b[39m ) -> \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m----> \u001b[39m\u001b[32m8\u001b[39m tokenizer = \u001b[43mAutoTokenizer\u001b[49m\u001b[43m.\u001b[49m\u001b[43mfrom_pretrained\u001b[49m\u001b[43m(\u001b[49m\u001b[43membedding_model_name\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 9\u001b[39m model = AutoModel.from_pretrained(embedding_model_name)\n\u001b[32m 10\u001b[39m device = \u001b[33m\"\u001b[39m\u001b[33mcuda\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m torch.cuda.is_available() \u001b[38;5;28;01melse\u001b[39;00m \u001b[33m\"\u001b[39m\u001b[33mcpu\u001b[39m\u001b[33m\"\u001b[39m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/transformers/models/auto/tokenization_auto.py:628\u001b[39m, in \u001b[36mAutoTokenizer.from_pretrained\u001b[39m\u001b[34m(cls, pretrained_model_name_or_path, *inputs, **kwargs)\u001b[39m\n\u001b[32m 624\u001b[39m config = AutoConfig.from_pretrained(\n\u001b[32m 625\u001b[39m pretrained_model_name_or_path, trust_remote_code=trust_remote_code, **kwargs\n\u001b[32m 626\u001b[39m )\n\u001b[32m 627\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m628\u001b[39m config = \u001b[43mPreTrainedConfig\u001b[49m\u001b[43m.\u001b[49m\u001b[43mfrom_pretrained\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpretrained_model_name_or_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 630\u001b[39m config_model_type = config.model_type\n\u001b[32m 632\u001b[39m \u001b[38;5;66;03m# Next, let's try to use the tokenizer_config file to get the tokenizer class.\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/transformers/configuration_utils.py:531\u001b[39m, in \u001b[36mPreTrainedConfig.from_pretrained\u001b[39m\u001b[34m(cls, pretrained_model_name_or_path, cache_dir, force_download, local_files_only, token, revision, **kwargs)\u001b[39m\n\u001b[32m 528\u001b[39m kwargs[\u001b[33m\"\u001b[39m\u001b[33mlocal_files_only\u001b[39m\u001b[33m\"\u001b[39m] = local_files_only\n\u001b[32m 529\u001b[39m kwargs[\u001b[33m\"\u001b[39m\u001b[33mrevision\u001b[39m\u001b[33m\"\u001b[39m] = revision\n\u001b[32m--> \u001b[39m\u001b[32m531\u001b[39m config_dict, kwargs = \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mget_config_dict\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpretrained_model_name_or_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 532\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mcls\u001b[39m.base_config_key \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mcls\u001b[39m.base_config_key \u001b[38;5;129;01min\u001b[39;00m config_dict:\n\u001b[32m 533\u001b[39m config_dict = config_dict[\u001b[38;5;28mcls\u001b[39m.base_config_key]\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/transformers/configuration_utils.py:572\u001b[39m, in \u001b[36mPreTrainedConfig.get_config_dict\u001b[39m\u001b[34m(cls, pretrained_model_name_or_path, **kwargs)\u001b[39m\n\u001b[32m 570\u001b[39m original_kwargs = copy.deepcopy(kwargs)\n\u001b[32m 571\u001b[39m \u001b[38;5;66;03m# Get config dict associated with the base config file\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m572\u001b[39m config_dict, kwargs = \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_get_config_dict\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpretrained_model_name_or_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 573\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m config_dict \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 574\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m {}, kwargs\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/transformers/configuration_utils.py:627\u001b[39m, in \u001b[36mPreTrainedConfig._get_config_dict\u001b[39m\u001b[34m(cls, pretrained_model_name_or_path, **kwargs)\u001b[39m\n\u001b[32m 623\u001b[39m configuration_file = kwargs.pop(\u001b[33m\"\u001b[39m\u001b[33m_configuration_file\u001b[39m\u001b[33m\"\u001b[39m, CONFIG_NAME) \u001b[38;5;28;01mif\u001b[39;00m gguf_file \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m gguf_file\n\u001b[32m 625\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 626\u001b[39m \u001b[38;5;66;03m# Load from local folder or from cache or download from model Hub and cache\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m627\u001b[39m resolved_config_file = \u001b[43mcached_file\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 628\u001b[39m \u001b[43m \u001b[49m\u001b[43mpretrained_model_name_or_path\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 629\u001b[39m \u001b[43m \u001b[49m\u001b[43mconfiguration_file\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 630\u001b[39m \u001b[43m \u001b[49m\u001b[43mcache_dir\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcache_dir\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 631\u001b[39m \u001b[43m \u001b[49m\u001b[43mforce_download\u001b[49m\u001b[43m=\u001b[49m\u001b[43mforce_download\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 632\u001b[39m \u001b[43m \u001b[49m\u001b[43mproxies\u001b[49m\u001b[43m=\u001b[49m\u001b[43mproxies\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 633\u001b[39m \u001b[43m \u001b[49m\u001b[43mlocal_files_only\u001b[49m\u001b[43m=\u001b[49m\u001b[43mlocal_files_only\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 634\u001b[39m \u001b[43m \u001b[49m\u001b[43mtoken\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtoken\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 635\u001b[39m \u001b[43m \u001b[49m\u001b[43muser_agent\u001b[49m\u001b[43m=\u001b[49m\u001b[43muser_agent\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 636\u001b[39m \u001b[43m \u001b[49m\u001b[43mrevision\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrevision\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 637\u001b[39m \u001b[43m \u001b[49m\u001b[43msubfolder\u001b[49m\u001b[43m=\u001b[49m\u001b[43msubfolder\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 638\u001b[39m \u001b[43m \u001b[49m\u001b[43m_commit_hash\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcommit_hash\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 639\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 640\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m resolved_config_file \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 641\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m, kwargs\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/transformers/utils/hub.py:276\u001b[39m, in \u001b[36mcached_file\u001b[39m\u001b[34m(path_or_repo_id, filename, **kwargs)\u001b[39m\n\u001b[32m 221\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mcached_file\u001b[39m(\n\u001b[32m 222\u001b[39m path_or_repo_id: \u001b[38;5;28mstr\u001b[39m | os.PathLike,\n\u001b[32m 223\u001b[39m filename: \u001b[38;5;28mstr\u001b[39m,\n\u001b[32m 224\u001b[39m **kwargs,\n\u001b[32m 225\u001b[39m ) -> \u001b[38;5;28mstr\u001b[39m | \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 226\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 227\u001b[39m \u001b[33;03m Tries to locate a file in a local folder and repo, downloads and cache it if necessary.\u001b[39;00m\n\u001b[32m 228\u001b[39m \n\u001b[32m (...)\u001b[39m\u001b[32m 274\u001b[39m \u001b[33;03m ```\u001b[39;00m\n\u001b[32m 275\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m276\u001b[39m file = \u001b[43mcached_files\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath_or_repo_id\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpath_or_repo_id\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfilenames\u001b[49m\u001b[43m=\u001b[49m\u001b[43m[\u001b[49m\u001b[43mfilename\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 277\u001b[39m file = file[\u001b[32m0\u001b[39m] \u001b[38;5;28;01mif\u001b[39;00m file \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m file\n\u001b[32m 278\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m file\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/PycharmProjects/assistance-engine/.venv/lib/python3.11/site-packages/transformers/utils/hub.py:468\u001b[39m, in \u001b[36mcached_files\u001b[39m\u001b[34m(path_or_repo_id, filenames, cache_dir, force_download, proxies, token, revision, local_files_only, subfolder, repo_type, user_agent, _raise_exceptions_for_gated_repo, _raise_exceptions_for_missing_entries, _raise_exceptions_for_connection_errors, _commit_hash, **deprecated_kwargs)\u001b[39m\n\u001b[32m 462\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mOSError\u001b[39;00m(\n\u001b[32m 463\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mPermissionError at \u001b[39m\u001b[38;5;132;01m{\u001b[39;00me.filename\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m when downloading \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mpath_or_repo_id\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m. \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 464\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mCheck cache directory permissions. Common causes: 1) another user is downloading the same model (please wait); \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 465\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m2) a previous download was canceled and the lock file needs manual removal.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 466\u001b[39m ) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01me\u001b[39;00m\n\u001b[32m 467\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(e, \u001b[38;5;167;01mValueError\u001b[39;00m):\n\u001b[32m--> \u001b[39m\u001b[32m468\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mOSError\u001b[39;00m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00me\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01me\u001b[39;00m\n\u001b[32m 470\u001b[39m \u001b[38;5;66;03m# Now we try to recover if we can find all files correctly in the cache\u001b[39;00m\n\u001b[32m 471\u001b[39m resolved_files = [\n\u001b[32m 472\u001b[39m _get_cache_file_to_return(path_or_repo_id, filename, cache_dir, revision, repo_type)\n\u001b[32m 473\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m filename \u001b[38;5;129;01min\u001b[39;00m full_filenames\n\u001b[32m 474\u001b[39m ]\n", + "\u001b[31mOSError\u001b[39m: Repo id must use alphanumeric chars, '-', '_' or '.'. The name cannot start or end with '-' or '.' and the maximum length is 96: '[Chunk(doc_id='demo-001', chunk_id=0, text='El impacto de la computación distribuida en la investigación científica La computación distribuida ha transformado profundamente la manera en que se realiza investigación científica a gran escala. En lugar de depender de un único superordenador centralizado, hoy es posible coordinar miles de máquinas interconectadas que comparten tareas complejas. Este enfoque permite procesar volúmenes masivos de datos en tiempos significativamente menores. Uno de los casos más conocidos es el análisis genómico. La secuenciación del ADN genera cantidades enormes de información que deben procesarse y compararse. Gracias a sistemas distribuidos, los investigadores pueden analizar', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=1, text='es de información que deben procesarse y compararse. Gracias a sistemas distribuidos, los investigadores pueden analizar mutaciones, identificar patrones genéticos y acelerar el desarrollo de tratamientos personalizados. Además del ámbito médico, la física de partículas también se beneficia enormemente. Experimentos como los realizados en el CERN producen petabytes de datos que deben distribuirse entre centros de investigación de todo el mundo. Sin este modelo colaborativo y distribuido, muchos descubrimientos serían simplemente inviables. Limitaciones energéticas y sostenibilidad Sin embargo, la expansión de infraestructuras computacionales trae consigo desafíos importantes. Uno', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=2, text='ostenibilidad Sin embargo, la expansión de infraestructuras computacionales trae consigo desafíos importantes. Uno de los más relevantes es el consumo energético. Los centros de datos modernos requieren cantidades masivas de electricidad tanto para operar como para refrigerar los equipos. Este consumo ha impulsado investigaciones en eficiencia energética, arquitecturas más sostenibles y el uso de energías renovables. Algunas empresas tecnológicas ya están instalando centros de datos en regiones frías para reducir costes de refrigeración, mientras que otras exploran soluciones basadas en inteligencia artificial para optimizar el uso energético. La sostenibilidad se ha', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=3, text=' otras exploran soluciones basadas en inteligencia artificial para optimizar el uso energético. La sostenibilidad se ha convertido en un criterio estratégico, no solo económico sino también reputacional. Las organizaciones que no gestionan adecuadamente su huella de carbono pueden enfrentar críticas públicas y regulatorias. Modelos de lenguaje y aprendizaje profundo En paralelo, el desarrollo de modelos de lenguaje de gran escala ha redefinido la inteligencia artificial contemporánea. Estos modelos, entrenados con billones de parámetros, pueden generar texto coherente, traducir idiomas y resolver problemas complejos. El entrenamiento de estos sistemas', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=4, text=', pueden generar texto coherente, traducir idiomas y resolver problemas complejos. El entrenamiento de estos sistemas requiere infraestructuras distribuidas extremadamente potentes. El paralelismo de datos y el paralelismo de modelo permiten dividir la carga computacional entre múltiples GPUs o nodos especializados. Sin embargo, la fase de inferencia presenta retos distintos. Aunque es menos intensiva que el entrenamiento, la inferencia a gran escala —como en servicios públicos de IA— requiere optimización constante para reducir latencia y consumo de recursos. Técnicas de chunking y recuperación semántica En sistemas basados en recuperación aumentada', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=5, text=' consumo de recursos. Técnicas de chunking y recuperación semántica En sistemas basados en recuperación aumentada (RAG), el modo en que se fragmenta la información influye directamente en la calidad de las respuestas generadas. El chunking basado únicamente en longitud puede cortar ideas a la mitad, afectando la coherencia del contexto recuperado. Por otro lado, el semantic chunking intenta agrupar fragmentos de texto que comparten significado. Este enfoque utiliza embeddings para medir similitud y decidir dónde dividir el contenido. Un umbral de similitud demasiado bajo puede generar fragmentos excesivamente grandes y heterogéne', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=6, text=' contenido. Un umbral de similitud demasiado bajo puede generar fragmentos excesivamente grandes y heterogéneos. En cambio, un umbral demasiado alto puede producir fragmentos pequeños y perder contexto relevante. La calibración adecuada depende del dominio del texto, la longitud media de los párrafos y el modelo de embeddings utilizado. Agricultura vertical y urbanismo del futuro La agricultura vertical propone cultivar alimentos en estructuras urbanas de múltiples niveles. Esta técnica busca reducir la dependencia del transporte y optimizar el uso del espacio en ciudades densamente pobladas. Mediante sistemas hidropónicos y control automatizado de nutrientes, las plant', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'}), Chunk(doc_id='demo-001', chunk_id=7, text=' en ciudades densamente pobladas. Mediante sistemas hidropónicos y control automatizado de nutrientes, las plantas pueden crecer sin suelo tradicional. Sensores distribuidos monitorizan humedad, temperatura y niveles de nutrientes en tiempo real. Además, la integración con energías renovables permite que estas instalaciones funcionen de manera más sostenible. En algunos casos, los edificios agrícolas se diseñan para integrarse arquitectónicamente en el entorno urbano. Aunque todavía enfrenta desafíos económicos, la agricultura vertical representa una posible solución para la seguridad alimentaria en megaciudades.', source='local_demo', metadata={'title': 'Demo', 'doc_id': 'demo-001'})]'." + ] } ], "source": [ - "chunks" + "chunks = build_chunks(\n", + " doc_text=doc_text,\n", + " source=\"local_demo\",\n", + " metadata={\"title\": \"Demo\", \"doc_id\": \"demo-001\"},\n", + " chunking_strategy=\"fixed\",\n", + " chunk_size=150,\n", + " overlap=25,\n", + ")\n", + "\n", + "index_chunks(es, es_index, embedding_model_name, chunks)\n", + "es.indices.refresh(index=es_index)\n", + "print(f\"Indexed {len(chunks)} chunks into {es_index}.\")" ] }, { "cell_type": "code", "execution_count": null, - "id": "daa57061", + "id": "e04e2701", "metadata": {}, "outputs": [], "source": []