[{"data":1,"prerenderedAt":512},["ShallowReactive",2],{"blog-\u002Fblog\u002Fprogramowanie\u002Frag-vs-mcp":3,"blog-others-\u002Fblog\u002Fprogramowanie\u002Frag-vs-mcp":476},{"id":4,"title":5,"body":6,"category":462,"cover":463,"date":464,"description":465,"extension":466,"meta":467,"navigation":468,"path":469,"readingTime":470,"seo":471,"sitemap":472,"stem":473,"updated":474,"__hash__":475},"blog\u002Fblog\u002Fprogramowanie\u002Frag-vs-mcp.md","RAG vs MCP na przykładzie jednej aplikacji",{"type":7,"value":8,"toc":446},"minimark",[9,13,18,21,25,28,31,52,55,234,243,246,250,253,260,274,277,280,284,367,371,374,377,381,391,394,398,401,404,414,418,421,435,442],[10,11,12],"p",{},"W aplikacji, którą budujemy w kursie DevChallenge, quiz można utworzyć na dwa sposoby. W pierwszym wgrywasz swoje notatki w PDF i prosisz o pytania z ich treści. W drugim piszesz do Claude Code w terminalu: „zrób mi quiz o pułapkach async\u002Fawait i daj link”. W obu przypadkach dostajesz quiz, ale pod spodem działają dwa różne mechanizmy. Pierwszy to RAG, drugi to MCP. Na tym jednym projekcie pokażę Ci, czym się różnią i kiedy który z nich wybrać.",[14,15,17],"h2",{"id":16},"krótka-odpowiedź","Krótka odpowiedź",[10,19,20],{},"RAG (Retrieval-Augmented Generation) dokłada modelowi wiedzę. Aplikacja wyszukuje fragmenty Twojego dokumentu i dodaje je do promptu. MCP (Model Context Protocol) daje modelowi narzędzia. Agent AI może wywołać funkcję Twojej aplikacji, na przykład utworzenie quizu. RAG odpowiada więc na pytanie „co model ma wiedzieć”, a MCP na pytanie „co model może zrobić”. Te podejścia się nie wykluczają i w jednej aplikacji często działają obok siebie.",[14,22,24],{"id":23},"rag-model-dostaje-fragmenty-twojego-pdf-a","RAG: model dostaje fragmenty Twojego PDF⁠-⁠a",[10,26,27],{},"Zacznijmy od quizu z notatek. Model językowy nie zna Twojego PDF⁠-⁠a, a cały dokument rzadko mieści się w prompcie i zużywa dużo tokenów. Dlatego aplikacja dzieli pracę na dwa etapy.",[10,29,30],{},"Najpierw przygotowuje dokument:",[32,33,34,38,41,49],"ol",{},[35,36,37],"li",{},"serwer odczytuje tekst z przesłanego PDF⁠-⁠a,",[35,39,40],{},"dzieli go na fragmenty po akapitach, najwyżej po 1500 znaków,",[35,42,43,44,48],{},"zamienia każdy fragment na wektor (embedding) modelem ",[45,46,47],"code",{},"text-embedding-3-small",", czyli na listę 1536 liczb,",[35,50,51],{},"zapisuje dokument, fragmenty i wektory w PostgreSQL z rozszerzeniem pgvector, w jednej transakcji.",[10,53,54],{},"Potem przy każdym generowaniu quizu zamienia jego temat na wektor i szuka fragmentów, których wektory leżą najbliżej. W kursie robi to jedna funkcja SQL:",[56,57,62],"pre",{"className":58,"code":59,"language":60,"meta":61,"style":61},"language-sql shiki shiki-themes one-dark-pro","select chunk.content\nfrom public.document_chunks chunk\njoin public.documents document\n  on document.id = chunk.document_id\nwhere chunk.document_id = target_document_id\n  and document.expires_at > now()\norder by chunk.embedding operator(extensions.\u003C=>) query_embedding\nlimit least(greatest(match_count, 0), 4);\n","sql","",[45,63,64,84,101,117,142,160,182,204],{"__ignoreMap":61},[65,66,69,73,77,81],"span",{"class":67,"line":68},"line",1,[65,70,72],{"class":71},"seHd6","select",[65,74,76],{"class":75},"sVC51"," chunk",[65,78,80],{"class":79},"sn6KH",".",[65,82,83],{"class":75},"content\n",[65,85,87,90,93,95,98],{"class":67,"line":86},2,[65,88,89],{"class":71},"from",[65,91,92],{"class":75}," public",[65,94,80],{"class":79},[65,96,97],{"class":75},"document_chunks",[65,99,100],{"class":79}," chunk\n",[65,102,104,107,109,111,114],{"class":67,"line":103},3,[65,105,106],{"class":71},"join",[65,108,92],{"class":75},[65,110,80],{"class":79},[65,112,113],{"class":75},"documents",[65,115,116],{"class":79}," document\n",[65,118,120,123,126,128,131,135,137,139],{"class":67,"line":119},4,[65,121,122],{"class":71},"  on",[65,124,125],{"class":75}," document",[65,127,80],{"class":79},[65,129,130],{"class":75},"id",[65,132,134],{"class":133},"sjrmR"," =",[65,136,76],{"class":75},[65,138,80],{"class":79},[65,140,141],{"class":75},"document_id\n",[65,143,145,148,150,152,155,157],{"class":67,"line":144},5,[65,146,147],{"class":71},"where",[65,149,76],{"class":75},[65,151,80],{"class":79},[65,153,154],{"class":75},"document_id",[65,156,134],{"class":133},[65,158,159],{"class":79}," target_document_id\n",[65,161,163,166,168,170,173,176,179],{"class":67,"line":162},6,[65,164,165],{"class":71},"  and",[65,167,125],{"class":75},[65,169,80],{"class":79},[65,171,172],{"class":75},"expires_at",[65,174,175],{"class":133}," >",[65,177,178],{"class":71}," now",[65,180,181],{"class":79},"()\n",[65,183,185,188,190,192,195,198,201],{"class":67,"line":184},7,[65,186,187],{"class":71},"order by",[65,189,76],{"class":75},[65,191,80],{"class":79},[65,193,194],{"class":75},"embedding",[65,196,197],{"class":79}," operator(extensions.",[65,199,200],{"class":133},"\u003C=>",[65,202,203],{"class":79},") query_embedding\n",[65,205,207,210,213,216,219,222,225,228,231],{"class":67,"line":206},8,[65,208,209],{"class":71},"limit",[65,211,212],{"class":133}," least",[65,214,215],{"class":79},"(",[65,217,218],{"class":133},"greatest",[65,220,221],{"class":79},"(match_count, ",[65,223,224],{"class":75},"0",[65,226,227],{"class":79},"), ",[65,229,230],{"class":75},"4",[65,232,233],{"class":79},");\n",[10,235,236,237,239,240,242],{},"Operator ",[45,238,200],{}," liczy odległość kosinusową, więc zapytanie zwraca najwyżej cztery fragmenty najbardziej podobne do tematu. Te fragmenty trafiają do promptu jako materiał źródłowy, a model układa pytania na ich podstawie. Zwróć też uwagę na warunek ",[45,241,172],{},". Dokument ma termin ważności, a jego fragmenty odczyta tylko ta sesja, która ma token dostępu do tego PDF⁠-⁠a.",[10,244,245],{},"RAG przydaje się wtedy, gdy odpowiedź zależy od treści, której model nie zna albo nie powinien zgadywać. Tak jest z Twoimi notatkami, regulaminem firmy czy dokumentacją projektu.",[14,247,249],{"id":248},"mcp-agent-dostaje-narzędzie-twojej-aplikacji","MCP: agent dostaje narzędzie Twojej aplikacji",[10,251,252],{},"Teraz drugi sposób. Claude Code, Codex albo Copilot w VS Code nie wiedzą, że Twoja aplikacja w ogóle istnieje. MCP to otwarty protokół, przez który taki agent uruchamia serwer z listą narzędzi i wywołuje je, kiedy uzna, że są potrzebne.",[10,254,255,256,259],{},"W kursie serwer MCP udostępnia narzędzie ",[45,257,258],{},"create-challenge",". Przyjmuje ono cztery argumenty: temat (do 200 znaków), poziom, liczbę pytań od 3 do 10 i typ pytań. Kiedy agent je wywoła, serwer:",[32,261,262,265,268,271],{},[35,263,264],{},"wysyła temat do publicznego API aplikacji, które generuje szkic quizu,",[35,266,267],{},"sprawdza odpowiedź schematem Zod,",[35,269,270],{},"publikuje quiz pod własnym adresem,",[35,272,273],{},"zwraca agentowi link do gry.",[10,275,276],{},"Serwer MCP nie zna kluczy OpenAI ani danych dostępu do bazy danych. Zna tylko adres API, więc podlega tym samym limitom i tej samej walidacji co przeglądarka. Generowanie ma limit 5 quizów na godzinę z jednego adresu IP.",[10,278,279],{},"MCP przydaje się wtedy, gdy model ma coś zrobić w Twoim systemie, na przykład utworzyć rekord, odczytać ranking albo uruchomić proces. Opis narzędzia i jego schemat podpowiadają agentowi, kiedy i z jakimi danymi może je wywołać.",[14,281,283],{"id":282},"porównanie-rag-i-mcp-w-jednej-tabeli","Porównanie RAG i MCP w jednej tabeli",[285,286,288,307],"table",{"data-columns":287},"3",[289,290,292],"thead",{"role":291},"rowgroup",[293,294,296,301,304],"tr",{"role":295},"row",[297,298,300],"th",{"role":299},"columnheader","Cecha",[297,302,303],{"role":299},"RAG",[297,305,306],{"role":299},"MCP",[308,309,310,323,334,345,356],"tbody",{"role":291},[293,311,312,317,320],{"role":295},[313,314,316],"td",{"role":315},"cell","Co dostaje model",[313,318,319],{"role":315},"fragmenty dokumentu w prompcie",[313,321,322],{"role":315},"listę narzędzi z opisem i schematem argumentów",[293,324,325,328,331],{"role":295},[313,326,327],{"role":315},"Kto decyduje",[313,329,330],{"role":315},"Twój kod: kiedy szukać i ile fragmentów dodać",[313,332,333],{"role":315},"agent proponuje wywołanie, a Ty je zatwierdzasz",[293,335,336,339,342],{"role":295},[313,337,338],{"role":315},"Gdzie działa",[313,340,341],{"role":315},"wewnątrz Twojego backendu",[313,343,344],{"role":315},"między agentem AI a Twoim API",[293,346,347,350,353],{"role":295},[313,348,349],{"role":315},"Główne ryzyko",[313,351,352],{"role":315},"instrukcje ukryte w dokumencie i nieprawdziwe informacje w źródle",[313,354,355],{"role":315},"płatne wywołanie o trwałych skutkach",[293,357,358,361,364],{"role":295},[313,359,360],{"role":315},"Jak to sprawdzać",[313,362,363],{"role":315},"evals, czyli ocena, czy pytania są wierne źródłu",[313,365,366],{"role":315},"testy narzędzia i potwierdzenie przed płatnym wywołaniem",[14,368,370],{"id":369},"czym-mcp-różni-się-od-zwykłego-api","Czym MCP różni się od zwykłego API",[10,372,373],{},"Serwer MCP z tego kursu nie zastępuje API aplikacji, tylko z niego korzysta. API powstaje dla programów, które z góry wiedzą, jaki adres wywołać i jakie pola wysłać. Agent AI tego nie wie, dlatego MCP opisuje mu każde narzędzie zwykłym językiem i podaje schemat argumentów. Agent pobiera tę listę na starcie i sam wybiera narzędzie pasujące do Twojej prośby, a host pyta Cię o zgodę, zanim je wywoła.",[10,375,376],{},"W praktyce MCP to cienka warstwa nad Twoim API. Jeśli aplikację wywołuje tylko Twój frontend albo inny serwer, wystarczy samo API. Jeśli ma z niej korzystać agent w Claude Code, Codex albo Copilot, dokładasz serwer MCP, który zamienia jego prośby na wywołania tego API.",[14,378,380],{"id":379},"gdzie-rag-i-mcp-się-spotykają","Gdzie RAG i MCP się spotykają",[10,382,383,384,386,387,390],{},"Łatwo założyć, że agent z MCP „zrobi quiz z mojego kodu” albo „z mojego PDF⁠-⁠a”. Powiem wprost: w tej aplikacji tak nie jest. Narzędzie ",[45,385,258],{}," wysyła do API pusty ",[45,388,389],{},"documentId",", więc nie korzysta z RAG. Agent może przeczytać Twój kod, streścić go do tematu w 200 znakach i poprosić o quiz. Pytania powstają jednak z tego tematu i wiedzy modelu, a nie z plików projektu.",[10,392,393],{},"Jeśli chcesz pytań z treści PDF⁠-⁠a, wgrywasz go w aplikacji i tam generujesz quiz. Można zbudować narzędzie MCP, które też korzysta z dokumentu. Wtedy jednak agent musiałby dostać token dostępu do PDF⁠-⁠a i Twoją zgodę na jego analizę przez AI. To osobna decyzja o bezpieczeństwie, a nie jedna linijka kodu.",[14,395,397],{"id":396},"na-co-uważać-przy-rag-i-przy-mcp","Na co uważać przy RAG i przy MCP",[10,399,400],{},"Przy RAG największym ryzykiem jest sam dokument. PDF może zawierać zdanie udające polecenie dla modelu, na przykład „zignoruj poprzednie instrukcje”. Dlatego w kursie fragmenty trafiają do promptu w osobnej sekcji opisanej jako niezaufane dane, a instrukcja systemowa każe ignorować polecenia z materiału źródłowego. Taka obrona zmniejsza ryzyko, ale go nie usuwa, więc sprawdzamy ją testami na PDF⁠-⁠ach z ukrytym poleceniem.",[10,402,403],{},"Drugi problem jest mniej oczywisty. PDF może zawierać nieprawdziwą informację, a quiz będzie wtedy wierny źródłu, ale błędny. Model oceniający, który porównuje pytania z dokumentem, tego nie wyłapie, bo z jego punktu widzenia wszystko się zgadza.",[10,405,406,407,409,410,413],{},"Przy MCP ryzykiem jest działanie. Wywołanie ",[45,408,258],{}," uruchamia płatne generowanie quizu przez AI i publikuje go pod publicznym linkiem. Narzędzie ma więc w opisie ostrzeżenie o koszcie, a w adnotacjach ",[45,411,412],{},"readOnlyHint: false",". Agent powinien pokazać Ci argumenty i poczekać na zgodę. Nie wyłączaj potwierdzeń globalnie tylko dlatego, że lokalnie wszystko działa.",[14,415,417],{"id":416},"od-czego-zacząć","Od czego zacząć",[10,419,420],{},"Jeśli Twój problem brzmi „model nie zna moich danych”, zacznij od RAG. Jeśli brzmi „chcę, żeby agent coś zrobił w mojej aplikacji”, zacznij od MCP. Prosty RAG działa wewnątrz backendu, który już kontrolujesz, więc zwykle wdrożysz go najpierw. MCP dokładasz wtedy, gdy aplikacja ma być narzędziem dla agentów.",[10,422,423,424,429,430,434],{},"Jak napisać taki serwer i podłączyć go do trzech agentów, pokazuję we wpisie ",[425,426,428],"a",{"href":427},"\u002Fblog\u002Fprogramowanie\u002Fserwer-mcp-typescript","Serwer MCP w TypeScript dla Claude Code, Codex i Copilot",". Jeśli wolisz zacząć bez kodu, w ",[425,431,433],{"href":432},"\u002Fblog\u002Fprogramowanie\u002Fjak-zautomatyzowac-prace","tekście o automatyzacji pracy"," porównuję skrypty, n8n i agentów.",[10,436,437,438,80],{},"W DevChallenge przechodzimy tę drogę dwa razy. W Kursie 3 korzystasz z RAG w Pinecone, z klienta i z serwera MCP w n8n, bez programowania. W Kursie 4 budujesz oba mechanizmy samodzielnie w TypeScript, razem z testami i automatyczną oceną jakości quizów. Wszystkie lekcje znajdziesz w ",[425,439,441],{"href":440},"\u002Fkursy\u002Fprogram#part-4","programie kursu",[443,444,445],"style",{},"html pre.shiki code .seHd6,html code.shiki .seHd6{--shiki-default:#C678DD}html pre.shiki code .sVC51,html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .sn6KH,html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sjrmR,html code.shiki .sjrmR{--shiki-default:#56B6C2}html .default .shiki span{color:var(--shiki-default);background:var(--shiki-default-bg);font-style:var(--shiki-default-font-style);font-weight:var(--shiki-default-font-weight);text-decoration:var(--shiki-default-text-decoration)}html .shiki span{color:var(--shiki-default);background:var(--shiki-default-bg);font-style:var(--shiki-default-font-style);font-weight:var(--shiki-default-font-weight);text-decoration:var(--shiki-default-text-decoration)}",{"title":61,"searchDepth":103,"depth":103,"links":447},[448,449,451,452,454,456,458,460],{"id":16,"depth":86,"text":17},{"id":23,"depth":86,"text":450},"RAG: model dostaje fragmenty Twojego PDF-a",{"id":248,"depth":86,"text":249},{"id":282,"depth":86,"text":453},"Porównanie RAG i MCP w jednej tabeli",{"id":369,"depth":86,"text":455},"Czym MCP różni się od zwykłego API",{"id":379,"depth":86,"text":457},"Gdzie RAG i MCP się spotykają",{"id":396,"depth":86,"text":459},"Na co uważać przy RAG i przy MCP",{"id":416,"depth":86,"text":461},"Od czego zacząć","AI w praktyce",null,"2026-08-23","RAG czy MCP? Na przykładzie aplikacji z quizami pokazuję, kiedy model potrzebuje wiedzy z Twojego PDF-a, a kiedy narzędzia, które coś zrobi w aplikacji.","md",{},true,"\u002Fblog\u002Fprogramowanie\u002Frag-vs-mcp","9 min",{"title":5,"description":465},{"loc":469},"blog\u002Fprogramowanie\u002Frag-vs-mcp","2026-10-25","D5IILc_380uWKhtEcU7SlRM0qWvJaDqEef-cn71Uqj0",[477,481,485,491,496,502,507],{"title":478,"path":427,"description":479,"category":462,"date":480},"Serwer MCP w TypeScript dla Claude Code, Codex i Copilot","Serwer MCP w TypeScript: narzędzie z Zod, test w MCP Inspector i ten sam serwer w Claude Code, Codex i Copilot w VS Code.","2026-08-30",{"title":482,"path":432,"description":483,"category":462,"date":484},"Automatyzacja z AI w 6 poziomach: od skryptu po agenta","Jak zautomatyzować pracę z AI? Porównaj skrypt, RPA, n8n, czat z AI i agentów na raporcie z arkusza, który co tydzień wysyłasz mailem przełożonemu.","2026-08-16",{"title":486,"path":487,"description":488,"category":489,"date":490},"Jak nauczyć się matematyki bez wkuwania wzorów","\u002Fblog\u002Fmatematyka\u002Fjak-nauczyc-sie-matematyki","Jak nauczyć się matematyki bez wkuwania wzorów? Sprawdź, jak znaleźć braki w podstawach, ćwiczyć samodzielnie i po kolei nadrobić zaległości.","Matematyka","2026-08-12",{"title":492,"path":493,"description":494,"category":462,"date":495},"Jak zostać Full Stack Developerem w erze AI? 8 kroków","\u002Fblog\u002Fprogramowanie\u002Ffullstack-developer-w-dobie-ai","Jak zostać Full Stack Developerem? Plan nauki od HTML i JavaScriptu po backend, bazę danych i wdrożenie. Zobacz, jak korzystać z AI podczas nauki.","2026-08-09",{"title":497,"path":498,"description":499,"category":500,"date":501},"Jak myśleć jak programista? Najpierw problem, potem kod","\u002Fblog\u002Fprogramowanie\u002Fjak-myslec-jak-programista","Jak myśleć jak programista? Zobacz, jak podzielić problem na kroki, napisać pseudokod i sprawdzić plan, zanim przełożysz go na JavaScript.","Programowanie","2026-08-02",{"title":503,"path":504,"description":505,"category":500,"date":506},"Jak zacząć programować od zera? Plan na pierwsze 8 tygodni","\u002Fblog\u002Fprogramowanie\u002Fjak-zaczac-programowac-od-zera","Jak zacząć programować od zera? Wybierz język pod swój cel, przejdź 8-tygodniowy plan i zbuduj pierwszy projekt bez skakania między kursami.","2026-07-26",{"title":508,"path":509,"description":510,"category":489,"date":511},"Jak zaplanować naukę do matury z matematyki","\u002Fblog\u002Fmatematyka\u002Fprzygotowanie-do-matury-z-matematyki","Jak przygotować się do matury z matematyki? Zacznij od arkusza CKE, powtarzaj po jednym dziale i ułóż tydzień nauki, który da Ci zapas ponad próg 30%.","2026-07-22",1794052151914]