NOTE: Architecture is in active evolution: events through Kafka, bytes via a Media Gateway into MinIO, analytics in ClickHouse, and a thin Read API for the GUI. Ingest writes WARCs; summaries are sidecar objects keyed by the exact text hash. This post tracks the big ideas; fine‑grained topics (topics/schemas, scoring features, RBAC, DLQ) will land as they stabilize. BillsTechDeck Muchas veces en la vida tenemos que hacer algo no porque es fácil, sino porque es difícil. Estoy en uno de esos espacios. Mi sueño: construir un programa para recoger y correlacionar noticias de tecnología. Interesado en el próximo gen de realidad aumentada? BillsTechDeck puede ayudarle a encontrar información sobre él! El mundo está ampliamente abierto a los tipos de gadgets y anuncios de tecnología que puede obtener de una fuente correlacionada para evaluar las tendencias de la tecnología y tal vez obtener una imagen general que puede eludirle con el vigoroso googling. Tomando un gran aliento al ser capaz de obtener la "gran imagen". Es un problema en el que me encontré mientras miraba la información sobre el Vision Pro de Apple o cuando esperaba nuevas noticias de Switch 2. Let's start with an overview of the system by showing a flow diagram (rough). Some considerations: all arrows pointing back to the message are flowing to different queues. Also, consider every subsystem to be in Docker containers and orchestrated by K8's and in a CI/CD pipeline (i didn't include it in the graph because it would be too busy). Básicamente quiero noticias, tendencias, fuentes, análisis, resúmenes en un solo lugar para construir un volumen coherente de datos que pueda comprender el zeitgeist de noticias de tecnología, gadgets y tendencias. Intento de hacer algo coherente: Now, I'm just a hobbyist. So I make no claim that I know anything. I'm having fun which is the true joy. Let's take a high overview dive into this system. He rediseñado esto Mucho sooooo Vamos a romper los pasos (dejar fuera Pasos relacionados : Kafka The takes input from the which is based on info from the . It utilizes as a way to piece together and also be able to handle rich media in a distributed way. Media gets stored in the cluster (Media Cluster) which operates on and sha1 keys (in case of WARCs, but they'll have sha256 hash keys too for system congruency) Harvester Ingreso Servicio de Feedback MinIO WARCs MinIO sha256 El sanitizador obtiene puestos de trabajo en cola desde el Harvester y saca a los medios de comunicación de la puerta de entrada de los medios para sanitarlos.Si es sucio, todavía lo mantenemos para realizar forenses en un entorno controlado OCR se ejecuta en medios ricos basados en trabajos de Kafka gets run on everything. submits a coupled job to the sanity checker, and if sane it gets sent to a scoring service to decide whether an automatic summary is warranted, if not warranted it just gets sent to the correlation engine. If insane though, the data gets sent to an (not shown for brevity) to use as analytics or get human checking. Espacio (NER) spaCy spaCy phi4 Tráfico de locura Phi4 se ejecuta en pedazos específicos de datos, ya sea garantizados por el servicio de puntuación o iniciados por el usuario. El motor de correlación se ejecuta en todo Cada subsistema tendrá auditorias robustas y someterá a la cola de registro para ser manejado por el LogHandler y en el LogSilo/ElasticSearch. Los subsistemas / distribuidores que necesitan acceso a los medios interactuarán con el clúster MinIO a través de una llamada tranquila a través de un MediaGateway. Diferentes manejadores hablan con el GUIHandler que se muestra a la GUI. El GUIHandler puede enviar ControlEvents (pidiendo para la resumida phi4, ajustando las cosas) El FeedbackService habla con el HistoricalHandler para sacarse del HistoricalSilo para entrenar un modelo que brindará mejor información para el IngressOrca (Orchestrator) para elegir mejor cuándo, dónde y cómo podemos sacar mejor información para reducir los recursos desperdiciados en los datos de aglomeración Todos los datos se almacenan en un clúster MinIO (MediaCluster) y se acceden a través de llamadas relajantes Las llamadas a los GUIHandler se hacen por llamadas relajantes Todos los subsistemas son containerizados y orquestados por Kubernetes Harvester Ingreso Servicio de Feedback Sanitizador Harvester OCR Espacio (NER) Tráfico de locura Phi4 Motor de correlación Logopeda LogSilo/ElasticSearch Medios de comunicación Media cluster MediaGateway Guión Guión Controles FeedbackService comerciantes históricos Histórico IngressOrca MediaCluster Guión I'm sure I left out some detail, but that's the gist. The Harvester: Recopilación de datos Recopilación de datos ¿Cómo recopilamos nuestras noticias sobre el elegante Pixel Fold 3? ¡Necesitamos sacarlo de la red!Diversas fuentes requieren diferentes métodos de recopilación de datos. Todos los sitios tienen estructuras específicas también (cómo complicado). afortunadamente tenemos un ecosistema increíble detrás de la recolección de datos. Detección de bot, filtración DDoS, Captchas, información malformada Python es una lenguaje para usar para este propósito y tiene una vibrante comunidad trabajando diligentemente para ayudar a los aficionados como yo a capturar la información crucial en las especificaciones de tecnología de Steam Deck 2 y otros chats sobre él (cómo increíble). increíble Recon What is the site structure? What is the site's flow? What tricks are companies like Akamai pulling to impede my ability to get my precious tech snippets? What values change and where? When does my cookie become invalid depending on an abnormal flow? Does the javascript try to fool me? Is it dynamic, obfuscated or check for tampering? Are my user agents okay and when do I rotate them? How do I handle headers? How do I handle TLS Fingerprinting? This list is getting long so I'll just add "heuristics" Este es un proceso muy involucrado y requiere una buena cantidad de atención. Así que los objetivos para obtener mis noticias de tecnología tienen que ser curados en general y alcanzados. y Recopilar información valiosa sobre los sitios y su heurística es importante. Caido Proyecto Proxy CAPTCHAs *: image recognition tasks* Tradition CAPTCHAs *: Machine learning looking at user behavior to determine bot behavior* ReCAPTCHA *: pesky things that run in the background by grumpy site admins looking to stop me* Invisible CAPTCHAs Captcha Tradicional Recuperación Invisible CAPTCHAs Aunque una lista más pequeña, estas son definitivamente un gran obstáculo y de ninguna manera una lista exhaustiva.Todas las soluciones a estos problemas requieren soluciones complejas. Podría continuar, pero creo que añadir cosas como el uso de proxy residenciales de reputación, proxy móviles, limitación de tarifas, reconocimiento y mitigación de las huellas dactilares del dispositivo y, por último, potes de miel. Por lo tanto, necesitamos tener diferentes niveles de enfoque: Estrategia de Crawling de Respuesta Graduada “Prueba con un arma de pellets, escale a una Ordenanza si es fubar’d”. “Prueba con un arma de pellets, escale a una Ordenanza si es fubar’d”. : Level 1 Pellet Gun aiohttp scrapy Use for static pages, public APIs, or weakly protected endpoints. Low noise, low cost. : Level 2 Scoped Rifle Playwright + stealth plugins Use for JS-rendered sites, light bot defenses, simple captchas. Mimics real users, simulates browser behavior. Level 3: Ordinance Crawl4AI / Nodriver , heavyCAPTCHA solving , Mobile proxies Use when you hit: invisible captchas, anti-bot JavaScript puzzles, DOM obfuscation, or flow control defenses. Heavy but necessary for hard targets. Pistola de Pellet Pistola de disparo Ordenanza ¿Por qué esto importa Eficiencia: No queme los ciclos de Playwright cuando funciona el curling. Stealth: Evite levantar alarmas innecesariamente. Longevidad: correr durante meses sin prohibiciones, no semanas. Aunque ahora vamos a introducir la complejidad que está bien. Al principio tendremos reglas muy simples. se vuelve más robusto podemos hacer mejores llamadas a mejores lugares ya que tendríamos y patrones para guiarnos. Histórico Datos históricos Histórico Esta parte del sistema es probablemente la y será uno que requiere actualización constante debido al juego de gato y ratón entre weenies ejecutando sitios que me mantienen de mis dulces, dulces noticias de Samsung. El más esencial He creado un plan para ser capaz de ingerir, ingerir, ingerir y ser capaz de verificar antes de que realmente tenga que preocuparse por sacar datos en tiempo real.El plan actual es extraer datos de archive.org (a un ritmo cortés y educadamente, por supuesto). ser asíncronos y no bloqueantes. Archivo de Internet Python Wrapper Si acabo de empezar a extraer un montón de datos oportunos, no tendría una buena garantía de que mis correlaciones signifiquen nada.Los datos históricos me dan mucho más seguridad y me permiten verificar la información con una perspectiva retrospectiva de 20/20. This approach allows me to ingest and focus on the rest of the system without having to build a crawler that will require a lot of changes. I feel building a crawler would eat too much time at the start and leave the rest of the system derelict. No hay que confiar en los datos: El arte de las personas que buscan envenenar tu sistema El arte de las personas que buscan envenenar tu sistema ¿Cuál es el problema de obtener datos de Internet? Well, anyone who has been on the internet for any length of time knows about the dirty trolls. Actors who are out to hose you and your noble goal of getting the new smart phone information. Because the fact that people want to pwn you, you have to assume the worst. Destacemos algunas preocupaciones (no una lista exhaustiva, sólo un sabor) Malice in action Javascript Payloads (XSS, Embedded goodness, etc) Worry about data exfiltration Browser Exploits Redirection and Phishing PDF Macros and Embedded Object Can do spooky things like "remote code execution" Info disclosures Initiate connections to scary C2's Handling various filetypes Office Document macros EXE/DLL (less of a concern since they'd be filtered Malicous archive files that contain executables and path traversals Image/Media file: hiding stegonagraphy or utilizing dirty dirty codecs Data Integrity Tampered data Spoofed sources People looking to poison my system with generally bad data So how do we deal with this? Some things I left off this list (like servers trying to DDoS my harvester by serving up tons of unnecessary data to hurt my feelings). Primero queremos aislar y contener todos los datos que no hemos examinado.Una caja negra separada que reside en un sistema de red diferente o es . While occurs, it has to be weighed with the caveats that come with air-gapping (which I won't bore anyone with). air-gapped VLAN hopping One level is running reglas en un archivo. Lo cual es bueno, y un gran punto de partida. Tenemos herramientas para el análisis macro. Podemos verificar que los archivos son lo que son (asegurándose de que los trolls sucios no ocultan exes). Verificamos los hashes contra los feeds de amenazas. YARA PDF Análisis de código estático We also have En el otro extremo, es until we get past the Internet Archive phase. It comes with Proporciona análisis dinámico, informes de comportamiento, detección de amenazas... , de Algunos archivos sucios pueden detectar entornos de caja de arena. Otros pueden escapar de ellos. Es intensivo en recursos y tiene una configuración compleja. Es demasiado intensivo en recursos y complejo por un tiempo. coco No se implementará Significado pero it can be thwarted! it can be thwarted! Lastly, we have to worry about data poisoning. I don't have a clear path on how to handle this. There is a breadth of research papers I am going to go through to better understand the problem and approaches. No one said . I write this not a definitive writing of what I'm doing. More so highlighting the La cantidad de maneras en que los hombres malos pueden me and my system. safety is easy estancamiento compromise I have yet to see a lock that can't be picked. I can only make it as complicated as I can. Teniendo en cuenta esto, estoy diseñando esta parte con . Performance, memory safety and I just like it a lot. This will be a job. Media will be fetched and posted to the to interact with the (MinIO cluster) Rust Tokio Medios de comunicación MediaCluster Medios de comunicación MediaCluster In conclusion: In conclusion: En conclusión: En la mayor parte del tiempo, son for Cuanto más lejos pueda poner las manzanas dulces y dulces en el árbol y El mejor. Los malos actores mirando low hanging fruit minimize my attack surface Si los datos son escasos, los cuarentamos para poder analizarlos, los documentamos y los almacenamos en el . Histórico Histórico Phi4-medium: summarizing for busy people like me summarizing for busy people like me come with a lot of challenges. Resource wise, content wise. However, they also have the ability to give us cogent summaries of potentially lengthy pieces of information. That's why I'm using (needed something more robust). LLM's Phi4-medium Why would I choose this? Goldilocks size and performance Medium is bigger than mini. Medium has 14 billion parameters. Competitive enough with larger models but more efficient Optimized for my use cases Adecuado para implantaciones locales Cost-effective (desde que soy un granjero de repollo bajo) Flexibility in deployments I need something local and powerful and it fits the bill. Having it being its own docker image makes it easy. Another positive is my ability to fine tune it (for my greedy need for information on the new iPhone). Caveats! Hallucination Tis the cost of doing business. For this I may have to implement and RAG system. My own guys are working against me! *sigh* English In the end this is not an overall large deal since I'm not multilingual. Though it adds complexity should I want to expand data sources to places I can't understand I'm pigeonholing myself into consuming English. My own guys are working against me! Inglés So what does a like me do? headstrong cabbage farmer Los controles de salud. Things like volume yields : Checks if the summary's length is reasonable. Meaning Did Phi-4 produce a 150-word summary as requested, or did it return a single sentence or a 10-page novel? . Cardinality or categorical value checks : Checks if the entities (people, places, etc.) in the summary are a valid subset of the entities in the original article. Primary defense against hallucination. Meaning Does the summary mention 'Germany' when the source text only ever mentioned 'France'? . Completeness and fill rate checks Checks for the omission of critical information. Meaning: The original article mentioned three key companies, but the summary only includes one. Is the summary missing vital information? Uniqueness checks Checks for repetitive or redundant content within the summary. Meaning: Did the model get stuck in a loop and repeat the same sentence three times? . Range checks Checks if numerical data in the summary is factually correct based on the source. Meaning: The source text says profits were '$5 million,' but the summary says '$5 billion.' Is this a catastrophic numerical error? Presence checks The most basic check: did the service return anything at all? Meaning: Did the Phi-4 service time out or return an empty string instead of a summary? Data type validation checks. Checks if the summary adheres to the requested structure. Meaning: I asked for a JSON object with a 'title' and 'key_points' array. Is the output valid JSON with those exact keys? Consistency checks The deepest check for factual grounding and logical contradiction. Meaning: The source text says 'the project was cancelled,' but the summary implies it's ongoing. Does the summary contradict the facts of the original article? Things like volume yields Cardinality or categorical value checks Completitud y cumplimiento de los controles Comprobación de unicidad Rango de control Presence checks Verificación de tipo de datos. Comprobación de coherencia Esta lista puede convertirse rápidamente en el uso de los nombres de Benjamin Buford Blue para los camarones, por lo que lo topé allí. Esto se ejecutará automáticamente basado en el servicio de puntuación o solicitado manualmente por . Yo Capturar entidades con spaCy: the Atrapando cosas pertinentes grabbing pertinent things We are at the La Sección. spaCy ¿Qué modelo elegir? ofrece una variedad de modelos pre-entrenados todos con sus propios usos. so out of the box Probablemente necesitaré fijar un hábito and add Al principio tendré que anotar los datos para entrenar mi modelo (hay herramientas de código abierto para automatizar este proceso). . spaCy Contenidos Web Generales it won't recognize tech jargon No modelo Componentes habituales Identificar los tipos de entidades I will need to be (en el and ) y Para entrar y hacer y (es decir, "Apple" la empresa y "apple" el fruto). Con eso viene la posibilidad de construir una entidad personalizada de enlace de componente o integración de herramientas externas (esperemos que no). fluent in rule-based matching matcher EntityRuler Necesitará Entidades vinculadas Desambiguaciones Dado que sólo estoy preocupado por el inglés en este momento, estoy bendecido por ser ignorante de la detección de idiomas. En el pasado, habría que pensar en cosas como y . When not in use turn it off! Procesamiento de batch component disabling Con la consideración posible running with Tendré que considerar based models and based models, and also have to consider considerable RAM utilization. Procesos paralelos phi4 CPU GPU Hay que . The use of custom attributes will be a must. I will have to plan for out-of-domain text which I will inevitably run into and is crucial for me to know how to handle. Preprocesamiento, postprocesamiento y eventualmente integración de lógica y modelos externos Lastly, and almost most importantly: Los controles de salud. Esquema de validación Verificar los tipos de datos correctos Presta atención al comportamiento en torno a los campos críticos Defining expected data types Establecer intervalos aceptables con cosas como fechas y cuentas de palabras Definición de los valores permitidos Define completeness thresholds Consideración de las reglas de coherencia transversal A lot of the above mentioned sanity check stuff applies here, but in a more granular sense dealing with entities. The list goes on, and again, it becomes listing uses for shrimp to Forrest Gump. I feel okay about the completeness of this section. Correlación de datos: making sense of things Hacer sentido de las cosas En este sistema se Necesito un lenguaje que me pueda proporcionar algunas garantías de memoria, así como evitar que cometa errores de novato. al principio. lo pensé y volví a . I'm simply not an experienced programador y probablemente implementaría cosas que arruinarían mi sistema. Correlación de datos incredibly C++ Rust C++ En esencia, Toma entidades de and connects the dots. It will utilize Dos Necesitaba una granularidad real y funcionalidad para las estadísticas en correlación.Un proyecto anterior incorporó RocksDB, que no era lo suficientemente robusto con los desarrollos recientes. Rust Espacio Clínica Escribir / Leer / Tienda pertinente cosas So stats will be important (yay!). An La forma de codificar es clave y tendré que ser muy deliberado con lo que hago, por qué lo hago y cómo implemento las cosas. por esta parte, ya que tendré muchos procesos I/O que hablan de . idomatic Tokio Clínica We basically take all entities and En ellos se comparan . Análisis Rico historical data Considero las siguientes cosas: ¿Es esta relación estadísticamente significativa? Is this correlation more than just "chance"? ¿Merece la pena crear una relación gráfica con este significado? ¿Hay algún apoyo factual para poner énfasis en esta relación específica? So I'd need to do things like establish a for connections. It'd also be a good idea to establish , una medida que marca cuánto más probable es que dos entidades aparezcan juntas que por casualidad.Dónde las puntuaciones altas y negativas me dicen cosas grandes sobre una correlación. El valor p Información recíproca El uso de estadísticas es esencial para filtrar el ruido. por ejemplo, las entidades y aparecen juntas miles de veces, pero esta conexión es y Las estadísticas nos ayudan a demostrar que una conexión más rara, como una empresa de tecnología específica y una agencia gubernamental, es mucho más significativa incluso si sólo aparece unas pocas veces. : its Porque es una . “Apple” 'iPhone' Obviamente not Casa Blanca not significant El edificio blanco Antes de entrar en algunos conceptos que me siento fuera del alcance de esta visión general, lo dejaré en eso. Los datos: La espalda La espalda Entonces, ¿qué hago con todos estos datos sobre artículos de nueva tecnología calientes? I hoard it. Tendremos múltiples bases de datos (PostgreSQL, ClickHouse, Neo4j y MinIO) Todas las operaciones de datos se alimentarán a través de Uno se encargará Las operaciones, una which will be used to store artifact data , two will be (en el and ). Its a lot, but each DB has its own strength and I believe a simple Tendría desventajas significativas. Manejadores de datos Neo4J Postgrado (Básicamente un registro de metadatos) ClickHouse Histórico Correlaciones "SQL Server for everything" Histórico Correlaciones Las estructuras de datos, las tablas y las teclas primarias serán iguales en (El complejo Entre otras cosas, el will be significantly easier, though will definitely require a lot of care. It will be a source of much contemplation, tears and frustration. A good design will pay off in spades. I'm approaching this later since I feel I'll have a much better idea of what I need the further in the system I get. good ClickHouse stored procedures ArtifactSilo ArtifactSilo is another beast. I feel as long as my it in it should be painless (famous last words). My feelings are that I essentially want to try and make it as dumb as possible. I want to be able to point to point to my correlation engine and understand the Si empecé a agregar capas de complejidad y lógica de correlación, los datos se vuelven más acoplados y se deducen del valor de mi motor de correlación. El 4J correlator isn't phoning relatively “¿Por qué ?” El Será una DB tiene un montón de datos granulares de cosas como: HistoricalSilo Clínica HistoricalSilo Dónde encontramos buenos datos Cuáles son las consultas de búsqueda que proporcionan los mejores datos ¿Qué métodos de recolección funcionaron mejor para qué fuente de datos ¿Dónde/cuándo y potencialmente por qué recibimos datos sucios? Análisis de los datos sucios There's most likely much more, and I will find them when I get to that point. El Clúster será mucho menos doloroso para implementar que los otros. todavía tengo que asegurarme de que todo es cinturón y suspensores. Minero Las bases de datos serán una experiencia intensa. habrá una tonelada más. GUI: ¡Tempo de webapp! El Será una Inicialmente iba a hacer de esto una aplicación de escritorio. me di cuenta de que al final quiero que más personas la utilicen. No sería una gran opción. Gui webapp Pyside6 Using a Tengo acceso a una gran variedad de bibliotecas.Tengo acceso increíble a la información que puede no estar disponible si usaba una interfaz gráfica. , my goals were a lot different. I honestly just didn't want to write a gui in Python. I have no good reason as to why I don't. It's perfectly capable. It was just a personal preference. webapp Pyside6 Teniendo esa sensación de ronquido en mi intestino, busqué otra opción de gui. of gui projects were abandoned. To add to that, finding good examples of what people built with the gui libraries was difficult if not impossible. I could definitely have just pushed forward, but I didn't want to use something then put in work and come to the realization that my vision isn't possible with a certain gui. LOT Así que fui con una . There is a lot of benefit to it, but now I'll have to be really on top of security. However, I won't have to worry about that complexity until I believe I'm ready to show my project, and just maybe by then I could find some cool dudes to code with. webapp En primer lugar, el guionista habla con el Quien habla con el , , de y hacer control de eventos como poder ejecutar ciertos trabajos. Tendrá que ser deliberado y deliberado en la forma en que pone puestos de trabajo en . Guiadero Logopeda ArtifactHandler comerciantes históricos Controles Kafka Guiadero Logopeda ArtifactHandler comerciantes históricos Controles Tendremos que ser capaces de servir a todos los tipos de medios ricos. Se siente más prudente hacer solo una webapp. Palabras finales : Últimas consideraciones Últimas consideraciones I didn't cover everything. Una cosa que quiero añadir es mi elección de . el for this project right now is indeed overkill. It wasn't my initial choice. However, I ran into a snag during development when my initial choice became untenable. So, Es donde aterrizamos. Esta entrada se cierra ahora en 4.5k palabras Kafka Kafka Kafka An added bonus is that it looks good on a resume. Siempre he decidido intentar ser desarrollador. If . I won't Sin embargo, se vería bien. Hay una tonelada de trabajo por delante para poder respirar vida en mi amor por las tendencias tecnológicas. Do I para hacer cualquiera de estas cosas? Necesidad No. I just think it's incredible fun. Todas las opciones de arquitectura y flujo están sujetas a cambios. En este blog no voy a proporcionar código (te guardaré los ojos). There are tradeoffs everywhere. ¿Cuándo escalar Kafka? Do I implement a resource orchestrator so I'm not burning my rig? ¿Qué tan granulado puedo obtener con la definición de datos "valorables"? What do I do within the sytem to purge useless data? ¿Necesitaré sesiones de noche tardía para quemar dardos? ¿Qué hago si estoy comprometido? ¿Cómo compensar la intoxicación de datos? Vexing. Vexing. However daunting, I have a : time and no boss to ride me about failing. Armas secretas This will take years. And that's okay. Este proyecto puede ser exteriormente loco y ambicioso para el lector. Soy consciente lo suficiente para reconocerlo. Though I want to say that I'm incredibly interested in all the domains of knowledge within the system itself. It's a , not a 100-meter sprint. . long marathon Bit by bit BIT por BIT Quiero dejar una lección aprendida de Spruce es un hombre que cambió la dirección de la sede de UPS a su propia, un apartamento en Chicago. Esto fue permitido durante meses donde el Sr. Spruce pudo depositar ~$65k en efectivo en su cuenta que estaba destinada a UPS. El Sr. Spruce ¿Cómo se ajusta esto? Una lección que aprendí de esta historia es Tener un total desprecio por un techo lógico en lo posible. el Sr. Spruce no se preocupó con preguntas sobre si realmente podría cambiar la dirección de la mayor compañía logística del mundo a su propio apartamento. . audacity And it worked Audacidad And it worked Mientras siento que puedo eliminar definitivamente la falta de control de los impulsos del Sr. Spruce y la ausencia de previsión, puedo internalizar la audacia de intentarlo.Teniendo un total y total desprecio por lo que un consenso puede considerar "factible" puedo embarcarme en un viaje de aprendizaje desatado por una tradición envuelta en la razón que dice inequívocamente "no puedes". Tal vez no lo pueda.Prefiero fracasar mucho que no intentarlo.Para eso, debo encarnar el enfoque del Sr. Spruce de no dar una mierda. If you stumbled across this blog, I hope you may have learned something. mucho amor, Bill “Wizard” Anderson