2 पॉइंट द्वारा GN⁺ 2024-12-09 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • लोकल मॉडल के response को JSON Schema के अनुसार सीमित किया जा सकता है, जिससे post-processing parsing का बोझ घटता है और data extraction के नतीजे अधिक consistent बनते हैं
  • उपयोगकर्ता cURL, Python, JavaScript में format parameter के जरिए schema देकर उसी तरीके से structured output मांग सकते हैं
  • Python में Pydantic और JavaScript में Zod साथ इस्तेमाल करने पर schema definition और response validation को code level पर जोड़ना आसान होता है
  • उदाहरणों में country information, pet text, और llama3.2-vision image analysis results को तय JSON fields में लौटाकर validate किया गया है
  • अगर stable results चाहिए, तो prompt में “return as JSON” जोड़ने और temperature को 0 पर सेट करने की सिफारिश की जाती है

JSON Schema से model response सीमित करना

  • Ollama structured outputs को support करता है, जिससे model output को किसी खास JSON Schema format का पालन करने तक सीमित किया जा सकता है
  • Ollama Python और JavaScript libraries को भी structured outputs support करने के लिए update किया गया है
  • इस feature का उपयोग इन कामों में किया जा सकता है
    • documents से data parsing
    • images से data extraction
    • language model responses को structured बनाना
    • JSON mode की तुलना में अधिक reliability और consistency हासिल करना

इंस्टॉलेशन और call करने का तरीका

  • Ollama का latest version डाउनलोड करना होगा
  • Python library को नीचे दिए गए command से latest version में update करें
pip install -U ollama
  • JavaScript library को नीचे दिए गए command से install करें
npm i ollama
  • structured output मांगते समय cURL request या Python·JavaScript libraries में format parameter के भीतर schema pass किया जाता है

cURL से JSON Schema भेजना

  • cURL example में http://localhost:11434/api/chat पर request भेजी जाती है, जहां model को llama3.1 और stream को false पर सेट किया गया है
  • format में name, capital, languages वाला object schema दिया जाता है
    • name: string
    • capital: string
    • languages: strings की array
    • तीनों fields को required के रूप में निर्धारित किया गया है
  • response request में शामिल JSON Schema format में लौटता है
{
  "capital": "Ottawa",
  "languages": [
    "English",
    "French"
  ],
  "name": "Canada"
}

Python और JavaScript libraries का उपयोग

  • Python

    • Ollama Python library schema को JSON object के रूप में format parameter में pass करती है
    • schema को dict के रूप में दिया जा सकता है, और recommended तरीका Pydantic के model_json_schema() से serialize करना है
    • example में Country model में name, capital, languages fields define की गई हैं, और response को Country.model_validate_json() से validate किया जाता है
country = Country.model_validate_json(response.message.content)
  • example output में Canada, Ottawa, English, French तय fields के अनुसार लौटते हैं
  • JavaScript

    • Ollama JavaScript library schema को JSON object के रूप में format parameter में pass करती है
    • schema को object के रूप में दिया जा सकता है, और recommended तरीका Zod और zodToJsonSchema() का उपयोग करना है
    • example में Country schema को Zod object के रूप में define किया गया है, और response body को JSON.parse() करने के बाद Country.parse() से validate किया जाता है
const country = Country.parse(JSON.parse(response.message.content));

टेक्स्ट और images से data extraction

  • pet text extraction

    • structured outputs का उपयोग text से जरूरी जानकारी निकालने में किया जा सकता है
    • example में Pet और PetList Pydantic models define किए गए हैं, जो pet information को JSON structure में लौटाते हैं
      • Pet: name, animal, age, color, favorite_toy
      • PetList: pets array
    • input text में दो बिल्लियों की जानकारी शामिल है
      • Luna: 5 साल, gray fur, yarn पसंद है
      • Loki: 2 साल, black color, tennis balls पसंद हैं
    • output को defined schema के अनुसार Pet objects की list के रूप में validate किया जाता है
  • vision model image description

    • structured outputs को vision model के साथ भी इस्तेमाल किया जा सकता है
    • example में llama3.2-vision से image analyze करके ImageDescription schema के अनुरूप result लौटाया जाता है
    • schema में ये fields शामिल हैं
      • summary
      • objects
      • scene
      • colors
      • time_of_day
      • setting
      • text_content
    • example request image से objects, scene, colors और detect होने वाले text का analysis करने के लिए कहती है
    • options में temperature को 0 पर सेट किया गया है ताकि अधिक deterministic output मिले
    • example output beach में palm trees वाले scene का summary देता है, और tree, beach objects, colors, time of day, और outdoor setting को structured fields में लौटाता है

OpenAI-compatible API का उपयोग

  • OpenAI-compatible example में OpenAI client को base_url="http://localhost:11434/v1"; और api_key="ollama" के साथ सेट किया गया है
  • client.beta.chat.completions.parse() का उपयोग करके response_format में Pydantic model PetList pass किया जाता है
  • response में completion.choices[0].message को check किया जाता है, और अगर parsed मौजूद हो तो parsed result print किया जाता है
  • अगर refusal मौजूद हो, तो refusal response print किया जाता है, और openai.LengthFinishReasonError को tokens बहुत अधिक होने की स्थिति के रूप में handle किया जाता है

stable output settings और आगे की योजना

  • response schema define करने के लिए Python के Pydantic या JavaScript के Zod के उपयोग की सिफारिश की जाती है
  • model को request समझाने के लिए prompt में “return as JSON” जोड़ना बेहतर है
  • अधिक deterministic output के लिए temperature को 0 पर सेट करें
  • आगे की योजना में ये शामिल हैं
    • controlled generation के लिए logits exposure
    • structured outputs की performance और accuracy में सुधार
    • sampling के लिए GPU acceleration
    • JSON Schema से आगे के additional formats के लिए support

1 टिप्पणियां

 
GN⁺ 2024-12-09
Hacker News की राय
  • अगर ज़्यादा मजबूत output constraints चाहिए, तो llama.cpp GBNF को support करता है
    https://github.com/ggerganov/llama.cpp/blob/master/grammars/...

    • लगता है वे ठीक वही इस्तेमाल कर रहे हैं
    • जानना चाहूंगा कि arbitrary grammar के लिए output quality संतोषजनक रही या नहीं
      सीधे-सीधे सोचें तो चूंकि models ने JSON बहुत ज़्यादा देखा है, इसलिए लगता है कि वे दूसरे formats के मुकाबले JSON बेहतर बनाएंगे
    • जानना चाहूंगा कि किस मायने में यह ज़्यादा powerful है
  • अच्छी खबर है
    CSV data बनाते समय आगे-पीछे "Here is your data" या "Please note blah blah" जैसे गैर-ज़रूरी phrases के बिना सामान्य prompt कैसे बनाऊं, इस पर सोच रहा था; अब मनचाहा return format ठीक-ठीक define करके structured output को सीधे CSV में pass कर सकना अच्छा है

    • फिर भी prompt सही context में जाए, इसके लिए CSV generate करने का instruction अभी भी देना होगा
      नहीं तो technically output CSV format में होगा, लेकिन उसका कोई मतलब नहीं हो सकता। हो सकता है model असल में paragraph-style answer लिखना चाह रहा था, पर token sampler ने ऐसे low-probability tokens चुन लिए जिन्हें model खास तौर पर कहना नहीं चाहता था
    • कई मामलों में output की शुरुआत को \n से prefill करके पर रोक देने से ऐसी समस्या रोकी जा सकती है
  • काम करता है। gemma2:2b में नीचे वाला वाक्य डाला, तो मनचाहा JSON मिला
    You have spent 190 at Fresh Mart. Current balance: 5098
    result {"amount": 190, "balance": 5098, "category": "Shopping", "place": "Fresh Mart"} था

    • JSON काफी inconsistent है, लेकिन बहुत छोटा model है और ऊपर से gemma है, तो ऐसा होना समझ आता है
  • सच में कमाल है। यह उन features में से एक था जो मैं वाकई चाहता था
    ollama इसलिए अच्छा है क्योंकि यह LLM को दूसरे UNIX programs की तरह इस्तेमाल करने का एहसास देता है, और LLM को UNIX में naturally belong करता हुआ महसूस कराता है
    बस यह जानना चाहूंगा कि क्या किसी ने इसे AMD GPU पर अच्छे से चलाया है। सुना है यह ज़्यादा मुश्किल है, लेकिन अगले साल card खरीदते समय competitor को support करना चाहता हूं

    • संभव है। integrated GPU पर भी चलता है
      780M वाले mini PC में BIOS के जरिए shared memory 16GB allocate की, तो यह काफी अच्छे से चला
  • जानना चाहूंगा कि ऐसी constraints का LLM output quality पर क्या असर पड़ता है
    कुछ मामलों में अगर output quality बेहतर हो, तो मैं Markdown या plain text parse करना पसंद करूंगा

    • OpenAI models इस्तेमाल करते समय, अगर extra token cost उठा सकते हैं तो two-pass strategy बहुत अच्छी रही
      पहले pass में heavy model और natural language का इस्तेमाल करके reasoning को Markdown sections में handle करवाया और final natural-language answer दिलवाया। संभव हो तो Markdown headers से साफ labels दिए
      दूसरे pass में उस answer को cheaper और faster model से structured output format में बदलवाया, ताकि pipeline के non-LLM हिस्से उसे consume कर सकें
      मूल रूप से JSON schema mode से ambiguous natural-language हिस्सों के आसपास साफ boundaries बनती हैं, और LLM अपनी ही output को useful format में capture करने वाले preprocessor की तरह काम करता है
    • यह इस पर निर्भर करता है कि model JSON output के लिए कितना fine-tuned है
      साथ ही model को schema बताना होगा। नहीं बताएंगे तो अजीब tokenization issues और ज़्यादा होंगे
      उदाहरण के लिए अगर schema JSON key "foobarbaz" expect करता है और standard BPE tokenization ["foobar", "baz"] है, तो मौजूदा constrained-output libraries जो token mask बनाती हैं, वे model को "f", "foo", "foobar" में से चुनने की अनुमति दे सकती हैं। अगर model "foo" चुनता है, तो constraint अगले token के रूप में, मसलन, "bar" और "baz" force कर देता है। तब model ["foobar", "baz"] की जगह ["foo", "bar", "baz"] देखता है और confuse हो जाता है [0]
      अगर prompt में model को पता हो कि "foobarbaz" schema keys में से एक है, तो आम तौर पर वह "foo" की तुलना में "foobar" को prefer करता है
      [0] नए models में normalization की वजह से ये tokens आपस में related होते हैं, लेकिन same नहीं होते
    • case-by-case फर्क पड़ता है, लेकिन reasoning के लिहाज से negative impact होता है, और ज़्यादातर मामलों में फर्क बहुत बड़ा नहीं था
      यह काफी हद तक इस पर निर्भर करता है कि LLM और prompt वैसे ही JSON response बनाने की संभावना रखते हैं या नहीं। LLM को जितना ज़्यादा जबरदस्ती push करेंगे, valid input बनाने की संभावना उतनी कम होगी
      छोटे models में meaningful predictive power वाली space के किनारे तक आप जल्दी पहुंच जाते हैं, और output random noise के करीब होने लगती है
      यह कोई strict measurement नहीं है; कई LLM projects पर बहुत समय बिताने के बाद gut feel से कहा है। इन खास tools को अभी इस्तेमाल नहीं किया है, लेकिन ollama में पहले भी मिलती-जुलती technique लगने वाले तरीके से JSON output guarantee की जा सकती थी, और partner के साथ हमने एक और LLM runtime tool, oobabooga, के लिए jsonformer जैसी चीज़ पर भी काम किया था
    • related research पर लगातार नज़र रख रहा हूं। sampling को speed और accuracy, दोनों तरफ से improve करने के लिए देख रहा हूं
      उम्मीद है कि ऐसे बदलाव आने पर JSON तक सीमित न रहने वाली general structured generation भी संभव हो सकेगी
    • instructor जैसे tools की usefulness को लेकर मैं कह सकता हूं कि मैं पूरी तरह गलत था
      tokens बहुत burn करना आसान है, लेकिन अगर जो काम करना है वह cost justify करता है, तो आप इसे काफी ज़ोर से push कर सकते हैं। absolute highest quality न भी हो, तो भी बिना मेहनत 95% level तक देने वाला tool toolbox में रखने लायक है
  • जानना चाहूंगा कि क्या इसे किसी भी supported model के साथ इस्तेमाल किया जा सकता है
    मेरे hardware पर 1B~3B models ही stable तरीके से चल पाते हैं, इसलिए पूछ रहा हूं

    • मैं blog post का author हूं। किसी भी model का इस्तेमाल हो पाना चाहिए
      छोटे models में results uneven हो सकते हैं, लेकिन “x को JSON में return करो” मांगने से accuracy में मदद मिलती थी
  • इस feature से जुड़ा PR लगभग 1 साल तक open था
    maintainers का इतना शांत रहना थोड़ा अफसोसजनक है

    • मैं post का author और maintainers में से एक हूं। सहमत हूं। maintainers ने देर से response दिया, और कुल मिलाकर मैं ज़्यादा contributions encourage करना चाहता हूं
      उम्मीद है अगले साल community PRs को बेहतर ढंग से संभाल और merge कर पाएंगे
    • माहौल देखकर लगता है कि यह company-centric रास्ते पर जा रहा है, और इसलिए हर चीज़ को उसी lens और profit maximization के नजरिए से देखा जा रहा है
    • मैं भी इसे साथ बनाने में सहयोग करना चाहता था, लेकिन बातचीत अचानक बंद हो गई
  • अभी भी oobabooga इस्तेमाल कर रहा हूँ। exlv2 सपोर्ट की वजह से dual 3090 पर inference काफी ज़्यादा efficient हो जाता है

    • मैंने काफी समय से ooba को छुआ नहीं है, लेकिन जानना चाहता हूँ कि exl2 और q3k_s जैसी non-uniform quantization methods की स्थिति कैसी है
      याद है कि exl2 तेज़ तो था, लेकिन खासकर कम bit depth पर gptq quantization accuracy के मामले में बेहतर लगता था
  • outlines की तुलना में इसमें क्या additional value है, यह जानना चाहता हूँ
    https://www.souzatharsis.com/tamingLLMs/notebooks/structured...

    • मैं ब्लॉग लेखक हूँ। मौजूदा implementation llama.cpp GBNF का उपयोग करके जल्दी लागू किया जा सका। फिलहाल सबसे बड़ी additional value यह है कि feature रिलीज़ हो गया है
      हालिया outlines/xgrammar से जुड़े research के आधार पर, उम्मीद है कि sampling को update करके ज़्यादा formats support किए जा सकेंगे, accuracy बढ़ेगी और performance बेहतर होगा
  • LLM को structured input देने का कोई best तरीका है या नहीं, यह जानना चाहता हूँ
    उदाहरण के लिए 100 वाक्य डालकर हर एक को कई तरीकों से classify करवाने का मामला। structured data लेना आसान है, लेकिन हर line के आगे line number लगाने वाला मेरा तरीका थोड़ा भद्दा लगता है

    • Models Markdown, JSON और कई programming languages पर trained होते हैं, इसलिए इनमें से कोई एक काम कर जाना चाहिए
      हालांकि इस case में, model को confuse न करने के लिए sentences एक-एक करके देना सबसे अच्छा है
      Prompt को "अगले वाक्य को classify करें। नियम हैं ..." + sentence के रूप में बनाएं तो prefix cache का फायदा उठाया जा सकता है, और performance भी एक साथ query करने से बेहतर हो सकती है
      बेशक यह तभी संभव है जब prefix cache हो और input token के हिसाब से charge न लिया जाता हो। आजकल ज्यादातर providers, अगर आप prefix cache इस्तेमाल करने की मंशा बताते हैं, तो इसे कम cost पर use करने देते हैं