დიდი ენის მოდელი (LLMs) არის ყველაფერს, ყოველდღიური პროგრამები მუდმივი ინსტრუმენტები. მათ გამოყენება ადვილია. მაგრამ თუ თქვენ უნდა იყენოთ თქვენი საკუთარი მოდელი? თუ თქვენ გაქვთ სინამდვილეში ერთი ან გაქვთ კონფიდენციალურობის სქესობრივი მონაცემები, სქესობრივი ზრდის. ამ პოსტში, ჩვენ გაუზიარებთ, რაც ჩვენ გაქვთ, როდესაც შექმნათ ჩვენი საკუთარი LLM შედუღების სისტემა. ჩვენ შეიცავს შენახვა და განთავსება მოდელები, დიზაინი მომსახურების არქიტექტურა, და გადაწყვეტილებების რეალურ მსოფლიოში პრობლემები, როგორიცაა გზა, სტრუქტურა, და მართვის microservices. პროცესი მოიცავს მოვლენებს, კონტაქტი LLMs გაძლევთ ფართო სპექტრი განაცხადების - chatbots და სამუშაო წვდომის მენეჯერი Smart ავტომატური ინსტრუმენტები. მიუხედავად იმისა, რომ მოპოვების გაზრდის გენერაციის, ინსტრუმენტების და მრავალფუნქციონალური პროტოკულები მნიშვნელოვანია, ისინი მუშაობენ დონეზე ზედაპირზე ძირითადი საავტომობილო: ძირითადი LLM. ბევრი პროექტები დამოკიდებულია გარე მომწოდებლები, როგორიცაა და ან , რომელიც არის საკმარისი ყველაზე გამოყენების შემთხვევაში. მაგრამ ზოგიერთი განაცხადებისთვის, ეს სწრაფად გახდება პრობლემა. რა უნდა იყოს, თუ მომწოდებლის გაჩერება? რა უნდა იყოს, თუ თქვენ სჭირდებათ სრული კონტროლი თხევადი, ფასების ან ოპტიმიზაციის შესახებ? ყველაზე მნიშვნელოვანია – რა უნდა იყოს, თუ თქვენ სარგებლობენ კონფიდენციალურობის შესახებ და არ გსურთ ხელმისაწვდომია მომხმარებლის მონაცემების გადაცემა თარიღი? Open ამჟამად ორმაგი ანტრაპიკური Open ამჟამად ორმაგი ანტრაპიკური ეს არის ის ადგილი, სადაც თვითმფრინავი ჰოსტინგი მნიშვნელოვანია. მომსახურების წინასწარ მოდელი ან სინამდვილე მოდელი უზრუნველყოფს კონტროლი, უსაფრთხოება და შესაძლებლობა, რათა მოდელი შეესაბამება კონკრეტული ბიზნეს მოთხოვნებს. აშენება ასეთი სისტემა არ მოითხოვს დიდი გუნდი ან ფართო რესურსები. ჩვენ აშენდა მას მოკლე budgets, მცირე გუნდი, და მხოლოდ რამდენიმე ღონისძიებები. ეს შეზღუდვა ეფუძნება ჩვენი არქიტექტური გადაწყვეტილებები, მოთხოვნა, რომ ჩვენ განკუთვნილია ეფექტურობა და ეფექტურობა. შემდეგი ნაწილებში, ჩვენ განიხილებთ მოვლენებს, გადაწყვეტილებები განახლებული, და სასწავლებები, რომ გაიგ საერთო მიმოხილვა ეს არის ძირითადი კომპონენტები, რომლებიც შეიცავს სისტემის ქსელის. formats and encoding. a shared language across services is essential. which means consistent request/response formats, generation parameter schemes, dialog history structures, and serialization that works everywhere – from frontend to backend to model runner. Stretching და Routing. მრავალფეროვანი მოდელები, მოთხოვნების ტიპის და სასტუმრო Priorities მოთხოვნებს განიცდიან routing გადაწყვეტილებები. ჩვენ განიცდიან, თუ როგორ მოცემული მომხმარებლის მოთხოვნები განიცდიან სისტემაში - საწყისი დატვირთვის პოსტი, რომ შესაბამისი მუშაობის ღილაკს - და თუ როგორ რეკლამა გადაცემა. მოდელი შენახვის და განახლება. სადაც მოდელები ცხოვრობენ, და როგორ ისინი მზადდება წარმოების გამოყენება? ჩვენ განიხილებთ ძირითადი ტესტიებს, მათ შორის მოდელის საიმედოობის უზრუნველყოფს. როგორ იცით, რომ ყველაფერი მუშაობს? ჩვენ გვიჩვენებთ, რა მეტრიკები ჩვენ შეამოწმოთ, თუ როგორ ჩვენ შეამოწმოთ ცოდნა, და სდები ჩვენ გამოიყენებთ, რათა უზრუნველყოს სისტემის ჯანმრთელობა და საიმედოობა. Schema და მონაცემთა კოდირება მონაცემთა გადაზიდვის გრაფიკის არჩევანი მნიშვნელოვანია. მომსახურების მეშვეობით გაზიარება ფორმატში ადვილად შეესაბამება, შეამციროს შეცდომები და გაუმჯობესოს მორგება. ჩვენ მიზნად შეიმუშავეთ სისტემას, რათა მუშაობა გაუმჯობესდეს ორივე თვითმმართველობის მოდელებია და გარე მომწოდებლები - არ გამოტოვოს განსხვავებები მომხმარებელს. რატომ გრაფიკული დიზაინი მნიშვნელოვანია არ არსებობს უნივერსიტეტის სტანდარტი LLM მონაცემთა გადაზიდვისთვის. ბევრი მომწოდებლები შეესაბამება სისტემები, როგორიცაა: მიუხედავად იმისა, რომ სხვა - როგორც ან ბევრი ამ მომწოდებლები გთავაზობთ OpenAI- ს თავსებადი SDKs, რომლებიც შეინარჩუნებენ იგივე დიზაინი, მიუხედავად იმისა, რომ ხშირად შეზღუდვები ან შეზღუდული ფუნქციონირება (გ. და სხვა პროექტები, როგორიცაა განკუთვნილია ამ ვარიანტები შეუერთოს მათ OpenAI-ს თავსებადი ინტერფეისი. OpenAI კოლადის ორმაგი Anthropic- ის OpenAI-ს თავსებადი SDK Gemini- ის OpenAI თავსებადი ფართობი OpenRouter OpenAI კოლადის ორმაგი Anthropic- ის OpenAI-ს თავსებადი SDK Gemini- ის OpenAI თავსებადი ფართობი OpenRouter შეესაბამება ერთი წინასწარ განმარტებული მომწოდებლის გრაფიკით აქვს უპირატესობები: თქვენ მიიღებთ კარგად ტესტირება, სტაბილური API. თქვენ შეგიძლიათ დააყენოთ ხელმისაწვდომი SDK და ინსტრუმენტები. რა თქმა უნდა, არსებობს ასევე რეალური ცვლილებები: ეს შექმნა მიმწოდებელი lock-in, რაც რთულია მხარდაჭერა მრავალჯერადი მომწოდებლები. ეს შეზღუდვა მოქნილი გაფართოება დიზაინი მორგებული ფუნქციები საჭირო ბიზნეს მოთხოვნებს ან მონაცემთა მეცნიერება გუნდი მოთხოვნებს. თქვენ გაქვთ შეუზღუდავი ცვლილებები ან deprecations გარშემო თქვენი კონტროლი. ეს სისტემები ხშირად შეიცავს მშობლიური შეზღუდვა, რომელიც შეზღუდავს ფინადროვანი კონტროლი. ამ მიზნით, ჩვენ ვფიქრობთ, რომ ჩვენი — დიზაინი, რომელიც განკუთვნილია ჩვენი საჭიროებების გარშემო, რომელიც ჩვენ შემდეგ შეგვიძლია სხვადასხვა გარე ფორმატებში, როდესაც საჭიროა. own internal data model Internal Schema დიზაინი დასაწყისში დასაწყისში, გთხოვთ დააყენოთ პრობლემა და შეტყობინოთ ჩვენი მოთხოვნებს გადაწყვეტილებებისთვის: მარტივი კონვერტაცია ფორმატებში, რომელიც მოითხოვს გარე მომწოდებლები და განსხვავებით. სრული მხარდაჭერა ჩვენი ბიზნეს და მონაცემთა მეცნიერების გუნდის სპეციფიკაციებისთვის. უზრუნველყოფს, რომ სისტემა ადვილად გააგრძელდება, რათა შეესაბამება მომავალი მოთხოვნებს. ჩვენ დაიწყოთ ძირითადი LLM გრაფიკების მიმოხილვა, რათა შეინახოთ, თუ როგორ მომწოდებლები სტრუქტურა შეტყობინებები, პარამეტრები და outputs. საერთო ყველაზე სისტემები, მათ შორის: core domain entities Messages (e.g., prompt, history) გენერაციის პარამეტრები (გალითად, ტემპერატურა, top_p, beam_search) ზოგიერთი პარამეტრები, როგორიცაა და ან , as being specific to the provider's internal configuration and business logic. These elements lie outside the core LLM domain and are not part of the shared schema. Instead, they are treated as optional extensions. Whenever a feature becomes widely adopted or necessary for broader interoperability, we evaluate integrating it into the core schema. service_tier usage_metadata reasoning_mode მაღალი დონეზე, ჩვენი input scheme სტრუქტურა ამ ძირითადი კომპონენტები: მოდელი — გამოიყენება როგორც routing key, მუშაობს როგორც routing identifier, რომელიც საშუალებას გაძლევთ სისტემა გაგზავნას მოთხოვნას corresponding worker node. გენერაციის პარამეტრები — ძირითადი მოდელის პარამეტრები (მაგ., ტემპერატურა, top_p, max_tokens) შეტყობინებები — კონტაქტის ისტორია და სწრაფი payloads. ინსტრუმენტები – ინსტრუმენტები, რომლებიც მოდელი შეიძლება გამოიყენოთ. ეს მოდის შემდეგი ფორმაში, რომელიც მოიცავს a ეს აჩვენებს დიზაინის სტრუქტურა და მიზნით, მიუხედავად იმისა, რომ ზოგიერთი განხორციელების დეტალები ადვილია. Pydantic-გვალიერება Pydantic-გვალიერება class ChatCompletionRequest(BaseModel): model: str # Routing key to select the appropriate model or service messages: list[Message] # Prompt and dialogue history generation_parameters: GenerationParameters # Core generation settings tools: list[Tool] # Optional tool defenitions class GenerationParameters(BaseModel): temperature: float top_p: float max_tokens: int beam_search: BeamSearchParams # Optional, non-core fields specific to certain providers provider_extensions: dict[str, Any] = {} ... # Other parameters ჩვენ სავარაუდოდ გადაიხადეთ გენერაციის პარამეტრები განსხვავებული ინტეგრირებული სფეროში, ვიდრე მათ დააყენოთ root დონეზე. ეს დიზაინის არჩევანი გააჩნია განსხვავება parameters (e.g., temperature, top-p, model settings) and კომპონენტები (გალითად, შეტყობინებები, ინსტრუმენტები). ბევრი გუნდი ჩვენი ekosystem შენახავს ამ სტანდარტული პარამეტრები გარე კონფიგურაციის სისტემები, რაც ეს გათავისუფლება ორიგინალური და აუცილებელი. მუდმივი ვარიანტი ჩვენ მოიცავს დამატებითი ფართობი, რომელიც გამოიყენება შიდა ეს პარამეტრები მნიშვნელოვანია განსხვავდება სხვადასხვა LLM მომწოდებლები, validation და ინტერპრეტაცია ამ ფართობი არის — კომპონენტს, რომელიც იცის, თუ როგორ დაგვიკავშირდეთ კონკრეტული მოდელი მომწოდებელს. ასე რომ, ჩვენ თავიდან ავიცილოთ უარყოფითი pass-through coupling, რომელიც იწვევს redundant მონაცემთა გაწმენდა მრავალფეროვანი მომსახურება. provider_extensions GenerationParameters delegated to the final module that handles model inference გაუმჯობესების მიზნით, ახალი ფუნქციები შეიცვალა: ეს ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო. explicit, optional fields ეს გრაფიკები შენარჩუნება შეუერთებული Python ბიბლიოთეკაში და გამოიყენება მომსახურებებში, რათა უზრუნველყოს შეესაბამება მოთხოვნები და პასუხები. მუშაობა მესამე მხარის მომწოდებლები ჩვენ დაიწყეთ, თუ როგორ შექმნა ჩვენი საკუთარი პლატფორმა – ასე რომ, რატომ შეშფოთება თავსებადი გარშემო გარე მომწოდებლები? მიუხედავად იმისა, რომ დამოკიდებულია ჩვენი ინტეგრირებული ინფრასტრუქტურის, არსებობს რამდენიმე სტრატეგია, სადაც გარშემო მოდელები ითამაშოს მნიშვნელობა: Synthetic მონაცემთა გენერაციის prototyping და ექსპერიმენტი ჩვენი მონაცემთა მეცნიერების გუნდი. საერთო მიზნით მოვლენები, სადაც ზოგიერთი კონფიდენციალურობის მოდელები უკეთესია. Nonsensitive გამოყენების შემთხვევაში, სადაც კონფიდენციალურობის, თარიღი, ან ინფრასტრუქტურის კონტროლი არ არის რთული. საერთო კომუნიკაციის გადამცემა გარე მომწოდებლები შეიძლება დააკმაყოფილოს შემდეგი: This process involves the following steps: სპეციალური LLM-Gateway მომსახურება, რომელიც პასუხისმგებლობა კომუნიკაცია მომწოდებლის მიიღებს მომხმარებლის მოთხოვნა ჩვენი გრაფიკის ფორმატში. მოთხოვნა კონვერტებულია მომწოდებლის კონკრეტული ფორმატში, მათ შორის ნებისმიერი provide_extensions. External მომწოდებელი დამუშავებს მოთხოვნა და გადაიხადოს პასუხი. LLM-Gateway მომსახურება მიიღებს პასუხი და რუკა იგი უკან ჩვენი სტანდარტული პასუხი გრაფიკაში. ეს არის მაღალი დონეზე სქემა, რომელიც გარკვეული კონკრეტული microservices. დეტალები კონკრეტული კომპონენტები და streaming პასუხის ფორმატში შეიცავს შემდეგი ნაწილები. Streaming ფორმატები LLM პასუხები იგონება შედუღებრივ - token by token - და შემდეგ შედუღებამდე for efficient transmission. From the user’s perspective, whether through a browser, mobile app, or terminal, the experience must remain ეს მოითხოვს სატრანსპორტო მექანიზმი, რომელიც მხარს უჭერს . chunks fluid and responsive low-latency, real-time streaming არსებობს ორი ძირითადი ვარიანტი ამ მიზნით: WebSockets: Full-duplex კომუნიკაციის კანელი, რომელიც საშუალებას გაძლევთ მუდმივი ორიგინალური ინტერფეისი კლიენტების და სერვერზე. Server-Sent Events (SSE): ერთგვარი, HTTP- ის დაფუძნებული სტრუქტურული სტრუქტურა, რომელიც ფართოდ გამოიყენება რეალურ დროში განახლებებისთვის. WebSockets WebSockets Server-Sent მოვლენები (SSE) Server-Sent მოვლენები (SSE) რატომ SSE over WebSockets? მიუხედავად იმისა, რომ ორივე ვარიანტი ხელმისაწვდომია, — განსაკუთრებით OpenAI თავსებადი API და მსგავსი სისტემები. ეს იმიტომ, რომ რამდენიმე პრაქტიკული უპირატესობა: SSE is the more commonly used solution for standard LLM inference Simplicity: SSE აწარმოებს სტანდარტული HTTP, არ მოითხოვს სპეციალური განახლებები ან კონტაქტი. თავსებადი: ეს მუშაობს ნაქსოვი ყველა ძირითადი ბრაუზერები გარეშე დამატებითი ბიბლიოთეკები. Unidirectional Flow: უმრავლესობა LLM პასუხები გადამცემა მხოლოდ სერვერზე კლიენტს, რომელიც შეესაბამება SSE დიზაინი. Proxy-Friendliness: SSE კარგად ითამაშებს სტანდარტული HTTP ინფრასტრუქტურის, მათ შორის დადებითი პროქსი. upgrades or negotiation ამ უპირატესობების გამო, . SSE is typically chosen for text-only, prompt-response streaming use cases თუმცა, ზოგიერთი ახალი გამოყენების შემთხვევაში მოითხოვს უფრო მდიდარი, დაბალი თარიღი, ორიგინალური კომუნიკაცია - როგორიცაა რეალურ დროში გადაცემის ან საუბუქი-სუბუქი ინტერფეისი. ამ მოთხოვნებს გამოიყენოთ ამ პროტოკულები უკეთესია მუდმივი multimodal input და output. OpenAI’s Realtime API WebSockets OpenAI- ის რეალურ დროის API მას შემდეგ, რაც ჩვენი სისტემა სპეციალიზირებულია მხოლოდ ჩვენ მზად ვართ მისი მარტივი, თავსებადი და შეესაბამება ჩვენი streaming მოდელი. text-based interactions SSE Reply Stream შინაარსი ერთად დასაწყისში, როგორც გადაზიდვის ფართობი, შემდეგი ნაბიჯა შეიცვალა ეფექტური streaming მოითხოვს უფრო მეტი, ვიდრე მხოლოდ ნედლეული ტექსტი — მას უნდა უზრუნველყოს საკმარისი შემდეგი მომხმარებლის მხარდაჭერა, როგორიცაა მომხმარებლის ინტერფეისი და ავტომატიზაციის ინსტრუმენტები. ფოსტის უნდა შეიცავს შემდეგი ინფორმაცია: SSE what structure, metadata, and context Basic identifying information such as request ID. Header-Level Metadata. Real Content Chunks. ძირითადი გამოცემა - მოდელის შექმნილი ტოკები ან strings - გამოცემა შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომი შემდგომ This includes number of tokens generated, timing data, and optional diagnostics like logprobs or reasoning traces. These may be used for billing, debugging, or model evaluation. Usage and Token-Level Metadata. მას შემდეგ, რაც გადაცემის რეაგირების სტრუქტურა განკუთვნილია, ჩვენ ასევე ვფიქრობთ, რომ რამდენიმე არ ფუნქციური მოთხოვნები მნიშვნელოვანია საიმედოობის და მომავალი განვითარებისათვის. ჩვენი stream დიზაინი განკუთვნილია: სტრუქტურული — ნათელი განსხვავება შინაარსი ტიპის და მოვლენების ხარისხის შორის. Extensible - შეუძლიათ გადამცემთ უპირატესობრივი მეტატეგია, გარეშე გაქირავებული კლიენტებს. — resilient to malformed, delayed, or partial data. Robust მრავალი პროგრამები, როგორიცაა ან - მრავალჯერადი სექციები (მახვეულებლები) მზადდება პარამეტრი, როგორც ნაწილი ერთ-ერთი გენერაციის მოთხოვნა. side-by-side comparison diverse sampling ყველაზე ფართო ფორმატში streaming პასუხები განმარტებულია მას შემდეგ, რაც ერთ-ერთი გენერაციის chunk შეიძლება შეიცავს მრავალფეროვანი სექციები array: OpenAI API რეიტინგები choices OpenAI API რეიტინგები არჩევანი Array A list of chat completion choices. Can contain more than one element if n is greater than 1. Can also be empty for the last chunk. choices Array A list of chat completion choices. Can contain more than one element if n is greater than 1. Can also be empty for the last chunk. Although, in practice, individual chunks usually contain only a single delta, the format allows for multiple sequence updates per chunk. It’s important to account for this, as future updates might make broader use of this capability. Notably, even the განკუთვნილია ამ სტრუქტურების მხარდაჭერა. Python SDK პროგრამა Python SDK პროგრამა ჩვენ აირჩიეთ იგივე სტრუქტურა, რათა უზრუნველყოს თავსებადი ფართო სპექტრი პოტენციური ფუნქციები. ქვემოთ დიაგრამა აჩვენებს მაგალითს ჩვენი განახლება, სადაც ერთი გენერაცია შედგება სამი სექციები, სინამდვილეში სინამდვილეში: Chunk 1 — Generation Start. ეს chunk იმიტომ, რომ დაწყება მთელი Generation. იგი არ შეიცავს ნებისმიერი ფაქტობრივი შინაარსი, მაგრამ მოიცავს შეუერთებული მეტატეგია, როგორიცაა Generation ID, timestamp, და როლი (მაგ., მხატვერი, და ა.შ.). Chunk 2 — Sequence Start (Green & Purple). ორი სექციონები დაიწყებენ სინამდვილეში. თითოეულ ერთი უნიკალური identifier- ის გამოყენებით, რათა განსხვავდეს სხვა სექციონები. The third sequence starts (blue), while the first two sequences (green and purple) stream incremental content via delta events. Chunk 3 — Sequence Start (Blue) & Sequence Delta. Chunk 4 — Midstream Updates & Finish (Purple). წითელი და წითელი სექციები გაგრძელებენ სექციებს. ფერადი სექციები დასრულებენ — ეს მოიცავს სტრუქტურული finish_reason (გალითად, stop, სიგრძე და ა.შ.). Both the green and blue sequences complete. Each sequence’s lifecycle is now fully enclosed between its respective start and finish markers. Chunk 5 — Remaining Sequence Finishes. Chunk 6 — Generation Finish. ეს chunk დასრულებს გენერაციის და შეიძლება მოიცავს გლობალური გამოყენების სტატისტიკა, საბოლოო token counts, latency info, ან სხვა დიაგნოზი. როგორც ხედავთ, იმისათვის, რომ ფოსტი robust და ადვილად შეამოწმოთ, ჩვენ აირჩიეთ , rather than relying on implicit mechanisms such as null checks, EOFs, or magic tokens. This structured approach simplifies downstream parsing, especially in environments where multiple completions are streamed in parallel, and also improves debuggability and fault isolation during development and runtime inspection. explicitly signal Start and Finish events for both the overall generation and each individual sequence გარდა ამისა, ჩვენ გთავაზობთ დამატებითი ზოგიერთი შეცდომები, როგორიცაა შეცდომა მოთხოვნები ან ავტომატიზაციის პრობლემები, შეიძლება პირდაპირი გამოჩნდა სტანდარტული HTTP პასუხი კოდი. თუმცა, თუ შეცდომა ხდება , we have two options: either abruptly terminate the HTTP stream or emit a well-formed SSE error event. We chose the latter. Abruptly closing the connection makes it hard for clients to distinguish between network issues and actual model/service failures. By using a dedicated error chunk, we enable more reliable detection and propagation of issues during streaming. Error during the generation process Backend მომსახურება და მოთხოვნა Flow სისტემის ცენტრში არის ერთ-ერთი დატვირთვა: . It handles basic concerns like authentication, usage tracking and quota enforcement, request formatting, and routing based on the specified model. While it may look like the Gateway carries a lot of responsibility, each task is intentionally simple and modular. For external providers, it adapts requests to their APIs and maps responses back into a unified format. For self-hosted models, requests are routed directly to internal systems using our own unified schema. This design allows seamless support for both external and internal models through a consistent interface. LLM-Gateway Self-Hosted Models As mentioned earlier, განკუთვნილია გადამცემი პასუხები საბოლოო მომხმარებელს, მაგრამ ეს არ არის პრაქტიკული არჩევანი . When a request arrives, it must be routed to a suitable worker node for model inference, and the result streamed back. While some systems handle this using chained HTTP proxies and header-based routing, in our experience, this approach becomes difficult to manage and evolve as the logic grows in complexity. Server-Sent Events (SSE) internal backend communication Our internal infrastructure needs to support: Priority-aware გარიგება - მოთხოვნებს შეიძლება იყოს განსხვავებული ნედლეულის დონეები (მაგ., ინტერაქტიული vs. batch), და მაღალი ნედლეულის საქმიანობა უნდა გააკეთოთ პირველი. — Certain nodes run on higher-performance GPUs and should be preferred; others serve as overflow capacity. Hardware-aware routing Model-specific dispatching - თითოეული მუშაობის კონფიგურაცია მხარს უჭერს მხოლოდ ნიმუშები, ძირითადად, ტექნიკური თავსებადი და რესურსების შეზღუდვები. ამ მოთხოვნებს შეესაბამება, ჩვენ ვიყენებთ a ეს დიზაინი უზრუნველყოფს უკეთესი მოქნილობა და რეზოლუცია სხვადასხვა სატვირთო და რეზოლუციის პირობებში. ჩვენ გამოიყენებთ ამ მიზნით, მიუხედავად იმისა, რომ სხვა ბროკერები შეიძლება იყოს ხელმისაწვდომი, დამოკიდებულია თქვენი გაზაფხულება, გაზაფხულება, და ოპერაციული პარამეტრები. RabbitMQ იყო ბუნებრივი შეესაბამება, იმიტომ, რომ მისი ზრდა და შეესაბამება ჩვენი არსებული ინსტრუმენტები. message broker RabbitMQ RabbitMQ RabbitMQ Now let’s take a closer look at how this system is implemented in practice: ჩვენ ვიყენებთ , რომელიც საშუალებას გაძლევთ გზა მოთხოვნებს მოდელის თავსებადი და ნომერი შესაძლებლობების მიხედვით. პროცესი არის შემდეგი: dedicated queues per model კლიენტების მოთხოვნების გადაცემა. LLM-Gateway მომსახურება (მართავს მომხმარებელს) იწყებს HTTP მოთხოვნას ტექსტური გენერაციის საქმიანობის გადაცემას. Scheduler მომსახურება იწყებს ახალი მოთხოვნების მენეჯერი ამ მოთხოვნების მართვისთვის. Task Routing მეშვეობით Scheduler- ის მომსახურება. მოთხოვნა განიხილება Scheduler- ს მიერ, რომელიც აირჩიებს შესაბამისი ხაზს (გერითი ხაზზე იმიტომ, რომ სურათი) მოითხოვებული მოდელის მიხედვით და შეავსებს შეტყობინებას. სამუშაოები იღებს საქმიანობა. განკუთვნილია Inference Worker (თუ მხოლოდ ერთი სამუშაოები იხილება ადვილად, მაგრამ არსებობს ბევრი) დარეგისტრირებულია ხაზი იღებს საქმიანობა და იწყებს დამუშავება. ეს სამუშაოები აწარმოებს შერჩეული მოდელი ადგილობრივ. The worker streams the response chunk-by-chunk into the , to which the . Streaming the Response. Response Queue Scheduler replica handling the request is subscribed Recibing Response Chunks. Scheduler მოუსმინებს პასუხისმგებლობა და მიიღებს პასუხისმგებლობა chunks, როდესაც ისინი მოდის. SSE Streaming. სქემები შეიცვალა SSE ფორმატში და გადაცემა კლიენტს. To handle , ჩვენ არ მივიღებთ შეუზღუდავი შეტყობინება ბროკერი: large payloads Instead of embedding large input or output data directly in the task, we upload it to an . external S3-compatible store კონტაქტი (მაგ. URL ან რესურსის ID) მოიცავს სამუშაო მეტატონები, და თანამშრომელი იპოვებს რეალური შინაარსი, როდესაც საჭიროა. განკუთვნილია RabbitMQ როდესაც საქმე , each ეს არის რეგულარული RabbitMQ , განკუთვნილია ერთი მოდელი ტიპი. ჩვენ გჭირდებათ რა შეიძლება გააკეთოს გამოყენებით ამ კონფიგურაციაში, უმაღლესი Priority ღირებულებების შეტყობინებები მიწოდება და დამუშავება ქვემოთ ქვემოთ Priority ღირებულებების. , სადაც შეტყობინებები უნდა მიწოდება ყველაზე ეფექტური ხელმისაწვდომი ღონისძიებები პირველი, can help. Consumers with higher priority receive messages as long as they are active; lower-priority consumers only receive messages when the higher-priority ones are blocked or unavailable. routing and publishing messages Request Queue კუნძული priority-aware scheduling შეტყობინებები Priorities hardware-aware routing მომხმარებლის Priorities კუნძული შეტყობინებები Priorities მომხმარებლის Priorities If message loss is unacceptable, the following must be in place: to ensure the broker has received and stored the message. გამოქვეყნდა and so data survives restarts. Durable queues persistent messages Quorum ხაზები უფრო ძლიერი მგრძნობიარე მეშვეობით replication. ეს ასევე მხარს უჭერს მარტივი შეტყობინება და მომხმარებლის Priorities, როგორც RabbitMQ 4.0. გამოქვეყნდა გამოქვეყნდა Quorum კუნძულები Quorum კუნძულები simplified message and consumer priorities as of RabbitMQ 4.0 ამჟამად, ჩვენ შეიცავს, თუ როგორ გამოქვეყნდა სამუშაოები - მაგრამ თუ როგორ არის პირველი ნაბიჯა, რომ იცოდეთ, თუ როგორ მუშაობა RabbitMQ. ბროკერი მხარს უჭერს კონცეფცია, რომელიც გამოიყენება , which are bound to a single connection and automatically deleted when that connection closes. This makes them a natural fit for our setup. streamed response temporary queues Exclusive ხაზები Exclusive ხაზები Exclusive ხაზები ჩვენ შექმნათ , ensuring it’s automatically cleaned up when the replica shuts down. However, this introduces a challenge: while each service replica has a single RabbitMQ queue, it must handle . one exclusive queue per Scheduler service replica many requests in parallel To address this, we treat the RabbitMQ queue as a განიხილეთ, თუ როგორ უნდა დაგვიკავშირდეთ მომხმარებლის რეპლიკაცია. თითოეული მომხმარებლის მოთხოვნა გაქირავდება რა თქმა უნდა, რა თქმა უნდა, რა თქმა უნდა, რა თქმა უნდა, რა თქმა უნდა, რა თქმა უნდა, რა თქმა უნდა, რა თქმა უნდა, რა თქმა უნდა, რა თქმა უნდა, ეს არის. , we maintain an additional with short-lived in-memory queues — one per active request. Incoming chunks are matched to these queues based on the identifier and forwarded accordingly. These in-memory queues are discarded once the request completes, while the RabbitMQ queue persists for the lifetime of the service replica. transport layer unique identifier Scheduler in-memory routing layer Schematically ეს ხდის შემდეგი: A central dispatcher within the Scheduler dispatches chunks to the appropriate in-memory queue, each managed by a dedicated handler. Handlers then stream the chunks to users using SSE-protocol. კონტაქტი არსებობს რამდენიმე მყარი რკინიგზები ხელმისაწვდომია ეფექტური LLM შემდეგი, როგორიცაა: და ეს სისტემები განკუთვნილია and generate response tokens in real time, often with features like continuous batching and GPU memory optimization. In our setup, we use როგორც ძირითადი ინგრედიენტური საავტომობილო, რამდენიმე საბაჟო განახლებები: VLLM კონტაქტი process multiple sequences in parallel vLLM VLLM VLLM კონტაქტი კონტაქტი Custom beam search განახლება - უკეთესად შეესაბამება ჩვენი Generation Logic და მხარდაჭერა სტრუქტურული შეზღუდვები. მხარდაჭერა სტრუქტურული output schemes - საშუალებას აძლევს მოდელები მოგცემთ outputs შეესაბამება ბიზნესის კონკრეტული ფორმატები. Through experience, we’ve learned that even minor library updates can — თუ არა წარმოების ხარისხის, determinism, ან concurrency ქცევა. ამ მიზეზით, ჩვენ დაარსდა ძლიერი ტესტი pipeline: significantly alter model behavior სტრესი ტესტირება, რათა აღმოაჩინოს concurrency პრობლემები, მეხსიერების გაქცევა, ან სტაბილურობის რგეზიები. to ensure consistent outputs for fixed seeds and parameter sets. Determinism testing to cover a wide range of generation settings, without going overboard. Parameter grid testing შენახვა და განთავსება ყველაზე თანამედროვე სისტემები გამოიყენება — either in the cloud or within Kubernetes (K8s). მიუხედავად იმისა, რომ ეს setup მუშაობს კარგი ტიპიური backend მომსახურების, იგი იძლევა პრობლემები გარშემო LLM მოდელები შეიძლება იყოს , and baking model weights directly into Docker images — quickly becomes problematic: containerized environments model weight storage tens or even hundreds of gigabytes in size Slow builds - მაშინაც კი მრავალფეროვანი builds და caching, გადაცემა დიდი მოდელი ფაილი დროს build ფაზის შეიძლება რეზოლუციურად გაზრდის CI დრო. slow deployments - თითოეული გაფართოება მოითხოვს დიდი სურათები, რომელიც შეიძლება მიიღოს რამდენიმე წუთის განმავლობაში და გამოწვევა დატვირთვა. — Neither Docker registries nor Kubernetes nodes are optimized for handling extremely large images, resulting in bloated storage usage and bandwidth strain. Resource inefficiency To solve this, we separate Docker- ის სურათების სიცოცხლის ციკლი. ჩვენი მოდელები შენახავს , და მიიღო ადრე დასაწყისი სერვისი დაწყება. რათა გაუმჯობესოს დაწყების დრო და თავიდან ავიცილოთ redundant ჩამოტვირთვა, ჩვენ ასევე გამოიყენოთ მოდელი წონის cache თითოეული ნომერი. model storage external S3-compatible object storage Local Persistent Volumes (PVC) - ადგილობრივი მგრძნობიარე მოცულობა Local Persistent Volumes (PVC) - ადგილობრივი მგრძნობიარე მოცულობა Local Persistent Volumes (PVC) - ადგილობრივი მგრძნობიარე მოცულობა შეამოწმება სისტემა, როგორიცაა ეს - შექმნილია — requires რათა უზრუნველყოს საიმედოობა და შესრულება ფართობი. streaming, message queues, and real-time token generation robust observability დამატებით სტანდარტული მომსახურების დონის მეტრიკებს (CPU, მეხსიერება, შეცდომების სიჩქარეები და ა.შ.), ჩვენ ვფიქრობთ, რომ მნიშვნელოვანია შეამოწმოს შემდეგი: ხაზის სიხშირე, შეტყობინების ბალანსი და მომხმარებლის რაოდენობა - შეამოწმეთ შეტყობინების რაოდენობა, მიმდინარე ხაზის ზომა და აქტიური მომხმარებლის რაოდენობა დაეხმარება შეინახოთ სამუშაო გაფართოების ბალანსი და შეკაბამება მუშაობის გამოყენებით. Token / chunk throughput - შეამოწმოთ ტაქონების რაოდენობა ან პასუხისმგებლობის კუნძულები, რომელიც შექმნილია წამში, დაგეხმარება identify latency ან throughput regressions. — to pinpoint where requests fail or stall across components (gateway, broker, workers, etc.). Distributed ტრაკი Inference საავტომობილო ჯანმრთელობის კონცენტრაცია - რადგან inference პროცესები შეიძლება შეუზღუდავი გარკვეული პირობებში (გალითად, ცუდი ინვესტიციები ან უმაღლესი პარამეტრების ღირებულება), პროექტური კონცენტრაცია სიცოცხლე და მზადება მნიშვნელოვანია. Distributed ტრაკი Distributed ტრაკი Further Improvements მიუხედავად იმისა, რომ ჩვენი სისტემა მზად არის წარმოებისთვის, არსებობს მნიშვნელოვანი მოთხოვნები და შესაძლებლობები ოპტიმიზაციისთვის: გამოიყენეთ გაფართოებული KV-Cache, რათა გააუმჯობესოთ შეტყობინების შესრულება. Supporting to conserve compute when outputs are no longer needed. request cancellation Creating a for data science teams. simple model delivery pipeline კონტაქტი მიუხედავად იმისა, რომ შექმნათ საიმედო და მომწოდებლის დამოუკიდებელი LLM მომსახურების სისტემა შეიძლება გამოჩნდეს რთული პირველი, ეს არ მოითხოვს რკინიგზაცია. თითოეული კომპონენტები - streaming via SSE, task distribution through messaging brokers, და შეტყობინება, რომელიც დამუშავებულია runtimes როგორიცაა vLLM - მომსახურება ნათელი მიზანი და დააყენებს ხელმისაწვდომი, კარგად მხარს უჭერს ინსტრუმენტები. სწორი სტრუქტურა ხელმისაწვდომი, შესაძლებელია შექმნათ შენარჩუნება და განკუთვნილია setup, რომელიც შეესაბამება წარმოების მოთხოვნებს გარეშე უარყოფითი კომპლექტი. In the next post, we’ll explore more advanced topics such as distributed KV-caching, handling multiple models across replicas, and deployment workflows suited to ML-oriented teams. Authors Tochka , სტენეპლუს Shimovolos სტენეპლუს Shimovolos სტენეპლუს Shimovolos ტოქა , Maxim Afanasyev Maxim Afanasyev Maxim Afanasyev აღიარება მუშაობა Tochka Dmitry Kryukov Dmitry Kryukov- ს Dmitry Kryukov- ს