ПРИМЕЧАНИЕ: Архитектура находится в активном развитии: события через Кафку, байты через Media Gateway в MinIO, аналитики в ClickHouse и тонкий API для GUI. Ingest пишет WARC; резюме - это страничные объекты, зашифрованные с помощью точного текстового хаша. БиллсТехник Много раз в жизни мы должны что-то делать не потому, что это легко, а потому, что это трудно. Я в одном из этих пространств. Моя мечта: построить программу для получения и корреляции технических новостей. Интересуетесь следующим генером дополненной реальности? BillsTechDeck может помочь вам найти информацию об этом! Мир широко открыт для типов гаджетов и технических объявлений, которые вы можете получить из соответствующего источника, чтобы оценить технологические тенденции и, возможно, получить общую картину, которая может уклониться от вас с энергичным Google. Это проблема, с которой я столкнулся, глядя на информацию о Vision Pro от Apple или когда я ждал новых новостей о Switch 2. Давайте начнем с обзора системы, показывая диаграмму потока (грубая). Некоторые соображения: все стрелки, указывающие назад на сообщение, протекают в разные очереди. Также, рассмотрим каждую подсистему, чтобы быть в контейнерах Docker и оркестрирована K8 и в трубопроводе CI / CD (я не включил его в графике, потому что это было бы слишком занято). По сути, я хочу новости, тенденции, источники, анализ, резюме в одном месте, чтобы построить согласованный объем данных, который я могу понять дух технических новостей, гаджетов и тенденций. Попытка сделать что-то последовательное: Теперь, я просто хобби. так что я не утверждаю, что я знаю что-либо. я развлекаюсь, что является истинной радостью. Давайте взглянем на эту систему. Я переиздал это Много sooooo Давайте разорвать шаги (оставляя связанные с этим шаги): Кафка Harvester берет вклад из IngressOrca, который основан на информации из FeedbackService. Он использует MinIO как способ объединить WARC и также иметь возможность обрабатывать богатые медиа распределенным образом. Медиа хранится в кластере MinIO (Media Cluster), который работает на клавишах sha256 и sha1 (в случае WARC, но они также будут иметь хаш-ключи sha256 для систематической конгуренции) Sanitizer получает рабочие места в очереди от Harvester и вытягивает средства массовой информации из медиа-ворота для санитарии. Если его грязные мы все еще держим его для выполнения судебно-медицинской экспертизы в контролируемой среде OCR работает на богатых СМИ на основе рабочих мест от Кафки spaCy (NER) работает над всем. spaCy предоставляет совмещенную работу для проверки здоровья spaCy, и если это правильно, она отправляется в службу оценки, чтобы решить, является ли автоматическое резюме phi4 обоснованным, если не обоснованным, оно просто отправляется в двигатель корреляции. если безумно, данные отправляются в InsanityHandler (не показано для краткости) для использования в качестве аналитики или получения человеческой проверки. Phi4 запускается на конкретных кусочках данных, либо гарантированных сервисом оценки, либо инициированных пользователем. Корреляционный двигатель работает над всем Каждая подсистема будет иметь надежную аудиторскую работу и подготавливать очереди, которые будут обрабатываться LogHandler и LogSilo/ElasticSearch. Подсистемы / трейдеры, нуждающиеся в доступе к средствам массовой информации, будут взаимодействовать с кластером MinIO посредством спокойного вызова через MediaGateway. Различные манипуляторы разговаривают с GUIHandler, который отображается на GUI. GUIHandler может подавать ControlEvents (запросить phi4 резюме, настройка вещей) FeedbackService разговаривает с HistoricalHandler, чтобы выйти из HistoricalSilo, чтобы обучить модель, которая даст лучшую информацию для IngressOrca (Orchestrator), чтобы лучше выбрать, когда, где и как мы можем получить лучшую информацию, чтобы сократить траты ресурсов на бак данных Все данные хранятся в кластере MinIO (MediaCluster) и доступ через спокойные звонки Призывы к ГУИХандлеру делаются спокойными вызовами Все подсистемы контейнеризируются и оркестрируются Kubernetes. Harvester Вступление Feedback сервисы санитария Harvester ОКР Космический (NER) Безумные торговцы ФИ4 Корреляционный двигатель ЛогХандлер LogSilo / Эластичный поиск MediaGateway Медиа кластер MediaGateway ГУИХАНДЛЕР ГУИХАНДЛЕР ControlEvents Feedback сервисы Исторический трейдер Исторический Вступление Медиакластер ГУИХАНДЛЕР I'm sure I left out some detail, but that's the gist. Для урожая: Сбор данных Сбор данных Как мы собираем наши новости о стройном Pixel Fold 3? Мы должны вытащить его из Интернета! Различные источники требуют различных методов сбора данных. Все сайты также имеют определенные структуры (насколько это сложно).К счастью, у нас есть невероятная экосистема за сбором данных. bot detection, DDoS filtering, Captchas, malformed information Python is an язык для использования для этой цели и имеет оживленное сообщество, работающее усердно, чтобы помочь хоббистам, как я, захватить важную информацию о технологических спецификациях Steam Deck 2 и других шутках об этом (как невероятно). Невероятно 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" Это очень вовлеченный процесс и требует хорошего количества внимания, поэтому цели, чтобы получить мои технические новости, должны быть курированы в целом и охвачены. и to gather valuable information about sites and their heuristics is important. падает Митм Прокси 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 Традиционная капча ReCaptcha Невидимые CAPTCHA Хотя список меньше, это, безусловно, огромное препятствие и ни в коем случае не исчерпывающий список.Все решения этих проблем требуют сложных решений.Сложные решения, которые должны постоянно меняться. Я мог бы продолжить, но я считаю, что добавляю такие вещи, как использование репутационных жилых прокси, мобильных прокси, ограничение тарифов, признание и смягчение отпечатков пальцев устройств и, наконец, медовые горшки. Поэтому нам нужно иметь разные уровни подхода: Стратегия Crawling Response «Тест с пистолетом, эскалация к Ордену, если это fubar’d». «Тест с пистолетом, эскалация к Ордену, если это 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. пистолет пистолет Похищенная винтовка орденом Почему это имеет значение Эффективность: Не сжигайте циклы Playwright, когда работает закрутка. Stealth: избегайте повышения тревоги излишне. Долговечность: бегать месяцами без запретов, а не неделями. Хотя сейчас мы вводим сложность, которая хороша.В начале у нас будут очень простые правила. становятся более надежными, мы можем делать лучшие звонки в лучшие места, потому что мы и шаблоны, которые направляют нас. Исторический Исторические данные Исторический Эта часть системы, вероятно, является и будет одним, требующим постоянного обновления из-за игры кошки и мыши между сайтами, держащими меня от моих сладких, сладких новостей Samsung. Самое необходимое I've come up with a plan to be able to ingest, ingest, ingest and be able to verify before I really have to worry about pulling real time data. Current plan is to pull data from archive.org (at a throttled rate and politely of course). Going this way I rewrote the быть асинхронным и неблокирующим. Интернет-архив Python Wrapper Если бы я только начал черпать много своевременных данных, у меня не было бы хорошей уверенности в том, что мои корреляции ничего не означают. 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. Никаким данным нельзя доверять: Искусство людей, которые хотят отравить вашу систему Искусство людей, которые хотят отравить вашу систему What's the problem with taking data from the internet? Ну, каждый, кто был в Интернете в течение какого-либо времени знает о грязных троллях. Актеры, которые выходят, чтобы вытащить вас и вашу благородную цель получения новой информации о смартфоне. Потому что тот факт, что люди хотят вытащить вас, вы должны предположить худшее. Let's highlight some concerns (not an exhaustive list, just a taste) 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). We first off want to isolate and contain all data we haven't vetted. A separate black box that either resides on a different network system or is . While occurs, it has to be weighed with the caveats that come with air-gapping (which I won't bore anyone with). Воздушные пробелы VLAN hopping One level is running rules on a file. Which is fine, and a great starting point. We have tools for macro analysis. We have an analysis tools. We can verify files are what they are (making sure the dirty trolls aren't hiding exe's). We have Мы проверяем хеш против источников угроз. YARA PDF static code analysis We also have at the other extreme. It until we get past the Internet Archive phase. It comes with Он обеспечивает динамический анализ, поведенческие отчеты, обнаружение угроз... , Some dirty files can detect sandbox environments. Others can escape them. It is resource intensive and has a complex setup. It is too resource intensive and complex for a while. Cuckoo won't be implemented significant But 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. Никто не сказал Я пишу это не окончательное письмо о том, что я делаю. Сколько способов могут сделать плохие мужчины Я и моя система. safety is easy стагнация compromise I have yet to see a lock that can't be picked. Я могу только сделать это настолько сложным, насколько могу. With that in mind, I am designing this part with . 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 MediaGateway MediaCluster MediaGateway MediaCluster In conclusion: In conclusion: В заключение : For the majority of time, are for . The further I can put the sweet, sweet apples up the tree and the better. bad actors Смотреть Низкий вес плодов minimize my attack surface If the data is skanky we quarantine it so we can analyze it. We document it and store the analytics revolving around it in the . Исторический HistoricalSilo 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 (Нужно было сделать что-то более прочное) ЛЛМ 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 Подходит для местных размещений Эффективная стоимость (поскольку я низкокалорийный фермер) Flexibility in deployments Мне нужно что-то местное и мощное, и это вписывается в счет. Имея его собственное изображение докера, это легко.Еще один положительный момент - моя способность тонко настроить его (за мою жадную потребность в информации на новом 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. Мои друзья работают против меня! English So what does a Как я делаю? Сельхозпроизводитель Headstrong Cabbage Проверка здоровья . 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 Completeness and fill rate checks Uniqueness checks Range checks Presence checks Data type validation checks. Consistency checks This list can quickly become like Benjamin Buford Blue naming uses for shrimp so I'll top it off there. Это будет автоматически запускаться на основе сервиса оценки или вручную, запрошенного . moi Grabbing Entities with spaCy: ТЭ grabbing pertinent things grabbing pertinent things We are at the section. пространство Какую модель выбрать? offers a variety of pretrained models all with their own uses. They are trained on so out of the box . I will likely need to fine tune a custom and add . At the start I will need to annotate data to train my model (there are open source tools to somewhat automate this process). This will also encompass training it to . пространство Общий контент WEB не узнает технический жаргон NER model custom components recognize entity types I will need to be ( и ) и to go in and do и (т.е. «Apple» — компания, а «Apple» — плод) С этим приходит возможность построения индивидуальной структуры соединения компонента или интеграции внешних инструментов (надеюсь, нет). fluent В соответствии с правилами сочетания matcher EntityRuler will need entity linking disambiguation Since I'm only worried about English at the moment, I am blessed to be ignorant of language detection. Past that I will need to consider performant things like and . When not in use turn it off! batch processing component disabling С учетом возможного running with Мне придется рассмотреть based models and на основе моделей, а также необходимо учитывать значительное использование оперативной памяти RAM. Параллельные процессы ПИ4 CPU ГПУ There's . 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. pre-processing, post-processing and possibly integrating external logic and models И наконец, и почти самое главное: Проверка здоровья . Schema validation Verifying correct data types Paying close attention to the behavior around critical fields Определение ожидаемых типов данных Establishing acceptable ranges with things like dates and word counts Define allowed values Define completeness thresholds Рассмотрение правил кросс-полевой последовательности 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. Data correlation: making sense of things making sense of things in this system is important. I need a language that can provide me some memory guarantees as well as stop me from making newbie mistakes. I drifted towards at first. I thought it through and arrived back at . I'm simply not an experienced программистов и, вероятно, реализовывал бы вещи, которые могли бы разрушить мою систему. Data correlation incredibly C++ покоя С++ В основном, принимает субъекты из and connects the dots. It will utilize to . I needed some real granularity and functionality for statistics in correlation. An earlier draft incorporated RocksDB, which wasn't robust enough with recent developments. Rust spaCy Кликни write/read/store pertinent вещей So stats will be important (yay!). А способ кодирования является ключевым, и мне нужно будет быть очень преднамеренным с тем, что я делаю, почему я делаю это и как я внедряю вещи. для этой части, так как у меня будет много процессов I/O, говорящих о . idomatic Tokio ClickHouse We basically take all entities and На них сравнивают . Проводить богатый анализ historical data I consider the following things: Is this relationship statistically significant? Is this correlation more than just "chance"? Стоит ли этим значениям создавать графические отношения? Существует ли фактическая поддержка для того, чтобы подчеркнуть это конкретное отношение? So I'd need to do things like establish a for connections. It'd also be a good idea to establish , a measure that scores how much more likely two entities are to appear together than by random chance. Where high and negative scores tell me great things about a correlation. p-value Pointwise Mutual information Использование статистики необходимо для фильтрации шума. например, субъекты и будут появляться вместе тысячи раз, но эта связь и Статистика помогает нам доказать, что более редкая связь, как конкретная технологическая компания и правительственное агентство, гораздо более значима, даже если она появляется лишь несколько раз. • его because it's a . 'Apple' 'iPhone' Очевидно not Whitehouse not significant white building Past getting into some concepts I feel out of the scope of this overview, I'll leave it at that. Data: Задняя кость Задняя кость So what do I do with all this data about hot new tech items? I hoard it. I will have multiple databases (PostgreSQL, ClickHouse, Neo4j, MinIO) Все операции с данными будут питаться через . One will handle Операции, 1 который будет использоваться для хранения артефактных данных Два будут (на and ). Its a lot, but each DB has its own strength and I believe a simple Это будет иметь существенные недостатки. Обрабатывающие данные Нео4J PostgreSQL (в основном, это реестр метаданных) ClickHouse HistoricalSilo CorrelationSilo «SQL Server для всего» HistoricalSilo CorrelationSilo Data structures, Таблицы и первичные ключи будут одинаковыми в (Комплекс among other things). The Это будет источником много размышлений, слез и разочарований. Хороший дизайн оплачивается в мечах. Я приближаюсь к этому позже, потому что я чувствую, что у меня будет гораздо лучшее представление о том, что мне нужно дальше в системе, которую я получаю. good ClickHouse stored procedures Артикул Артикул Это еще один зверь.Я чувствую, пока мой 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 If I started adding layers of complexity and correlation logic the data becomes more coupled and detracts from the value of my correlation engine Neo4J correlator isn't phoning Относительно "why?" ТЭ Будет а DB имеет много гранулярных данных из таких вещей, как: Исторический Кликни Исторический Where we got good data What search queries yielded the best data Какие методы сбора работали лучше для какого источника данных Где/когда и почему мы получаем грязные данные Анализ этих грязных данных There's most likely much more, and I will find them when I get to that point. ТЭ кластер будет гораздо менее болезненным для реализации, чем другие. я все еще нужно убедиться, что все ремни и подвески. Мино Базы данных будут интенсивным опытом. Будут еще тонны. GUI: webapp time! ТЭ Будет а . Initially I was going to make this a desktop app. I realized though that eventually I want more people to use it. Это не будет большим выбором. GUI Webapp Pyside6 Using a Я получаю доступ к такому широкому разнообразию библиотек.У меня есть невероятный доступ к информации, которая может быть недоступна, если я использовал GUI. , 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 Пейзаж6 Имея это трепетное ощущение в моем кишечнике, я искал другой вариант. Чтобы добавить к этому, найти хорошие примеры того, что люди построили с помощью библиотек ГИ, было трудно, если не невозможно.Я, безусловно, мог просто продвинуться вперед, но я не хотел использовать что-то, а затем приступить к работе и прийти к пониманию, что мое видение невозможно с определенным ГИ. LOT Поэтому я пошел с . 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 Basically, the gui talks to the Кто разговаривает с , , и контролировать события, такие как возможность управлять определенными работами. должно быть закрыто и продумано в том, как оно ставит рабочие места в . ГУИХАНДЛЕР ЛогХандлер Артефактторговец Исторический трейдер Контрольные Кафка ГУИХАНДЛЕР LogHandler Артефактторговец Исторический трейдер Контрольные Мы должны быть способны обслуживать все виды богатых СМИ. Это чувствует себя более осторожным, чтобы просто сделать веб-приложение. Заключительные слова : Последние соображения Последние соображения Я не все покрывал. Одна вещь, которую я хочу добавить, это мой выбор . Это был не мой первоначальный выбор. Тем не менее, я попал в тупик во время разработки, когда мой первоначальный выбор стал неустойчивым. is where I landed. Эта статья сейчас закрывается на 4,5 тыс. слов Kafka Кафка Кафка Дополнительным бонусом является то, что он хорошо выглядит на резюме. I ever decide to try and be a developer. Если . I won't Но это будет выглядеть красиво. У меня есть масса работы впереди, чтобы вдохнуть жизнь в мою любовь к технологическим тенденциям. Do I Сделать что-нибудь из этого? need No. I just think it's incredible fun. Все варианты архитектуры и потока подлежат изменению.На этом блоге я не буду предоставлять код (я сберегу ваши глаза). There are tradeoffs everywhere. Когда нужно скалировать Кафку? Do I implement a resource orchestrator so I'm not burning my rig? Насколько гранулярным я получаю определение «ценных» данных? What do I do within the sytem to purge useless data? Будут ли мне нужны поздние ночные сеансы сжигания дарт? Что делать, если я компрометирован? How do I offset data poisoning? Вексинг Вексинг Не смотря ни на что, у меня есть Время и никакого босса, чтобы ездить на меня о неудаче. Тайное оружие Это займет годы. И это в порядке. Этот проект может быть внешне безумным и амбициозным для читателя. Я достаточно осознан, чтобы признать это. Хотя я хочу сказать, что я невероятно заинтересован во всех областях знаний в самой системе. Это не 100-метровый спринт. . long marathon bit по bit Bit by bit Я хочу уйти из урока, полученного от Спрайс - человек, который изменил адрес штаб-квартиры UPS на свою собственную квартиру в Чикаго.Это было разрешено в течение месяцев, когда г-н Спрайс смог внести ~65 000 долларов наличными на свой счет, который был предназначен для UPS. Мистер Спрайз Как это подходит? A lesson I learned from this story is Г-н Спрус не беспокоился вопросами о том, мог ли он действительно изменить адрес крупнейшей в мире логистической компании в свою собственную квартиру. . Смелость And it worked Смелость And it worked Хотя я чувствую, что я могу окончательно отказаться от недостатка контроля импульсов г-на Спрайса и отсутствия предсказания, я могу интернализировать смелость, чтобы попытаться. Имея полное и полное пренебрежение тем, что консенсус может считать "возможным", я могу начать путешествие обучения, не закрепленное традицией, застрявшей в разуме, которое однозначно говорит "вы не можете". Maybe I can't. I'd rather fail large than to not try. For that, I must embody Mr. Spruce's approach of totally not giving a fuck. Если вы наткнулись на этот блог, я надеюсь, что вы чему-то научились. Much love, Билл «Волшебник» Андерсон