πŸš€β¬†οΈ ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠΉ свой AI: Ρ€Π°Π·ΠΎΠ±Π»Π°Ρ‡Π΅Π½ΠΈΠ΅ 6 ΠΌΠΈΡ„ΠΎΠ² ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ Π² Pgvector

Π¨Π΅ΡΡ‚ΡŒ Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅ΡˆΠ°ΡŽΡ‚ Ρ‚Π΅Π±Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всю ΠΌΠΎΡ‰ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Ρ… Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Π² AI. Π Π°Π·Π²Π΅Π½Ρ‡Π°Π² эти ΠΌΠΈΡ„Ρ‹, Ρ‚Ρ‹ смоТСшь Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΡŒ истинный ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Ρ‚Π²ΠΎΠΈΡ… AI-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ².

Π­Ρ‚ΠΎΡ‚ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» взят ΠΈΠ· нашСй СТСнСдСльной email-рассылки, посвящСнной ИИ. Подпишись, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π² числС ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΊΡ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ дайдТСст.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Pgvector

Pgvector – Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ для PostgreSQL, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ – Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ, ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ запросы. Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² Π² рСляционной Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π΄Π°Π΅Ρ‚ нСсколько Π²Π°ΠΆΠ½Ρ‹Ρ… прСимущСств ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с использованиСм спСциализированного Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°:

  • МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС возмоТности рСляционных Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… наряду с Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹ΠΌ поиском – ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ с Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ, ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈ Ρ‚. Π΄.
  • Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ поиска ΠΏΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠΉ схоТСсти ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΡ… сосСдСй ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ самыС Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π½Ρ‹Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… запросов.

Π‘Π»ΠΎΠ²ΠΎΠΌ, pgvector ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Тизнь ИИ-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΡ€ΠΎΡ‰Π΅ – особСнно Ссли ΠΎΠ½ избавится ΠΎΡ‚ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… устойчивых Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΎ возмоТностях ΠΈ ограничСниях ΠΏΠ»Π°Π³ΠΈΠ½Π°. Автор этой ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π» распространСнныС срСди Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… спСциалистов ΠΌΠΈΡ„Ρ‹.

ΠœΠΈΡ„ 1: Для хранСния Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² всСгда Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ индСкс

ΠœΠΈΡ„ появился ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Π΅ Π±Π°Π·Ρ‹ ΠΈ популярныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ «индСкс» для описания любого способа хранСния Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ². Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ индСксы – СдинствСнный способ хранСния Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ². Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния PostgreSQL это Π½Π΅ Ρ‚Π°ΠΊ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Ρ… Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°Ρ… «плоским» индСксом называСтся структура Π±Π΅Π· ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ. Π’ PostgreSQL ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ‚ΠΎΠΆΠ΅ «плоскиС». Π’ΠΎ Π΅ΡΡ‚ΡŒ, Ссли Π²Ρ‹ создадитС Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ с ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΎΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ Ρ‚ΡƒΠ΄Π° Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹, Ρƒ вас ΠΊΠ°ΠΊ Ρ€Π°Π· получится Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… систСмах считаСтся плоским Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹ΠΌ индСксом.

Π₯отя ΠΏΡ€ΠΈ использовании pgvector индСксы ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях ΠΎΠ½ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½Ρ‹. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ индСксируСт Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΈ Π·Π²ΠΎΠ½ΠΊΠΎΠ² для поиска ΠΈ извлСчСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Допустим, Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π΅ΡΡ‚ΡŒ 10 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Ρ… прСдставлСний, Π½ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° приходится Π½Π΅ большС 10 тысяч эмбСддингов, Π° Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Π° – Π΄ΠΎ 1000, ΠΈ ΠΎΠ½ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡ‰ΡƒΡ‚ Π·Π²ΠΎΠ½ΠΊΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π° послСдниС нСсколько нСдСль – это мСньшС 100 записСй.

Если Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ всСго срСди 100 ΠΈΠ»ΠΈ 1000 Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ², ΠΏΠΎΡ‡Ρ‚ΠΈ навСрняка Π²Π°ΠΌ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ индСкса. ВмСсто этого ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ B-Tree индСксы (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, с Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π½Π° части) для ограничСния области поиска Π½Π° Π½ΡƒΠΆΠ½Ρ‹ΠΉ подмноТСство Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ². Π­Ρ‚ΠΎ даст Π²Π°ΠΌ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΎΡ…Π²Π°Ρ‚ (Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Π΅ индСксы Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½Π½Ρ‹ΠΌ поиском, поэтому ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…) ΠΈ сэкономит врСмя, ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ рСсурсы процСссора Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ индСксов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ бСсполСзны (ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ PostgreSQL, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ).

ΠœΠΈΡ„ 2: Π‘Π΅ΠΌΠ°Π½Ρ‚ΠΈΠΊΠ° Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Ρ… индСксов ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° сСмантику Π΄Ρ€ΡƒΠ³ΠΈΡ… индСксов

SQL-запрос, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ индСкс, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, Ρ‡Ρ‚ΠΎ ΠΈ запрос Π±Π΅Π· индСкса. Π­Ρ‚ΠΎ основная Π»ΠΎΠ³ΠΈΠΊΠ° SQL ΠΈ рСляционных Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Π΅ индСксы Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠΎ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ.

Но с Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹ΠΌΠΈ индСксами Π΄Π΅Π»ΠΎ обстоит ΠΈΠ½Π°Ρ‡Π΅: ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой структуру Π΄Π°Π½Π½Ρ‹Ρ… для эффСктивного ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ поиска Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΡ… сосСдСй. Для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ½ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ поиска Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΡ… сосСдСй ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ подмноТСствами Π³Ρ€Π°Ρ„Π°. Π­Ρ‚ΠΈ подмноТСства Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π½ΠΈΡ… с большой Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π»ΠΈΡΡŒ блиТайшиС сосСди, Π½ΠΎ Π½Π° 100% это Π½Π΅ гарантируСтся.

ИмСнно здСсь Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ компромисс ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡ‚ΠΎΠΉ поиска: Ρ‡Π΅ΠΌ большС подмноТСств Π³Ρ€Π°Ρ„Π° Π²Ρ‹ провСряСтС, Ρ‚Π΅ΠΌ Π²Ρ‹ΡˆΠ΅ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π½Π°ΠΉΡ‚ΠΈ настоящих Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΡ… сосСдСй, Π½ΠΎ Ρ‚Π΅ΠΌ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ это Π·Π°ΠΉΠΌΠ΅Ρ‚. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Ρ… индСксов ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ – Π½Π° сколько подмноТСств Π²Ρ‹ Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ? Насколько Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ просматриваСтС ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ подмноТСство? Π­Ρ‚ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° баланс ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡ‚ΠΎΠΉ поиска, ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ индСкса ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ pgvector.

ΠœΠΈΡ„ 3: НСльзя Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ 2000 ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ Π² Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠΌ индСксС

Π­Ρ‚ΠΎΡ‚ ΠΌΠΈΡ„ связан с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² PostgreSQL ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 8К. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Π΅ΠΊΡ‚ΠΎΡ€ – это Π½Π°Π±ΠΎΡ€ чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ число Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 32 Π±ΠΈΡ‚Π°. ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅ вычислСния ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов ΠΏΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΎΠΊΠΎΠ»ΠΎ 2000 ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ Π²Ρ‹ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ°Π΅Ρ‚Π΅ΡΡŒ ΠΊ Π»ΠΈΠΌΠΈΡ‚Ρƒ Π² 8К. Π₯отя Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±Π»ΠΎΠΊΠ°Ρ… (благодаря Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ TOAST), ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹ΠΉ индСкс для слишком Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² Π½Π΅ получится. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ Π΄Π²Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°:

  • ИспользованиС ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ эмбСддингов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ с мСньшим количСством ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ, Π»ΠΈΠ±ΠΎ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, ΠΎΠ±ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.
  • ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² сокращСния размСрности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°ΡŽΡ‚ количСство ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°, ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ сохраняя Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ. Π‘Ρ€Π΅Π΄ΠΈ Ρ‚Π°ΠΊΠΈΡ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² – PCA, t-SNE ΠΈ UMAP, ΠΈ Π΅ΡΡ‚ΡŒ исслСдования, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ достаточно эффСктивно.

Π‘Π°ΠΌΡ‹ΠΉ ΠΆΠ΅ простой ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ – ΠΊΠ²Π°Π½Ρ‚ΠΎΠ²Π°Π½ΠΈΠ΅. Π­Ρ‚ΠΎ процСсс использования Π±ΠΎΠ»Π΅Π΅ лСгковСсных Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ измСрСния. Pgvector ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ half_vec с ΠΊΠ²Π°Π½Ρ‚ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ: ΠΎΠ½ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π² 16-Π±ΠΈΡ‚Π½Ρ‹Π΅ значСния, убирая Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Π΅ разряды. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для поиска Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΡ… сосСдСй, эти Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ разряды ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ нСсильно Π²Π»ΠΈΡΡŽΡ‚ Π½Π° ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ расстояния ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ.

Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ half_vec Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ float, Π² PostgreSQL ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 4000 ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ. БообщСство Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°Π΄ ΠΊΠ²Π°Π½Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π΄ΠΎ 8 Π±ΠΈΡ‚ с Ρ‚ΠΈΠΏΠΎΠΌ int_vec, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ с 8000 ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ.

Π”Π°ΠΆΠ΅ Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ нСбольшиС Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² Π±Π»ΠΎΠΊ PostgreSQL ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, стоит Π²Π·ΡΡ‚ΡŒ ΠΊΠ²Π°Π½Ρ‚ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Π²ΠΎΠΎΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅: ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ объСма Π΄Π°Π½Π½Ρ‹Ρ… Π² Π΄Π²Π° Ρ€Π°Π·Π° Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ сниТаСт использованиС рСсурсов – практичСски Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΡŒ для точности поиска.

ΠœΠΈΡ„ 4: ИспользованиС Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ индСкса с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°ΠΌΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ пропуску Π΄Π°Π½Π½Ρ‹Ρ…

Π­Ρ‚ΠΎ, Π½Π° самом Π΄Π΅Π»Π΅, ΠΏΡ€Π°Π²Π΄Π° – Π½ΠΎ станСт ΠΌΠΈΡ„ΠΎΠΌ Π² блиТайшСС врСмя, с выпуском pgvector вСрсии 0.8.0. БСйчас ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° выглядит Ρ‚Π°ΠΊ:

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ‹ проиндСксировали Π²ΠΈΠΊΠΈ своСй ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° запрос «процСсс ΠΈ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡΒ». Но Ρƒ вашСй ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π΅ΡΡ‚ΡŒ нСсколько ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠΉ, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ продвиТСния ΠΏΠΎ ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Π½ΠΎΠΉ лСстницС, Π° вас ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠ· ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Β«ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π½ΠΎΠ΅ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅Β». Π’Π°Ρˆ запрос ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

select doc_id, doc_title
from document_embeddings
where embedding <-> $1 < 1
and doc_category = 'engineering'
order by embedding <-> $1
limit 10;

Как PostgreSQL Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ Ρ‚Π°ΠΊΠΎΠΉ запрос? Π₯ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ поиск происходил Ρ‚ΠΎΠ»ΡŒΠΊΠΎ срСди подмноТСства Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ², относящихся ΠΊ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Β«ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π½ΠΎΠ΅ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅Β». Но Ссли Π²Ρ‹ Π·Π°Ρ€Π°Π½Π΅Π΅ Π½Π΅ создали Ρ€Π°Π·Π΄Π΅Π»Ρ‹ ΠΈΠ»ΠΈ частичныС индСксы, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ подмноТСства Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. ΠŸΡ€ΠΈ поискС PostgreSQL сначала ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹ΠΉ индСкс, Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ 10 Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΡ… сосСдСй, Π° Π·Π°Ρ‚Π΅ΠΌ примСняСт Ρ„ΠΈΠ»ΡŒΡ‚Ρ€, отбрасывая Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ относятся ΠΊ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π½ΠΎΠΌΡƒ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΡŽ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ 10 Π΄ΠΎ 0 строк. А Π²Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€ΠΎΠ²Π½ΠΎ 10 строк Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… поиска, Ρ‚.Π΅. Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π½Π°ΠΉΡ‚ΠΈ k Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΡ… сосСдСй послС примСнСния Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°, Π½ΠΎ Π·Π°Ρ€Π°Π½Π΅Π΅ нСльзя ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, сколько сосСдСй Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ индСкс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ этого Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ.

Π’ вСрсии 0.8.0 Π±ΡƒΠ΄ΡƒΡ‚ Π²Π²Π΅Π΄Π΅Π½Ρ‹ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Π΅ индСксы. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ PostgreSQL ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ индСкс, Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΡ… сосСдСй, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ сканированиС индСкса ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎΠ΅ количСство сосСдСй.

Π’Π°ΠΊΠΆΠ΅ Π² вСрсии 0.8.0 Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΎΡ†Π΅Π½ΠΊΠ° стоимости использования Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Ρ… индСксов, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ PostgreSQL Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹ΠΉ индСкс, Π° ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° индСксы B-Tree ΠΈΠ»ΠΈ GiST. Π­Ρ‚ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ упростят созданиС индСксов ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ запросов, обСспСчивая ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ PostgreSQL с Π½ΠΈΠΌΠΈ.

ΠœΠΈΡ„ 5: ВСкторная ΡΡ…ΠΎΠΆΠ΅ΡΡ‚ΡŒ примСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² RAG-прилоТСниях

Π’ RAG эмбСддинги ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π½Ρ‹ΠΉ контСкст, Ρ‡Ρ‚ΠΎ позволяСт большим языковым модСлям (LLM) Π΄Π°Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ ΠΈ ΡΠ½ΠΈΠΆΠ°Ρ‚ΡŒ риск Π³Π°Π»Π»ΡŽΡ†ΠΈΠ½Π°Ρ†ΠΈΠΉ. Однако Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ области, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Ρ… эмбСддингов Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ сСмантичСски схоТий ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π΅ΠΎΡ†Π΅Π½ΠΈΠΌΡƒΡŽ ΠΏΠΎΠΌΠΎΡ‰ΡŒ, Π΄Π°ΠΆΠ΅ Π±Π΅Π· использования LLM:

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ – Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π±Π°Π·Ρ‹ Π·Π½Π°Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ запросу ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΈΠ»ΠΈ Π°Π³Π΅Π½Ρ‚Ρƒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ.
  • ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ – Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ ΠΎΠ± ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅.
  • Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ – Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ²Π°Ρ€Ρ‹ ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚, ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ Π½Π° Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»ΠΈΡΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ. НапримСр, «Если Π²Π°ΠΌ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»Π°ΡΡŒ эта ΠΊΠ½ΠΈΠ³Π°, Π²Π°ΠΌ, вСроятно, понравится ΠΈ эта...Β»
  • ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΉ – Ρ‡Ρ‚ΠΎΠ±Ρ‹ вмСсто поиска ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ для обнаруТСния случаСв, ΠΊΠΎΠ³Π΄Π° Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΡ… сосСдСй. Если ΠΎΠ½ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ отличаСтся ΠΎΡ‚ всСх ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ аномалия, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ стоит Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.
  • Поиск ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ² – Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎ Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ Ρ‚ΠΎΠ²Π°Ρ€Ρ‹.

ΠœΠΈΡ„ 6: pgvector Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ BM25 (ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π°Π·Ρ€Π΅ΠΆΠ΅Π½Π½Ρ‹Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹)

БущСствуСт Π΄Π²Π° Ρ‚ΠΈΠΏΠ° Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Ρ… эмбСддингов – ΠΏΠ»ΠΎΡ‚Π½Ρ‹Π΅ ΠΈ Ρ€Π°Π·Ρ€Π΅ΠΆΠ΅Π½Π½Ρ‹Π΅:

  • ΠŸΠ»ΠΎΡ‚Π½Ρ‹Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΎΠ±ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ языковыми модСлями ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΡƒΡŽΡ‚ сСмантичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прСдлоТСния ΠΈΠ»ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. Π­Ρ‚ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ нСльзя ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ словом ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠ΅ΠΉ. ΠŸΠ»ΠΎΡ‚Π½Ρ‹Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΡ‚ 256 Π΄ΠΎ 4096 ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ.
  • Π Π°Π·Ρ€Π΅ΠΆΠ΅Π½Π½Ρ‹Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹, Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², часто ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² тСкстового поиска, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ TF-IDF, BM25, SPLADE, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для прСдставлСния ваТности слов Π² тСкстС. Π’ Ρ€Π°Π·Ρ€Π΅ΠΆΠ΅Π½Π½Ρ‹Ρ… Π²Π΅ΠΊΡ‚ΠΎΡ€Π°Ρ… ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ соотвСтствуСт слову, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, насколько часто ΠΈΠ»ΠΈ Π²Π°ΠΆΠ½ΠΎ это слово Π² тСкстС. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ Π² Ρ‚Π°ΠΊΠΈΡ… Π²Π΅ΠΊΡ‚ΠΎΡ€Π°Ρ… зависит Π»ΠΈΠ±ΠΎ ΠΎΡ‚ количСства ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… слов Π² Π½Π°Π±ΠΎΡ€Π΅ Π΄Π°Π½Π½Ρ‹Ρ… (Π² случаС TF-IDF ΠΈ BM25), Π»ΠΈΠ±ΠΎ ΠΎΡ‚ количСства слов, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±ΡƒΡ‡Π΅Π½Π° модСль (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 30 522 слова для SPLADE). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ тСкстов содСрТат лишь ΠΌΠ°Π»ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… слов, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ Π² Ρ€Π°Π·Ρ€Π΅ΠΆΠ΅Π½Π½Ρ‹Ρ… Π²Π΅ΠΊΡ‚ΠΎΡ€Π°Ρ… ΠΈΠΌΠ΅ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0.

Π’ вСрсии 0.7.0 pgvector Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ€Π°Π·Ρ€Π΅ΠΆΠ΅Π½Π½Ρ‹Ρ… Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² с Ρ‚ΠΈΠΏΠΎΠΌ sparsevec. Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ Ρ…Ρ€Π°Π½ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ элСмСнты Π²Π΅ΠΊΡ‚ΠΎΡ€Π°. Π Π°Π·Ρ€Π΅ΠΆΠ΅Π½Π½Ρ‹Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ, указывая Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ значСния ΠΈ ΠΈΡ… индСксы. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ клиСнтскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ pgvector (доступныС для ΠΌΠ½ΠΎΠ³ΠΈΡ… языков ΠΈ ORM), Ρ‚ΠΎ ΠΎΠ½ΠΈ автоматичСски ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ тСкстовый Ρ„ΠΎΡ€ΠΌΠ°Ρ‚.

πŸ€– Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π”Π°Ρ‚Π° БайСнтиста
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π”Π°Ρ‚Π° БайСнтиста»
πŸ€–πŸŽ“ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° DS для собСса
ΠŸΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ свои знания ΠΏΠΎ DS Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° DS для собСса»
πŸ€–πŸ§© Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ DS
Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ DS для ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ DSΒ»

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Плагин pgvector постоянно развиваСтся: вСрсия 0.7.0 Π±Ρ‹Π»Π° Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½Π° Π² Π°ΠΏΡ€Π΅Π»Π΅ 2024 Π³ΠΎΠ΄Π°, Π° Ρ€Π΅Π»ΠΈΠ· 0.8.0 оТидаСтся Π² ΠΊΠΎΠ½Ρ†Π΅ октября 2024. Π‘ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ вСрсиСй Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ нСсколько Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΡƒΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ старыС ограничСния – pgvector становится всС Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹ΠΌ ΠΈ Π³ΠΈΠ±ΠΊΠΈΠΌ инструмСнтом ИИ-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.

***

Как Π²Ρ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ знания ΠΎ Pgvector Π² своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…? РасскаТитС ΠΎ своих идСях!

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

eFusion
08 января 2020

11 Ρ‚ΠΈΠΏΠΎΠ² соврСмСнных Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…: ΠΊΡ€Π°Ρ‚ΠΊΠΈΠ΅ описания, схСмы ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π‘Π”

Π›ΡŽΠ±Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π³Π΄Π΅-Ρ‚ΠΎ хранятся. Π‘ΡƒΠ΄ΡŒ это ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ Π²Π΅Ρ‰Π΅ΠΉ ΠΈΠ»ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ Π² *nix. По...
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
29 июня 2017

5 сайтов для оттачивания Π½Π°Π²Ρ‹ΠΊΠΎΠ² написания SQL-запросов

Одним ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… Π½Π°Π²Ρ‹ΠΊΠΎΠ² ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… являСтся ΡƒΠΌΠ΅Π½ΠΈΠ΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ...
admin
23 фСвраля 2017

SQL Π·Π° 20 ΠΌΠΈΠ½ΡƒΡ‚

ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ Π²Π°ΡˆΠ΅ΠΌΡƒ вниманию ΡΡ‚Π°Ρ‚ΡŒΡŽ с ΠΊΡ€ΠΈΡ‡Π°Ρ‰ΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ "SQL Π·Π° 20 ΠΌΠΈΠ½ΡƒΡ‚". К...