Cohere, dostawca, który postawił na wyszukiwanie
Większość firm z tej branży ściga się na modele rozmawiające. Cohere poszedł inną drogą i zbudował pozycję na trzech rzeczach mniej widowiskowych: osadzeniach, zmianie kolejności wyników i wdrożeniach we własnej infrastrukturze klienta.
To znaczy, że jego produkty rzadko są tym, czego szukasz do budowy asystenta rozmawiającego, a często tym, czego szukasz, gdy asystent zwraca nietrafione fragmenty i nie wiadomo dlaczego.
Zmiana kolejności wyników
To najbardziej wyróżniający produkt tej firmy i wart osobnego omówienia, bo rozwiązuje konkretny problem.
Wyszukiwanie wektorowe zwraca fragmenty podobne znaczeniowo do pytania, ale podobieństwo wektorów to przybliżenie. Model porządkujący ocenia parę pytanie i fragment razem, więc widzi więcej niż odległość między wektorami.
import cohere
klient = cohere.ClientV2(api_key=os.environ["COHERE_API_KEY"])
wyniki = klient.rerank(
model="rerank-v3.5",
query="jak pobrac duplikat faktury",
documents=fragmenty_z_bazy,
top_n=5,
)Układ wygląda tak: baza wektorowa zwraca dwadzieścia kandydatów, model porządkujący ocenia każdego i do promptu trafia pięć najlepszych. Kosztuje to jedno dodatkowe wywołanie i zwykle zauważalnie poprawia trafność.
Warto natomiast zmierzyć, czy w Twoim przypadku faktycznie poprawia. Na zestawie trzydziestu prawdziwych pytań porównaj trafność przed i po. Jeśli różnica jest niewielka, oszczędzasz wywołanie i opóźnienie, a to przy każdym zapytaniu.
Alternatywą tańszą jest zwiększenie liczby zwracanych fragmentów przy jednoczesnym doprecyzowaniu filtrów. Nierzadko problem leży nie w kolejności, tylko w tym, że właściwego fragmentu w ogóle nie ma w zwróconym zbiorze, a wtedy porządkowanie nie ma czego naprawić.
Osadzenia i języki
Modele osadzeń tego dostawcy wypadają dobrze w językach innych niż angielski i to jest ich praktyczna przewaga.
Model trenowany głównie na danych angielskich zwraca w polszczyźnie fragmenty gorzej dopasowane, a diagnoza tego problemu bywa myląca, bo wygląda jak wina bazy wektorowej. Model wielojęzyczny usuwa tę przyczynę i to zwykle najtańsza poprawa jakości wyszukiwania.
osadzenia = klient.embed(
model="embed-v4.0",
texts=fragmenty,
input_type="search_document",
)Parametr typu wejścia jest tu istotny i często pomijany. Osadzenia dla dokumentów i dla zapytań liczy się inaczej, bo pełnią inną rolę. Użycie tego samego typu dla obu obniża trafność, a nic o tym nie informuje.
Warto też pamiętać, że zmiana modelu osadzeń wymaga przeliczenia całej kolekcji. Wektory z różnych modeli nie są porównywalne, więc test dwóch modeli robi się na próbce, a nie po zindeksowaniu miliona fragmentów.
Modele nowszej generacji obsługują też obrazy w tej samej przestrzeni co tekst, co pozwala wyszukiwać po dokumentach zawierających wykresy i zrzuty ekranu bez osobnego przetwarzania.
Modele rozmawiające
Poza wyszukiwaniem dostawca ma modele generujące, przystosowane do pracy z dokumentami i do wywoływania narzędzi.
Ich cechą wyróżniającą jest wbudowana obsługa cytowań. Model odpowiadający na podstawie dostarczonych fragmentów zwraca też wskazanie, z którego fragmentu pochodzi które zdanie. To rozwiązuje problem, który przy innych modelach trzeba obchodzić instrukcją i parsowaniem.
Przy zastosowaniach firmowych ta właściwość bywa rozstrzygająca, bo odpowiedź bez wskazania źródła jest w wielu kontekstach bezużyteczna. Użytkownik musi móc sprawdzić, skąd wzięła się informacja, a przy dokumentach wewnętrznych to często wymóg formalny.
Uczciwie trzeba dodać, że w ogólnych zestawieniach jakości modele tego dostawcy nie przewodzą. Ich sens leży w połączeniu przyzwoitej jakości z cytowaniami, ceną niższą od czołówki i możliwością wdrożenia we własnej infrastrukturze.
Wdrożenie we własnej infrastrukturze
To drugi filar pozycji tej firmy i powód, dla którego pojawia się w rozmowach o wdrożeniach w bankach i administracji.
Modele da się uruchomić w chmurze prywatnej klienta albo u głównych dostawców chmurowych z zachowaniem kontroli nad kluczami. Dane nie opuszczają wtedy wybranego obszaru, co przy wymogach zgodności bywa warunkiem, a nie preferencją.
Dwie rzeczy trzeba tu rozdzielić, bo rozliczają się inaczej. Dedykowane instancje prowadzone przez dostawcę mają jawny cennik godzinowy i miesięczny: od 4 dolarów za godzinę za mniejszy poziom wydajności modelu osadzeń do 10 dolarów za godzinę za większy poziom modelu porządkującego, czyli od 2500 do 6500 dolarów miesięcznie za instancję. Uruchomienie modeli w Twojej własnej infrastrukturze to osobna umowa i wycena indywidualna.
Poza tym dostępna jest platforma agentowa przeznaczona do wdrożeń wewnętrznych, łącząca wyszukiwanie po dokumentach firmy z wywoływaniem narzędzi. Ceny tej części nie są publikowane, więc przy planowaniu budżetu trzeba przejść przez rozmowę handlową.
Ta nieprzejrzystość jest realną wadą. Porównanie kosztu z alternatywami wymaga wtedy czasu i kilku spotkań, podczas gdy u dostawców z jawnym cennikiem szacunek robi się w kwadrans. Przy niewielkim zespole bez działu zakupów to bywa powodem, dla którego rozmowa nie dochodzi do skutku.
Pełny przepływ wyszukiwania
Warto zobaczyć, jak te trzy produkty układają się w jedną ścieżkę, bo dopiero wtedy widać, gdzie każdy z nich wchodzi.
wektor = klient.embed(
model="embed-v4.0",
texts=[pytanie],
input_type="search_query",
).embeddings.float[0]
kandydaci = baza.szukaj(wektor, limit=25, filtr={"jezyk": "pl"})
najlepsze = klient.rerank(
model="rerank-v3.5",
query=pytanie,
documents=[k.tresc for k in kandydaci],
top_n=5,
)
odpowiedz = klient.chat(
model="command-a-03-2025",
messages=[{"role": "user", "content": pytanie}],
documents=[kandydaci[w.index].tresc for w in najlepsze.results],
)Cztery kroki, z których każdy da się wymienić osobno. Osadzenia zamieniają pytanie na wektor, baza wektorowa pokroju Qdranta zwraca kandydatów, model porządkujący wybiera najlepszych, a model generujący składa odpowiedź z cytowaniami.
Liczba kandydatów przed porządkowaniem jest tu parametrem wartym przemyślenia. Dwadzieścia pięć daje modelowi porządkującemu z czego wybierać, a nie podnosi kosztu, bo rozliczenie idzie za wyszukanie. Zwiększanie tej liczby do stu rzadko poprawia wynik i wydłuża czas odpowiedzi.
Filtr po metadanych działa przed wyszukiwaniem, więc zawęża zbiór, zamiast odsiewać wyniki po fakcie. Przy aplikacji obsługującej wielu klientów to nie jest kwestia trafności, tylko poprawności, bo brak filtra po właścicielu oznacza wyciek danych.
Ceny
| Produkt | Koszt orientacyjny | Uwagi |
|---|---|---|
| Osadzenia | 0,12 USD za milion tokenów tekstu | Obrazy liczone osobno, 0,47 USD za milion |
| Zmiana kolejności | 2,00 albo 2,50 USD za tysiąc wyszukań, zależnie od wariantu modelu | Wyszukanie to zapytanie i do stu dokumentów |
| Modele generujące | rzędu kilku dolarów za milion tokenów | Poniżej stawek czołówki |
| Instancje dedykowane | od 4 do 10 USD za godzinę instancji | Rozliczenie godzinowe albo miesięczne |
| Wdrożenie we własnej infrastrukturze | wycena indywidualna | Brak jawnego cennika |
Rozliczenie zmiany kolejności za wyszukanie, a nie za tokeny, jest tu nietypowe i warto o tym pamiętać przy szacowaniu. Jedno wyszukanie to jednak zapytanie z najwyżej stu dokumentami, a dokument dłuższy niż pięćset tokenów dostawca dzieli na fragmenty liczone jak osobne dokumenty. Do stu kandydatów rachunek zależy więc od liczby zapytań, a powyżej tego progu rośnie skokowo, bo jedno wywołanie liczy się jako kilka wyszukań.
Przy budowaniu wyszukiwania po dokumentach największym kosztem jednorazowym jest zwykle indeksowanie, czyli policzenie osadzeń dla całej bazy. Milion fragmentów przy tej stawce to koszt rzędu kilkudziesięciu dolarów, a przy zmianie modelu ten koszt wraca.
Stawki bywają korygowane, więc przed policzeniem budżetu na rok sprawdź aktualny cennik u źródła zamiast opierać się na artykułach.
Cytowania w praktyce
Wbudowane cytowania to funkcja, którą łatwo przeoczyć w opisie, a która zmienia to, jak wygląda gotowy produkt.
Model zwraca odpowiedź razem z informacją, który fragment tekstu opiera się na którym dokumencie. W interfejsie zamienia się to w odnośniki przy zdaniach, dzięki czemu użytkownik może sprawdzić źródło bez pytania kogokolwiek.
Wartość tego jest podwójna. Po pierwsze, użytkownik ufa odpowiedzi bardziej, gdy widzi, skąd pochodzi. Po drugie, i ważniejsze, cytowania pozwalają wykryć sytuację, w której model odpowiedział poprawnie z własnej wiedzy zamiast z podanych dokumentów. Odpowiedź bez przypisania do żadnego fragmentu jest sygnałem ostrzegawczym.
Warto natomiast pamiętać, że cytowanie potwierdza pochodzenie zdania, a nie jego prawdziwość. Jeśli dokument źródłowy jest nieaktualny, odpowiedź będzie poprawnie zacytowana i błędna. To argument za pilnowaniem świeżości indeksu, a nie za mniejszą ostrożnością.
Przy zastosowaniach, gdzie odpowiedź trafia do klienta, warto pokazywać cytowania zawsze, nawet gdy interfejs robi się przez to gęstszy. Odpowiedź bez źródła i odpowiedź ze źródłem to dwa różne produkty pod względem zaufania.
Kiedy nie warto po to sięgać
Uczciwie trzeba powiedzieć, kiedy ten dostawca nie jest właściwym wyborem, bo lista jest konkretna.
Do budowy asystenta rozmawiającego bez elementu wyszukiwania inni dostawcy mają mocniejsze modele. Jeśli zadanie polega na rozumowaniu, pisaniu kodu albo prowadzeniu długiej rozmowy, przewaga leży gdzie indziej.
Przy prototypie, gdzie liczy się czas do pierwszego działającego rozwiązania, dodanie osobnego dostawcy do osadzeń i porządkowania komplikuje konfigurację. Wtedy prościej wziąć wszystko od jednego dostawcy i wrócić do optymalizacji, gdy będzie co optymalizować.
Przy zbiorze rzędu kilku tysięcy fragmentów zmiana kolejności wyników rzadko robi różnicę, bo wyszukiwanie wektorowe i tak trafia w niewielkim zbiorze. Sens pojawia się przy dziesiątkach tysięcy, gdzie kandydatów podobnych jest wielu.
Cohere kontra alternatywy
| Rozwiązanie | Mocna strona | Słabość | Kiedy wybrać |
|---|---|---|---|
| Cohere | Zmiana kolejności, osadzenia wielojęzyczne, wdrożenie prywatne | Modele generujące poza czołówką, brak jawnych cen części oferty | Wyszukiwanie po dokumentach, wymogi zgodności |
| OpenAI | Największy ekosystem, dobre osadzenia | Brak wdrożenia we własnej infrastrukturze | Projekt oparty o gotowe narzędzia |
| Mistral | Licencja permisywna, wagi dostępne | Mniej narzędzi do wyszukiwania | Wymóg pełnej niezależności |
| Modele lokalne | Zero kosztu za token, dane u siebie | Niższa jakość osadzeń, wymaga sprzętu | Duży wolumen z własnym zapleczem |
Praktyczny wniosek jest taki, że tych dostawców nie trzeba wybierać rozłącznie. Częsty układ to osadzenia i zmiana kolejności od jednego dostawcy, a generowanie odpowiedzi od innego, bo to trzy niezależne kroki i każdy da się obsadzić osobno.
Ten podział ma zresztą zaletę praktyczną. Zmiana modelu generującego nie wymaga przeliczania osadzeń, a zmiana modelu osadzeń nie dotyka warstwy generowania. Przy jednym dostawcy dla wszystkiego migracja bywa większa, niż powinna.
Warto natomiast policzyć, czy podział na trzech dostawców nie kosztuje więcej, niż daje. Trzy umowy, trzy klucze, trzy miejsca do sprawdzenia przy awarii i trzy cenniki do śledzenia to realny narzut operacyjny. Przy niewielkim projekcie jeden dostawca dla wszystkiego bywa tańszy w utrzymaniu, nawet gdy każdy element z osobna wypada gorzej.
Granica przebiega tam, gdzie jakość wyszukiwania zaczyna decydować o użyteczności produktu. Przy asystencie odpowiadającym na pytania o dokumentację nietrafione fragmenty są problemem widocznym dla użytkownika przy każdym pytaniu, więc optymalizacja tego etapu zwraca się szybciej niż koszt utrzymania drugiego dostawcy.
Typowe błędy
Pierwszy to pominięcie typu wejścia przy liczeniu osadzeń. Dokumenty i zapytania wymagają innego typu, a użycie tego samego dla obu obniża trafność bez żadnego komunikatu.
Drugi to dodanie zmiany kolejności bez pomiaru. To dodatkowe wywołanie przy każdym zapytaniu, więc warto sprawdzić, czy różnica w trafności uzasadnia opóźnienie i koszt.
Trzeci to zmiana modelu osadzeń bez przeliczenia kolekcji. Stare i nowe wektory leżą w różnych przestrzeniach, więc wyniki stają się przypadkowe, a nic o tym nie informuje.
Czwarty to porównywanie modeli na cudzych zestawieniach. Przy polszczyźnie różnice bywają odwrotne do tych mierzonych na danych angielskich, więc test na własnych fragmentach jest obowiązkowy.
Piąty to planowanie budżetu bez uwzględnienia indeksowania. Koszt jednorazowy przy pierwszym zindeksowaniu bywa większy niż miesiąc działania systemu.
Szósty to zakładanie, że lepsza jakość odpowiedzi wynika ze zmiany modelu generującego. Jeśli właściwego fragmentu nie ma w kontekście, żaden model nie odpowie poprawnie, a diagnozę trzeba zacząć od wyszukiwania.
FAQ
Do czego najlepiej nadaje się Cohere?
Do budowania wyszukiwania po własnych dokumentach: osadzenia radzące sobie z językami innymi niż angielski, model zmieniający kolejność wyników i modele generujące z wbudowanymi cytowaniami. Do budowy asystenta rozmawiającego bez elementu wyszukiwania inni dostawcy wypadają lepiej.
Czym jest zmiana kolejności wyników?
To drugi etap wyszukiwania. Baza wektorowa zwraca kandydatów na podstawie podobieństwa wektorów, a model porządkujący ocenia parę pytanie i fragment razem, więc trafniej rozstrzyga, co faktycznie odpowiada na pytanie. Kosztuje jedno dodatkowe wywołanie i zwykle poprawia wyniki.
Ile to kosztuje?
Osadzenia to dwanaście centów za milion tokenów tekstu, zmiana kolejności dwa dolary za tysiąc wyszukań w tańszym wariancie modelu, a modele generujące rzędu kilku dolarów za milion tokenów. Ceny wdrożeń prywatnych nie są publikowane, więc wymagają rozmowy handlowej.
Czy modele radzą sobie po polsku?
Lepiej niż modele trenowane głównie na danych angielskich, zwłaszcza przy osadzeniach. To najczęstszy powód sięgania po tego dostawcę w projektach europejskich, choć porównanie na własnych fragmentach i tak warto przeprowadzić.
Czy da się wdrożyć we własnej infrastrukturze?
Tak i to jeden z filarów tej oferty. Modele uruchamia się w chmurze prywatnej albo u głównych dostawców z zachowaniem kontroli nad kluczami, co przy wymogach zgodności bywa warunkiem koniecznym.
Dokumentacja stoi na stronie projektu, a porównanie stawek znajdziesz w zestawieniu cen.