Sinji

მრავალკლიენტიანი პლატფორმა, რომელიც ზარის ჩანაწერს ან ჩასმულ ტრანსკრიპტს გარდაქმნის მოსაუბრეებად დაყოფილ ტექსტად, ცოდნის ბაზასთან ფაქტების შემოწმებად, ტონის ორმხრივ წაკითხვად (რას ამბობს სიტყვები და რას ამბობს ხმა) და რუბრიკით შეწონილ შეფასების ბარათად — ყველაფერი ერთ აუდიო ტაიმლაინზე. მას თან ახლავს ცოდნის ბაზის მართვა AI-კურაციით, ცოდნის ბაზაზე დაფუძნებული მხარდაჭერის ბოტი და აგენტის კოპილოტი, რომელიც ციტატებიან მონახაზებს ნაკადად აწვდის, საჯარო ხმოვანი ინსტრუმენტები და ოპერატორის კონსოლი AI-მოხმარებისა და სერვერის ჯანმრთელობის ანგარიშებით. მუშაობს პირველ რიგში ქართულად, ინგლისურთან ერთად. მთელი პროდუქტი ჩვენ ავაგეთ, Python-ის პაიპლაინიდან Next.js ფრონტენდამდე; ეს დემო სწორედ ის ფრონტენდია, გამოგონილი ბრენდის ქვეშ.

წელი: 2026 · კატეგორია: AI და ანალიტიკა

ჩვენი როლი

Full-stack. ანალიზის პაიპლაინი და მისი მონაცემთა მოდელი, ცოდნის ბაზა და ძიება, შეფასებისა და ფაქტების შემოწმების ლოგიკა, კოპილოტის უკან მდგარი ჩატის ძრავა, ოპერატორის კონსოლი და ფრონტენდი.

პრობლემა

მხარდაჭერის გუნდი, რომელიც ზარებს იწერს, ძალიან იშვიათად უსმენს მათ. ხარისხის კონტროლი ერთი ადამიანია ცხრილით და კვირაში რამდენიმე ზარით, ამიტომ იზომება მხოლოდ ის, რაც შემთხვევით მოხვდა ამონარჩევში, ხოლო ქულა იმაზეა დამოკიდებული, ვინ შეარჩია. ქართულ ენაზე ჩვეული მოკლე გზები ორჯერ ჩავარდება: სატელეფონო ხაზის ტრანსკრიფცია არასრულყოფილია, ხოლო ერთ სიტყვაში არასწორ ტრანსკრიპტს შეუძლია აგენტი არასწორად გამოაჩინოს. ერთხელ მეტყველების მოდელმა „36 თვემდე“-ს ნაცვლად „36 წლამდე“ გაიგონა და ეს მხოლოდ იმიტომ შეამჩნიეს, რომ ცოდნის ბაზაში სხვა ეწერა.

მეორე ხარვეზი ისაა, რისი თქმის უფლებაც აგენტს აქვს. პასუხები პოლიტიკის დოკუმენტებში, პროდუქტის ფურცლებსა და სკრიპტებშია, რომლებიც იცვლება, და ზოგიერთი მათგანი (ფასდაკლების კიბე, შიდა სკრიპტი) კლიენტს არასოდეს უნდა ეთქვას. შემფასებელს სჭირდება, დაინახოს თითოეული მტკიცება: რა თქვა აგენტმა, რომელი პასაჟი ადასტურებს ან ეწინააღმდეგება მას და როგორ შეესაბამება სიტყვების ტონი ხმის ტონს.

მიდგომა

ზარი ჩვენ ტაიმლაინიან დოკუმენტად განვიხილეთ. პაიპლაინი ტექსტად გადაწერს მოსაუბრეების ნიშნებით, იღებს მონაცემებს სამუშაო სივრცის საკუთარი ცოდნის ბაზიდან, გამოყოფს ფაქტობრივ მტკიცებებს, თითოეულს ამოწმებს მისი საუკეთესო პასაჟების მიმართ, ტონს კითხულობს ტექსტიდან და, როცა გვერდითი სერვისი ხელმისაწვდომია, ხმიდანაც, და მხოლოდ ამის შემდეგ აფასებს. ყოველ ანალიზატორს ტრანსკრიპტი დანომრილი სეგმენტებით ეძლევა და ის სეგმენტების ინდექსებით პასუხობს და არა წამებით, ამიტომ მიგნებები სწორ ხაზზე რჩება, დროის ნიშნულები როგორიც არ უნდა აღმოჩნდეს.

შეფასება გაყოფილია შეგნებულად: მოდელი აფასებს რუბრიკის თითოეულ კრიტერიუმს, წონებს კი კოდი ადებს. ორი კრიტერიუმი გაზომილია და არა შეფასებული (სიზუსტე ფაქტების შემოწმებიდან მოდის, თავაზიანობა — ტონის წაკითხვიდან), ხოლო შემფასებელს შეუძლია ნებისმიერი ქულის შენიშვნით შეცვლა, რაც მოდელის ქულას არ გადაწერს და ახალ რედაქციას ქმნის. იგივე ცოდნის ბაზა შემდეგ საფუძვლად უდევს კლიენტის ბოტსაც და კოპილოტსაც, რომელიც აგენტისთვის პასუხებს ამზადებს, ხოლო ღამის კურაციის ამოცანა იმას, რასაც კლიენტები სულ ეკითხებიან და რასაც ფაქტების შემოწმება სულ აფიქსირებს, ცვლილების წინადადებებად აქცევს, რომელთაც ადამიანი იღებს ან უარყოფს.

მთავარი მომენტები

  • ზარი ხდება ტაიმლაინი: ფლეერი, განწყობის ზოლი, ერთი ზოლი რუბრიკის თითო კრიტერიუმზე და ტრანსკრიპტი, სადაც მტკიცებები მონიშნულია როგორც დადასტურებული, საწინააღმდეგო ან ცოდნის ბაზაში არარსებული, და თითოეული ბმულია იმ პასაჟთან, რომელზეც განაჩენია დაფუძნებული.
  • ტექსტის ტონი და ხმის ტონი გვერდიგვერდ ჩანს და მათი საშუალო არასოდეს გამოითვლება. როცა სიტყვები თავაზიანია, ხმა კი — არა, ბანერი ამას ამბობს და ხმას მიჰყვება.
  • მოდელი აფასებს, კოდი წონის. რუბრიკის ორი კრიტერიუმი გაზომილია და არა შეფასებული, ნებისმიერი ქულა შენიშვნით შეიძლება შეიცვალოს და ყოველი ცვლილება ახალი რედაქციაა, მოდელის თავდაპირველი ქულა კი უცვლელი რჩება.
  • ცოდნის ბაზაში დოკუმენტი შეიძლება შიდად აღინიშნოს და ბოტი მის ციტირებაზე უარს იტყვის. ძიების პლეიგრაუნდი ზუსტად აჩვენებს, რატომ: დალაგებული პასაჟები, ქულა, სხვაობა და სანდოობის დონე.
  • კოპილოტი თავის მუშაობას აჩვენებს: ეტაპის ჩიპები გაზომილი მილიწამებით (დაფუძნება, პირველი დონის პასაჟები, მონახაზები), სიტყვა-სიტყვა მოდინებული ციტატებიანი მონახაზები და „ჩასმა“, „შესწორება და გაგზავნა“ ან „უგულებელყოფა“, რომელთაგან თითოეული უკუკავშირად ფიქსირდება.
  • ოპერატორის კონსოლი მოიცავს ყველაფერს, რაც პლატფორმას სჭირდება: სამუშაო სივრცეები და მათი მომხმარებლები, სერვერის ჯანმრთელობა ცოცხალი გრაფიკებით, AI პროვაიდერები და სივრცეებზე მათი მიბმა, ჩატის წვდომის მონაცემების დიაგნოსტიკა და ტოკენების მოხმარება, რომელიც სივრციდან ზარამდე და მოდელთან ერთ მიმართვამდე ჩადის.

არქიტექტურა

  • ვებ-აპლიკაცია: Next.js-ის სტატიკური ექსპორტი, რომელსაც nginx ემსახურება და `/api`-ს იმავე origin-ზე მდებარე API-ზე პროქსირებს. ერთი სამუშაო სივრცის გვერდი ემსახურება როგორც კლიენტებს, ისე ოპერატორს, რომელიც მოთხოვნის სათაურით ნებისმიერ სივრცეში მოქმედებს. ატვირთვები პროგრესს XHR-ით აჩვენებს; კოპილოტის შეტყობინებები და დაიჯესტები server-sent events-ით მოედინება.
  • API: FastAPI სერვისი ერთი პრინციპალის განმსაზღვრელით: ოპერატორი, სამუშაო სივრცე (bearer ტოკენი ან API გასაღები), რეგისტრირებული მომხმარებელი ან ანონიმური მომხმარებელი IP-ის მიხედვით. კლიენტის ვინაობა ტოკენიდან იღება და ყოველი მოთხოვნა სამუშაო სივრცის იდენტიფიკატორით ფილტრდება. ბევრი ენდფოინთი ორჯერ არსებობს, ერთხელ კლიენტის დონეზე და ერთხელ ოპერატორის ტყუპად, ერთსა და იმავე იმპლემენტაციაზე.
  • მონაცემები და ძიება: PostgreSQL 16 pgvector-ით. ცოდნის ბაზის ჩანკებს აქვს კოსინუსური HNSW ინდექსი, საკვანძო სიტყვებით ძიების სარეზერვო ვარიანტად კი ტრიგრამული ინდექსი; საკუთარ სერვერზე გაშვებული ემბედინგის მოდელი 1024-განზომილებიან ვექტორებს აგენერირებს. ერთ ჩანაწერზე ერთი სტრიქონი ინახავს ტრანსკრიპტს, ანალიზს, ფაქტების შემოწმებას, ტონსა და შეფასების ბარათს JSON სვეტებად. მიგრაციები იდემპოტენტური SQL-ია და გაშვებისას ეშვება.
  • AI ფენა: პროვაიდერების რეესტრი თითო ნაგულისხმევი კავშირით თითოეულ შესაძლებლობაზე (ენობრივი მოდელი, მეტყველება-ტექსტად, ტექსტი-მეტყველებად), სამუშაო სივრცეზე მიბმული დანიშვნებითა და საკუთარი გასაღებებით, რომლებიც შენახვისას დაშიფრულია. ყოველი სტრუქტურირებული პასუხი იძულებითი tool call-ია მკაცრი JSON სქემის მიხედვით. მოდელთან ყველა მიმართვა ერთ სერვისში გადის, რომელიც დაშვებას აკონტროლებს და ტოკენებს ფუნქციების მიხედვით მოხმარების ცხრილში აღრიცხავს.
  • ანალიზის პაიპლაინი: მეტყველება-ტექსტად დიარიზაციით, ძიება ცოდნის ბაზაში, ანალიზი, მტკიცებების გამოყოფა თითოეულისთვის ცალკე ძიებითა და შემოწმებით, ტონის ანალიზატორი (ტექსტი და არასავალდებულო ხმის ემოციის გვერდითი სერვისი, რომლის არარსებობაც შედეგს მხოლოდ ტექსტამდე ამცირებს), შემდეგ კი რუბრიკით შეფასება. შემავალი მონაცემები დანომრილი ტაიმლაინის სახით გადაეცემა, გამავალი კი სეგმენტების ინდექსებია.
  • ცოდნის ბაზა და კურაცია: ატვირთვა, პარსინგი, დაჩანკვა, ემბედინგი, ძიების სანდოობის მეტრიკებით, ზუსტი და თითქმის იდენტური დუბლიკატების სკანირებითა და ხელახალი ემბედინგით ასინქრონულ ამოცანად. ღამის მაინერი ვებ, სოციალური და სატელეფონო არხების კლიენტთა შეკითხვებს კლასტერებად აჯგუფებს და ერთ წინადადებას უკეთებს კლასტერზე; წინადადება მხოლოდ მას შემდეგ გამოიყენება, რაც ადამიანი დაადასტურებს.
  • ჩატის ძრავა: ტრანსპორტისგან დამოუკიდებელი მოვლენების ასინქრონული გენერატორი, რომელიც server-sent events-ად სერიალიზდება გარე ჩატ-სერვისისთვის, რომელიც ვიწრო უფლებებითა და მბრუნავი წვდომის მონაცემებით ავტორიზდება. ტრიაჟის ეტაპი და დაფუძნების ბარიერი წყვეტენ, უფლება აქვს თუ არა ბოტს უპასუხოს; კოპილოტი აგენტს რამდენიმე ციტატებიან მონახაზს ნაკადად უგზავნის; გლობალური და თითო სივრცის გამომრთველი ბოტს აჩერებს.
  • ვორკერი და ოპერაციები: იგივე იმიჯზე გაშვებული ვორკერი ასრულებს კურაციას, რიგში მდგარ ხელახალ ემბედინგებს და შენახვის ვადის გასუფთავებას. API პროცესში სემპლერი სერვერის ჯანმრთელობას აღრიცხავს, ფლაშერი კი — სამუშაო სივრცეების დატვირთვას. ყველაფერი Docker Compose-ით მუშაობს ერთ Linux სერვერზე nginx-ისა და TLS-ის უკან; მთავარ ბრენჩზე push webhook-ს იწვევს, რომელიც კოდს ჩამოტვირთავს, ხელახლა ააწყობს და სქემას გამოიყენებს.

ციფრებში

სიმულირებული API მარშრუტი: 134 · ცალკე ჩატვირთვადი გვერდი: 46 · დემო-ანგარიში, თითო როლზე: 4 · ზარი საწყის მონაცემებში, 83 შემოწმებული მტკიცებით: 17 · ინტერფეისის ენა: 2 · ფრონტენდის TypeScript-ის კოდის ხაზი: 40k

შედეგები

  • შეფასება აღარ არის ამონარჩევი. ნებისმიერი ზარი იხსნება ტაიმლაინად, სადაც ყოველი მტკიცება, ქულა და ტონის წაკითხვა იმ ხაზზე მიუთითებს, საიდანაც წარმოიშვა.
  • გუნდის საკუთარი დოკუმენტების მიმართ ფაქტების შემოწმებამ გამოავლინა ის, რასაც მხოლოდ ტრანსკრიპტი ვერ გვიჩვენებს: რიცხვი, რომელიც სწორად ჟღერს, მაგრამ არასწორია, და ტრანსკრიფციის შეცდომა, რომელიც აგენტს დაბრალდებოდა.
  • ერთი და იგივე ცოდნის ბაზა საფუძვლად უდევს ხარისხის შეფასების ბარათსაც, კლიენტის ბოტსაც და აგენტის კოპილოტსაც, ამიტომ ერთხელ, კურაციის რიგის გავლით შესწორებული რამ სამივეს აუმჯობესებს.
  • ოპერატორები ბევრ გუნდს ერთი კონსოლიდან მართავენ, სივრცეზე ცალ-ცალკე AI პროვაიდერებითა და გასაღებებით და ხილული, ტოკენების დონეზე აღრიცხვით იმისა, რას ხარჯავს თითოეული სივრცე.

რა გამოვიყენეთ

  • ფრონტენდი: Next.js (სტატიკური ექსპორტი), TypeScript, ატვირთვის პროგრესი XHR-ით, Server-sent events, Web Audio API (რედაქტორი)
  • API და ვორკერი: Python 3.11, FastAPI, ფონური ვორკერი (იგივე იმიჯით), უფლებებით შეზღუდული bearer ტოკენები და API გასაღებები, Fernet-ით დაშიფრული პროვაიდერების გასაღებები, psutil (მდგომარეობის გაზომვა)
  • მონაცემები და ძიება: PostgreSQL 16, pgvector (HNSW, კოსინუსური), pg_trgm (საკვანძო სიტყვებით ძიების სარეზერვო ვარიანტი), საკუთარ სერვერზე გაშვებული ემბედინგის მოდელი (1024 განზომილება), JSON სვეტები თითო ჩანაწერზე
  • AI ფენა: პროვაიდერების რეესტრი (ენობრივი მოდელი, მეტყველება-ტექსტად, ტექსტი-მეტყველებად), იძულებითი tool call-ები მკაცრი JSON სქემებით, საკუთარ სერვერზე გაშვებული ხმის ემოციის გვერდითი სერვისი, საკუთარი გასაღებები თითო სამუშაო სივრცეზე
  • ინფრასტრუქტურა: Docker Compose, nginx და TLS, Webhook-ით ამოქმედებული დეპლოის სკრიპტი, იდემპოტენტური SQL მიგრაციები
  • დემოს აწყობა: React 18, TypeScript (strict), Vite 6, Tailwind CSS 4, React Router 6, TanStack Query 5, i18next (EN/KA), Recharts 2, Radix UI, framer-motion, cmdk, @portfolio/demo-kit: სიმულირებული API

დემო

Boulder-ის მიერ აშენებული რეალური პროდუქტის გამოგონილი ბრენდით გადაკეთებული ვერსია, რომლის ბექენდიც ბრაუზერშივე მომუშავე სიმულაციითაა ჩანაცვლებული: საწყისი მონაცემები ბანდლშია ჩაშენებული და მეხსიერებიდან მიეწოდება. მოდელის ყოველი შედეგი წინასწარაა გამოთვლილი (ან ჩანართშივე გამოითვლება მცირე წმინდა ფუნქციებით, როგორიცაა ძიება და შეფასების ფორმულა), მეტყველების სინთეზი წინასწარ ჩაწერილ კლიპებს უკრავს, ატვირთული ფაილი კი უახლოეს მზა ზარს ესადაგება. არაფერი გვერდს არ ტოვებს, არაფერი ინახება და გვერდის გადატვირთვა ხელუხლებელ მონაცემებს აბრუნებს. ზედა პანელიდან შეგიძლიათ შეხვიდეთ როგორც ოპერატორი, სამუშაო სივრცის მფლობელი ან წევრი, ან კონტაქტ-ცენტრის აგენტი.