7 पॉइंट द्वारा GN⁺ 2024-09-03 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • OpenAI API के structured outputs से HTML tables को structured data के रूप में निकालने वाला AI-assisted web scraper प्रयोग किया गया, और GPT-4o ने कुछ जटिल tables में उम्मीद से बेहतर extraction quality दिखाई
  • Weather.com के 10-day forecast जैसे जटिल display structure वाले tables में इसने day/night forecasts को अलग किया और स्क्रीन पर न दिखने वाली values भी HTML source से ढूंढ निकालीं
  • Wikipedia के Human Development Index जैसे tables में, जहां दोहराए गए values merged rows में थे, column-wise values की संख्या mismatch हो गई, जिससे table reconstruction मुश्किल हुआ; सिर्फ prompt बदलने से समस्या हल नहीं हुई
  • API call costs घटाने के लिए XPath generation भी आजमाया गया, लेकिन गलत या empty results देने वाले XPath बने; पहले data extract करके फिर उन values के आधार पर XPath मांगना ज्यादा stable रहा
  • दो दिन के प्रयोग में $24 खर्च हुए; HTML attributes घटाने पर character count आधा हो गया और performance degradation नहीं दिखी, लेकिन cost के कारण आगे की validation सीमित रही

structured outputs से HTML tables निकालना

  • OpenAI API के structured outputs feature से AI-assisted web scraper implement किया गया
  • पहला प्रयोग HTML string को GPT-4o को देकर table data को structured form में extract करने का अनुरोध करने के तरीके पर आधारित था
  • उपयोग किए गए Pydantic model में table name और column list रखने वाला ParsedTable, तथा column name और values list रखने वाला ParsedColumn structure था
  • system prompt में HTML table से structured data extract करने वाले expert web scraper की भूमिका दी गई
  • GPT-4o mini भी आजमाया गया, लेकिन results काफी खराब थे, इसलिए बाद के प्रयोग GPT-4o से किए गए

जटिल tables में दिखी ताकत

  • simple tables के बाद Weather.com का 10-day weather forecast table input किया गया
  • इस table में सबसे ऊपर एक बड़ी row है, और बाकी 9 दिन छोटी rows से बने हैं
  • GPT-4o ने बाकी 9 दिनों की day/night forecast structure को पहचाना और Day/Night column जोड़ दिया
  • शुरुआत में extracted Condition column hallucination जैसा लगा, लेकिन HTML source जांचने पर पता चला कि वह वास्तव में screen पर न दिखने वाले tag के रूप में मौजूद था

merged rows में हुई failure

  • Wikipedia का Human Development Index table देखने में simple है, लेकिन repeated values वाली rows merged हैं, इसलिए GPT-4o उसे ठीक से handle नहीं कर पाया
  • model ने instruction के अनुसार individual columns extract किए, लेकिन हर column में values की संख्या अलग थी, जिससे result को table के रूप में दिखाना मुश्किल हो गया
  • “merged rows को multiple JSON values के रूप में extract करो ताकि सभी columns की row count समान हो” जैसे system prompt changes किए गए, लेकिन यह काम नहीं किया
  • columns के बजाय row-level extraction instruct करने वाला prompt अभी आजमाया नहीं गया

XPath generation approach की सीमाएं

  • हर बार OpenAI API call करने पर cost बढ़ सकती है, इसलिए extracted data की जगह XPath return कराने की कोशिश की गई
  • लक्ष्य था कि same page से updated data दोबारा लाते समय model call के बिना XPath से scraping हो सके
  • prompt को इस तरह बनाया गया कि वह HTML content और column names लेकर Selenium के driver.find_elements(By.XPATH, xpath) में evaluate किए जा सकने वाले XPath strings return करे
  • यह तरीका stable नहीं था
    • GPT-4o कई बार गलत XPath return करता था
    • Selenium का उल्लेख करने वाली sentence से कुछ सुधार हुआ, लेकिन गलत data या empty results return करने वाले XPath भी मिले

data extraction और XPath generation को जोड़ना

  • अगला प्रयास था कि पहले GPT-4o data extract करे और उस result को reference value बनाकर XPath मांगा जाए
  • यह combination शुरुआत से ही सिर्फ XPath मांगने वाले approach की तुलना में काफी बेहतर चला
  • कभी-कभी generated XPath कोई result नहीं लौटाता था, इसलिए result न होने पर फिर से try करने वाली simple retry logic जोड़ी गई
  • test किए गए tables में यह retry approach effective रही
  • कुछ नए issues भी बचे हैं
    • पहले चरण की data extraction कभी-कभी images को text में बदल देती थी
    • उदाहरण के लिए ऊपर की ओर arrow image arrow-upwards जैसे text के रूप में extract हो सकती है
    • दूसरा चरण actual HTML में न मौजूद text खोजने लगता है और fail हो जाता है
    • इस issue को अलग से fix नहीं किया गया

cost और HTML cleanup

  • GPT-4o से web scraping करने पर छोटे HTML tables में भी बहुत सारे characters होते हैं, जिससे cost बढ़ सकती है
  • दो दिनों तक experiment करते हुए पहले ही $24 खर्च हो चुके थे
  • cost घटाने के लिए model को भेजने से पहले HTML string से unnecessary data हटाने की cleanup logic जोड़ी गई
  • generated XPath जिन class, id, data-testid attributes का मुख्य रूप से उपयोग करते थे, उन्हें छोड़कर बाकी सभी attributes हटाने पर table character count आधा हो गया
  • इस cleanup के बाद performance degradation नहीं दिखा, और extraction quality वास्तव में improve भी हो सकती है, ऐसा माना गया
  • वर्तमान XPath generation step table के हर column के लिए एक model call करता है
  • एक बार में कई XPath generate करने का improvement भी संभव है, लेकिन अभी इसे try या performance evaluate नहीं किया गया

demo और आगे के experiment ideas

  • GPT-4o की extraction quality impressive थी, लेकिन OpenAI को चुकाई जाने वाली cost भी काफी बड़ी लगी
  • Streamlit से बनाया गया simple demo https://orange-resonance-9766.ploomberapp.io पर देखा जा सकता है
  • source code GitHub पर public है, और इसके साथ यह caveat है कि polished tool की उम्मीद न करें
  • ज्यादा tables test करना चाहते थे, लेकिन OpenAI cost बढ़ने की वजह से केवल कुछ ही tables पर experiment किया गया
  • अगर अधिक समय मिला तो आगे यह try करने की योजना है
    • मौजूदा demo एक one-time process है जहां user URL और initial XPath input करता है; user जिस table को extract करना चाहता है उसे click करे और sample rows दे, ऐसा तरीका बेहतर user experience हो सकता है
    • complex tables में single XPath से पूरी column extract करना मुश्किल हो सकता है, इसलिए LLM से Python जैसा program return कराने का approach experiment करना चाहेंगे
    • GPT-4o usage cost महंगी है और ऐसा लगता है कि unnecessary data बहुत भेजा जा रहा है, इसलिए HTML cleanup methods पर और experiment करने की जरूरत है

1 टिप्पणियां

 
GN⁺ 2024-09-03
Hacker News की राय
  • HTML को सीधे LLM में डालने के बजाय पहले उसे Markdown जैसे सरल फ़ॉर्मैट में बदलने पर सबसे अच्छे नतीजे मिले
    जिन टूल्स को आज़माया उनमें Extractus https://github.com/extractus और dom-to-semantic-markdown https://github.com/romansky/dom-to-semantic-markdown शामिल हैं
    cloud पर चलने वाले Magic Loops https://magicloops.dev/ के अंदर Apify https://apify.com/ और Firecrawl https://www.firecrawl.dev/ का इस्तेमाल होता है, और Chrome Extension में dom-to-semantic-markdown का इस्तेमाल होता है
    अभी किसी खास site के लिए XPath को user-assisted flow से बनाने के बाद, LLM call से पहले सिर्फ़ ज़रूरी elements निकालने का तरीका प्रयोग कर रहे हैं; समस्या को सरल करने पर GPT-4o mini से भी काफ़ी अच्छे नतीजे मिले

    • हम जो https://browserbase.com/ बना रहे हैं, उसे भी देखेंगे तो अच्छा होगा
      headless browser में Chrome Extension चलाया जा सकता है, इसलिए data को बाहर निकालने से पहले browser के अंदर semantic Markdown conversion किया जा सकता है
      browser का iFrame-सक्षम live view भी है, ताकि user बनाए जा रहे XPath पर तुरंत feedback दे सके: https://docs.browserbase.com/features/session-live-view#give...
    • जानना चाहूंगा कि क्या आपने Markdown में बदलने की तुलना HTML में बस tag attributes हटाने, links खोलने, और दिखाई न देने वाले elements हटाने जैसे तरीके से की है
      मेरे अनुभव में performance Markdown जैसी ही थी, और conversion आसान था तथा edge cases भी कम थे
    • Semantic Markdown https://hackmd.io/@sparna/semantic-markdown-draft के बारे में पहली बार सुना; यह Markdown document के अंदर RDF data डालने का तरीका लगता है
      जो page मिला वह “Alpha Draft” है, इसलिए Semantic Markdown content corpus शायद ज़्यादा बड़ा नहीं होगा, और training data की कमी LLM की समझ में बाधा डाल सकती है
      फिर भी यह काफ़ी पढ़ने योग्य फ़ॉर्मैट है, इसलिए अगर LLM structured metadata को कोष्ठक वाली व्याख्या की तरह माने तो इसे काफ़ी अच्छे से process कर सकता है
    • इसी तरह का काम दूसरे context में किया था: execution graph दिखाने वाले complex JSON को पहले सरल Graphviz dot format में बदला, फिर LLM में डाला, और नतीजे काफ़ी ठीक रहे
  • OpenAI ने हाल ही में Batch API जारी किया है, जिससे सभी prompts पहले तैयार कर batch में चलाए जा सकते हैं, और cost भी 50% हो जाती है: https://platform.openai.com/docs/guides/batch
    पहले GPT-4o mini के साथ इसका काफ़ी इस्तेमाल किया था, और 3,000 items को 5 मिनट के अंदर process कर पाया था
    जिन applications को real-time की ज़रूरत नहीं है, उनके लिए यह काफ़ी अच्छा हो सकता है

    • उम्मीद है open source inference servers भी जल्द उस endpoint को support करेंगे
      vLLM ने उसी format के “offline batch mode” का कुछ support जोड़ा है, लेकिन अभी OpenAI endpoint implementation तक नहीं पहुंचा है
    • OpenAI का प्रस्ताव अच्छा है, लेकिन समान precision और recall देने वाले traditional text extraction तरीकों की तुलना में यह अभी भी एक-दो orders of magnitude महंगा लगता है
    • OpenAI का यह सचमुच अच्छा फैसला है, और Azure जैसे दूसरे cloud tools भी यही feature दें तो अच्छा होगा
      यह बहुत स्वाभाविक feature है
  • structured content, जैसे item lists या simple tables के लिए ज़रूरी नहीं कि LLM की आवश्यकता हो
    हाल में किसी भी website पर अपने-आप काम करने वाला web scraper https://easyscraper.com बनाया; शुरुआती version AI से बनाया था, लेकिन अंत में element attributes और position-based heuristics ज़्यादा तेज़, सस्ते और सही निकले
    ज़्यादातर websites पर non-AI approach बहुत अच्छी तरह काम करती है, इसलिए पहले यह देखना बेहतर है कि AI सच में ज़रूरी है या नहीं—जैसे जब data unstructured हो या page data के आधार पर output format निकालना हो

    • LLM उन website updates के प्रति ज़्यादा robust होते हैं जो सामान्य scraping को तोड़ सकते हैं
      लेखक की तरह LLM से XPath generate करवाकर, सामान्य दिनों में उसी XPath से regular scraping की जा सकती है, और टूटने पर LLM से XPath update करवाया जा सकता है
      फिर भी अगर data दोबारा flow न हो या pipeline के आगे unexpected format के कारण टूट जाए, तो उस समय इंसान को alert किया जा सकता है
    • ऐसा tool पहली बार देखा जिसमें खुद select करके यह तय कर सकते हैं कि क्या scrape करना है
      हमेशा सोचता था कि ऐसा tool पहले से क्यों नहीं था
  • जानना चाहता/चाहती हूँ कि “HTML reducer” जैसी कोई चीज़ पहले से मौजूद है या नहीं
    अगर page source को जैसा है वैसा देखें, तो random JavaScript, ads, गैर-ज़रूरी attributes, और rendering के लिए जरूरत से ज्यादा nesting की वजह से 90% tokens कचरा होते हैं
    DOM parser से traverse करते हुए सिर्फ text वाले nodes, HTML structure, और ज़रूरी tag attributes (लगभग class/id) छोड़ दिए जाएँ, तो cost काफी घट सकती है, और XPath वाला तरीका भी बेहतर काम कर सकता है
    Readability भी इस्तेमाल करता/करती हूँ, लेकिन उसमें DOM structure खो जाता है, और JavaScript-heavy websites या “continue reading” की तरह text expand करने वाले pages पर quality गिर जाती है
    जानना है कि इस तरह के use case के लिए standard के करीब कौन-सा tool है

    • Ribbon में हमने internal use के लिए ऐसा कुछ बनाया था
      अगर रुचि हो तो इसे open source कर सकते हैं, और reducer से गुज़रने के बाद LLM output का काफी बेहतर हो जाना हैरान करने वाला था
    • Jina.ai इस use case के लिए काफी अच्छा free API देता है
      किसी भी URL के आगे https://r.jina.ai/ लगा दें, तो यह उस page का main content Markdown version में लौटाता है, जो LLM में डालने के लिए अच्छा होता है
      उदाहरण https://r.jina.ai/https://simonwillison.net/2024/Sep/2/anato... है और original page https://simonwillison.net/2024/Sep/2/anatomy-of-a-textual-us... है
      Code open source है, इसलिए आप इसे खुद run कर सकते हैं: https://github.com/jina-ai/reader
      यह TypeScript में लिखा गया है और Puppeteer व https://github.com/mozilla/readability का इस्तेमाल करता है
      मैंने Markdown conversion के बिना सिर्फ Readability इस्तेमाल करके page title और body extract किए थे, और Playwright व shot-scraper से चलाने की recipe भी है: https://shot-scraper.datasette.io/en/stable/javascript.html#...
    • Skyvern में इस्तेमाल के लिए हमने मिलता-जुलता कुछ बनाया था: https://github.com/Skyvern-AI/skyvern/blob/0d39e62df6c516e0a...
      यह vimium से लिया और modify किया गया तरीका है, और HTML को सिर्फ important parts तक distill करते हुए कई edge cases भी handle करता है
    • Readability से गुज़ार दें: https://github.com/mozilla/readability
    • मैं follow-up post लिख रहा/रही हूँ, और पता चला कि सिर्फ सभी HTML tags हटाने से भी यह अच्छी तरह काम करता है और cost काफी घट सकती है
  • हैरानी है कि लेखक ने काम और writing का 99% कर लिया, लेकिन बाकी 1% यानी ollama या llama.cpp-based engine download करके कोई अच्छा local LLM test नहीं किया
    इस use case में 7B या 30B models भी अच्छा कर सकते हैं, और run करने की cost भी इतनी कम हो सकती है कि GPT-4o की जरूरत न पड़े

    • अच्छा सुझाव है
      मैंने अभी LLMs के साथ शुरुआत ही की है, और locally hosted models भी देखने वाला/वाली हूँ
  • Kadoa https://kadoa.com में हम AI automated web scraping करते रहे हैं, और शुरुआती experiments इस post जैसे ही थे
    जब सिर्फ महंगा और धीमा GPT-3 था, तभी से हमने शुरू किया था, इसलिए बड़े scale पर cost-effective solution चाहिए था
    अंत में extraction stage में हर बार LLM इस्तेमाल करने के बजाय code generation से CSS selectors या XPath extraction code बनवाया, और बाद में website changes के हिसाब से scraper code adjust करवाया
    cleaning और transformation के लिए छोटे fine-tuned LLM का इस्तेमाल किया, और validation में reverse search जैसे traditional तरीकों के साथ LLM-as-a-judge से data quality evaluate की
    कुछ simple data sources पर apply करना और हजारों websites पर reliable, scalable और cost-effective तरीके से चलाना बिल्कुल अलग problem थी, और traditional ETL engineering को छोटे, अच्छी तरह evaluated LLM stages के साथ मिलाने वाला तरीका सही रहा

  • जिस HTML को scrape करना है उसका example देकर BeautifulSoup code snippet माँगें, तो यह काफी अच्छा काम करता था
    आम तौर पर जिस structure को scrape करना होता है वह वैसा ही रहता है, लेकिन उसे parse करने वाली मुश्किल string खुद लिखना उबाऊ होता है
    actual parsing LLM को सौंपना जरूरत से ज्यादा है, और hallucination से result contaminate होने का risk भी है

  • HTML को पहले preprocess करें तो ज्यादा सस्ते और अच्छे results मिल सकते हैं
    लगता है अभी इसका ज़िक्र नहीं हुआ, लेकिन personally मुझे trafilatura https://trafilatura.readthedocs.io/en/latest/ से अच्छे results मिले हैं

    • trafilatura से पूरी तरह सहमत हूँ
      LLM को सिर्फ text भेजना होता है, इसलिए cost बहुत कम की जा सकती है
      मैंने इसे हाल के project https://github.com/philippe2803/contentmap में भी इस्तेमाल किया, जो domain XML sitemap को starting point बनाकर arbitrary websites के लिए vector store बनाने वाली एक simple Python library है
      हर domain का HTML structure अलग होता है, इसलिए असली content ही निकालना और HTML tags आदि हटाना जरूरी था; Trafilatura ने कुछ lines of code में लगभग हर URL पर यह काम कर दिया
  • इतने सारे नारंगी टैग लगे हुए लेख मैंने शायद पहली बार देखा है
    NewsCatcher में हम GPT-4o के साथ बहुत सारे टेस्ट कर रहे हैं, और हमें 100,000 से ज़्यादा news websites को crawl करने के बाद news content parse करना होता है
    किसी भी article से data निकालने वाला rules-based model काफ़ी अच्छा काम करता था, और GPT से इसे और बेहतर करने का तरीका नहीं मिला
    ज़्यादा दिलचस्प हिस्सा crawling है, जहाँ यह जानना होता है कि news article किन-किन जगहों पर publish हो सकता है, और कभी-कभी 50 से ज़्यादा subsections होती हैं
    हर website का structure अक्सर नहीं बदलता, इसलिए लगता है कि कई projects के लिए extraction code generate करने का तरीका पर्याप्त हो सकता है
    इसलिए हम LLM से HTML parsing code generate कराने की दिशा में देख रहे हैं; अगर रुचि हो तो artem [at] newscatcherapi.com पर संपर्क कर सकते हैं

    • hobby project में इसे आज़माना चाहता हूँ
      अच्छा होगा अगर self signup होता
  • web scraping ही वह वास्तविक वजह थी जिसके चलते मेरे co-founder और मैंने आज का openpipe.ai बनाया
    GPT-4 यह काम सचमुच बहुत अच्छी तरह करता है, लेकिन बहुत महँगा है
    हालांकि किसी खास तरह की sites को scrape करने की क्षमता को बहुत सस्ते fine-tuned model में distill करना काफ़ी आसान है, और उस तरह की sites पर यह भरोसेमंद तरीके से अच्छी scraping करता है

    • Kyle, यह मुझे पहले बताना चाहिए था
      हम भी इस समस्या पर काफ़ी समय से काम कर रहे हैं, और हम कहाँ तक पहुँचे हैं यह दिखाने के लिए संपर्क करूँगा