From 955a8ea88eb938c3eefe24f12326a8b935929630 Mon Sep 17 00:00:00 2001 From: atita arora Date: Fri, 22 Dec 2023 17:57:41 +0100 Subject: [PATCH 01/28] rag_eval - WIP --- .../rag_granular.png | Bin 0 -> 113622 bytes .../rag_qdrant.jpg | Bin 0 -> 38845 bytes .../retrieval_augmented_generation_eval.md | 96 ++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 docs/assets/use_cases/retrieval_augmented_generation_eval/rag_granular.png create mode 100644 docs/assets/use_cases/retrieval_augmented_generation_eval/rag_qdrant.jpg create mode 100644 docs/use_cases/retrieval_augmented_generation_eval.md diff --git a/docs/assets/use_cases/retrieval_augmented_generation_eval/rag_granular.png b/docs/assets/use_cases/retrieval_augmented_generation_eval/rag_granular.png new file mode 100644 index 0000000000000000000000000000000000000000..21bce32eb4fb7f42bc1e958b4eb70e8c7e4e29ca GIT binary patch literal 113622 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�@r+vyMA%HhBxPgBIlFVH0P{Po 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 X&g#ts#fO+}@bA3h#WR_wP44^;QZ<6o literal 0 HcmV?d00001 diff --git a/docs/assets/use_cases/retrieval_augmented_generation_eval/rag_qdrant.jpg b/docs/assets/use_cases/retrieval_augmented_generation_eval/rag_qdrant.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4eeb4419fd6f6d8e5aa3eb64810196d519443521 GIT binary patch literal 38845 zcmce-1y~$SvoN{@50VfhxC9b{EWsTTLU0Ifiv^cu7k5kGh2R7TZVB$bySM~*S$uH~ zwzxxb$@iUezxSN`ob$`Q_pf=Tr>3i>yQZh7y1T0S_ss8Qz+**O1z7+F1^|F@e*k{3 zV$3K=OPi=^sLCoR%lwnj3%Ca?ZU6uRb#>N|d&{V&4`Re!{^t{aXr|^aj(@KI1>Bc= zKJ}+`000U6FL?gDY;G679WQ4)=#Oz#d=;U<4=tpa63K z*FDAy;0Evj1b?Fd(g4f{f8bAwc@J1PSbqQy2L~GmAMfEqd^~*ohlGy^9}*A~;NugK z5D`Cm{FvnNL&7JdPac!rwlF|q#$ig8aQ!G6NTgCj-yOx^SoF0WJU_p0_oGID+m=dl$$X1=%5nl*y1)f6md zfk8*V=KzG5_l1yPk^o)f6f}hkgV@WnK0H@mV_dVC7aoNWzkHdFoRN$!&iBN3<(HGRo(1Y87$$ zP`&im5~{;|Z?8^AR4h}+iANWmMRV*6O72b{<0z<|duLv*ftx^vVx@P6sW5s8X&@2( zb9LV*!qd_~8D*{VnAVr!Z+gVVR?&vz;yzq1M+rT~MVqN%Uwf6njjB&_gsNAW)?f*>^Z&r!SJBT4Qv=jpH2DqVBi4yl>p`a)=y zIQA=Ru+R}#Fe-*328(VOS~+DdgjeQW|5?k-zL4qbMPV^EBvUu5(@hC9t=Tv^9W59? zTkf=%n_pjH<3me3P1KI-C|9Poh;=zSaHjOK(XqX=iHy{mUn?K%=NT44aQ0ML98Gf} zf*f9zR!K3akj~r&DBK^v0YPqRXP7fe%`1$e#pKwDmqcg(dj67Okn)&BX_(! z>n=jT^S|D`dG`+M|41TLu!}9Lu9TNzn5;rJ>4mvZ&ONvK7xaML*D_YjLDO(~Z4cY3 zREOHvgyLJbeH54prq&~)NGpaxYg)E+N;K742Hz{*&AG}TCU7f;uRB!hh$6KW_w%C5 zszk<|v%np4TgJ`ojf)4@PSK0U>~rjM*E@IxamA4oU24-rvoCGwO?^ZRH!p~sfLNdE zi673n%o#FBmrts1=aK8!f(Hk6`v;niC-J~4;(?h(r^9nX%@xOOQ@ylpM}wfX>M1By zd8{?Xj)dAoJqKE(jD|+qxf1#IL-cO|r)e|wc5&LAVB&+mAUSokx#2irw9l(8dT|P? zRJXW|TeY7S6a)FMz4HBZTter~9|h)pYCrCuf{I3Q*?bA9udZ5d5Q4sOc>S%nb}I2Z zg4Q8KDXh77nJHx7zp%8ngXz%4_8m$8@}nTjLLXm|ppfO@j8WzOgRf2uKlU540Nr~+ z=!lXXiJkn61hVtYGKcsdCoB~b%*x8 VrR_A=#SPZ+b7>ECsz7M1W{&;?!@SvRUJ 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 Sg|2C* zV5o|wR&M!|AY3W2{|5Tm{LzplIMSiH#YG_oSw|Or)>VESNBj%I@nR+_-TcUyJ({6q zq&TO37j3GWF1wI9Zzp^kK^?Y?#{X{XQhfJLM@dW!I>mjdRM|l;t{jM$az9b$i8Oz6 zKT&T3hyw`rapNX!VS13-DKK4i+=7%GWk_aX97P8qCq2=h0S32_D5>n<|8zy#AC_30euYY!L*U&ajRCG- zh2u|1PB>c$n=wlzHu7_Ghb-f@}EJMf2vorG32?wt>$!uqnNQsyLvFyB6( z#IK}WDuFz^*x<#xn(6MhJ$GPLr(9duHDM!Z7MGtaDw-+%K5LJj0YI3&}p~J=bU_%aFqG zWIC4k4TwC(r)vbLy0n6+n~$biWjcj(Eym`6Fpj6SvSZ-xn?YZ}m{0j-MJlDwp5=@F zKb@3%%485htL@D!s36}wskmY=3| zK1sGI|7NDQ!H}>};R%~skW!tn@UsgmVu==X5f4Flh~#)Y#<}aodp5+q7Ox~gab!_r zbi}y?xM8hUiPbCNBd{ma@=)^S4%^724lPKO)Oq(VdJ8z)e5a^e57vpA-M4REI0F-Y zM=0n(_DYLdHM%g1gFtHlpIjnd=jPAx{*ZJe!m-$2pv|R}mPdQYNyJ~NBxc-u&kO}= zT^}mVtJayEyXI3@dvK(RWu;pGfEGl9%1UaO;DtVNjuLTCGj@9a)Lt~gCVTv<3JiY% z1|Iq>#Ayk#s<^on(=w+j5GcR8_rr7;)QRDIYxdYzM~Z{8*_E@@og&_ybdep&n0OQv z_{R3H&SZ{W1cELEhHUB5r7-=H1_X4K)(c8YVl;THrJ&`I@@kz$wgI+XLw5-O=PWBl zRa2_jo{9Q1w`D$E4kxxfulE>s18AL0hN2@HAVfx+HZY6DvfFD`^}Us+>-%sv%I=XG z{eHnm=(kgKfh!eEIiOXRXkMSEzqHMMzrrgH)q6~gF*W+p-dSmNe$}9R& zx(OGAhjY+3kpj|Gs=%3}!PJAobH#}Fn*Kqw2wgQ@Y0dXL^>qD8x#kfDG>?|(-w)2a zKpNsWpzr~g?VLJ8TU!$Y?t*-Kq(F$RJPXgqERjyk8IQgC0rekN<=Sfq!=3n$8>4&? zx6F<-HQP?|^B&R6AvwzEs?q@ATyU|wt*g{ZE$$`(CskE7=rm?TI>B_pA^ zQ&88T=+qsWOMg{W?U6FL6rVpLe1=btjTKUOUSpMT?bSto@(LzJ3;U`rJA;))UXeJ{ z8`OJxoFW20-A6z!bc3}b^72tWYmq4Qgt|78>e<&W4zE-rx}s|C*zMVU+uQ!#<;dj9 z9RYp5>D1W36Q2Fh)B^^}pXHa)NqrI6Ji}Az33Gn&wfnDeT!QJ;TPGI}L_IPlrbM?j zE{uxk3~6T#w?1y`*EC*WSMz(?8~O_BKy;$noJtbu;>@oP!h8C3A%)?YtzX^Ud(iLQ z7e5o*WbAPgy!l?ak#4es-G8I5XHTJINED7M%B<0gaaqL=ZQE)bc8OkdIDCtqa)i91 zM@3B?1!0#oUpowV&WV^+)s6@$M72_W79?g$3vuYkuZibWEt!VejTmiO`!D3V#mb2O zkESgA9B*63Tkd`XWF&8IPS%&EBvr?Mo&~^Pr}32MQ`R<~g235L#6(niP!q!Z(cE0*#p-7-v6l;y1k0 z3Md+gf!wt1N#ZZq#Virjy~-***y1E1nj_dOjJ(Ba%nQRMyAsioreJwpna94;gjz?u zc+V`HWJkMsqA<#AX#T{*z52VA30p~csa|`&W-ovys;7X6fe)l=&Ju$P7zOC6XucOI z70}XuFP8XY8m}PV?X@udlWw%>ueap8>#GyduVb=Wf$(cD>%)bilBF@lg|#U~PP;CL zp8c^94OCH1UML14wfp0vVfO_K3Ig1In;QGK$b?ae^6(7>+I9Ye-ed7|2Cz}xYu@2v zq=XzT}B0Hq#P*x%{4TqE)qR=c#|(pKD-ajv2c4rg{$%QHO<$I^HZo!ZxL6JuAu-;cT*FKwX3Q0#UYt5dZ{>w_dSVmtuf~r9yh(}o;DuJ3u%~$y} z`JN`Rdm#HzjUIIA5@lk-K5vYb3Gi!eH(8~^^z|wKpg91W+RB> zmE6_eqR#x%Alpj_*&3 zq;voCl*r`C04-00Z7!JETq%8vF6hk>%k_h@)UwWCH|=-lL=stj+xkPa2p}TPL~b5& z8Pqd;B*_dxNOnRuChd-F*@oi$Lr)Suwpe-&^G~%hwyGI){CZiKQOb4oNi3m6r9xBz zbI@VXl*LcQ);p)vj^ zw@GsQzX7=>4d(&Rimq#K0=A!`o3nb0{mV4g-|LxPU#Q=}ZURzK<_#$wQ_K?mzE(%7 z_D}6%I7&iNStVNaq=}EF8)6nJ zP`A_nT}7{rcV4@<~v1+|cz4I(n zx*wVR1z`_&K%tz}!LPq+v?dCd8$ei$V;c64dOl~Yiod@>i>Ef8Hrb^>`cg%#Q5$y@ z`cFGGdiWu!RMeM?qnq^wj?2Dyl3!Y;*xLW~uc|MYt}U?-)ZpGnWnAXeh;4&W68p8~ zsd#Xva$iC*fk9hFs*PvB^BIX;;XVJK-8B}T?gZvz^EkHMDn$a15Qsi&^XHIPe9W#s zkL5{4)hWel+V6%t*<6CrG*151r#plo)M!QXWZlFf^o~n+a(Ed7tbm?Lrly{9K$xwH zq_4V9Jxka^n3x;oL&RY^91hrqRyzV>&<0qS(fEM6)}r;OhR&pR=(}jA*x=YcLdH)6 zvuU-rMr}4r$3-h*F-D9*OF;V7x4y}5#%18u4YE%uYMn!*^(XUL_6)W}ay~4P9C<&C zSWC&OU0UeHv{DGip zLvr2A-Fvro>9ws<>Y96gSLSLhx*Rb%-Z?d))Acm{TDOVVBih(QR_Me61qn(gcKOuo zQ8AtI@LS`$z!TM2Jyy5W12NQMw%*({FXR^A*TK}|;HsJC)hj)i*N%=AYvKT2XoTj6 ze?=~3zkgX)2N_V{f()Q}Mw4+t3v4t^lK?NusmsQ+I_3$FQ#OdM|8rLYiOI$@_*V2{ zQB!zade^!eZ=#^kLA{S3uK(gvKaUDAJp9NIs?Q7^y6OB6WA+zc@76s%4iJlwp@`8XbM%@TpuZvCHs0Fo4?x z(f-t^)peqEjf(uB(~$M!(J+&ryChQ#tpPOF==y4Kgx@Xe`%w6m({!ROZ^P4)yBOMR zx9;Bnj~s+XQh7^j_!%uruV3_^ zeOm!ZV7=S%v(NMs3cd8_E!g$U&(Yw_DRyfT!WPd*<{YAnC zZCTtq#)k-n@37XQ=~UG&dw&D4g7a3rgJUdz1027n98Te!h$foWoYS)~;66$|*u}8# z?~8V_EGVj-#J6pRG+iiPvXadOMUK!?(GK+jZ#yzzG=krAoa*g^I`><PHay zS^~I`A-%zzx5rg=+ks}3QJTQxLqN2qj0VKtxXy zx4Jq7`}Sl@7=X{nd0bBGyN$Lj6n#YMXm914ilFI(h|sBoq`N4&=jNr0+PMoI&4avx z-}_-T1uiZi<+-V}p)n4|9e(mP*vn&QP5L zH*VVCiF5(gdq~&{5cZn0RRe_bZP3&Qc7MNZ(KJz8ow1$W_335APB(0wkfejUb3EUr z5tU0{a5Q8#*_$>nYIrD?;5*cvSMb-ok*ts_@`vF9!qkJK9?p0|zTW1Vru)+~tzmsG zBifD>jmgqmTumL$skmmOr-pA{vI2@7(TsKb3##Q;rilS=gBrhb3k;+eD zKAo!bWuN5)VnW4apBH(#8-1SSM@61$2~ZRfI#qxFmg!#m@xmTA=7XFA2q~bei1wya zvgmad2fueXO}G$LZwVIz7j~d}w;H{&7)j8SZzKby4&dEWj(3+N?X4e+UXKOC)`jzd ziAXt_gf*R#NpW5`^N-Y>a!i*UA0 z=ssJA!7mJpf<8nmQ1<`!(j!I*$%PljUWxG;bry zC*BuGR7f<+jXryJ*2|d?MBTbUp1lwQvIB34L1*;jKS(Aq;KbN60^=23hg&s{A2FJ* z7a%k~J%?x-v@(0_bswNI7S6B2PVGxK4p@-Q_}$;Xg=c(SX=}&~Nyn7X3~6hMU;DX$ zmK;$tR^E#nJNyk$RTxT~uZ`h4Ozz$~r^ge$-`Us;+fnQ3d*0ggBuQ_8o`pI|3P!i5Dl)-Io=O zGHT2NPW`sq3y1|9TJzY)mRL&vLqdFb)f@v-;{aIwd8IOaoos$e37Hnm0nZMB9p+VEB2}E>d(A5ohr2L zVImuAOu(YO2Nt$hm2cuuin)6eg02)|RDPmB?nXOw=&QjmQZVDr?DSJ2aW4a`AJX7j z+wn3qLg_;xLp|c%o`>Gq0ZDDU7-u4?RPD!Nw{WDkc5Ekd$LWK|$C(hi+XwZj%|-4& z2BdwEdNq6UT3+>-f*9omz>XDV^UcAjG1m(WnD_7qrJFRp;65bS&r#;})9!1Cs+b_C zEBX-kwbLT-@h^SE2HAm*Kk3AhWg-`OVl`yjA8_ag{vv#WOFNM>x zhv$o_#FGzHgVzyCUDaX&sY_&&(U5W{Y>3WCLZm%m?9s<9agj|~oZ7m*O1>jlE=!-L zHOvx`rUJ}I`d2imgFb&j?O!|@Q;&E)Darwz%Wooo8Enf-Z2h6w3PFL%*=KJ;#PsIQHuzSf8cF zWn6%!YA>^dx#@4*iM(!CKzZ*xE5PXMsyKt^Ez2jDWk|96h1J&&Zfj+UMM~2`kx19|8 z@C$tYplS;L73|+a+{FBA@8z#}ncsjuH3&gX^+h_$^~V9<&&`TvCH%P9 zlrQbfEXEr9lNYV(9uRk-qI=rPS|j}!kwa97xyl=QCj?Pd0*@ak=87eVcf4188+^S#H!?J2Deo@^dzh`KDAS`r9&U($Ai)~Pw6B_x7 z7^!Sd(KO?{Vq^zHj!)o~^3?~*R^kHO50=K^t-;XrfDbjVbCCDFL)A$VqlhZhKeeUiFpV_9YJ@QQJ9Gqhg(DgP84cms_ zO!+|956hg5o$X%4lO>0SWi&%760OY3Zy+`Ym7(Fub^j@LL1amUD^pGwt<=YQQW1P1 zv}AH6cUBP$J1L@A3f`7=%0yI{){@B6_1o>xjeia>kMV$PZ{S+i{d^JAk*?kPyf>Tc zUhDPtdZ7CAX`Uc&+FJwk_jfgZK(Ht6y)V&nSk7TA0g+8c5?C6P*tIwykJ|N52MA9bl}GN*ftg2 z(Gj3nnBuPOHpKg|Dg21d^-Oi4bjiJo^0EpsgX?g7nE*Yrs|H0;H|x?RU+tIr1o`5M zK-X^bw9A;PQO-cc%GvVMvcjCgOli*dhn^Oyp18A(vTGAf6|l)J@UGdo`L=PIueFWu za)VK_9r+tb_@aU0G{$rLn`#{I+x@1sJ?MtMIP*J43BiJ=sEJYCX-)p-v$OfqkVjx@ zRgTv$(S9Y!qK3v8TLA%yxWtL=-6drP1qD)3H95-XWt;9Oj7Is{Z<&kH{S{W%u}OC1 zACegB>JJ5ON7a82d$Vs73 z5bmiviHU8G4ya~Fu0~#-L9_cjgC~nDcOo;YqAu1gX=!s#E3=ME%QFsl6E;G`Lf)}d z8_;^(gkWL55FTNNOa{B7)LYN<~sDQFX{rao;DVfLIIbQF6mS4w_WWFBU3m)TVqvZg>~p_^(oS?4YKE%CKO zmQ~%2q1OBA=)x#js`kX0f_@XnC$noV?>ogG2Z;U*-12?xXT9-gs)6y|q4zPM=~|26#HUESNqa7w> z&^#>m6A3i#w&<&^UNI0)Ov`H$D#m9T_7i!9k$cd%od*<0)yJSbBqxr5-H8c@OEi0D zXm{x(Q6^47YPKNbHg}-Flf4y8d9kRDblFb+=pDEbPnIh|WW-b8-kj?$PD8aWZ%9sR zTK}@=^9&up)jAEur$I_&r6=@;d@TG0^VC&q=8#Zw%9&4@F;%w%A=MBjxU69)+Mw@) z&vLUifkjpP>NvX>W~fBd_zKEV9$nQC)bpB<+RH9+MY7PK;slW{BON1d$eJ;Pa<8pC zO>4Q!V4gu%%_JD^{aQB`qvc8a1ve~yzJAh0mnsZmX#Lir8wc3mKiXez6_1~fs&4t% z_;|{Dro^D0s2-HUqT&6S-c~5^y)zTfS7Yfp!p?eYrhe(jWB5qQ6M%a^oH?}~q0cNFC@QP3_H925UO!H)>x zr+6Pvr2Tj1tiP4=^3VRUzcc^6lyBFQ3v?}3^|EY5-T^7?5u0^ju#vU| z4?gas!6b^0oCXi)vtDM`TWG^vHfC5n42+Z<$RWjF;lY#4d7QkJuDSNP&Pi26Obdt- z58|0$DYnBNR;A$x&f4|5yjI$xnmPN4iJBog3C`Ma%Iwf;faPxeZJE7&3=|c;3;r(! zV8|j6wT!cs4PBc-yBS{Z{eZ<8^V-$ZPq%=}GzXD^n^)z8TqOL_^HoC7e*OQZH52YP zJp8Tc|5rYsbo$#PiQvO-r^dx15VUet1lxQ+Zk>$#O4+@C*w_=LPT;?b^r2yU6e=$j z892OL;qmux8tfTzA;OX8nj+HI#xxzs5uUZ0u@VWy5Hz()~ z)egOK3?S+8&=s{ITBnvSkuNMtI8CJe?iAKO(V&;UlbkxXrG(Gm`eDCb46t$~Imy%J zracY@gU=BPm%jl2cwR&qIzl*~qL{7V^h79dk16vMw=BOrh<=)Ev z_SmP#@>j=L0IT(F!f$|JMCR?~R+9gX!=yq!RBvuU`}iul<2g@*Uy___y`s_%<@;>h2Zfwi(Poard#VW9BMu3`9zHQW{b+8M=U(fK_p9~2-+;K$ zv!_a?jol8EUHq;Wcp(RY+?2Czr!fGA>uLUN-fdRohyRPaw+@T*TeAhpFCio$KnPAD z!3i3IQxt>{EQJJj2vm>)3a4;LAi>?;U4wg(1S#CTC^R^QyX98*^qD^AO!u9>&+VD# znfdS2{r$7Q{l4#d*IIi=!eP49BEP~|4U>uq4)isb99;W@vr^CcF9r_E%N-8KTn|Mf zo>;RmQ{fUc=d?wC;h$9;3_h_#HQk2|=apUD%M#4O0pgHmylm}0cha{^&lWt0|CF*? zBD+o1s+B^O@6@L3wpHt6zv1)ESwpfzB2CHvuy zn@ZCpiowRSlIAv8x$@|k1pTzj{#WRRQhu3!>*>`WoUBm2A%T9SI-!IVe>LZG>i(BS zdHm|qUbW-X)p*fWP5^!yYI#iKe)ag><9RNx6z9@SSj)DCm=Z@$2;%Rqs4u1eLiQHE zM+Be{`437$IR4Xr^LYt->EAyr@pq$qcwdxL`S&Zy-;W~o|C>*`xqVyl#9t0ub!}6t zMVoXwK0%^bde}{lk}&aUt%vnF$5Qv*o9TMJxDvPSHcqFccmu{LQs|;%hTry>FuPZ4v<3tcZ!O3< z(GL}SYii2C6zl3@C7>Ig`3Z9A^XH9w3KG?t^((dsCAr}Ilr$1rK^O5F%=KF^-XEN% zT}@($29mnATW=*Ym3Y)iQ0{=%>F$aDX_Yns-VHCr7hNJbnXe_S;d^gda;eDoE~H^o za@iAbhf%#N=a92dA--+Ej$?cib62;erCoIO4MuJSmzE)GD$A&Ms#VR%3ruWq1)2iy zZ2_VhxPhZI!uPf`DfOLO1+$u~^K%C!VgbM)WJ60^DPD!gsLOa?5Z?|ig2_<-y~R;) zB)`bN>%X#lMFVIl}(sf5my9iMEiNqJ9Q5TNlxWmOo`h&mepdTO-=Su!1f6!QAGv`s+i zWyzI(KI2`3R5(tA!+UN51dV%%~cwYhs8xLAsS`r9Q*#$QJYLZyzuKds4`)iWPYmZCVf~>ZDl4f*FyY4K&)?L zHojElRp^tz`4UM>5CP6#3NLV!f2tAw<-D*_t``~S5MBa1 z??yD&>*>?Da0h60F}YKlLv6b%0)&LfZM!4X(lJeR-)~v%+%Brr}^V&=zz7UI${%Rr44s8y)K9)F|lcn zMr=q19+R13^I->-u_dV zPA!b%_UAOI)*X{QKke_I(rFM340JUw40X83$q#>FgN$;uT#QE5-o14BVz9HK*RTGw zkgO5;+)e3e+)RWCaI2c*{fBq9(L)a_UXP;o!q?KnLCsYnckG7v_47r%_uK1w2Neu5xXr`8D$5>FPKHt9+BmVj5-CTU9-{W0B8!vp)GWLKnToeR#?-$?Pb@loKBTnE@M26NJhiKJa+brsMkT;-TDUJwXyq zuQ?ZKA3wc*ZysxPIap~%jD+F#18>)WZt0nQkwBdF#D~WOhbg5t%OyL~wmmKs9Gzul zh-cglP&5&JGzX~YdU36Z_WdhtDlNr*&Z58n z>g8)r3eV+Xg_qkUTU&x-vv%HON+8;If;H;$7i>i|BX4i>EjWME&Wzo&-@B*R+H8_X z?ycEzlG38aL$Om}EV!NWvTWi6p(F(=q0BG!D_?gNdns-4@##~CMIT$E&fz~e+dQ=O zH-B(G{lQ_D+*Y!^cD${+898z2drD3y3ltbCjw=SAKArihIT%93oSQ)Q?<(T-F@dq@$y|ViW5)Zg@Lh2*d z>p%+uzeh|}xSHf_yZ_Gl_|J~~(~rGR|KP;=>RnuhT>o1@{55wuw!U<3ZT@`=Xj!58 zP{9gHfLLunM!>_HuCG*54v!{Tr$Xz4>YLZHwX4qM6rIj*iGh>^Wod`0h2t&_j&;cwi>vNSI34wssUCH*voEv zx7@+n)!86!INYYM-x6kHx0@7L=f4_h?Rovz$N@&GzxJ+ae05s%1r$E6)+f3g3z-)U z{Bd>&0M4b_%??u!qYCeyskXi2AK~HpJMqF>dkCHnXsqU{VFf*<9~nl62^&G z7|ABHv2Qc}S?8Bza%mPGtvxBw&}$x9`T%LWE__k9DADQh*vQv!igf<#e5OkCq z$OfoxgObf8Eh}u{*33Tvfo4&8m*EqZU2$)~0mtvruAI+y9Ilh|^Z}La9bW1wNS$FR z-fHD|P*FJJnAWFjXly6UBQp0S?mV&CRbvbcE8_(=b>$%kRPqvzT8>L#n#x!2i;I~r z4th4x$Np8f@0SiPZG>o9vx>`IRr=5%&;C~GU#opSwz9Q%E*~mfxXYU~rvz-+G8EpN ziFW?M>EfJUNkysnOowNU;9O?dOT0-u96nSszIF6s2905B zzB|#om!*GjDpaH;X0C?+R~}SObK5$V$hL1!>O2#j6gd^?fy#TPP+u7?GQ7CoxS1T# z32VZ0s9)Xr^7IV$X4&a!WqIjQ$d2OkSu2G&(4fGWn23MGwg2d|^ax~osi}2_e!0)) z88pP``wsFc`8_G`h6xl$m{tmQ(i}DmA02Cv@As|NFGcD|JaImksBQQl5cy^?!b(DX zhkK~xQq!1>D^~C*h@OVqI*(wUuWP_JwFzjW+`0R@&fNjSzusLl=)G({kMX7DIB%KM_RFW0FUk=F?KU&(h~cC|7YI28@R!0Vb3(vapVH^1?}({01-L znOm2=`3*>-g6*XG_>|yLp9#0~^Uj4lp4YF0VW@_e-l-DU||P%~S*j^85df~9qs z`k4y&O&=g%n$6QdcPfwcP`=x}F!?%abpGmI%$~S|{WxunKr!-^!|&SIAH}g3UrXvR zIQ*f9i1Qn8{zorTJ^tHaVqM-*YbTx!@?1@ z`6ZA>mnoeIT>lk8SI8de==Hb?jsRY`H<^l*uiFeIpnL|oNY7hjC5?Jli{b{hOl?>& z!Gjoal6M>7bE5dywY8Z_ynqxuv(E4OQ$^bZfuzkALLSzGp!-%>kd2a6ygd52o;+xo z7o7u5B~f?)fAN(RNw?%`q#SP{@L?-_Xx76=IC6H;qS3g_LG{yqR-=@K>G*0lAP26Fa!eNp;QD8=eI*DY_;{9EOAM%GM)eN<=PI_yUU__J~dv%n=lc zjfYKInI}R|nX2>&tIXn$R@^XVIRzBzny5|FZznvJ;b+?kZ_ea@?7baKTP5riXvh<1 zgnrwQy?}Sr?!0K2*5AQ6A2;h!qgu5^i>~UP54>J|-uIDhXr~Y43U^TgLm$(a0g(*!v2lt16?a3dWTYe8OL=%Xd-o*jsGM`$TR+e2Dn=(&{I_TW&>Gd+0-wF(cHIDk2ih0kj!imN zYY$qtj0`GhD`Po$@vRk5>@q#Rq+QY<_q%aX19EFrq z-ZX)gm4uKhT0{5M#l_>Za*zy4zR{;Xg<5`YCoZ~HjJ-agKG$}sXa8ZOijUS+V78Q4 zaD`}q_hj~t=d@)MIW>m`eY5a22!wX`bh`M6E{dK z{UrVL(u9a6vNG=o=#8ZI6m(a2`dvOp~;x>Vw*P zN&{L|t@T|NoZCIn9e<=l8d9S>$D{a9R>K%%7JBfq>Ncky=qV@#JvJ8H9 z=5uwMiuxW#x&p6=b7{~Kk9b50-&Di&o!f{%T(CS#zs1$~7Ta?K9MW~mxb`XcRx*@A z4@nTv1=RX*%4Ok(>Ati1JZ-h1o0uYoCGXDvtpnGzNVKSXDScWI#LJcVk7>rgXqH0m zWokGTIIMwl2@tS={=B1474??_pgq&Qmz`)M<;sQD1!W%<6`tD>m7XR{;oasCIAC+( zo^CO@xw)v3K97{z)fFn8TvC49iZiYDu!E)|{JTVM)GHxLetYyhW?neTg&)l|jux8K zwSUsecdXCNQ!C@sIOv;OP?{UF3}Cj19T7>k)+b>xNgf57yB^+mq+lQgWQ)r$3L+(k z9YR2iO|wgR`o?athGHDZ6@Lmjz$^Bhe7@R4&^l_fi20YK?S#S8KhA_2izpjwqZnu6H zysphDg}qJzI?~@B#5@tB>|njlh1j%Wt!srO>^G@L1t@r1w+REFQ{K@CHgvUt@~B&- zGv5*4BpIm#n8DhY)Cq(ldLw1%ocR@|@!bd}O6Sf>vQ{7d)c-y7cE7Z!h^yQ$$AlJa z$O6PSjY<1uB$q~KG%_|qv)O#U=VWyaYn&iQP0_nKr}$d^a-^od2{@OMp^1xN8UOwv zDc$gXiu|V1_;Eda)v=i?h=Z2m{<#$)`=$#|CR2m360`_v>!^cb{+0LpyM87tqPWb- zV3e}ZJ~pk-c+zs7ZjVn0f6u|HfHT z$DoUYF*$6{-Z1EJdHlgK@8=>PD5PoZGKRK}cGzc?e%2kk~(;8#!Nvr`+v-7fL2a_QIPj8d)k(NF&{~FTku&wpob-`*@(KmZ| z=9?0U$u>TnM&*u&afN|k^4XoK_L1ewDgz(8sxp`A`k3dN?CdE$&0h%z0lRoRr+;~J zgcql@WUOn(&Q;RtgGe4(mpjyrVs0nW(~ggKf$)1aDJGq;Y0`p_t^{=@m-^0;9t%kO zr(cVz>$_)PmL5Ow81_rbn^1Z(m=$0>h@wlXLws!R?#ZOPdqMREbxgKlVQVmR5y4); z)tWIktTH@bfWcz5-F^lu)Fa{w5;!jxrE6I?v>oyXoW$71RMkamR7d+3blIZl1&5(~ zQ-1em&OvQ-ufOrAckHpTCC*j2g^Lg1LD?Uu^?^K{zu2p;=Qv2M2^`JUV&h@xIiy09 z``*tM-(|T?NrY>_BE=YJ!J;OXE*6}V3C?8JgVai&uQ;he(f0-RM%9Oz(q{K;ZM(7v zcSC)RmP8_D2T$V-rsv0%)CJ9psXIZ%0vk`LfYuYpP-xFa;+lf3D~>2lrh_{yz2FHqzkK=BF3x2 z!JhD=9WT@S^jdy7m>z!N#GG;X;$8y~wn;*DhX&FaJO6F`3n3LNAqL9AmbmLq>;(BCLh;oSCkh#|nap}78M^JSNl)P199VCU2* z|CDg>QFcwklb~Y?+kKTOz zn7OZ6F7M9bB2!7*Y)}k-cM_*QOl3dsRR4Op@#Gw<;d0b_NxK$~AuXHp$}I0b{a4j* zi|U8dhOJA*-Ox-}11c%}Y~ClT)!4kzZm)ju2Elvxz7myRMb@N-wc>JObwUcLFX{(g23$s??xYKd90+B$4 z&j6J8nc?R8;z*^K%9DeeS?gRx1)FMX=Ty~r3M<4i)$vl!C%Szq->OxmvMXY)8Ok;S zBO$Lnoik-~4_X}ZK5m$3)w<5F#^9I0w5j!aQdW=(D*T@;;Xii43V>ZXJ4>Vd;Z}UH z{@T4Y-)Tdx4m4dF;H#=3tb0qDF@()IX~u&Ft))22d~Al}N4wl-*e*pX9ONZwiyKo# z5vsN*duSPysx?Xi)N36b_Zfelh*dbyRRWOE6eXB(A+&6u3#OYCzGJIZ({6pf zT4P&jFCQIKqvK?#Px1zpcPvpVmkYWv-_JAef45ylAZ1~ z+x$a(_lDm(M*iFR%^8_bN>jR6I!Ib25Wp5rBU)08+9M?GQ?y9OO^#2tmn}r+7yN;k zPiS%zJlG1ML_s{)e8n|}PEuNY%QKg4%j8v=^8lkEth8 z&FVa|KGDMj+9M0a62tUXkOyPCMh8}dGpb@G3Y?G#is32CI2Sron=t3_ZO2`@zX%cK z+KPgb52p+m7mMa#UgxW{&CPJEc1mF4R{H61fJ)Oqw>XSh#SV_0Y_^YB+paSjjlkcQ zlD`RBzqS&GS28$H0bm=nCDlkd3WXeFrh>B4;$k!Y%qq*cnxPG>`J4;UK~)LWdg?(i z1<|CJ(2kdT8*MHt=@E@`_2S#BVDs{lFX5F~i#`zrfZm;9X9SKdTx#UEfphmsp&?`} zUAMamBQl|n^?MFmKGm3j-{_sc>2QoV2d}j~oKz5~o{*!89s{?4=caooneKHfPZ9w7 zo#&2AQeY-OYnsE!0#y(6X1ScJr;Y&(vkO7>1+Kj5(XPOc28Qz& zH8l8ojxeGh4*ho_8>7u7J8AR%9J|6+TbtIbB~C@A-ek<*0~D8*Op4RjDStSnJetqi z(c|H_Ca4t39lP#2H+a>i()1gC%hnC80+#WX6`J#X=oaHlA@alW74Cq`DC(g!S8tn^l#uVbw=`ublVOJk75lE z?RV5OO*P3VKbNlfI-}?)cPtyQW4$#}(vXv?j4?uNv!EX&JpY zZ0d7*S!HP3d)JQ32hzWb*;ew(!#L*_jBI_bk1$PoL-~gcxnfePZUqxu$OR;1%8hs0 z=>3zFN~WBY^4h3gwztAj#=s7};jlNJ^=sBaWi*V?p)!cxWPz*A5h_({{KIB>_cY5Y zV~tpZWuDKQUTD#_yIFGd(44JO4nLJBCH`lIAC|33rn3RY^Z+-rT#{y^qn4Ui9Hk(# z=8*R(B`AHvM|N-7J2K9Y%z`pES)bj5XK`BgYlyjDXfSDc!=z_^RG zm2vL_{dY+6V_*aSXUmhQD!rOYYSrv$ox(}Qx&-zk{ZNSHBe|3<^-!s*5cV87=XnVq2rs4HNf6me1*6} zSjQe!su{IQ)W%9C!>{u13%n<=`YCzt6E#G7c#489abz5IpCcv>tar45Gu0UEAoJM7;KlK_SP_+U6KQ$kLxqiMyJdQ=dw4l{@Em+S{7TU^Bcr=2Ze3)mWQP@?pRZI_oHBB*VPq%3cgdfV z7aPMrU}iZlSOLEdKV!*l57_AN%xwf0QPDO_fMupRN@70yulJ0&^4jG>1{PKuOhNbr zGWpa$qg3U>wbNAYBRz-;Q^Y+eB&v1N3=D}q8;)sK!1eZr0DrWlhidsOVd!syG1!NO z5Pi`7K>^1n=GA(yHxeJKut6cNd=5-bi%Ar2R0DH*hlKR8avd;=I!>Ln_4Nj3Js5xM zJFRg9N~?{Nr2d%yQJP-x=+4XH>337S{J~E&rJOA?*10fbS1U+I8L+ z1+^0YLq*iK-hM80dqbsp7u^4DMgPFX^6u3umGhFRhSur3^~H97j`mSeyK&!0l>&*g zbh!)RE4Dpont;!}@0Ckf=K|4wj~+fR3$7fq77ipVF-3ljq#FMlvkP(kn@2EFgy>JPld(BT&G9NvkSVTg?$a}ST|#=^?;4`b>TJ=NW8SI(a& z5+KHAZL21=raB#L{N5XT(QH#Ezic)ki1)=-belz#XG3#^rv^U{fU+&{g9<7J)eUE3CX6!LOB zwyH8a5dwB|J7xus3XV(!it(g&G&LIMPbP zoGEt&M9>1$LIAr=5J*FizpGub>9@csU|l?-lLAI1-25`%Z6Uq4#Ad8bvl)_bRScVM zE&-AOy;mCLfG=FgtSySekiu&6NKW^_jD_p74`~0d2zGuwBl>c&-l+A7$r;!=e=JKM zcT+CCOIBWSXu_9+DG52{v;Ll$Giz`vAjngF;l^(k+mV0;8|8G{PKUYm>MOw<$ZY+dP`=!Rimv)9Mr88~rVZij z($G@(9*6NhspWq$P<_o3FwKMla8|fJDu&LV6U>b=M-VW7h6B#^CV3i6;;(+%je6Rb zmNgsliSl#kf0KL<_KG7YF%$Zw%EssJ6>dNKEx#oLc1@`gp3X6;q!y^SbwD5>eD#T2jUOj=#F-)!*2gd*HN^<74d%bgER@`Pq+3*9p`_sx}Tn}T08A1ZlQQ-+>3jnr1%y63Q&5dLVC zmv;iY-eZCCG;BpQ>XlYpS;u((?$=a_Hh>o7Wki&Ok7#PEcL>Msigs2DJEA|& zHhLk!f-$8s_B3=g_b2o*aZ}i?ye{V=LwuYg8Cqg-r(A-i)?A zp7I*YWf(jH%4X^F+xW`b)Lz7EqWX&; z4$70+ZovX-`U)*;3>+Aw_B*WQr~Y`;qOMzBOudJmXv)^7^e?gUm#cFxhP&uE3+2j& zvxW_2Gv*sAp*NSFCb{YbU1eP&PO_&N2kkV1CSs|65V9$oyX@$(>RfBs#yhv&TZ z(Gf5BI>VDUUu2-tZ(G@X)w;v~;80wgUyI>V9;D~HTnSgCy)hBuvU^brUFAIN8!*sD zR9GpjCCnKbvk08xq9M~52J7^i&v>xUYOa5uC|Gm~POs>tZdZ58lmiFe!RWOYF$rQI zZUGU_LL@(*QFQD6OHE=5Kt7oR_k~!kFC``0^`y1_o++|F$e1ZS!gCQ;Y^^ui#N3Jb zjQ{rU6NF-IvNDyUs;YY|+n?$95alN=u=pU4)(yCwmHe`+bSymY|75GF-(P7^`Fln0 z2e3Aofz)yeEI-9PpK3mxQ!7q7Y0#-vU9Y!EL#$dyNl;^&qcN3$2E<3CMj>YVbG`-s zyj!YUwt4RK?x%_`0%hX{(lp|hQoebxzau~6AcA&_ET{fO!&LfEv zAre@*>`PF;UDxrTwAX%<=V^8?L9=;%Gm5lR=t<+;ZEk$JQjQbN+4HRxh97wMsjkz# zq#E>{?dZD?(_SM2X~(^cdc(AgN*AV5zpYcVr-}<4HY7RcSnI8vi-@A#>Mi&DP>lZs ziY}spO~c!@%(%N@jHmW_X1HdZs&Z?Zq-D(Yk6G3>ygoK{zKR)9z+kOKz&?cK^xY31 z-<|4Bl=#1`9KlAt+1(3FzpTAgs+RbAhl5gfzVn8#kH2rkj<&o!4_;rS>>z?bizs!k8luoKbzK9n=*J@Ef zH)GZKD}AO+pO%-OE#~#v_?tR}2{ z)A#$IHyQpvfA=y*wtK;X{^R}5Of{md7p|N~g7?tbCb6icMXZYgOC-VwLwQ@TKc(bU z&@l3|%5x)%FP!bib07ZTU7SPEXBMqN<(2iEEHHHZiMA9yJhj}w$o+7iRIbMRf#`K6 zagVsRd8|~XA*@Qfu%VBd-->T3eE;Q!_{6-nvZYrIN1L<~b2yJ*4C^Te8|o}<(NP#P z0JmIhdeUIj_+!wb2U7Z7Z|h~*L8HHd+Q_99V8_dUg|_v+?2n7%Z@30~u7E-3X<(bT z49rZrDL*4ePJwB-4%vi3%}}Hs`$p@Zc;PAewJ%(qW!l+&^^tUB5`NYjx%N?{Q#`4!uY zD1G@JGgP_DGhA>+%sq!r-tJ7%{)R2zOiT zZ1gggGr{b=t=_&UhzwAV^+9Mx4$H*;%w)}AIGmD4gwpfSUacVx<)2DA=r zn2!~%hM0^D^2SX@KCz70!?T@7{><$_E&eE4Xiz)yNcHFZSZpSs8r!Sf?e`0$yx0=i zaAH&URsk5>BmpD0xqFS-gReJQZx=Rp79V+qx>s;7+BRmN2DP3Lt% zfm2nI0M`guGwV}3b(pZNp7nP#MA6y06Jq6f*Wm(@fjo(CDw(Mlw-#$#{TB6F{t(f|=9kR-Y5s3uI=;cH)q@%WcN1jrFMuwVQW!~fql9yUyZ2dATJ0BZ6T&oSN*sY=HL7D@3owKX%)e)~p2TWDFWj?76wlp&^ zu}pB^Iu4avZcyxOZtF+`(mP_EZwu#@Tgexz2`;_WciYXOY2@d!BW4j5TF5??;?CXW z_R{u%CEMJz=^%0e1u1{20r({jXt?VbY z!C40hVl28Nc5F3tI4LMJx%PkKU-`e`l>OVtlr)t?UDc04@T-K#q<8xld!B_Hd3R7A6%zF;F;J|eD*FwXxR6y}r-SdYR zz{$lQd!P`;DUsq6$B_ZQ9sV75D=Sr*^hD}s`Y|+uS z3VD0zQ@4Rs|HWPwS6}*v;&-+~r*828AA9etJ#tB*$*^4hZ8ZryPfW!w`_??%6KhXj z6+4Qm@x0&nb zVi75MF?mdnVflljjiu3IuzU#~iw~f_sl-h}Bf#nzOigZxd+IiR3gSOA9f^nYHa}xc zatXlw2WRS3a(Bn0nY8`P4Xf`q>DM-$|1gpR$goBE=sV?(m%>PeWZpb(n?Q;JLH_ z4_AyRwcfgjn;((AcL+t;*yNPnI4v6tQRK6HNwgvc()O=yRur|iX>3|K4UVwdPdLUp zG%c{Qvej0~Mr~YV7zXQ=pMhJ|v{25d~32$c1BBPhw3->=C;}E4TI=Yh303#tmK@+klIk)2rA0MLFi|K0#2Tm*Q(t|zu zelW^Cf1T56A7qi557W8OW6G1szdt^%q1iiH5IiP+g>!H@oNcEOEk-TR;4?qk*$uQK z=y>x|39O>b~Bh8C#=Jd z@x8k-<5PI%-CX9;x(m^K5koV6LgU5LxuVQNmo`Icdwms33GrOtkz(y8{lzy&J;<=+ zF0iC<+Z1-shu-EEj`ps0Snmk}oQvIzxBX2}i0IgVi6`|BRE7V=H=e?!VKMukDjK9- ze5w-|`-LQK#NFlI-`y)kUz4{%)PnY$zserhI@Jt?s3b4=?*i#ft4n)z6&_UelF0}- zjVlTzuzeRTL{%N0eOt_)M#=F5?4EB77ltjquPo>P;2euT5#qFuX_PYn^ppKcHP_%b znW2Ey%t=};$wi>tN~z*3PsK6b@RuUtolfq|73heYz>CPFJ>bRXoSkpYh)Inr&Uoh9 z@tUp}VMs%n2eKB<(Hkj|8l;}s-s~%BBWPLIe1}_7Q7IiWbEI8Y%1?5NjJxbS$rMq& zl^JcJ= zd^SMXCIanH*-{;nn|0sRllH+d&+m(DROiAf>>Rk~8B{j^7tHRq_WUT5H}s_Nt8cBv z=9M+{MkN4d8IjD_X$OtuR5NE}_4TMBZof1YE3I=Gi)BAK(`@^?qzd)zkqd!AG=c7BmRRUz+=Syi|=57G$|d!Kjj<8 zlZjpSIK=kjBm_&5UaFxF#omooO`!(s7p9J}d?-eyMfCc=ubBD;e_Kn{iSWc37B0T_ zn)YC~*ht~}Yg$Bb(tBpdf6jOJJFs(q={zz-cz@t+;=x%iU25PWkHQ=yw)6-$rn(!Q z!6bH5d#JZ>VrPEh>*ebtN-QEqyL`3gjL^@^_kYn_QUUK^MGb?0*M4_-bBJ|)djY^S z+OAeTn8#gj&@Vsp^cE}_m%*haBjqYADDdN>`Ow)NP#0#oJB6k7!*O`uS6I~y6$;iU z!dekZf%G|f>NAXt8#e#lD8_#@o)6Er0hWVj!h3pNL^lay#}+l8NEc*0vpM;e9`l6zi{C#t9F4Krdx9HLkE;hT&ypgh1aWD@UVYUZ-$8#OixsQavr4C<*Sn zzQ4F~rTKcbs=_>Rmhvp2sfqcGpU{gCz4BjMg|X5X(?dA>J3>=@`@Cr}c0~hL zIfjoqveI+YnMQGfnJQ_@EqNdTqy0^UK$~9=f8b^8EUk~*)*=} z@@(Ps%$Fs1%pbxl2|Al#t%5*I^)6D8Fvn(y&cWyD)pMcD$)xZp%VX*UkS_3rG!AJl=8)7s&27^nUZ*!B|Qaw{MxiT-^RrnXYHsszlU~O;A!hPnXlo zef@gb0T9tI*L}jPTFs@eSEg$oxLt~wF5|%PM2(`CN|WnDMD{fKLmnqlKP9V{XG{=! z4@UowQqIMn2}Ob9IbI!xbVNce8_g-}m#~4^Vyc+Le{@yAu$phbmH7 zGLB#VIZtkjFCS;?-}2`cUP08%u&8uT*MfR|=vqp~YNJju{)F&X8IMpd=uI40E-2cu ztfGQqUxekNSiY}x`Ip7xGUD;?tw)2e`l`0<1X$i;a@XAMK zwdQc93&|F8R!Vnf+jlDf0Ni$^`s;Y*$<&Z4mn4%m-mp~~*-;>Q|MBYi#oC_`k!@l@ zxVdu^GW>dIT&!`~G7#IQ9WSRojH1Pb)E@A;i-MwKMUwlgn)HvxoUNKlBWo*OujRmV zPnC4${GKY^oG>yrgB)dVguxYCqc-a&8V5`!i;&wKy`p=w0aejJAsl4=IHsJg5n`sZ zh}#IG4CpGG)4XtqEoy$&wLT08FpWOv#;d#;-xk4AY!te^TkmwZcmFQ@*~qrBGT-PTS9KQhjn zbqe>QPhU?o%vvOqO~YCw*irFV_w^q1=S7Q06HFYBcqLwa*$_C8C#0sIdna%GIaMlz zp&I)rUR<;O8{a&FZA!Tphk{t_@*Xqxw|nO89%*ozbiwTY-4Ou!l*sW4vAfzOiW2Z) zvA)Hl%Wgy*{O1}ibM=DjVcy5vjYVtb6X6Qpzd)1Z$Rd1rgtL`76<&w`JxD7}&}u_N zBAjC7UDB!7E2*3AJ%73n_lLZa7=_eGU^Uw((QxMel9SXii8cD|O9NQ|ge$A8V!RIJJ20nosgBDh&S8U*A8{J?|uLuKh2h~DsnUCwp+Nj!pw z?fPb{TSf9ldZB-;jSOMI=wI3gc-26_+7ah9JKy9s(V_x#R|T27d`M37CIh{_m{F`< zOZXVzMJ-pYFQ zHZdt9QjB52;sqpMmfk=I1-JkDoY^ek_E%6D8aB;V zH2(uKPy4*S>wk1?#(|iUN+%5(Kl5nx=$2o+aU_vv;0ePCL@snX+pC>1U-WYKTtfU$ zlf{}e1#h}aQ>`nu&vh?%mPUx;N)$ck;#L!F8yp=9>RpqvpoX$ssdOb&LCUe92($vT zG@(~R2k-0mmjvB}j7eNA!IyATNDO4oH*cKR3! ztoO*tO>8ei(z)>FuI2&|#xgw%55 zYYRuN7L^bC&9vq6#o;e2;$$}>JWQVcW9={^cgLk%r^j!KXA8pw`q|D;&$j8m@DK9@ zMP>!9Z1jx?p%>zZCzj=HLj(r1oKA;7Q3dQ73>4BL59Z-I7m-_VIm!`h~a z6azl$Ud^7C2>3N`LRVZjXu7H_oyN}BA9}rDO-GoapNP!y&5(>GC5=fl?MpMp`{T4A z6gNiqhTkVGN8d`0qx#_6+b<+4W6`OPe(Bb7E>+Dt3VE2|SCXHojHkJe%wrp;eSE&4 z&nxbW3NOZGV>Y%@he24|=gcN|+;dW?xZ4tq9Z0mlbLv$Ee>Bvtcms+}`paMN?h2oPy}a>6`Y```gzQo1erp)UVg zNqONvek7dSpp02!&=IOy!2F1qPpY=g(9=@{HXI#0?tsYAoHN2X-8slK(>P?H{l25H z1UTa3sd3r(oU32OWZf0FnD_Av8ahqDE-cf!&V;)tE$7uf9t_+oUOSfea$?!&KXTL- zilW*c4R#z26`&U5yKkmsX-z#?kB|y9sDU1XCi6NDhT|slDr%5t!c<7Y%pTkw@O0s^ zhS){M{vBP$m!tFJleU+j=P-$z6quH%ntVJWpGj{@@u3(a!s8sWpknfAgqJ~h=JzOY zdjfEGCuHv!iZ_R^aRYNV@TEiEewz>OngiC=`sY=S^{K~xbc(R}zm6!Kzux~1 + +# Evaluating Retrieval Augmented Generation + + +## Understanding Retrieval-Augmented Generation + +Implementation of RAG using Qdrant as a vector database + +RAG stands for Retrieval Augmented Generation and it probably is the most useful application of large language models lately. +It is the technique that combines the strengths of both retrieval and generation models. The retrieval is usually based on dense vector search, in combination with a text generation model like GPT. +RAG has received significant attention due to its ability to enhance content generation by leveraging existing information effectively. Its capacity to amalgamate specific, relevant details from multiple sources and generate accurate and relevant content has a lot of potential in various domains like content creation, question & answer application, and information synthesis. + +Read more: https://hub.superlinked.com/retrieval-augmented-generation + +## Why do we need RAG? + +Let’s flip the question to ‘When is vector search alone not enough’? +We established above that ‘vector search’ is one of the key pieces in the retrieval stage of RAG. +But why can’t we just do it with vector search alone? +RAG is the solution meant for when your users do not want to interact with documents or search results but generate new content based on the retrieved knowledge. +This capability is valuable for tasks requiring detailed, coherent explanations, summaries, or responses that go beyond what's explicitly stored in the vectors. +Vector search is excellent for finding similar items efficiently, RAG complements it by providing a deeper level of understanding and content synthesis. It's particularly beneficial for tasks demanding contextually rich, informative, and human-like responses or content generation. Integrating both approaches can offer a more comprehensive and versatile solution for various information retrieval and content creation needs. + +That said, it is advisable to conduct feasibility and correlate with your business needs and value expectations. + +## Evaluating Retrieval-Augmented Generation + +At this point, there are a few hundred if not thousands short demos proving the concept of RAG and how seamlessly it may make any business achieve that extra oomph! using AI. +Helping one of our recent customers implement RAG from POC to production made us realize that there is a lot of unknown that goes in the mix to polish the solution. +The most important here is to improve and optimize your solution through evaluation. + +### Why do you need to evaluate? + +Evaluation is a very crucial step to distill a sense of Trust in your application, which establishes reputation, and boosts team morale and confidence. +Needless to say, it also validates that your applications avoid common pitfalls and it is no different than how we would evaluate and tune our information retrieval systems or machine learning models. +The aspect of relevance assessment through DCG / nDCG or machine learning model through train-validation-test split/overfitting/underfitting analysis addressed similar concerns. +And for some who think LLMs are perfect, they can and do make mistakes too!! 🙂 +The key here is that the ‘data’ either source/query is forever changing hence a good evaluation comes in handy to ensure the results are correlated to what users expect. + +### If you can't quantify it, you can't improve it!! +For RAG it can be restated as : +### If you can't retrieve it, you can't generate it!! + +Assuming you are aware of the different components of +RAG viz. Information Retrieval - Augmentation - Response Generation +Here we are talking about an evaluation methodology/framework that is essentially composed of using one/multiple tools, that cover each step to ensure our measurements are granular and thorough. + +An Evaluation metric could be one or a combination of many different metrics to assess the effectiveness of retrieval, coherence of generated responses, and relevance to the retrieved information. + +Granular Levels of Evaluation of RAG + +### Let's dive in !! + +## Strategies for Evaluation + +Now that we have defined different levels at which we can break down the RAG pipeline, let us zoom into the levels individually, starting from the level 1. + +### Model Evaluation + +The baseline of our model evaluation could be inspired of : +https://github.com/embeddings-benchmark/mteb#leaderboard +The idea is to be able to assess that the data that we are going to encode is comprehensible by the model. +The benchmark above leverages different public/private datasets to evaluate the different capabilities of individual models and report them. +If your business domain is niche there is a good chance that you may have to put together a dataset for this step and it will be worthwhile. +We could either leverage the results here (provided our model belongs to this list) or run relevant ‘tasks’ for our custom model (instructions provided in the link) + +TODO: Script examples +. + +### Data Ingestion Evaluation + +Once the model is validated to understand our domain language we move to the part where we need to ingest the data into our semantic retrieval aka vector store. +Seeing various blogs and write-ups paying attention to the ‘retrieval and generations’ phases, we realized a lot can happen here. We also did not understand that on our first try ;) +With evaluation on this end - we mean to focus on variables that affect the data ingestion, for example : + +* chunk size - represents the size of each segment, our data is split into. This will, in principle, depend on the token limit of our embedding model but has a substantial impact on the contextual understanding thereby affecting the precision, recall, and relevancy of our results. + +* chunk overlap - represents the presence of overlapping information fragments in each segment. This helps with context retention of the information chunks but at the same time must be used with relevant strategies like deduplication, and content normalization to eradicate adverse effects. + +* chunking/text splitting strategy - represents the process of data splitting and further treatment as mentioned above. + + +### Semantic Retrieval Evaluation + +This stage of evaluation goes into iteration with the other 2 previous stages as it puts them to a litmus test. +We may have to go back and forth frequently. + + +### End-to-End Evaluation + +This stage of evaluation covers the evaluation of response generation of the question leveraging the provided context through document retrieved. + + +Now that we have laid the foundation of what are the important pieces and the layers of evaluation, we can further zoom in on the demo application which we are going to use to demystify the impact of each one of them. From 948c2b0ff5b182c8d96564a33183b404f4a2fefb Mon Sep 17 00:00:00 2001 From: atita arora Date: Sat, 6 Jan 2024 00:56:10 +0100 Subject: [PATCH 02/28] rag_eval - fixed format as per feedback. --- .../retrieval_augmented_generation_eval.md | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index 32a48f9b5..937a6229e 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -12,7 +12,7 @@ RAG stands for Retrieval Augmented Generation and it probably is the most useful It is the technique that combines the strengths of both retrieval and generation models. The retrieval is usually based on dense vector search, in combination with a text generation model like GPT. RAG has received significant attention due to its ability to enhance content generation by leveraging existing information effectively. Its capacity to amalgamate specific, relevant details from multiple sources and generate accurate and relevant content has a lot of potential in various domains like content creation, question & answer application, and information synthesis. -Read more: https://hub.superlinked.com/retrieval-augmented-generation +Read more: [here]("https://hub.superlinked.com/retrieval-augmented-generation") ## Why do we need RAG? @@ -66,8 +66,23 @@ The benchmark above leverages different public/private datasets to evaluate the If your business domain is niche there is a good chance that you may have to put together a dataset for this step and it will be worthwhile. We could either leverage the results here (provided our model belongs to this list) or run relevant ‘tasks’ for our custom model (instructions provided in the link) -TODO: Script examples -. +```python +import logging + +from mteb import MTEB +from sentence_transformers import SentenceTransformer + + +logging.basicConfig(level=logging.INFO) + + +model_name = "average_word_embeddings_komninos" +model = SentenceTransformer(model_name) +evaluation = MTEB(task_langs=["en"]) +evaluation.run(model, output_folder=f"results/{model_name}", eval_splits=["test"]) + +print("--DONE--") +``` ### Data Ingestion Evaluation @@ -81,6 +96,7 @@ With evaluation on this end - we mean to focus on variables that affect the data * chunking/text splitting strategy - represents the process of data splitting and further treatment as mentioned above. +A [utility]("https://chunkviz.up.railway.app/") like this seem very useful to visualise your apparent chunks. ### Semantic Retrieval Evaluation @@ -88,6 +104,7 @@ This stage of evaluation goes into iteration with the other 2 previous stages as We may have to go back and forth frequently. + ### End-to-End Evaluation This stage of evaluation covers the evaluation of response generation of the question leveraging the provided context through document retrieved. From 895bed281d31caf932081e8bc41f72100d78b6c9 Mon Sep 17 00:00:00 2001 From: atita arora Date: Mon, 29 Jan 2024 01:08:23 +0100 Subject: [PATCH 03/28] Added retrieval and challenges info --- .../rag_challenges.png | Bin 0 -> 60635 bytes .../retrieval_augmented_generation_eval.md | 25 ++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 docs/assets/use_cases/retrieval_augmented_generation_eval/rag_challenges.png diff --git a/docs/assets/use_cases/retrieval_augmented_generation_eval/rag_challenges.png b/docs/assets/use_cases/retrieval_augmented_generation_eval/rag_challenges.png new file mode 100644 index 0000000000000000000000000000000000000000..43929df1872161627b03c03ab01f35637d9db5f4 GIT binary patch literal 60635 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 literal 0 HcmV?d00001 diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index 937a6229e..76042a197 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -44,8 +44,13 @@ For RAG it can be restated as : ### If you can't retrieve it, you can't generate it!! Assuming you are aware of the different components of -RAG viz. Information Retrieval - Augmentation - Response Generation -Here we are talking about an evaluation methodology/framework that is essentially composed of using one/multiple tools, that cover each step to ensure our measurements are granular and thorough. +RAG viz. Information Retrieval - Context Augmentation - Response Generation + +We categorised the component-wise challenges to understand it better to evaluate each component in isolation. + +Classification of Challenges of RAG Evaluation + +We need an evaluation methodology/framework that is essentially composed of using one/multiple tools, that cover each component of RAG to ensure our measurements are granular and thorough. An Evaluation metric could be one or a combination of many different metrics to assess the effectiveness of retrieval, coherence of generated responses, and relevance to the retrieved information. @@ -55,7 +60,7 @@ An Evaluation metric could be one or a combination of many different metrics to ## Strategies for Evaluation -Now that we have defined different levels at which we can break down the RAG pipeline, let us zoom into the levels individually, starting from the level 1. +Now that we have defined different challenges and levels at which we can break down the RAG evaluation, let us zoom into the levels individually, starting from the level 1. ### Model Evaluation @@ -100,10 +105,20 @@ A [utility]("https://chunkviz.up.railway.app/") like this seem very useful to vi ### Semantic Retrieval Evaluation -This stage of evaluation goes into iteration with the other 2 previous stages as it puts them to a litmus test. -We may have to go back and forth frequently. +This stage of evaluation goes into iteration with the previous two stages as it puts them to a litmus test. + +Retrieval is driving component of the RAG and may need to be addressed as a classic information retrieval evaluation problem. + +One of the keys to evaluate information retrieval is to establish the expectations from the returned results , which will help us identifying our reference metrics and important parameters to establish if the documents retrieved at this stage are relevant to the expected information need. + +There are existing metrics to guide and define our baseline like Precision and Recall or their combination F1 Score. We have others metrics like DCG and NDCG to take into account the relevance in regards to the inclusion or rank of relevant documents in the results. + +Although the nature of semantic information retrieval poses a bit of challenge at this stage, as the documents are retrieved beyond the keywords/synonyms/token enrichment-matching. +The essence of an idea here is to build a reference evaluation set aka [Golden Set]("https://www.luigisbox.com/search-glossary/golden-set/"). We could also leverage [T5 Model]("https://huggingface.co/docs/transformers/model_doc/t5") to generate a starter pack for evaluation. +The golden set is a fundamental component in information retrieval evaluation, that helps in defining characteristics of reference standard for assessing the performance, effectiveness, and relevance of retrieval algorithm. +It provides a common ground for objective comparison and improvement of retrieval process/algorithm. ### End-to-End Evaluation From 08d28eaddde163d1c659295205e1ea29de236507 Mon Sep 17 00:00:00 2001 From: atita arora Date: Mon, 29 Jan 2024 13:04:42 +0100 Subject: [PATCH 04/28] Added generation and closing - review pending --- .../retrieval_augmented_generation_eval.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index 76042a197..3deb5a9b7 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -124,5 +124,18 @@ It provides a common ground for objective comparison and improvement of retrieva This stage of evaluation covers the evaluation of response generation of the question leveraging the provided context through document retrieved. +Evaluating the quality of responses produced by large language models poses a considerable challenge due to various factors as described in the challenges above. -Now that we have laid the foundation of what are the important pieces and the layers of evaluation, we can further zoom in on the demo application which we are going to use to demystify the impact of each one of them. +By virtue of nature and design , the answers generated rely on diversity of response which makes it impossible to device a fixed metric or methodology that fits in all domains and use-cases. + +To address these difficulties, it is often suggested to employ not a single but a blend of existing metrics like [BLEU]("https://huggingface.co/spaces/evaluate-metric/bleu") and [ROUGE]("https://huggingface.co/spaces/evaluate-metric/rouge") scores combined with LLM-based or human evaluation methods. [This]("https://scholarspace.manoa.hawaii.edu/server/api/core/bitstreams/c6a53998-09e3-4d17-91fd-c7416d51b250/content") paper provides some great ideas around the same. + +In completeness, the idea is to establish a sense to automate evaluating similarity and content overlap between generated response and reference summaries , topped by leveraging human evaluation to aid the assessment of subjective aspects such as context-relevance, novelty, and fluency. + +Another simple technique to build a classified 'domain - questions' set on the basis of question complexity as easy , medium , hard to get an overall sense of the RAG performance aids targeted improvements. + +Nevertheless, formulating a comprehensive set of metrics for appraising the quality of responses from LLMs remains an ongoing and intricate issue within the context of natural language processing. + + +Now that we have laid the foundation of the building blocks and the layers of evaluation , in the next part of this series we will continue to look into demystifying some of the existing frameworks that helps us to assess the RAG Evaluation. +Looking forward to seeing you in the next part! From d5bd03c8511007ae2dcd37bd08ce7cfb99344d42 Mon Sep 17 00:00:00 2001 From: atita arora Date: Tue, 30 Jan 2024 10:25:02 +0100 Subject: [PATCH 05/28] Added general diagram and md updates --- .../rag_diagram.jpg | Bin 0 -> 38847 bytes .../rag_qdrant.jpg | Bin 38845 -> 0 bytes .../retrieval_augmented_generation_eval.md | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/assets/use_cases/retrieval_augmented_generation_eval/rag_diagram.jpg delete mode 100644 docs/assets/use_cases/retrieval_augmented_generation_eval/rag_qdrant.jpg diff --git a/docs/assets/use_cases/retrieval_augmented_generation_eval/rag_diagram.jpg b/docs/assets/use_cases/retrieval_augmented_generation_eval/rag_diagram.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a2405481e753e267c12d18db7354c031c2fe5099 GIT binary patch literal 38847 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�{=V2ZI0lm7LHzEm6H?{9 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 literal 0 HcmV?d00001 diff --git a/docs/assets/use_cases/retrieval_augmented_generation_eval/rag_qdrant.jpg b/docs/assets/use_cases/retrieval_augmented_generation_eval/rag_qdrant.jpg deleted file mode 100644 index 4eeb4419fd6f6d8e5aa3eb64810196d519443521..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38845 zcmce-1y~$SvoN{@50VfhxC9b{EWsTTLU0Ifiv^cu7k5kGh2R7TZVB$bySM~*S$uH~ zwzxxb$@iUezxSN`ob$`Q_pf=Tr>3i>yQZh7y1T0S_ss8Qz+**O1z7+F1^|F@e*k{3 zV$3K=OPi=^sLCoR%lwnj3%Ca?ZU6uRb#>N|d&{V&4`Re!{^t{aXr|^aj(@KI1>Bc= zKJ}+`000U6FL?gDY;G679WQ4)=#Oz#d=;U<4=tpa63K z*FDAy;0Evj1b?Fd(g4f{f8bAwc@J1PSbqQy2L~GmAMfEqd^~*ohlGy^9}*A~;NugK z5D`Cm{FvnNL&7JdPac!rwlF|q#$ig8aQ!G6NTgCj-yOx^SoF0WJU_p0_oGID+m=dl$$X1=%5nl*y1)f6md zfk8*V=KzG5_l1yPk^o)f6f}hkgV@WnK0H@mV_dVC7aoNWzkHdFoRN$!&iBN3<(HGRo(1Y87$$ zP`&im5~{;|Z?8^AR4h}+iANWmMRV*6O72b{<0z<|duLv*ftx^vVx@P6sW5s8X&@2( zb9LV*!qd_~8D*{VnAVr!Z+gVVR?&vz;yzq1M+rT~MVqN%Uwf6njjB&_gsNAW)?f*>^Z&r!SJBT4Qv=jpH2DqVBi4yl>p`a)=y zIQA=Ru+R}#Fe-*328(VOS~+DdgjeQW|5?k-zL4qbMPV^EBvUu5(@hC9t=Tv^9W59? zTkf=%n_pjH<3me3P1KI-C|9Poh;=zSaHjOK(XqX=iHy{mUn?K%=NT44aQ0ML98Gf} zf*f9zR!K3akj~r&DBK^v0YPqRXP7fe%`1$e#pKwDmqcg(dj67Okn)&BX_(! z>n=jT^S|D`dG`+M|41TLu!}9Lu9TNzn5;rJ>4mvZ&ONvK7xaML*D_YjLDO(~Z4cY3 zREOHvgyLJbeH54prq&~)NGpaxYg)E+N;K742Hz{*&AG}TCU7f;uRB!hh$6KW_w%C5 zszk<|v%np4TgJ`ojf)4@PSK0U>~rjM*E@IxamA4oU24-rvoCGwO?^ZRH!p~sfLNdE zi673n%o#FBmrts1=aK8!f(Hk6`v;niC-J~4;(?h(r^9nX%@xOOQ@ylpM}wfX>M1By zd8{?Xj)dAoJqKE(jD|+qxf1#IL-cO|r)e|wc5&LAVB&+mAUSokx#2irw9l(8dT|P? zRJXW|TeY7S6a)FMz4HBZTter~9|h)pYCrCuf{I3Q*?bA9udZ5d5Q4sOc>S%nb}I2Z zg4Q8KDXh77nJHx7zp%8ngXz%4_8m$8@}nTjLLXm|ppfO@j8WzOgRf2uKlU540Nr~+ z=!lXXiJkn61hVtYGKcsdCoB~b%*x8 VrR_A=#SPZ+b7>ECsz7M1W{&;?!@SvRUJ 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 Sg|2C* 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 +Typical implementation of RAG using a vector database RAG stands for Retrieval Augmented Generation and it probably is the most useful application of large language models lately. It is the technique that combines the strengths of both retrieval and generation models. The retrieval is usually based on dense vector search, in combination with a text generation model like GPT. From 3a34e5e192986978d5ffcecc862b47517315c695 Mon Sep 17 00:00:00 2001 From: atita arora Date: Tue, 30 Jan 2024 15:24:07 +0100 Subject: [PATCH 06/28] Accommodated suggestions and review comments --- .../rag_qdrant.jpg | Bin 0 -> 38845 bytes .../retrieval_augmented_generation_eval.md | 139 +++++++++++------- 2 files changed, 89 insertions(+), 50 deletions(-) create mode 100644 docs/assets/use_cases/retrieval_augmented_generation_eval/rag_qdrant.jpg diff --git a/docs/assets/use_cases/retrieval_augmented_generation_eval/rag_qdrant.jpg b/docs/assets/use_cases/retrieval_augmented_generation_eval/rag_qdrant.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4eeb4419fd6f6d8e5aa3eb64810196d519443521 GIT binary patch literal 38845 zcmce-1y~$SvoN{@50VfhxC9b{EWsTTLU0Ifiv^cu7k5kGh2R7TZVB$bySM~*S$uH~ zwzxxb$@iUezxSN`ob$`Q_pf=Tr>3i>yQZh7y1T0S_ss8Qz+**O1z7+F1^|F@e*k{3 zV$3K=OPi=^sLCoR%lwnj3%Ca?ZU6uRb#>N|d&{V&4`Re!{^t{aXr|^aj(@KI1>Bc= zKJ}+`000U6FL?gDY;G679WQ4)=#Oz#d=;U<4=tpa63K z*FDAy;0Evj1b?Fd(g4f{f8bAwc@J1PSbqQy2L~GmAMfEqd^~*ohlGy^9}*A~;NugK z5D`Cm{FvnNL&7JdPac!rwlF|q#$ig8aQ!G6NTgCj-yOx^SoF0WJU_p0_oGID+m=dl$$X1=%5nl*y1)f6md zfk8*V=KzG5_l1yPk^o)f6f}hkgV@WnK0H@mV_dVC7aoNWzkHdFoRN$!&iBN3<(HGRo(1Y87$$ zP`&im5~{;|Z?8^AR4h}+iANWmMRV*6O72b{<0z<|duLv*ftx^vVx@P6sW5s8X&@2( zb9LV*!qd_~8D*{VnAVr!Z+gVVR?&vz;yzq1M+rT~MVqN%Uwf6njjB&_gsNAW)?f*>^Z&r!SJBT4Qv=jpH2DqVBi4yl>p`a)=y zIQA=Ru+R}#Fe-*328(VOS~+DdgjeQW|5?k-zL4qbMPV^EBvUu5(@hC9t=Tv^9W59? zTkf=%n_pjH<3me3P1KI-C|9Poh;=zSaHjOK(XqX=iHy{mUn?K%=NT44aQ0ML98Gf} zf*f9zR!K3akj~r&DBK^v0YPqRXP7fe%`1$e#pKwDmqcg(dj67Okn)&BX_(! z>n=jT^S|D`dG`+M|41TLu!}9Lu9TNzn5;rJ>4mvZ&ONvK7xaML*D_YjLDO(~Z4cY3 zREOHvgyLJbeH54prq&~)NGpaxYg)E+N;K742Hz{*&AG}TCU7f;uRB!hh$6KW_w%C5 zszk<|v%np4TgJ`ojf)4@PSK0U>~rjM*E@IxamA4oU24-rvoCGwO?^ZRH!p~sfLNdE zi673n%o#FBmrts1=aK8!f(Hk6`v;niC-J~4;(?h(r^9nX%@xOOQ@ylpM}wfX>M1By zd8{?Xj)dAoJqKE(jD|+qxf1#IL-cO|r)e|wc5&LAVB&+mAUSokx#2irw9l(8dT|P? zRJXW|TeY7S6a)FMz4HBZTter~9|h)pYCrCuf{I3Q*?bA9udZ5d5Q4sOc>S%nb}I2Z zg4Q8KDXh77nJHx7zp%8ngXz%4_8m$8@}nTjLLXm|ppfO@j8WzOgRf2uKlU540Nr~+ z=!lXXiJkn61hVtYGKcsdCoB~b%*x8 VrR_A=#SPZ+b7>ECsz7M1W{&;?!@SvRUJ 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 Sg|2C* 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 +Implementation of RAG using Qdrant as a vector database -RAG stands for Retrieval Augmented Generation and it probably is the most useful application of large language models lately. +**Disclaimer**: +The provided implementation serves as an example using [Qdrant]("https://qdrant.tech"). Alternative Vector Databases are also available. To determine the most suitable Vector Database for your specific use case, please refer to the [Vector DB feature matrix]("https://vdbs.superlinked.com/") + +**RAG** stands for **Retrieval Augmented Generation**, and it probably is the most useful application of large language models lately. It is the technique that combines the strengths of both retrieval and generation models. The retrieval is usually based on dense vector search, in combination with a text generation model like GPT. -RAG has received significant attention due to its ability to enhance content generation by leveraging existing information effectively. Its capacity to amalgamate specific, relevant details from multiple sources and generate accurate and relevant content has a lot of potential in various domains like content creation, question & answer application, and information synthesis. + +RAG has received significant attention due to its ability to enhance content generation by leveraging existing information effectively. +Its capacity to amalgamate specific, relevant details from multiple sources and generate accurate and relevant content has a lot of potential in various domains like content creation, question & answer application, and information synthesis. Read more: [here]("https://hub.superlinked.com/retrieval-augmented-generation") ## Why do we need RAG? -Let’s flip the question to ‘When is vector search alone not enough’? -We established above that ‘vector search’ is one of the key pieces in the retrieval stage of RAG. -But why can’t we just do it with vector search alone? -RAG is the solution meant for when your users do not want to interact with documents or search results but generate new content based on the retrieved knowledge. -This capability is valuable for tasks requiring detailed, coherent explanations, summaries, or responses that go beyond what's explicitly stored in the vectors. -Vector search is excellent for finding similar items efficiently, RAG complements it by providing a deeper level of understanding and content synthesis. It's particularly beneficial for tasks demanding contextually rich, informative, and human-like responses or content generation. Integrating both approaches can offer a more comprehensive and versatile solution for various information retrieval and content creation needs. +You can leverage RAG to enhance [vector search](https://qdrant.tech/documentation/overview/vector-search/), allowing users to generate new content based on the retrieved knowledge. + +RAG proves invaluable for tasks requiring detailed, coherent explanations, summaries, or responses that transcend the explicit data stored in vectors. +While vector search efficiently finds similar items, RAG takes a step further, offering content synthesis and a deeper level of understanding. + +If the question is : "When is vector search alone not enough?" +RAG becomes crucial when users seek to generate new content rather than interact with documents or search results directly. +It excels in providing contextually rich, informative, and human-like responses, making it an ideal solution for a comprehensive and versatile approach when integrated with vector search. -That said, it is advisable to conduct feasibility and correlate with your business needs and value expectations. +Your next step is to conduct feasibility studies and correlate the results with your business needs and value expectations. ## Evaluating Retrieval-Augmented Generation -At this point, there are a few hundred if not thousands short demos proving the concept of RAG and how seamlessly it may make any business achieve that extra oomph! using AI. -Helping one of our recent customers implement RAG from POC to production made us realize that there is a lot of unknown that goes in the mix to polish the solution. -The most important here is to improve and optimize your solution through evaluation. +Our experience scaling RAG from Proof-of-concept (POC) to production taught us +about the unknowns. The lesson is to improve and optimize your solution through evaluation. ### Why do you need to evaluate? Evaluation is a very crucial step to distill a sense of Trust in your application, which establishes reputation, and boosts team morale and confidence. -Needless to say, it also validates that your applications avoid common pitfalls and it is no different than how we would evaluate and tune our information retrieval systems or machine learning models. +Needless to say, it also validates that your applications avoid common pitfalls, and it is no different Evaluation is key. It distills a sense of Trust in your application, +which establishes reputation, and boosts team morale and confidence. +It also validates that your applications avoid common pitfalls. The aspect of relevance assessment through DCG / nDCG or machine learning model through train-validation-test split/overfitting/underfitting analysis addressed similar concerns. + And for some who think LLMs are perfect, they can and do make mistakes too!! 🙂 -The key here is that the ‘data’ either source/query is forever changing hence a good evaluation comes in handy to ensure the results are correlated to what users expect. +One problem is that the 'data' frequently changes. Evaluation helps ensure the results are consistent with user expectations. ### If you can't quantify it, you can't improve it!! -For RAG it can be restated as : + +
For RAG it can be restated as : + ### If you can't retrieve it, you can't generate it!! -Assuming you are aware of the different components of -RAG viz. Information Retrieval - Context Augmentation - Response Generation +Our experience has taught us that it is better to evaluate each component in isolation. -We categorised the component-wise challenges to understand it better to evaluate each component in isolation. +As for different components of RAG viz. Information Retrieval - Context Augmentation - Response Generation , we classified challenges of RAG as below : Classification of Challenges of RAG Evaluation -We need an evaluation methodology/framework that is essentially composed of using one/multiple tools, that cover each component of RAG to ensure our measurements are granular and thorough. +For evaluation, we need metrics/methodology/frameworks that uses one or more +tools. The tools that you use should cover each component of RAG. Such coverage +ensures granular and thorough measurements. + +Evaluation metrics can assess: -An Evaluation metric could be one or a combination of many different metrics to assess the effectiveness of retrieval, coherence of generated responses, and relevance to the retrieved information. +- Retrieval effectiveness +- Coherence of generated responses +- Relevance to the retrieved information. Granular Levels of Evaluation of RAG @@ -60,16 +76,17 @@ An Evaluation metric could be one or a combination of many different metrics to ## Strategies for Evaluation -Now that we have defined different challenges and levels at which we can break down the RAG evaluation, let us zoom into the levels individually, starting from the level 1. +Now that we have defined different challenges and levels at which we can break down the RAG evaluation, let us zoom into the levels individually. ### Model Evaluation -The baseline of our model evaluation could be inspired of : -https://github.com/embeddings-benchmark/mteb#leaderboard -The idea is to be able to assess that the data that we are going to encode is comprehensible by the model. -The benchmark above leverages different public/private datasets to evaluate the different capabilities of individual models and report them. -If your business domain is niche there is a good chance that you may have to put together a dataset for this step and it will be worthwhile. -We could either leverage the results here (provided our model belongs to this list) or run relevant ‘tasks’ for our custom model (instructions provided in the link) +To evaluate our model, we start with this [Massive Text Embedding Benchmark](https://github.com/embeddings-benchmark/mteb#leaderboard). We want to ensure that +the model can understand the data that we encode. +The benchmark shown above leverages different public/private datasets to evaluate and report on the different capabilities of individual models. +If you're working with specialized domains, you may want to put together a +specialized dataset to teach the model. + +We could either leverage the results here (provided our model belongs to this list) or run relevant 'tasks' for our custom model (instructions provided in the link) ```python import logging @@ -91,51 +108,73 @@ print("--DONE--") ### Data Ingestion Evaluation -Once the model is validated to understand our domain language we move to the part where we need to ingest the data into our semantic retrieval aka vector store. -Seeing various blogs and write-ups paying attention to the ‘retrieval and generations’ phases, we realized a lot can happen here. We also did not understand that on our first try ;) -With evaluation on this end - we mean to focus on variables that affect the data ingestion, for example : +We first validate the model, and train it on the language of our domain. +We can then configure data ingestion into our semantic retrieval store aka vector store. +Various vector databases offer index configurations to influence and enhance the retrieval quality, based on the supported index types (Flat , LSH , HNSW and IVF). +One such example here to improve HNSW [retrieval-quality]("https://qdrant.tech/documentation/tutorials/retrieval-quality/"). + +To evaluate ingestion, we need to focus on related variables, such as: -* chunk size - represents the size of each segment, our data is split into. This will, in principle, depend on the token limit of our embedding model but has a substantial impact on the contextual understanding thereby affecting the precision, recall, and relevancy of our results. +* **Chunk size** - represents the size of each segment. This depends on the token limit of our embedding model. It also has a substantial impact on the contextual understanding of the data. That impacts the precision, recall, and relevancy of our results. -* chunk overlap - represents the presence of overlapping information fragments in each segment. This helps with context retention of the information chunks but at the same time must be used with relevant strategies like deduplication, and content normalization to eradicate adverse effects. +* **Chunk overlap** - represents the presence of overlapping information fragments in each segment. This helps with context retention of the information chunks but at the same time must be used with relevant strategies like deduplication, and content normalization to eradicate adverse effects. -* chunking/text splitting strategy - represents the process of data splitting and further treatment as mentioned above. +* **Chunking/Text splitting strategy** - represents the process of data splitting and further treatment as mentioned above. -A [utility]("https://chunkviz.up.railway.app/") like this seem very useful to visualise your apparent chunks. +A [utility]("https://chunkviz.up.railway.app/") like this seem useful to visualise your apparent chunks. ### Semantic Retrieval Evaluation -This stage of evaluation goes into iteration with the previous two stages as it puts them to a litmus test. +The next step is semantic retrieval evaluation. It puts the work you've done so far to a litmus test. + +Retrieval is the vital component of the RAG and its evaluation can be addressed as a classic information retrieval evaluation problem. + +You need to establish the expectations from the returned results. This can help +us to identify reference metrics and important parameters. Done correctly, it +helps us determine if the documents retrieved at this stage are relevant +results. -Retrieval is driving component of the RAG and may need to be addressed as a classic information retrieval evaluation problem. +We have several existing metrics to guide and define our baseline: -One of the keys to evaluate information retrieval is to establish the expectations from the returned results , which will help us identifying our reference metrics and important parameters to establish if the documents retrieved at this stage are relevant to the expected information need. +- Precision and Recall or their combination F1 Score +- DCG and nDCG, which relates to their relevance, based on the inclusion or rank of documents in the results -There are existing metrics to guide and define our baseline like Precision and Recall or their combination F1 Score. We have others metrics like DCG and NDCG to take into account the relevance in regards to the inclusion or rank of relevant documents in the results. +The nature of semantic information retrieval poses a challenge at this stage, as the documents are retrieved beyond the keywords/synonyms/token enrichment-matching. -Although the nature of semantic information retrieval poses a bit of challenge at this stage, as the documents are retrieved beyond the keywords/synonyms/token enrichment-matching. +You can build a reference evaluation set, known as a [Golden Set]("https://www.luigisbox.com/search-glossary/golden-set/"). We could also leverage [T5 Model]("https://huggingface.co/docs/transformers/model_doc/t5") to generate a starter pack for evaluation. -The essence of an idea here is to build a reference evaluation set aka [Golden Set]("https://www.luigisbox.com/search-glossary/golden-set/"). We could also leverage [T5 Model]("https://huggingface.co/docs/transformers/model_doc/t5") to generate a starter pack for evaluation. +The golden set is a fundamental component in information retrieval evaluation. +It helps in define characteristics of a reference standard to assess the performance, effectiveness, and relevance of a selected retrieval algorithm. +It provides a common ground for objective comparison and improvement of a retrieval process/algorithm. -The golden set is a fundamental component in information retrieval evaluation, that helps in defining characteristics of reference standard for assessing the performance, effectiveness, and relevance of retrieval algorithm. -It provides a common ground for objective comparison and improvement of retrieval process/algorithm. ### End-to-End Evaluation -This stage of evaluation covers the evaluation of response generation of the question leveraging the provided context through document retrieved. +An end-to-end evaluation covers the response generation of the question. It leverages the provided context through retrieved documents. -Evaluating the quality of responses produced by large language models poses a considerable challenge due to various factors as described in the challenges above. +Evaluating the quality of responses produced by large language models can be a challenge due to various factors as described above. By virtue of nature and design , the answers generated rely on diversity of response which makes it impossible to device a fixed metric or methodology that fits in all domains and use-cases. -To address these difficulties, it is often suggested to employ not a single but a blend of existing metrics like [BLEU]("https://huggingface.co/spaces/evaluate-metric/bleu") and [ROUGE]("https://huggingface.co/spaces/evaluate-metric/rouge") scores combined with LLM-based or human evaluation methods. [This]("https://scholarspace.manoa.hawaii.edu/server/api/core/bitstreams/c6a53998-09e3-4d17-91fd-c7416d51b250/content") paper provides some great ideas around the same. +To address these difficulties, you may use a blend of existing metrics like the following scores: + +- [BLEU]("https://huggingface.co/spaces/evaluate-metric/bleu") +- [ROUGE]("https://huggingface.co/spaces/evaluate-metric/rouge") + +You can then combine these score with LLM-based or human evaluation methods. +For more information, see this paper which provides great ideas to establish [Quality Criteria]("https://scholarspace.manoa.hawaii.edu/server/api/core/bitstreams/c6a53998-09e3-4d17-91fd-c7416d51b250/content") for the same. + +To summarize, you want to establish methods to automate evaluating similarity +and content overlap between generated response and reference summaries. You can +also leverage human evaluation to evaluate subjective information, such as context-relevance, novelty, and fluency. -In completeness, the idea is to establish a sense to automate evaluating similarity and content overlap between generated response and reference summaries , topped by leveraging human evaluation to aid the assessment of subjective aspects such as context-relevance, novelty, and fluency. +You can also build a classified 'domain - questions' set based on question complexity (easy, medium, hard). It can give you an overall sense of the RAG performance. -Another simple technique to build a classified 'domain - questions' set on the basis of question complexity as easy , medium , hard to get an overall sense of the RAG performance aids targeted improvements. +Nevertheless, it is a challenge to formulate a comprehensive set of metrics. It +has to appraise he quality of responses from LLMs. It remains an ongoing and intricate issue in the context of natural language processing. -Nevertheless, formulating a comprehensive set of metrics for appraising the quality of responses from LLMs remains an ongoing and intricate issue within the context of natural language processing. +We have laid the foundation, and we know more about the layers of evaluation. +In the next article, we will describe how you can demystify existing frameworks. -Now that we have laid the foundation of the building blocks and the layers of evaluation , in the next part of this series we will continue to look into demystifying some of the existing frameworks that helps us to assess the RAG Evaluation. Looking forward to seeing you in the next part! From 931b06ad2eb80f99d20f414c50f526b82e6697c0 Mon Sep 17 00:00:00 2001 From: Atita Arora Date: Wed, 31 Jan 2024 10:47:56 +0100 Subject: [PATCH 07/28] Update docs/use_cases/retrieval_augmented_generation_eval.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kacper Łukawski --- docs/use_cases/retrieval_augmented_generation_eval.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index d97b2c80a..341e9c1d5 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -171,7 +171,7 @@ also leverage human evaluation to evaluate subjective information, such as conte You can also build a classified 'domain - questions' set based on question complexity (easy, medium, hard). It can give you an overall sense of the RAG performance. Nevertheless, it is a challenge to formulate a comprehensive set of metrics. It -has to appraise he quality of responses from LLMs. It remains an ongoing and intricate issue in the context of natural language processing. +has to appraise the quality of responses from LLMs. It remains an ongoing and intricate issue in the context of natural language processing. We have laid the foundation, and we know more about the layers of evaluation. From b8dbe1d15f284caf060b42220ece4fa1b9018e06 Mon Sep 17 00:00:00 2001 From: atita arora Date: Wed, 31 Jan 2024 13:32:11 +0100 Subject: [PATCH 08/28] Accommodated suggestions and review comments --- .../rag_challenges.jpg | Bin 0 -> 41131 bytes .../rag_challenges.png | Bin 60635 -> 0 bytes .../retrieval_augmented_generation_eval.md | 49 +++++++++--------- 3 files changed, 25 insertions(+), 24 deletions(-) create mode 100644 docs/assets/use_cases/retrieval_augmented_generation_eval/rag_challenges.jpg delete mode 100644 docs/assets/use_cases/retrieval_augmented_generation_eval/rag_challenges.png diff --git a/docs/assets/use_cases/retrieval_augmented_generation_eval/rag_challenges.jpg b/docs/assets/use_cases/retrieval_augmented_generation_eval/rag_challenges.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9f9294f40debda7b3a28b47074d3f39aa001f8d9 GIT binary patch literal 41131 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 M1OHP8cKk8^Cj@&{Y5)KL literal 0 HcmV?d00001 diff --git a/docs/assets/use_cases/retrieval_augmented_generation_eval/rag_challenges.png b/docs/assets/use_cases/retrieval_augmented_generation_eval/rag_challenges.png deleted file mode 100644 index 43929df1872161627b03c03ab01f35637d9db5f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60635 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 diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index 341e9c1d5..584dc42d6 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -9,7 +9,7 @@ Implementation of RAG using Qdrant as a vector database **Disclaimer**: -The provided implementation serves as an example using [Qdrant]("https://qdrant.tech"). Alternative Vector Databases are also available. To determine the most suitable Vector Database for your specific use case, please refer to the [Vector DB feature matrix]("https://vdbs.superlinked.com/") +The provided implementation serves as an example using [Qdrant](https://qdrant.tech). Alternative Vector Databases are also available. To determine the most suitable Vector Database for your specific use case, please refer to the [Vector DB feature matrix](https://vdbs.superlinked.com/) **RAG** stands for **Retrieval Augmented Generation**, and it probably is the most useful application of large language models lately. It is the technique that combines the strengths of both retrieval and generation models. The retrieval is usually based on dense vector search, in combination with a text generation model like GPT. @@ -17,13 +17,13 @@ It is the technique that combines the strengths of both retrieval and generation RAG has received significant attention due to its ability to enhance content generation by leveraging existing information effectively. Its capacity to amalgamate specific, relevant details from multiple sources and generate accurate and relevant content has a lot of potential in various domains like content creation, question & answer application, and information synthesis. -Read more: [here]("https://hub.superlinked.com/retrieval-augmented-generation") +Read more: [here](https://hub.superlinked.com/retrieval-augmented-generation) ## Why do we need RAG? -You can leverage RAG to enhance [vector search](https://qdrant.tech/documentation/overview/vector-search/), allowing users to generate new content based on the retrieved knowledge. +RAG plays a crucial role to significantly enhance [vector search](https://qdrant.tech/documentation/overview/vector-search/) with the power of Large Language Model (LLM), enabling dynamic content generation based on the retrieved knowledge. -RAG proves invaluable for tasks requiring detailed, coherent explanations, summaries, or responses that transcend the explicit data stored in vectors. +It proves invaluable for tasks requiring detailed, coherent explanations, summaries, or responses that transcend the explicit data stored in vectors. While vector search efficiently finds similar items, RAG takes a step further, offering content synthesis and a deeper level of understanding. If the question is : "When is vector search alone not enough?" @@ -39,26 +39,28 @@ about the unknowns. The lesson is to improve and optimize your solution through ### Why do you need to evaluate? -Evaluation is a very crucial step to distill a sense of Trust in your application, which establishes reputation, and boosts team morale and confidence. -Needless to say, it also validates that your applications avoid common pitfalls, and it is no different Evaluation is key. It distills a sense of Trust in your application, +Evaluation is key. It distills a sense of Trust in your application, which establishes reputation, and boosts team morale and confidence. It also validates that your applications avoid common pitfalls. -The aspect of relevance assessment through DCG / nDCG or machine learning model through train-validation-test split/overfitting/underfitting analysis addressed similar concerns. -And for some who think LLMs are perfect, they can and do make mistakes too!! 🙂 +As we know, LLMs can make mistakes!! 🙂 + One problem is that the 'data' frequently changes. Evaluation helps ensure the results are consistent with user expectations. -### If you can't quantify it, you can't improve it!! +> If you can't quantify it, you can't improve it!! -
For RAG it can be restated as : +For RAG it can be restated as : -### If you can't retrieve it, you can't generate it!! +>If you can't retrieve it, you can't generate it!! Our experience has taught us that it is better to evaluate each component in isolation. As for different components of RAG viz. Information Retrieval - Context Augmentation - Response Generation , we classified challenges of RAG as below : -Classification of Challenges of RAG Evaluation +
+Classification of Challenges of RAG Evaluation +
Slide from RAG Evaluation Presentation mentions ['Lost in the Middle' problem](https://arxiv.org/abs/2307.03172)
+
For evaluation, we need metrics/methodology/frameworks that uses one or more tools. The tools that you use should cover each component of RAG. Such coverage @@ -80,13 +82,12 @@ Now that we have defined different challenges and levels at which we can break d ### Model Evaluation -To evaluate our model, we start with this [Massive Text Embedding Benchmark](https://github.com/embeddings-benchmark/mteb#leaderboard). We want to ensure that -the model can understand the data that we encode. +To evaluate our model, we start with this [Massive Text Embedding Benchmark](https://huggingface.co/spaces/mteb/leaderboard). +We want to ensure that the model can understand the data that we encode. The benchmark shown above leverages different public/private datasets to evaluate and report on the different capabilities of individual models. -If you're working with specialized domains, you may want to put together a -specialized dataset to teach the model. +If you're working with specialized domains, you may want to put together a specialized dataset to teach the model. -We could either leverage the results here (provided our model belongs to this list) or run relevant 'tasks' for our custom model (instructions provided in the link) +We could either leverage the results here (provided our model belongs to this list) or run relevant 'tasks' for our custom model (instructions provided in the github [link](https://github.com/embeddings-benchmark/mteb#leaderboard)) ```python import logging @@ -111,7 +112,7 @@ print("--DONE--") We first validate the model, and train it on the language of our domain. We can then configure data ingestion into our semantic retrieval store aka vector store. Various vector databases offer index configurations to influence and enhance the retrieval quality, based on the supported index types (Flat , LSH , HNSW and IVF). -One such example here to improve HNSW [retrieval-quality]("https://qdrant.tech/documentation/tutorials/retrieval-quality/"). +One such example here to improve HNSW [retrieval-quality](https://qdrant.tech/documentation/tutorials/retrieval-quality/). To evaluate ingestion, we need to focus on related variables, such as: @@ -121,7 +122,7 @@ To evaluate ingestion, we need to focus on related variables, such as: * **Chunking/Text splitting strategy** - represents the process of data splitting and further treatment as mentioned above. -A [utility]("https://chunkviz.up.railway.app/") like this seem useful to visualise your apparent chunks. +A [utility](https://chunkviz.up.railway.app/) like this seems useful to visualise your apparent chunks. ### Semantic Retrieval Evaluation @@ -141,7 +142,7 @@ We have several existing metrics to guide and define our baseline: The nature of semantic information retrieval poses a challenge at this stage, as the documents are retrieved beyond the keywords/synonyms/token enrichment-matching. -You can build a reference evaluation set, known as a [Golden Set]("https://www.luigisbox.com/search-glossary/golden-set/"). We could also leverage [T5 Model]("https://huggingface.co/docs/transformers/model_doc/t5") to generate a starter pack for evaluation. +You can build a reference evaluation set, known as a [Golden Set](https://www.luigisbox.com/search-glossary/golden-set/). We could also leverage [T5 Model](https://huggingface.co/docs/transformers/model_doc/t5) to generate a starter pack for evaluation. The golden set is a fundamental component in information retrieval evaluation. It helps in define characteristics of a reference standard to assess the performance, effectiveness, and relevance of a selected retrieval algorithm. @@ -154,15 +155,15 @@ An end-to-end evaluation covers the response generation of the question. It leve Evaluating the quality of responses produced by large language models can be a challenge due to various factors as described above. -By virtue of nature and design , the answers generated rely on diversity of response which makes it impossible to device a fixed metric or methodology that fits in all domains and use-cases. +By virtue of nature and design, the answers generated rely on the diversity of response which makes it impossible to devise a fixed metric or methodology that fits all domains and use-cases. To address these difficulties, you may use a blend of existing metrics like the following scores: -- [BLEU]("https://huggingface.co/spaces/evaluate-metric/bleu") -- [ROUGE]("https://huggingface.co/spaces/evaluate-metric/rouge") +- [BLEU](https://huggingface.co/spaces/evaluate-metric/bleu) +- [ROUGE](https://huggingface.co/spaces/evaluate-metric/rouge) You can then combine these score with LLM-based or human evaluation methods. -For more information, see this paper which provides great ideas to establish [Quality Criteria]("https://scholarspace.manoa.hawaii.edu/server/api/core/bitstreams/c6a53998-09e3-4d17-91fd-c7416d51b250/content") for the same. +For more information, see this paper which provides great ideas to establish [Quality Criteria](https://scholarspace.manoa.hawaii.edu/server/api/core/bitstreams/c6a53998-09e3-4d17-91fd-c7416d51b250/content) for the same. To summarize, you want to establish methods to automate evaluating similarity and content overlap between generated response and reference summaries. You can From a794e78d68b1bc0a38996883a2cee812543c7a58 Mon Sep 17 00:00:00 2001 From: Atita Arora Date: Wed, 31 Jan 2024 17:01:35 +0100 Subject: [PATCH 09/28] Update docs/use_cases/retrieval_augmented_generation_eval.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For image caption Co-authored-by: Kacper Łukawski --- docs/use_cases/retrieval_augmented_generation_eval.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index 584dc42d6..f6d841629 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -59,7 +59,7 @@ As for different components of RAG viz. Information Retrieval - Context Augmenta
Classification of Challenges of RAG Evaluation -
Slide from RAG Evaluation Presentation mentions ['Lost in the Middle' problem](https://arxiv.org/abs/2307.03172)
+
Slide from RAG Evaluation Presentation mentions 'Lost in the Middle' problem
For evaluation, we need metrics/methodology/frameworks that uses one or more From 207bbe0fe56ed92a666992fe61ca40b6793a909d Mon Sep 17 00:00:00 2001 From: Atita Arora Date: Fri, 2 Feb 2024 11:00:16 +0100 Subject: [PATCH 10/28] Update docs/use_cases/retrieval_augmented_generation_eval.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mór Kapronczay --- docs/use_cases/retrieval_augmented_generation_eval.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index f6d841629..3215ac580 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -51,7 +51,7 @@ One problem is that the 'data' frequently changes. Evaluation helps ensure the r For RAG it can be restated as : ->If you can't retrieve it, you can't generate it!! +> If you can't retrieve it, you can't generate it!! Our experience has taught us that it is better to evaluate each component in isolation. From b1fdf99b0516843f3085b36ea8d83305c9a6e3da Mon Sep 17 00:00:00 2001 From: Atita Arora Date: Fri, 2 Feb 2024 11:01:59 +0100 Subject: [PATCH 11/28] Update docs/use_cases/retrieval_augmented_generation_eval.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mór Kapronczay --- docs/use_cases/retrieval_augmented_generation_eval.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index 3215ac580..1e6109390 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -85,7 +85,7 @@ Now that we have defined different challenges and levels at which we can break d To evaluate our model, we start with this [Massive Text Embedding Benchmark](https://huggingface.co/spaces/mteb/leaderboard). We want to ensure that the model can understand the data that we encode. The benchmark shown above leverages different public/private datasets to evaluate and report on the different capabilities of individual models. -If you're working with specialized domains, you may want to put together a specialized dataset to teach the model. +If you're working with specialized domains, you may want to put together a specialized dataset to train the model. We could either leverage the results here (provided our model belongs to this list) or run relevant 'tasks' for our custom model (instructions provided in the github [link](https://github.com/embeddings-benchmark/mteb#leaderboard)) From 0fc81e785005af808647ed93341aed5527d826c1 Mon Sep 17 00:00:00 2001 From: Atita Arora Date: Fri, 2 Feb 2024 11:02:24 +0100 Subject: [PATCH 12/28] Update docs/use_cases/retrieval_augmented_generation_eval.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mór Kapronczay --- docs/use_cases/retrieval_augmented_generation_eval.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index 1e6109390..26bbbf0b2 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -128,7 +128,7 @@ A [utility](https://chunkviz.up.railway.app/) like this seems useful to visualis The next step is semantic retrieval evaluation. It puts the work you've done so far to a litmus test. -Retrieval is the vital component of the RAG and its evaluation can be addressed as a classic information retrieval evaluation problem. +Retrieval is a vital component of RAG and its evaluation can be addressed as a classic information retrieval evaluation problem. You need to establish the expectations from the returned results. This can help us to identify reference metrics and important parameters. Done correctly, it From 49899faa9f7bc426aa8dc7091cd6ac8cb8d0069e Mon Sep 17 00:00:00 2001 From: atita arora Date: Fri, 2 Feb 2024 13:23:34 +0100 Subject: [PATCH 13/28] Changes per Review suggestions --- .../retrieval_augmented_generation_eval.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index 26bbbf0b2..a00beccc3 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -21,16 +21,20 @@ Read more: [here](https://hub.superlinked.com/retrieval-augmented-generation) ## Why do we need RAG? -RAG plays a crucial role to significantly enhance [vector search](https://qdrant.tech/documentation/overview/vector-search/) with the power of Large Language Model (LLM), enabling dynamic content generation based on the retrieved knowledge. +RAG plays a crucial role in significantly enhancing [vector search](https://qdrant.tech/documentation/overview/vector-search/) with the power of Large Language Model (LLM), +enabling dynamic content generation based on the retrieved knowledge. +It proves invaluable for tasks requiring detailed, coherent explanations, summaries, or responses that transcend the explicit data stored in vectors. -It proves invaluable for tasks requiring detailed, coherent explanations, summaries, or responses that transcend the explicit data stored in vectors. -While vector search efficiently finds similar items, RAG takes a step further, offering content synthesis and a deeper level of understanding. +While vector search efficiently retrieves relevant similar documents/chunks, RAG takes a step further, providing unique and tailored answers for each query. +This distinction ensures that every response is not only relevant but also personalized, offering content synthesis and a deeper level of understanding beyond document retrieval, +contributing to an enriched user experience. If the question is : "When is vector search alone not enough?" -RAG becomes crucial when users seek to generate new content rather than interact with documents or search results directly. +RAG becomes indispensable when users seek to generate new content rather than interact with documents or search results directly. It excels in providing contextually rich, informative, and human-like responses, making it an ideal solution for a comprehensive and versatile approach when integrated with vector search. -Your next step is to conduct feasibility studies and correlate the results with your business needs and value expectations. +*While we've highlighted the substantial benefits of RAG, it's essential to note that its effectiveness may vary based on your unique business requirements. +Consider conducting feasibility studies to ensure that RAG aligns to your specific needs and correlates with your value expectations.* ## Evaluating Retrieval-Augmented Generation From ff079ecbe657d1249832be33831f5ec41e0a0814 Mon Sep 17 00:00:00 2001 From: atita arora Date: Thu, 8 Feb 2024 12:48:49 +0100 Subject: [PATCH 14/28] Changes per Review suggestions --- .../retrieval_augmented_generation_eval.md | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index a00beccc3..264472f34 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -46,10 +46,11 @@ about the unknowns. The lesson is to improve and optimize your solution through Evaluation is key. It distills a sense of Trust in your application, which establishes reputation, and boosts team morale and confidence. It also validates that your applications avoid common pitfalls. - As we know, LLMs can make mistakes!! 🙂 -One problem is that the 'data' frequently changes. Evaluation helps ensure the results are consistent with user expectations. +The 'data' you leverage to build your RAG is likely to be dynamic in nature which may often undergo frequent changes. +Not only are there going to be new queries , this can include data used to build response - like real-time data streams , economic fluctuations , business metrics or research data to name a few. +Evaluation helps ensure the results are consistent with user expectations. > If you can't quantify it, you can't improve it!! @@ -59,26 +60,24 @@ For RAG it can be restated as : Our experience has taught us that it is better to evaluate each component in isolation. -As for different components of RAG viz. Information Retrieval - Context Augmentation - Response Generation , we classified challenges of RAG as below : +As for different components of RAG viz. Information Retrieval , Context Augmentation and Response Generation , we classified challenges of RAG as below :
Classification of Challenges of RAG Evaluation
Slide from RAG Evaluation Presentation mentions 'Lost in the Middle' problem
-For evaluation, we need metrics/methodology/frameworks that uses one or more -tools. The tools that you use should cover each component of RAG. Such coverage -ensures granular and thorough measurements. +For effective evaluation, we propose a framework such that the coverage ensures granular and thorough measurements. Evaluation metrics can assess: -- Retrieval effectiveness -- Coherence of generated responses -- Relevance to the retrieved information. +- Retrieval effectiveness - as a measure of accuracy of the retrieved relevant information from the underlying vector database that aligns with user's query intent. +- Relevance to the retrieved information - as a measure of generated responses being meaningful and aligned with the content and context of retrieved information. +- Coherence of generated responses - as a measure of generated responses being logically connected , fluent and contextually consistent with the user's query. Granular Levels of Evaluation of RAG -### Let's dive in !! +**Let's dive in !!** ## Strategies for Evaluation @@ -120,11 +119,11 @@ One such example here to improve HNSW [retrieval-quality](https://qdrant.tech/do To evaluate ingestion, we need to focus on related variables, such as: -* **Chunk size** - represents the size of each segment. This depends on the token limit of our embedding model. It also has a substantial impact on the contextual understanding of the data. That impacts the precision, recall, and relevancy of our results. +* **Chunk size** - represents the size of each segment. This depends on the token limit of our embedding model. It also has a substantial control on the granularity of the information and impact on the contextual understanding of the data. That impacts the precision, recall, and relevancy of our results. * **Chunk overlap** - represents the presence of overlapping information fragments in each segment. This helps with context retention of the information chunks but at the same time must be used with relevant strategies like deduplication, and content normalization to eradicate adverse effects. -* **Chunking/Text splitting strategy** - represents the process of data splitting and further treatment as mentioned above. +* **Chunking/Text splitting strategy** - represents the process of data splitting and further treatment based on the type of data for e.g. html , markdown , code , or pdf combined with nuances from the use-case like a summarization use-case may split segments based on chapters or paragraphs , legal document assistant may divide documents into sections based on headings and subsections , medical literature assistant may split them based on sentence boundaries or key-concepts. A [utility](https://chunkviz.up.railway.app/) like this seems useful to visualise your apparent chunks. @@ -144,7 +143,7 @@ We have several existing metrics to guide and define our baseline: - Precision and Recall or their combination F1 Score - DCG and nDCG, which relates to their relevance, based on the inclusion or rank of documents in the results -The nature of semantic information retrieval poses a challenge at this stage, as the documents are retrieved beyond the keywords/synonyms/token enrichment-matching. +At this stage, the challenge arises in semantic information retrieval, where retrieval transcends mere keyword matching, encompassing considerations beyond synonyms and token-level enrichment. You can build a reference evaluation set, known as a [Golden Set](https://www.luigisbox.com/search-glossary/golden-set/). We could also leverage [T5 Model](https://huggingface.co/docs/transformers/model_doc/t5) to generate a starter pack for evaluation. From a0f7672721eb58cab07ca1b0b3d75a99daa33706 Mon Sep 17 00:00:00 2001 From: Atita Arora Date: Thu, 8 Feb 2024 16:08:42 +0100 Subject: [PATCH 15/28] Update docs/use_cases/retrieval_augmented_generation_eval.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mór Kapronczay --- docs/use_cases/retrieval_augmented_generation_eval.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index 264472f34..9218f2e7f 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -112,7 +112,7 @@ print("--DONE--") ### Data Ingestion Evaluation -We first validate the model, and train it on the language of our domain. +After we evaluated our model's performance using benchmarks, and optionally fine-tuned it on the language of our domain, We can then configure data ingestion into our semantic retrieval store aka vector store. Various vector databases offer index configurations to influence and enhance the retrieval quality, based on the supported index types (Flat , LSH , HNSW and IVF). One such example here to improve HNSW [retrieval-quality](https://qdrant.tech/documentation/tutorials/retrieval-quality/). From 9808ac569b2f649c1118a618b78d1936787820ce Mon Sep 17 00:00:00 2001 From: Atita Arora Date: Thu, 8 Feb 2024 16:08:58 +0100 Subject: [PATCH 16/28] Update docs/use_cases/retrieval_augmented_generation_eval.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mór Kapronczay --- docs/use_cases/retrieval_augmented_generation_eval.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index 9218f2e7f..04ea70f2e 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -113,7 +113,7 @@ print("--DONE--") ### Data Ingestion Evaluation After we evaluated our model's performance using benchmarks, and optionally fine-tuned it on the language of our domain, -We can then configure data ingestion into our semantic retrieval store aka vector store. +we can then configure data ingestion into our semantic retrieval store aka vector store. Various vector databases offer index configurations to influence and enhance the retrieval quality, based on the supported index types (Flat , LSH , HNSW and IVF). One such example here to improve HNSW [retrieval-quality](https://qdrant.tech/documentation/tutorials/retrieval-quality/). From 7db01ee61aa0112276866fc062c77ad8098e796a Mon Sep 17 00:00:00 2001 From: robertturner <143536791+robertdhayanturner@users.noreply.github.com> Date: Fri, 9 Feb 2024 18:17:57 -0500 Subject: [PATCH 17/28] Update retrieval_augmented_generation_eval.md in progress commit. not ready for review by author yet. --- .../retrieval_augmented_generation_eval.md | 160 ++++++------------ 1 file changed, 51 insertions(+), 109 deletions(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index 04ea70f2e..4fe67981c 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -3,94 +3,63 @@ # Evaluating Retrieval Augmented Generation +## Why evaluate RAG? -## Understanding Retrieval-Augmented Generation +Retrieval Augmented Generation (RAG) is probably the most useful application of large language models today. RAG enhances content generation by leveraging existing information effectively. It can amalgamate specific, relevant details from multiple sources to generate more accurate and relevant query results. This makes RAG potentially invaluable in various domains like content creation, question & answer application, and information synthesis. RAG does this by combining the strengths of retrieval - usually using dense vector search - and text generation models - like GPT. For a more in-depth introduction to RAG, read [here](https://hub.superlinked.com/retrieval-augmented-generation). -Implementation of RAG using Qdrant as a vector database - -**Disclaimer**: -The provided implementation serves as an example using [Qdrant](https://qdrant.tech). Alternative Vector Databases are also available. To determine the most suitable Vector Database for your specific use case, please refer to the [Vector DB feature matrix](https://vdbs.superlinked.com/) +But to see what is and isn't working in your RAG system, to refine and optimize, you have to **evaluate** it... LLMs can make mistakes.... +((outline what you did with your RAG eval... +This is first of three articles. In this article we go over the broad strokes of a general evaluation approach...)) -**RAG** stands for **Retrieval Augmented Generation**, and it probably is the most useful application of large language models lately. -It is the technique that combines the strengths of both retrieval and generation models. The retrieval is usually based on dense vector search, in combination with a text generation model like GPT. - -RAG has received significant attention due to its ability to enhance content generation by leveraging existing information effectively. -Its capacity to amalgamate specific, relevant details from multiple sources and generate accurate and relevant content has a lot of potential in various domains like content creation, question & answer application, and information synthesis. +Implementation of RAG using Qdrant as a vector database -Read more: [here](https://hub.superlinked.com/retrieval-augmented-generation) +While we use Qdrant, there are a lot of Vector Databases. To determine which one is most suited to your specific use case, please refer to the [Vector DB feature matrix](https://vdbs.superlinked.com/). ## Why do we need RAG? -RAG plays a crucial role in significantly enhancing [vector search](https://qdrant.tech/documentation/overview/vector-search/) with the power of Large Language Model (LLM), -enabling dynamic content generation based on the retrieved knowledge. -It proves invaluable for tasks requiring detailed, coherent explanations, summaries, or responses that transcend the explicit data stored in vectors. - -While vector search efficiently retrieves relevant similar documents/chunks, RAG takes a step further, providing unique and tailored answers for each query. -This distinction ensures that every response is not only relevant but also personalized, offering content synthesis and a deeper level of understanding beyond document retrieval, -contributing to an enriched user experience. - -If the question is : "When is vector search alone not enough?" -RAG becomes indispensable when users seek to generate new content rather than interact with documents or search results directly. -It excels in providing contextually rich, informative, and human-like responses, making it an ideal solution for a comprehensive and versatile approach when integrated with vector search. - -*While we've highlighted the substantial benefits of RAG, it's essential to note that its effectiveness may vary based on your unique business requirements. -Consider conducting feasibility studies to ensure that RAG aligns to your specific needs and correlates with your value expectations.* +RAG significantly enhances [vector search](https://hub.superlinked.com/vector-search) with the power of Large Language Models (LLM), by enabling dynamic content generation based on retrieved knowledge. RAG is indispensable when users seek to generate new content rather than interact with documents or search results directly. It excels in providing contextually rich, informative, and human-like responses. For tasks requiring detailed, coherent explanations, summaries, or responses that transcend the explicit data stored in vectors, RAG is invaluable. _Before setting up an RAG system, you should consider conducting feasibility studies to determine how and whether RAG aligns with your specific needs and value expectations._ -## Evaluating Retrieval-Augmented Generation +While vector search efficiently retrieves relevant similar documents/chunks from a document corpus, RAG permits content synthesis and a deeper level of understanding, providing essential context to queries and results generation. In this way, RAG can ensure that answers are unique and tailored for each query, in essence personalized to the user. -Our experience scaling RAG from Proof-of-concept (POC) to production taught us -about the unknowns. The lesson is to improve and optimize your solution through evaluation. +These are the promises of RAG. But how do we make sure that our RAG system is achieving its potential? -### Why do you need to evaluate? +## Evaluating RAG -Evaluation is key. It distills a sense of Trust in your application, -which establishes reputation, and boosts team morale and confidence. -It also validates that your applications avoid common pitfalls. -As we know, LLMs can make mistakes!! 🙂 +In the process of scaling RAG from Proof-of-concept (POC) to production ((in ....add details here)), we learned many things. But chief among them was the **importance of evaluation in improving and optimizing our RAG system**. -The 'data' you leverage to build your RAG is likely to be dynamic in nature which may often undergo frequent changes. -Not only are there going to be new queries , this can include data used to build response - like real-time data streams , economic fluctuations , business metrics or research data to name a few. -Evaluation helps ensure the results are consistent with user expectations. +> If you can't quantify it, you can't improve it. - Peter Drucker -> If you can't quantify it, you can't improve it!! +In the case of RAG, not only is it important to have good metrics, but that you measure things separately. That is: -For RAG it can be restated as : +> If you can't retrieve it, you can't generate it. -> If you can't retrieve it, you can't generate it!! - -Our experience has taught us that it is better to evaluate each component in isolation. - -As for different components of RAG viz. Information Retrieval , Context Augmentation and Response Generation , we classified challenges of RAG as below : +To see where things are going well, can be improved, and also where errors may originate, it's important to evaluate each component in isolation. In the following visual, we've classified RAG's components - Information Retrieval, Context Augmentation, and Response Generation - along with what needs evaluation in each:
Classification of Challenges of RAG Evaluation
Slide from RAG Evaluation Presentation mentions 'Lost in the Middle' problem
-For effective evaluation, we propose a framework such that the coverage ensures granular and thorough measurements. +The evaluation framework we propose is meant to ensure granular and thorough measurement, addressing the challenges faced in all three components. Broadly, we want to assess: -Evaluation metrics can assess: +- Retrieval effectiveness - the accuracy of the information retrieved from the underlying vector database that aligns with user's query intent. ((still vague)) +- Relevance of responses to retrieved information - how meaningful and aligned the generated responses are with the content and context of retrieved information. +- Coherence of generated responses - how logically connected, fluent, and contextually consistent generated responses are with the user's query. +- (( possibly additional point repurposed from above, b/c doesn't fit anywhere above: "Data currency - the data you leverage to build your RAG is likely to be dynamic in nature, including not only new queries, but also updates to the data corpus used to generate responses; your database may be continuously revised with data from real-time data streams, economic fluctuations, business metrics or research data, and so on.")) -- Retrieval effectiveness - as a measure of accuracy of the retrieved relevant information from the underlying vector database that aligns with user's query intent. -- Relevance to the retrieved information - as a measure of generated responses being meaningful and aligned with the content and context of retrieved information. -- Coherence of generated responses - as a measure of generated responses being logically connected , fluent and contextually consistent with the user's query. - -Granular Levels of Evaluation of RAG +## Strategies for Evaluation -**Let's dive in !!** +To meet these evaluation challenges systematically, we should break down our evaluation into different levels. -## Strategies for Evaluation +Granular Levels of Evaluation of RAG -Now that we have defined different challenges and levels at which we can break down the RAG evaluation, let us zoom into the levels individually. +Let's take a closer look to see what's involved in each of the levels individually. -### Model Evaluation +### Model Evaluation -To evaluate our model, we start with this [Massive Text Embedding Benchmark](https://huggingface.co/spaces/mteb/leaderboard). -We want to ensure that the model can understand the data that we encode. -The benchmark shown above leverages different public/private datasets to evaluate and report on the different capabilities of individual models. -If you're working with specialized domains, you may want to put together a specialized dataset to train the model. +We want to ensure that the model can understand the data that we encode. The [Massive Text Embedding Benchmark (MTEB)](https://huggingface.co/spaces/mteb/leaderboard) leverages different public/private datasets to evaluate and report on the different capabilities of individual models. We can use the MTEB to evaluate any model in its list. If, on the other hand, you're working with specialized domains, you may want to put together a specialized dataset to train the model. Another option is to run relevant 'tasks' for our custom model, using [these instructions](https://github.com/embeddings-benchmark/mteb#leaderboard). -We could either leverage the results here (provided our model belongs to this list) or run relevant 'tasks' for our custom model (instructions provided in the github [link](https://github.com/embeddings-benchmark/mteb#leaderboard)) +Fortunately, our pretrained model (average_word_embeddings_komninos) is in the MTEB, so let's import, configure, initialize, and then evaluate our model: ```python import logging @@ -98,10 +67,8 @@ import logging from mteb import MTEB from sentence_transformers import SentenceTransformer - logging.basicConfig(level=logging.INFO) - model_name = "average_word_embeddings_komninos" model = SentenceTransformer(model_name) evaluation = MTEB(task_langs=["en"]) @@ -112,73 +79,48 @@ print("--DONE--") ### Data Ingestion Evaluation -After we evaluated our model's performance using benchmarks, and optionally fine-tuned it on the language of our domain, -we can then configure data ingestion into our semantic retrieval store aka vector store. -Various vector databases offer index configurations to influence and enhance the retrieval quality, based on the supported index types (Flat , LSH , HNSW and IVF). -One such example here to improve HNSW [retrieval-quality](https://qdrant.tech/documentation/tutorials/retrieval-quality/). - -To evaluate ingestion, we need to focus on related variables, such as: - -* **Chunk size** - represents the size of each segment. This depends on the token limit of our embedding model. It also has a substantial control on the granularity of the information and impact on the contextual understanding of the data. That impacts the precision, recall, and relevancy of our results. +After we evaluate our model’s performance using benchmarks, and optionally fine-tune it on the language of our domain, we can then configure data ingestion into our semantic retrieval store (vector store). Various vector databases offer index configurations (of whatever index types the database supports) to influence and enhance the retrieval quality. Common index types include Flat (Brute Force), LSH (Locality Sensitive Hashing), HNSW (Hierarchical Navigable Small World), and IVF (Inverted File Index). Here's one such example, based on HNSW retrieval-quality. -* **Chunk overlap** - represents the presence of overlapping information fragments in each segment. This helps with context retention of the information chunks but at the same time must be used with relevant strategies like deduplication, and content normalization to eradicate adverse effects. +cop: Evaluating the effect of these variables means observing and measuring how changes in chunk size, chunk overlap, and text splitting strategy impact the performance and effectiveness of data ingestion. -* **Chunking/Text splitting strategy** - represents the process of data splitting and further treatment based on the type of data for e.g. html , markdown , code , or pdf combined with nuances from the use-case like a summarization use-case may split segments based on chapters or paragraphs , legal document assistant may divide documents into sections based on headings and subsections , medical literature assistant may split them based on sentence boundaries or key-concepts. +To evaluate ingestion, we need to focus on how changes in related variables affect ingestion outcomes. For example: +* **Chunk size** - the size of each data segment, and depends on the token limit of our embedding model. Chunk size substantially determines data granularity and the contextual understanding of the data, which impacts the precision, recall, and relevancy of our results. +* **Chunk overlap** - the extent to which data points of events are shared by adjacent data chunks. Overlap helps with retention of context information in chunks, but should be paired with strategies like deduplication and content normalization to eradicate adverse effects (redundancy or inconsistency). +* **Chunking/Text splitting strategy** - the process of data splitting and further treatment, based on both data type (e.g. html, markdown, code, or pdf, etc.) and nuances of your use-case. For example, summarization use-cases might split segments based on chapters or paragraphs; a legal document assistant might section docs based on headings and subsections; a medical literature assistant might split docs based on sentence boundaries or key concepts. -A [utility](https://chunkviz.up.railway.app/) like this seems useful to visualise your apparent chunks. +Utilities like [ChunkViz](https://chunkviz.up.railway.app/) help visualize different chunk splitting strategies on different chunk sizes and chunk overlaps. ### Semantic Retrieval Evaluation -The next step is semantic retrieval evaluation. It puts the work you've done so far to a litmus test. - -Retrieval is a vital component of RAG and its evaluation can be addressed as a classic information retrieval evaluation problem. - -You need to establish the expectations from the returned results. This can help -us to identify reference metrics and important parameters. Done correctly, it -helps us determine if the documents retrieved at this stage are relevant -results. - -We have several existing metrics to guide and define our baseline: +Semantic retrieval evaluation puts the work you've done so far in evaluating your model and ingestion to a litmus test, and can be approached like a classic information retrieval evaluation problem - that is, using metrics such as precision, recall, accuracy, and F1-score to determine if retrieved documents are relevant. -- Precision and Recall or their combination F1 Score -- DCG and nDCG, which relates to their relevance, based on the inclusion or rank of documents in the results - -At this stage, the challenge arises in semantic information retrieval, where retrieval transcends mere keyword matching, encompassing considerations beyond synonyms and token-level enrichment. - -You can build a reference evaluation set, known as a [Golden Set](https://www.luigisbox.com/search-glossary/golden-set/). We could also leverage [T5 Model](https://huggingface.co/docs/transformers/model_doc/t5) to generate a starter pack for evaluation. - -The golden set is a fundamental component in information retrieval evaluation. -It helps in define characteristics of a reference standard to assess the performance, effectiveness, and relevance of a selected retrieval algorithm. -It provides a common ground for objective comparison and improvement of a retrieval process/algorithm. +First, we establish what we expect the returned results to look like in terms of important parameters. This guides our choice of reference metrics. We have several existing metrics to guide and define our baseline: +- Precision (accuracy), Recall (completeness), or their combination F1 Score +- DCG (Discounted Cumulative Gain) and nDCG (normalized DCG), which measure the relevance quality of ranked lists of documents +But semantic retrieval, because it goes beyond mere keyword matching, synonyms, and token-level enrichment, and encompasses broader semantic understanding and context, typically requires a "ground truth" evaluation set - a [Golden Set](https://www.luigisbox.com/search-glossary/golden-set/). A Golden Set assesses the correctness and faithfulness of generated answers to a human annotated reference set. + +We could leverage the [T5 Model](https://huggingface.co/docs/transformers/model_doc/t5) to generate a starter pack for evaluation using a Golden Set. ### End-to-End Evaluation -An end-to-end evaluation covers the response generation of the question. It leverages the provided context through retrieved documents. - -Evaluating the quality of responses produced by large language models can be a challenge due to various factors as described above. - -By virtue of nature and design, the answers generated rely on the diversity of response which makes it impossible to devise a fixed metric or methodology that fits all domains and use-cases. +An end-to-end evaluation of RAG assesses the final response to a query. It leverages the provided context through retrieved documents. Evaluating the quality of responses produced by large language models can be a challenge due to various factors as described above. By virtue of nature and design, the answers generated rely on the diversity of response which makes it impossible to devise a fixed metric or methodology that fits all domains and use-cases. To address these difficulties, you may use a blend of existing metrics like the following scores: - [BLEU](https://huggingface.co/spaces/evaluate-metric/bleu) - [ROUGE](https://huggingface.co/spaces/evaluate-metric/rouge) -You can then combine these score with LLM-based or human evaluation methods. -For more information, see this paper which provides great ideas to establish [Quality Criteria](https://scholarspace.manoa.hawaii.edu/server/api/core/bitstreams/c6a53998-09e3-4d17-91fd-c7416d51b250/content) for the same. - -To summarize, you want to establish methods to automate evaluating similarity -and content overlap between generated response and reference summaries. You can -also leverage human evaluation to evaluate subjective information, such as context-relevance, novelty, and fluency. +You can then combine these score with LLM-based or human evaluation methods. For more information, see this paper which provides great ideas to establish [Quality Criteria](https://scholarspace.manoa.hawaii.edu/server/api/core/bitstreams/c6a53998-09e3-4d17-91fd-c7416d51b250/content) for the same. -You can also build a classified 'domain - questions' set based on question complexity (easy, medium, hard). It can give you an overall sense of the RAG performance. +To summarize, you want to establish methods to automate evaluating similarity and content overlap between generated response and reference summaries. You can also leverage human evaluation to evaluate subjective information, such as context-relevance, novelty, and fluency. You can also build a classified 'domain - questions' set based on question complexity (easy, medium, hard). It can give you an overall sense of the RAG performance. -Nevertheless, it is a challenge to formulate a comprehensive set of metrics. It -has to appraise the quality of responses from LLMs. It remains an ongoing and intricate issue in the context of natural language processing. +Nevertheless, it is a challenge to formulate a comprehensive set of metrics. It has to appraise the quality of responses from LLMs. It remains an ongoing and intricate issue in the context of natural language processing. -We have laid the foundation, and we know more about the layers of evaluation. +We have laid the foundation, and we know more about the layers of evaluation. In the next article, we will describe how you can demystify existing frameworks. Looking forward to seeing you in the next part! -In the next article, we will describe how you can demystify existing frameworks. +## Contributors -Looking forward to seeing you in the next part! +[Atita Arora, Author](https://www.linkedin.com/in/atitaarora/) +[Mór Kapronczay, Editor](linkedin.com/in/mór-kapronczay-49447692) +[Robert Turner, Editor](https://robertturner.co/copyedit) From 6aec71d9efb8e4f4f5742395fba44566ce5ca307 Mon Sep 17 00:00:00 2001 From: robertturner <143536791+robertdhayanturner@users.noreply.github.com> Date: Fri, 9 Feb 2024 21:16:49 -0500 Subject: [PATCH 18/28] Update retrieval_augmented_generation_eval.md in progress, not yet ready for author's input --- .../retrieval_augmented_generation_eval.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index 4fe67981c..d60e9e55a 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -104,20 +104,19 @@ We could leverage the [T5 Model](https://huggingface.co/docs/transformers/model_ ### End-to-End Evaluation -An end-to-end evaluation of RAG assesses the final response to a query. It leverages the provided context through retrieved documents. Evaluating the quality of responses produced by large language models can be a challenge due to various factors as described above. By virtue of nature and design, the answers generated rely on the diversity of response which makes it impossible to devise a fixed metric or methodology that fits all domains and use-cases. +An end-to-end evaluation of a RAG application assesses the final responses generated by LLMs in response to given inputs. It requires addressing issues discussed above, related to data heterogeneity, domain specificity, and user query and preference diversity. It's impossible to devise a fixed metric or methodology that fits all domains and use-cases. -To address these difficulties, you may use a blend of existing metrics like the following scores: +To address these difficulties, you can assess the fidelity and quality of generated text using established metrics like [BLEU](https://huggingface.co/spaces/evaluate-metric/bleu) and [ROUGE](https://huggingface.co/spaces/evaluate-metric/rouge), and combine these scores with LLM-based or human evaluation methods. This [Quality Criteria paper](https://scholarspace.manoa.hawaii.edu/server/api/core/bitstreams/c6a53998-09e3-4d17-91fd-c7416d51b250/content) provides some excellent ideas for creating such a solution. -- [BLEU](https://huggingface.co/spaces/evaluate-metric/bleu) -- [ROUGE](https://huggingface.co/spaces/evaluate-metric/rouge) +## In sum... -You can then combine these score with LLM-based or human evaluation methods. For more information, see this paper which provides great ideas to establish [Quality Criteria](https://scholarspace.manoa.hawaii.edu/server/api/core/bitstreams/c6a53998-09e3-4d17-91fd-c7416d51b250/content) for the same. +To summarize, a robust RAG evaluation strategy requires you to establish methods to automatically evaluate similarity and content overlap between generated response and reference summaries. You can also leverage human evaluation to evaluate subjective information, such as context-relevance, novelty, and fluency. You can also build a classified 'domain - questions' set based on question complexity (easy, medium, hard). Doing this can give you an overall sense of the RAG performance. -To summarize, you want to establish methods to automate evaluating similarity and content overlap between generated response and reference summaries. You can also leverage human evaluation to evaluate subjective information, such as context-relevance, novelty, and fluency. You can also build a classified 'domain - questions' set based on question complexity (easy, medium, hard). It can give you an overall sense of the RAG performance. +Still, it remains complicated and challenging to formulate a comprehensive set of evaluation metrics. -Nevertheless, it is a challenge to formulate a comprehensive set of metrics. It has to appraise the quality of responses from LLMs. It remains an ongoing and intricate issue in the context of natural language processing. +## What's next -We have laid the foundation, and we know more about the layers of evaluation. In the next article, we will describe how you can demystify existing frameworks. Looking forward to seeing you in the next part! +We've laid a foundation and discussed the layers of evaluation. In the next article, we will describe how you can demystify existing frameworks ((too vague - frameworks for what?)). Looking forward to seeing you in the next part! ## Contributors From 3ffc02b6515c06c0be346f07ed8a2d506674aa6d Mon Sep 17 00:00:00 2001 From: robertturner <143536791+robertdhayanturner@users.noreply.github.com> Date: Sat, 10 Feb 2024 08:29:55 -0500 Subject: [PATCH 19/28] Update retrieval_augmented_generation_eval.md in progress, not ready for author perusal yet --- docs/use_cases/retrieval_augmented_generation_eval.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index d60e9e55a..d27c6d8a4 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -100,7 +100,7 @@ First, we establish what we expect the returned results to look like in terms of But semantic retrieval, because it goes beyond mere keyword matching, synonyms, and token-level enrichment, and encompasses broader semantic understanding and context, typically requires a "ground truth" evaluation set - a [Golden Set](https://www.luigisbox.com/search-glossary/golden-set/). A Golden Set assesses the correctness and faithfulness of generated answers to a human annotated reference set. -We could leverage the [T5 Model](https://huggingface.co/docs/transformers/model_doc/t5) to generate a starter pack for evaluation using a Golden Set. +To generate a starter pack for evaluation using a Golden Set, we can leverage the [T5 Model](https://huggingface.co/docs/transformers/model_doc/t5) . ### End-to-End Evaluation From a156b5bce1919f8137663bb8ada82e210e3d184a Mon Sep 17 00:00:00 2001 From: robertturner <143536791+robertdhayanturner@users.noreply.github.com> Date: Mon, 12 Feb 2024 13:39:08 -0500 Subject: [PATCH 20/28] Update retrieval_augmented_generation_eval.md needs input from Atita --- .../retrieval_augmented_generation_eval.md | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index d27c6d8a4..cec7ee701 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -7,13 +7,14 @@ Retrieval Augmented Generation (RAG) is probably the most useful application of large language models today. RAG enhances content generation by leveraging existing information effectively. It can amalgamate specific, relevant details from multiple sources to generate more accurate and relevant query results. This makes RAG potentially invaluable in various domains like content creation, question & answer application, and information synthesis. RAG does this by combining the strengths of retrieval - usually using dense vector search - and text generation models - like GPT. For a more in-depth introduction to RAG, read [here](https://hub.superlinked.com/retrieval-augmented-generation). -But to see what is and isn't working in your RAG system, to refine and optimize, you have to **evaluate** it... LLMs can make mistakes.... -((outline what you did with your RAG eval... -This is first of three articles. In this article we go over the broad strokes of a general evaluation approach...)) +But to see what is and isn't working in your RAG system, to refine and optimize, you have to **evaluate** it. In this article, we go over the broad strokes of our proposed evaluation approach / framework, which includes separate assessments of the model itself, data ingestion, semantic retrieval, and, finally the RAG application end-to-end, providing a high level discussion of what's involved in each. + +In article 2, we will look at RAGAS (RAG Assessment), learn how to set it up with an example, calculate some of the supported metrics, and compare that with our proposed framework. We will also look at some examples of our proposed framework. +In article 3... Implementation of RAG using Qdrant as a vector database -While we use Qdrant, there are a lot of Vector Databases. To determine which one is most suited to your specific use case, please refer to the [Vector DB feature matrix](https://vdbs.superlinked.com/). +We use Qdrant as the knowledge store for our RAG. Still, there are a lot of other Vector Databases. To determine which one is most suited to your specific use case, please refer to the [Vector DB feature matrix](https://vdbs.superlinked.com/). ## Why do we need RAG? @@ -25,7 +26,7 @@ These are the promises of RAG. But how do we make sure that our RAG system is ac ## Evaluating RAG -In the process of scaling RAG from Proof-of-concept (POC) to production ((in ....add details here)), we learned many things. But chief among them was the **importance of evaluation in improving and optimizing our RAG system**. +In the process of scaling RAG from Proof-of-concept (POC) to production, we learned many things. But chief among them was the **importance of evaluation in improving and optimizing our RAG system**. > If you can't quantify it, you can't improve it. - Peter Drucker @@ -42,14 +43,14 @@ To see where things are going well, can be improved, and also where errors may o The evaluation framework we propose is meant to ensure granular and thorough measurement, addressing the challenges faced in all three components. Broadly, we want to assess: -- Retrieval effectiveness - the accuracy of the information retrieved from the underlying vector database that aligns with user's query intent. ((still vague)) +- Retrieval effectiveness - the accuracy of the information retrieved from the underlying vector database that aligns with user's query intent. - Relevance of responses to retrieved information - how meaningful and aligned the generated responses are with the content and context of retrieved information. - Coherence of generated responses - how logically connected, fluent, and contextually consistent generated responses are with the user's query. - (( possibly additional point repurposed from above, b/c doesn't fit anywhere above: "Data currency - the data you leverage to build your RAG is likely to be dynamic in nature, including not only new queries, but also updates to the data corpus used to generate responses; your database may be continuously revised with data from real-time data streams, economic fluctuations, business metrics or research data, and so on.")) ## Strategies for Evaluation -To meet these evaluation challenges systematically, we should break down our evaluation into different levels. +To meet these evaluation challenges systematically, it's best practice to break down our evaluation into different levels, so that we understand what specifically is working well, and what needs improvement. Granular Levels of Evaluation of RAG @@ -57,7 +58,7 @@ Let's take a closer look to see what's involved in each of the levels individual ### Model Evaluation -We want to ensure that the model can understand the data that we encode. The [Massive Text Embedding Benchmark (MTEB)](https://huggingface.co/spaces/mteb/leaderboard) leverages different public/private datasets to evaluate and report on the different capabilities of individual models. We can use the MTEB to evaluate any model in its list. If, on the other hand, you're working with specialized domains, you may want to put together a specialized dataset to train the model. Another option is to run relevant 'tasks' for our custom model, using [these instructions](https://github.com/embeddings-benchmark/mteb#leaderboard). +We want to ensure that the model can understand the data that we encode. The [Massive Text Embedding Benchmark (MTEB)](https://huggingface.co/spaces/mteb/leaderboard) leverages different public/private datasets to evaluate and report on the different capabilities of individual models. We can use the MTEB to evaluate any model in its list. If, on the other hand, you're working with specialized domains, you may want to put together a specialized dataset to train the model. Another option is to run relevant 'tasks' for your custom model, using [these instructions](https://github.com/embeddings-benchmark/mteb#leaderboard). Fortunately, our pretrained model (average_word_embeddings_komninos) is in the MTEB, so let's import, configure, initialize, and then evaluate our model: @@ -79,14 +80,12 @@ print("--DONE--") ### Data Ingestion Evaluation -After we evaluate our model’s performance using benchmarks, and optionally fine-tune it on the language of our domain, we can then configure data ingestion into our semantic retrieval store (vector store). Various vector databases offer index configurations (of whatever index types the database supports) to influence and enhance the retrieval quality. Common index types include Flat (Brute Force), LSH (Locality Sensitive Hashing), HNSW (Hierarchical Navigable Small World), and IVF (Inverted File Index). Here's one such example, based on HNSW retrieval-quality. - -cop: Evaluating the effect of these variables means observing and measuring how changes in chunk size, chunk overlap, and text splitting strategy impact the performance and effectiveness of data ingestion. +After we evaluate our model’s performance using benchmarks, and (optionally) fine-tune it on the language of our domain, we can then configure data ingestion into our semantic retrieval store (vector store). Various vector databases offer index configurations (of whatever index types the database supports) to influence and enhance the retrieval quality. Common index types include Flat (Brute Force), LSH (Locality Sensitive Hashing), HNSW (Hierarchical Navigable Small World), and IVF (Inverted File Index). Here's one such example, based on HNSW retrieval-quality. -To evaluate ingestion, we need to focus on how changes in related variables affect ingestion outcomes. For example: -* **Chunk size** - the size of each data segment, and depends on the token limit of our embedding model. Chunk size substantially determines data granularity and the contextual understanding of the data, which impacts the precision, recall, and relevancy of our results. +To evaluate data ingestion, we need to observe and measure how changes in related variables affect ingestion outcomes. For example: +* **Chunk size** - the size of each data segment, which depends on the token limit of our embedding model. Chunk size substantially determines data granularity and the contextual understanding of the data, which impacts the precision, recall, and relevancy of our results. * **Chunk overlap** - the extent to which data points of events are shared by adjacent data chunks. Overlap helps with retention of context information in chunks, but should be paired with strategies like deduplication and content normalization to eradicate adverse effects (redundancy or inconsistency). -* **Chunking/Text splitting strategy** - the process of data splitting and further treatment, based on both data type (e.g. html, markdown, code, or pdf, etc.) and nuances of your use-case. For example, summarization use-cases might split segments based on chapters or paragraphs; a legal document assistant might section docs based on headings and subsections; a medical literature assistant might split docs based on sentence boundaries or key concepts. +* **Chunking/Text splitting strategy** - the process of data splitting and further treatment, based on both data type (e.g. html, markdown, code, or pdf, etc.) and nuances of your use-case. For example, summarization use-cases might split segments based on chapters or paragraphs; a legal document assistant may section docs based on headings and subsections; a medical literature assistant might split docs based on sentence boundaries or key concepts. Utilities like [ChunkViz](https://chunkviz.up.railway.app/) help visualize different chunk splitting strategies on different chunk sizes and chunk overlaps. @@ -104,19 +103,19 @@ To generate a starter pack for evaluation using a Golden Set, we can leverage th ### End-to-End Evaluation -An end-to-end evaluation of a RAG application assesses the final responses generated by LLMs in response to given inputs. It requires addressing issues discussed above, related to data heterogeneity, domain specificity, and user query and preference diversity. It's impossible to devise a fixed metric or methodology that fits all domains and use-cases. +An end-to-end evaluation of a RAG application assesses the final outputs generated by LLMs in response to given inputs. It requires addressing issues discussed above, related to data heterogeneity, domain specificity, and user query and preference diversity. It's impossible to devise a fixed metric or methodology that fits all domains and use-cases. To address these difficulties, you can assess the fidelity and quality of generated text using established metrics like [BLEU](https://huggingface.co/spaces/evaluate-metric/bleu) and [ROUGE](https://huggingface.co/spaces/evaluate-metric/rouge), and combine these scores with LLM-based or human evaluation methods. This [Quality Criteria paper](https://scholarspace.manoa.hawaii.edu/server/api/core/bitstreams/c6a53998-09e3-4d17-91fd-c7416d51b250/content) provides some excellent ideas for creating such a solution. ## In sum... -To summarize, a robust RAG evaluation strategy requires you to establish methods to automatically evaluate similarity and content overlap between generated response and reference summaries. You can also leverage human evaluation to evaluate subjective information, such as context-relevance, novelty, and fluency. You can also build a classified 'domain - questions' set based on question complexity (easy, medium, hard). Doing this can give you an overall sense of the RAG performance. +To summarize, a robust RAG evaluation strategy requires you to establish methods to automatically evaluate similarity and content overlap between generated response and reference summaries. You can also leverage human evaluation to evaluate subjective information, such as context-relevance, novelty, and fluency. In addition, you can build a classified 'domain - questions' set based on question complexity (easy, medium, hard). Doing this will provide you with an overall sense of the RAG application's performance. -Still, it remains complicated and challenging to formulate a comprehensive set of evaluation metrics. +While our proposed evaluation strategy is meant to improve RAG evaluation, we should acknowledge that no evaluation is perfect, and it remains complicated and challenging to formulate a comprehensive set of evaluation metrics. ## What's next -We've laid a foundation and discussed the layers of evaluation. In the next article, we will describe how you can demystify existing frameworks ((too vague - frameworks for what?)). Looking forward to seeing you in the next part! +We've laid a general foundation for discussing RAG evaluation. In the next article, we'll demystify some existing evaluation frameworks, including...(Trulens, Arize, maybe Quotient AI MVP), and see how well they do at covering all the layers of evaluation we've discused. Looking forward to seeing you in the next part! ## Contributors From d4d9e653c38153c487a25c01b3340c62ec48adfa Mon Sep 17 00:00:00 2001 From: robertturner <143536791+robertdhayanturner@users.noreply.github.com> Date: Tue, 13 Feb 2024 16:46:42 -0500 Subject: [PATCH 21/28] Update retrieval_augmented_generation_eval.md update.. awaiting responses from Atita --- docs/use_cases/retrieval_augmented_generation_eval.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index cec7ee701..81438abc1 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -7,10 +7,9 @@ Retrieval Augmented Generation (RAG) is probably the most useful application of large language models today. RAG enhances content generation by leveraging existing information effectively. It can amalgamate specific, relevant details from multiple sources to generate more accurate and relevant query results. This makes RAG potentially invaluable in various domains like content creation, question & answer application, and information synthesis. RAG does this by combining the strengths of retrieval - usually using dense vector search - and text generation models - like GPT. For a more in-depth introduction to RAG, read [here](https://hub.superlinked.com/retrieval-augmented-generation). -But to see what is and isn't working in your RAG system, to refine and optimize, you have to **evaluate** it. In this article, we go over the broad strokes of our proposed evaluation approach / framework, which includes separate assessments of the model itself, data ingestion, semantic retrieval, and, finally the RAG application end-to-end, providing a high level discussion of what's involved in each. +But to see what is and isn't working in your RAG system, to refine and optimize, you have to **evaluate** it. Evaluation is, therefore, essential to making sure your application does what users expect it to. In this article, we go over the broad strokes of our proposed evaluation approach / framework, which includes separate assessments of the model itself, data ingestion, semantic retrieval, and, finally the RAG application end-to-end, providing a high level discussion of what's involved in each. -In article 2, we will look at RAGAS (RAG Assessment), learn how to set it up with an example, calculate some of the supported metrics, and compare that with our proposed framework. We will also look at some examples of our proposed framework. -In article 3... +In the next article, we will look at an existing evaluation framework, learn how to set it up with an example, calculate some of the supported metrics, and compare that with our proposed framework. We will also look at some examples of our proposed framework. Implementation of RAG using Qdrant as a vector database @@ -43,10 +42,10 @@ To see where things are going well, can be improved, and also where errors may o The evaluation framework we propose is meant to ensure granular and thorough measurement, addressing the challenges faced in all three components. Broadly, we want to assess: -- Retrieval effectiveness - the accuracy of the information retrieved from the underlying vector database that aligns with user's query intent. +- Retrieval effectiveness - the degree to which the information retrieved from the underlying vector database is semantically relevant to the intention of the user's query. - Relevance of responses to retrieved information - how meaningful and aligned the generated responses are with the content and context of retrieved information. - Coherence of generated responses - how logically connected, fluent, and contextually consistent generated responses are with the user's query. -- (( possibly additional point repurposed from above, b/c doesn't fit anywhere above: "Data currency - the data you leverage to build your RAG is likely to be dynamic in nature, including not only new queries, but also updates to the data corpus used to generate responses; your database may be continuously revised with data from real-time data streams, economic fluctuations, business metrics or research data, and so on.")) +- Up-to-date data - how reflective of real-world changes your RAG application's database is, to meet user expectations. Commonly, your RAG database will be dynamic, and include not just new queries but also continuously revised with data from real-time data streams, economic fluctuations, business metrics or research data, etc. ## Strategies for Evaluation @@ -60,7 +59,7 @@ Let's take a closer look to see what's involved in each of the levels individual We want to ensure that the model can understand the data that we encode. The [Massive Text Embedding Benchmark (MTEB)](https://huggingface.co/spaces/mteb/leaderboard) leverages different public/private datasets to evaluate and report on the different capabilities of individual models. We can use the MTEB to evaluate any model in its list. If, on the other hand, you're working with specialized domains, you may want to put together a specialized dataset to train the model. Another option is to run relevant 'tasks' for your custom model, using [these instructions](https://github.com/embeddings-benchmark/mteb#leaderboard). -Fortunately, our pretrained model (average_word_embeddings_komninos) is in the MTEB, so let's import, configure, initialize, and then evaluate our model: +Our pretrained model (average_word_embeddings_komninos) is in the MTEB, so let's import, configure, initialize, and then evaluate our model: ```python import logging From 25d862d78e55bc6585972fa74e999d77c2b25c20 Mon Sep 17 00:00:00 2001 From: robertturner <143536791+robertdhayanturner@users.noreply.github.com> Date: Tue, 13 Feb 2024 16:54:52 -0500 Subject: [PATCH 22/28] Update retrieval_augmented_generation_eval.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit small addition, awaiting Atita's responses to remaining questions: line 28 - whatever details of project you can add without compromising client confidentiality is great for providing context. I’ve revised the intro so it reflects the content of the article, and shows where it’s going. But when you introduce qdrant and “the implementation,” readers of the article don’t yet know who you/we/the author is and what the implementation is.. line 118 - “In the next article, we’ll demystify some existing evaluation frameworks, including...(Trulens, Arize, maybe Quotient AI MVP),” - we need to add some kind of preview to keep the reader interested in reading article 2, so I added these details. Is what I added accurate? What details would you add or remove? --- docs/use_cases/retrieval_augmented_generation_eval.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index 81438abc1..343f67e06 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -7,7 +7,7 @@ Retrieval Augmented Generation (RAG) is probably the most useful application of large language models today. RAG enhances content generation by leveraging existing information effectively. It can amalgamate specific, relevant details from multiple sources to generate more accurate and relevant query results. This makes RAG potentially invaluable in various domains like content creation, question & answer application, and information synthesis. RAG does this by combining the strengths of retrieval - usually using dense vector search - and text generation models - like GPT. For a more in-depth introduction to RAG, read [here](https://hub.superlinked.com/retrieval-augmented-generation). -But to see what is and isn't working in your RAG system, to refine and optimize, you have to **evaluate** it. Evaluation is, therefore, essential to making sure your application does what users expect it to. In this article, we go over the broad strokes of our proposed evaluation approach / framework, which includes separate assessments of the model itself, data ingestion, semantic retrieval, and, finally the RAG application end-to-end, providing a high level discussion of what's involved in each. +But to see what is and isn't working in your RAG system, to refine and optimize, you have to **evaluate** it. Evaluation is, therefore, essential to validate and make sure your application does what users expect it to. In this article, we go over the broad strokes of our proposed evaluation approach / framework, which includes separate assessments of the model itself, data ingestion, semantic retrieval, and, finally the RAG application end-to-end, providing a high level discussion of what's involved in each. In the next article, we will look at an existing evaluation framework, learn how to set it up with an example, calculate some of the supported metrics, and compare that with our proposed framework. We will also look at some examples of our proposed framework. From 0ce2a0f67472667e940b6c2fdcc952ab7811c428 Mon Sep 17 00:00:00 2001 From: atita arora Date: Tue, 13 Feb 2024 23:08:48 +0100 Subject: [PATCH 23/28] Changes per Review suggestions --- .../use_cases/retrieval_augmented_generation_eval.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index cec7ee701..524c56435 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -9,8 +9,8 @@ Retrieval Augmented Generation (RAG) is probably the most useful application of But to see what is and isn't working in your RAG system, to refine and optimize, you have to **evaluate** it. In this article, we go over the broad strokes of our proposed evaluation approach / framework, which includes separate assessments of the model itself, data ingestion, semantic retrieval, and, finally the RAG application end-to-end, providing a high level discussion of what's involved in each. -In article 2, we will look at RAGAS (RAG Assessment), learn how to set it up with an example, calculate some of the supported metrics, and compare that with our proposed framework. We will also look at some examples of our proposed framework. -In article 3... +In article 2, we will look at RAGAS (RAG Assessment)(https://github.com/explodinggradients/ragas), learn how to set it up with an example, calculate some of the supported metrics, and compare that with our proposed framework. We will also look at some examples of our proposed framework. +In article 3, we will look at Arize AI (https://arize.com/) way of evaluating RAG applications using Phoenix Evals focussed on Retrieval evaluation and Response evaluation. Implementation of RAG using Qdrant as a vector database @@ -58,9 +58,9 @@ Let's take a closer look to see what's involved in each of the levels individual ### Model Evaluation -We want to ensure that the model can understand the data that we encode. The [Massive Text Embedding Benchmark (MTEB)](https://huggingface.co/spaces/mteb/leaderboard) leverages different public/private datasets to evaluate and report on the different capabilities of individual models. We can use the MTEB to evaluate any model in its list. If, on the other hand, you're working with specialized domains, you may want to put together a specialized dataset to train the model. Another option is to run relevant 'tasks' for your custom model, using [these instructions](https://github.com/embeddings-benchmark/mteb#leaderboard). +We want to ensure that the model can understand the data that we encode. The [Massive Text Embedding Benchmark (MTEB)](https://huggingface.co/spaces/mteb/leaderboard) leverages different public/private datasets to evaluate and report on the different capabilities of individual models. We can use the MTEB to evaluate any model in its list. If, on the other hand, you're working with specialized domains, you may want to put together a specialized dataset to train the model. Another option is to run relevant 'tasks' for your custom model, using instructions available [here](https://github.com/embeddings-benchmark/mteb#leaderboard). -Fortunately, our pretrained model (average_word_embeddings_komninos) is in the MTEB, so let's import, configure, initialize, and then evaluate our model: +For a custom SentenceTransformer based model we can set up evaluation tasks as below - import, configure, initialize, and then evaluate our model: ```python import logging @@ -70,7 +70,7 @@ from sentence_transformers import SentenceTransformer logging.basicConfig(level=logging.INFO) -model_name = "average_word_embeddings_komninos" +model_name = "<>" model = SentenceTransformer(model_name) evaluation = MTEB(task_langs=["en"]) evaluation.run(model, output_folder=f"results/{model_name}", eval_splits=["test"]) @@ -115,7 +115,7 @@ While our proposed evaluation strategy is meant to improve RAG evaluation, we sh ## What's next -We've laid a general foundation for discussing RAG evaluation. In the next article, we'll demystify some existing evaluation frameworks, including...(Trulens, Arize, maybe Quotient AI MVP), and see how well they do at covering all the layers of evaluation we've discused. Looking forward to seeing you in the next part! +We've laid a general foundation for discussing RAG evaluation. In the next article, we'll demystify some existing evaluation frameworks, including...(Trulens, Arize, maybe Quotient AI MVP), and see how well they do at covering all the layers of evaluation we've discussed. Looking forward to seeing you in the next part! ## Contributors From cf74c439687c9152105011f815074078bda01fa1 Mon Sep 17 00:00:00 2001 From: robertturner <143536791+robertdhayanturner@users.noreply.github.com> Date: Tue, 13 Feb 2024 18:45:27 -0500 Subject: [PATCH 24/28] Update retrieval_augmented_generation_eval.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit checked most recent changes, added small edits; awaiting response to one remaining question: line 28 - whatever details of your project you can add without compromising client confidentiality is great for providing context. I’ve revised the intro so it reflects the content of the article, and shows where it’s going. But when you introduce qdrant and “the implementation,” readers of the article don’t yet know who you/we/the author is and what the implementation is.. So, whatever details of your implementation (using qdrant, going from PoC to production) you can add are helpful. --- docs/use_cases/retrieval_augmented_generation_eval.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index be5030e22..159d8de6d 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -9,8 +9,7 @@ Retrieval Augmented Generation (RAG) is probably the most useful application of But to see what is and isn't working in your RAG system, to refine and optimize, you have to **evaluate** it. Evaluation is, therefore, essential to validate and make sure your application does what users expect it to. In this article, we go over the broad strokes of our proposed evaluation approach / framework, which includes separate assessments of the model itself, data ingestion, semantic retrieval, and, finally the RAG application end-to-end, providing a high level discussion of what's involved in each. -In article 2, we will look at RAGAS (RAG Assessment)(https://github.com/explodinggradients/ragas), learn how to set it up with an example, calculate some of the supported metrics, and compare that with our proposed framework. We will also look at some examples of our proposed framework. -In article 3, we will look at Arize AI (https://arize.com/) way of evaluating RAG applications using Phoenix Evals focussed on Retrieval evaluation and Response evaluation. +In article 2, we will look at RAGAS ([RAG Assessment](https://github.com/explodinggradients/ragas)), learn how to set it up with an example, calculate some of the supported metrics, and compare that with our proposed framework. We will also look at some examples of our proposed framework. Then, in article 3, we will look at Arize AI (https://arize.com/) way of evaluating RAG applications using Phoenix Evals focussed on Retrieval evaluation and Response evaluation. Implementation of RAG using Qdrant as a vector database @@ -60,7 +59,7 @@ Let's take a closer look to see what's involved in each of the levels individual We want to ensure that the model can understand the data that we encode. The [Massive Text Embedding Benchmark (MTEB)](https://huggingface.co/spaces/mteb/leaderboard) leverages different public/private datasets to evaluate and report on the different capabilities of individual models. We can use the MTEB to evaluate any model in its list. If, on the other hand, you're working with specialized domains, you may want to put together a specialized dataset to train the model. Another option is to run relevant 'tasks' for your custom model, using instructions available [here](https://github.com/embeddings-benchmark/mteb#leaderboard). -For a custom SentenceTransformer based model we can set up evaluation tasks as below - import, configure, initialize, and then evaluate our model: +For a custom SentenceTransformer-based model we can set up evaluation tasks as in the following code - import, configure, initialize, and then evaluate our model: ```python import logging @@ -115,7 +114,7 @@ While our proposed evaluation strategy is meant to improve RAG evaluation, we sh ## What's next -We've laid a general foundation for discussing RAG evaluation. In the next article, we'll demystify some existing evaluation frameworks, including...(Trulens, Arize, maybe Quotient AI MVP), and see how well they do at covering all the layers of evaluation we've discused. Looking forward to seeing you in the next part! +We've laid a general foundation for discussing RAG evaluation. In the next article, we'll demystify an existing evaluation framework (RAGAS), and see how well it does at covering all the layers of evaluation we've discused. Looking forward to seeing you in the next part! ## Contributors From 10b354cda98c1f8d048cd1c146020fd5687c3cf4 Mon Sep 17 00:00:00 2001 From: atita arora Date: Thu, 15 Feb 2024 14:20:29 +0100 Subject: [PATCH 25/28] Changes per Review suggestions --- docs/use_cases/retrieval_augmented_generation_eval.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index 159d8de6d..c7cbdab7e 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -25,7 +25,7 @@ These are the promises of RAG. But how do we make sure that our RAG system is ac ## Evaluating RAG -In the process of scaling RAG from Proof-of-concept (POC) to production, we learned many things. But chief among them was the **importance of evaluation in improving and optimizing our RAG system**. +In the process of scaling RAG from Proof-of-concept (POC) to production with clients from the academia and finance domains, numerous lessons emerged. Right from assessing various data processing and enrichment techniques to choosing a model to understand the 'domain specific' jargon and their combined impact on the retrieval, bolstered with creative prompts built with guardrails to generate trustworthy and informative responses. However, paramount among these was the significance of evaluation in enhancing and refining our RAG system. > If you can't quantify it, you can't improve it. - Peter Drucker From c48729f82ca77534c88976317d8ebcb38692d01b Mon Sep 17 00:00:00 2001 From: robertturner <143536791+robertdhayanturner@users.noreply.github.com> Date: Thu, 15 Feb 2024 09:33:03 -0500 Subject: [PATCH 26/28] Update retrieval_augmented_generation_eval.md edited, awaiting response re line 16 --- docs/use_cases/retrieval_augmented_generation_eval.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index c7cbdab7e..b749513ff 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -7,7 +7,7 @@ Retrieval Augmented Generation (RAG) is probably the most useful application of large language models today. RAG enhances content generation by leveraging existing information effectively. It can amalgamate specific, relevant details from multiple sources to generate more accurate and relevant query results. This makes RAG potentially invaluable in various domains like content creation, question & answer application, and information synthesis. RAG does this by combining the strengths of retrieval - usually using dense vector search - and text generation models - like GPT. For a more in-depth introduction to RAG, read [here](https://hub.superlinked.com/retrieval-augmented-generation). -But to see what is and isn't working in your RAG system, to refine and optimize, you have to **evaluate** it. Evaluation is, therefore, essential to validate and make sure your application does what users expect it to. In this article, we go over the broad strokes of our proposed evaluation approach / framework, which includes separate assessments of the model itself, data ingestion, semantic retrieval, and, finally the RAG application end-to-end, providing a high level discussion of what's involved in each. +But to see what is and isn't working in your RAG system, to refine and optimize, you have to **evaluate** it. Evaluation is, therefore, essential to validate and make sure your application does what users expect it to. In this article (the first of three), we go over the broad strokes of our proposed evaluation approach / framework, which includes separate assessments of the model itself, data ingestion, semantic retrieval, and, finally the RAG application end-to-end, providing a high level discussion of what's involved in each. In article 2, we will look at RAGAS ([RAG Assessment](https://github.com/explodinggradients/ragas)), learn how to set it up with an example, calculate some of the supported metrics, and compare that with our proposed framework. We will also look at some examples of our proposed framework. Then, in article 3, we will look at Arize AI (https://arize.com/) way of evaluating RAG applications using Phoenix Evals focussed on Retrieval evaluation and Response evaluation. @@ -25,7 +25,7 @@ These are the promises of RAG. But how do we make sure that our RAG system is ac ## Evaluating RAG -In the process of scaling RAG from Proof-of-concept (POC) to production with clients from the academia and finance domains, numerous lessons emerged. Right from assessing various data processing and enrichment techniques to choosing a model to understand the 'domain specific' jargon and their combined impact on the retrieval, bolstered with creative prompts built with guardrails to generate trustworthy and informative responses. However, paramount among these was the significance of evaluation in enhancing and refining our RAG system. +In the process of scaling RAG from Proof-of-concept (POC) to production with clients in academia and finance, we learned many things - including various data processing and enrichment techniques, choosing a model to understand the 'domain specific' jargon, their combined impact on retrieval, bolstering with creative prompts built with guardrails to generate trustworthy and informative responses, to name a few. But our chief lesson was the **importance of evaluation in enhancing and refining our RAG system**. > If you can't quantify it, you can't improve it. - Peter Drucker From ecc143a9226fadddcb8ab3f2e123b2c36db0fbdd Mon Sep 17 00:00:00 2001 From: robertturner <143536791+robertdhayanturner@users.noreply.github.com> Date: Thu, 15 Feb 2024 10:31:18 -0500 Subject: [PATCH 27/28] Update retrieval_augmented_generation_eval.md image moved up, ref to vdbs captioned. --- docs/use_cases/retrieval_augmented_generation_eval.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index b749513ff..9835a5e1b 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -5,15 +5,15 @@ ## Why evaluate RAG? -Retrieval Augmented Generation (RAG) is probably the most useful application of large language models today. RAG enhances content generation by leveraging existing information effectively. It can amalgamate specific, relevant details from multiple sources to generate more accurate and relevant query results. This makes RAG potentially invaluable in various domains like content creation, question & answer application, and information synthesis. RAG does this by combining the strengths of retrieval - usually using dense vector search - and text generation models - like GPT. For a more in-depth introduction to RAG, read [here](https://hub.superlinked.com/retrieval-augmented-generation). +Retrieval Augmented Generation (RAG) is probably the most useful application of large language models today. RAG enhances content generation by leveraging existing information effectively. It can amalgamate specific, relevant details from multiple sources to generate more accurate and relevant query results. This makes RAG potentially invaluable in various domains like content creation, question & answer applications, and information synthesis. RAG does this by combining the strengths of retrieval - usually using dense vector search - and text generation models - like GPT. For a more in-depth introduction to RAG, read [here](https://hub.superlinked.com/retrieval-augmented-generation). -But to see what is and isn't working in your RAG system, to refine and optimize, you have to **evaluate** it. Evaluation is, therefore, essential to validate and make sure your application does what users expect it to. In this article (the first of three), we go over the broad strokes of our proposed evaluation approach / framework, which includes separate assessments of the model itself, data ingestion, semantic retrieval, and, finally the RAG application end-to-end, providing a high level discussion of what's involved in each. +Implementation of RAG using Qdrant as a vector database -In article 2, we will look at RAGAS ([RAG Assessment](https://github.com/explodinggradients/ragas)), learn how to set it up with an example, calculate some of the supported metrics, and compare that with our proposed framework. We will also look at some examples of our proposed framework. Then, in article 3, we will look at Arize AI (https://arize.com/) way of evaluating RAG applications using Phoenix Evals focussed on Retrieval evaluation and Response evaluation. +*RAG system (above) using* *Qdrant* *as the knowledge store. To determine which Vector Database fits your specific use case, refer to the [Vector DB feature matrix](https://vdbs.superlinked.com/).* -Implementation of RAG using Qdrant as a vector database +But to see what is and isn't working in your RAG system, to refine and optimize, you have to **evaluate** it. Evaluation is, therefore, essential to validate and make sure your application does what users expect it to. In this article (the first of three), we go over the broad strokes of our proposed evaluation approach / framework, which includes separate assessments of the model itself, data ingestion, semantic retrieval, and, finally the RAG application end-to-end, providing a high level discussion of what's involved in each. -We use Qdrant as the knowledge store for our RAG. Still, there are a lot of other Vector Databases. To determine which one is most suited to your specific use case, please refer to the [Vector DB feature matrix](https://vdbs.superlinked.com/). +In article 2, we will look at RAGAS ([RAG Assessment](https://github.com/explodinggradients/ragas)), learn how to set it up with an example, calculate some of the supported metrics, and compare that with our proposed framework. We will also look at some examples of our proposed framework. Then, in article 3, we will look at Arize AI (https://arize.com/) way of evaluating RAG applications using Phoenix Evals focussed on Retrieval evaluation and Response evaluation. ## Why do we need RAG? From 996fca881afa513d0f0b65ca000b980bd21b5557 Mon Sep 17 00:00:00 2001 From: robertturner <143536791+robertdhayanturner@users.noreply.github.com> Date: Thu, 15 Feb 2024 11:23:29 -0500 Subject: [PATCH 28/28] Update retrieval_augmented_generation_eval.md commit, checking with author to go ahead --- .../retrieval_augmented_generation_eval.md | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/use_cases/retrieval_augmented_generation_eval.md b/docs/use_cases/retrieval_augmented_generation_eval.md index 9835a5e1b..80af8c627 100644 --- a/docs/use_cases/retrieval_augmented_generation_eval.md +++ b/docs/use_cases/retrieval_augmented_generation_eval.md @@ -5,27 +5,27 @@ ## Why evaluate RAG? -Retrieval Augmented Generation (RAG) is probably the most useful application of large language models today. RAG enhances content generation by leveraging existing information effectively. It can amalgamate specific, relevant details from multiple sources to generate more accurate and relevant query results. This makes RAG potentially invaluable in various domains like content creation, question & answer applications, and information synthesis. RAG does this by combining the strengths of retrieval - usually using dense vector search - and text generation models - like GPT. For a more in-depth introduction to RAG, read [here](https://hub.superlinked.com/retrieval-augmented-generation). +Retrieval Augmented Generation (RAG) is probably the most useful application of large language models today. RAG enhances content generation by leveraging existing information effectively. It can amalgamate specific, relevant details from multiple sources to generate more accurate and relevant query results. This makes RAG potentially invaluable in various domains, including content creation, question & answer applications, and information synthesis. RAG does this by combining the strengths of retrieval, usually using dense vector search, and text generation models, like GPT. For a more in-depth introduction to RAG, read [here](https://hub.superlinked.com/retrieval-augmented-generation). Implementation of RAG using Qdrant as a vector database *RAG system (above) using* *Qdrant* *as the knowledge store. To determine which Vector Database fits your specific use case, refer to the [Vector DB feature matrix](https://vdbs.superlinked.com/).* -But to see what is and isn't working in your RAG system, to refine and optimize, you have to **evaluate** it. Evaluation is, therefore, essential to validate and make sure your application does what users expect it to. In this article (the first of three), we go over the broad strokes of our proposed evaluation approach / framework, which includes separate assessments of the model itself, data ingestion, semantic retrieval, and, finally the RAG application end-to-end, providing a high level discussion of what's involved in each. +**But to see what is and isn't working in your RAG system, to refine and optimize, you have to evaluate it**. Evaluation is essential to validate and make sure your application does what users expect it to. In this article (the first of three), we go over the broad strokes of our proposed evaluation framework, which includes separate assessments of the model itself, data ingestion, semantic retrieval, and, finally, the RAG application end-to-end, providing a high level discussion of what's involved in each. -In article 2, we will look at RAGAS ([RAG Assessment](https://github.com/explodinggradients/ragas)), learn how to set it up with an example, calculate some of the supported metrics, and compare that with our proposed framework. We will also look at some examples of our proposed framework. Then, in article 3, we will look at Arize AI (https://arize.com/) way of evaluating RAG applications using Phoenix Evals focussed on Retrieval evaluation and Response evaluation. +In article 2, we'll look at RAGAS ([RAG Assessment](https://github.com/explodinggradients/ragas)), learn how to set it up with an example, calculate some of the supported metrics, and compare that with our proposed framework. We'll also examine some examples of our proposed framework. Then, in article 3, we will look at [Arize AI](https://arize.com/)'s way of evaluating RAG applications, using Phoenix Evals to focus on Retrieval evaluation and Response evaluation. ## Why do we need RAG? -RAG significantly enhances [vector search](https://hub.superlinked.com/vector-search) with the power of Large Language Models (LLM), by enabling dynamic content generation based on retrieved knowledge. RAG is indispensable when users seek to generate new content rather than interact with documents or search results directly. It excels in providing contextually rich, informative, and human-like responses. For tasks requiring detailed, coherent explanations, summaries, or responses that transcend the explicit data stored in vectors, RAG is invaluable. _Before setting up an RAG system, you should consider conducting feasibility studies to determine how and whether RAG aligns with your specific needs and value expectations._ +RAG significantly enhances [vector search](https://hub.superlinked.com/vector-search) with the power of Large Language Models (LLM), by enabling dynamic content generation based on retrieved knowledge. RAG is indispensable when users seek to generate new content rather than interact with documents or search results directly. It excels in providing contextually rich, informative, and human-like responses. For tasks requiring detailed, coherent explanations, summaries, or responses that transcend the explicit data stored in vectors, RAG is invaluable. _Before setting up a RAG system, you should consider conducting feasibility studies to determine how and whether RAG aligns with your specific needs and value expectations._ -While vector search efficiently retrieves relevant similar documents/chunks from a document corpus, RAG permits content synthesis and a deeper level of understanding, providing essential context to queries and results generation. In this way, RAG can ensure that answers are unique and tailored for each query, in essence personalized to the user. +While vector search efficiently retrieves relevant similar documents/chunks from a document corpus, RAG permits content synthesis and a deeper level of understanding, providing essential context to queries and results generation. In this way, RAG can ensure that answers are unique and tailored to each query, in essence personalized to the user. These are the promises of RAG. But how do we make sure that our RAG system is achieving its potential? ## Evaluating RAG -In the process of scaling RAG from Proof-of-concept (POC) to production with clients in academia and finance, we learned many things - including various data processing and enrichment techniques, choosing a model to understand the 'domain specific' jargon, their combined impact on retrieval, bolstering with creative prompts built with guardrails to generate trustworthy and informative responses, to name a few. But our chief lesson was the **importance of evaluation in enhancing and refining our RAG system**. +In the process of scaling RAG from Proof-of-concept (POC) to production for clients in academia and finance, we've learned many things - including various data processing and enrichment techniques, how to choose a model to understand the 'domain specific' jargon, the combined impact of the former techniques and model on retrieval, how to bolster with creative prompts, built with guardrails, to generate trustworthy and informative responses, and so on. But our chief takeaway was the **importance of evaluation in enhancing and refining our RAG system**. > If you can't quantify it, you can't improve it. - Peter Drucker @@ -44,8 +44,8 @@ The evaluation framework we propose is meant to ensure granular and thorough mea - Retrieval effectiveness - the degree to which the information retrieved from the underlying vector database is semantically relevant to the intention of the user's query. - Relevance of responses to retrieved information - how meaningful and aligned the generated responses are with the content and context of retrieved information. -- Coherence of generated responses - how logically connected, fluent, and contextually consistent generated responses are with the user's query. -- Up-to-date data - how reflective of real-world changes your RAG application's database is, to meet user expectations. Commonly, your RAG database will be dynamic, and include not just new queries but also continuously revised with data from real-time data streams, economic fluctuations, business metrics or research data, etc. +- Coherence of generated responses - how logically connected, fluent, and contextually consistent generated responses are when compared to the user's query. +- Up-to-date data - how reflective of real-world changes your RAG application's database is, to meet user expectations. Commonly, your RAG database will be dynamic, and include not just new queries but also continuously revised data from real-time data streams, economic fluctuations, business metrics, or research data, etc. ## Strategies for Evaluation @@ -53,13 +53,13 @@ To meet these evaluation challenges systematically, it's best practice to break Granular Levels of Evaluation of RAG -Let's take a closer look to see what's involved in each of the levels individually. +Let's take a closer look to see what's involved in each of these levels individually. ### Model Evaluation We want to ensure that the model can understand the data that we encode. The [Massive Text Embedding Benchmark (MTEB)](https://huggingface.co/spaces/mteb/leaderboard) leverages different public/private datasets to evaluate and report on the different capabilities of individual models. We can use the MTEB to evaluate any model in its list. If, on the other hand, you're working with specialized domains, you may want to put together a specialized dataset to train the model. Another option is to run relevant 'tasks' for your custom model, using instructions available [here](https://github.com/embeddings-benchmark/mteb#leaderboard). -For a custom SentenceTransformer-based model we can set up evaluation tasks as in the following code - import, configure, initialize, and then evaluate our model: +For a custom SentenceTransformer-based model we can set up evaluation tasks as in the following code. We import, configure, initialize, and then evaluate our model: ```python import logging @@ -79,11 +79,11 @@ print("--DONE--") ### Data Ingestion Evaluation -After we evaluate our model’s performance using benchmarks, and (optionally) fine-tune it on the language of our domain, we can then configure data ingestion into our semantic retrieval store (vector store). Various vector databases offer index configurations (of whatever index types the database supports) to influence and enhance the retrieval quality. Common index types include Flat (Brute Force), LSH (Locality Sensitive Hashing), HNSW (Hierarchical Navigable Small World), and IVF (Inverted File Index). Here's one such example, based on HNSW retrieval-quality. +After we evaluate our model’s performance using benchmarks, and (optionally) fine-tune it on the language of our domain, we can then configure data ingestion into our semantic retrieval store (vector store). Various [vector databases](https://vdbs.superlinked.com/) offer index configurations (of whatever index types the database supports) to influence and enhance the retrieval quality. Common index types include Flat (Brute Force), LSH (Locality Sensitive Hashing), HNSW (Hierarchical Navigable Small World), and IVF (Inverted File Index). Here's one such example, based on HNSW retrieval-quality. To evaluate data ingestion, we need to observe and measure how changes in related variables affect ingestion outcomes. For example: * **Chunk size** - the size of each data segment, which depends on the token limit of our embedding model. Chunk size substantially determines data granularity and the contextual understanding of the data, which impacts the precision, recall, and relevancy of our results. -* **Chunk overlap** - the extent to which data points of events are shared by adjacent data chunks. Overlap helps with retention of context information in chunks, but should be paired with strategies like deduplication and content normalization to eradicate adverse effects (redundancy or inconsistency). +* **Chunk overlap** - the extent to which data points of events are shared by adjacent data chunks. Overlap helps with retention of context information contained in chunks, but should be paired with strategies like deduplication and content normalization to eradicate adverse effects (redundancy or inconsistency). * **Chunking/Text splitting strategy** - the process of data splitting and further treatment, based on both data type (e.g. html, markdown, code, or pdf, etc.) and nuances of your use-case. For example, summarization use-cases might split segments based on chapters or paragraphs; a legal document assistant may section docs based on headings and subsections; a medical literature assistant might split docs based on sentence boundaries or key concepts. Utilities like [ChunkViz](https://chunkviz.up.railway.app/) help visualize different chunk splitting strategies on different chunk sizes and chunk overlaps. @@ -92,23 +92,23 @@ Utilities like [ChunkViz](https://chunkviz.up.railway.app/) help visualize diffe Semantic retrieval evaluation puts the work you've done so far in evaluating your model and ingestion to a litmus test, and can be approached like a classic information retrieval evaluation problem - that is, using metrics such as precision, recall, accuracy, and F1-score to determine if retrieved documents are relevant. -First, we establish what we expect the returned results to look like in terms of important parameters. This guides our choice of reference metrics. We have several existing metrics to guide and define our baseline: +First, we establish what we expect the returned results to look like in terms of important parameters. This guides our choice of reference metrics. We have several existing metrics to inform and define our baseline: - Precision (accuracy), Recall (completeness), or their combination F1 Score - DCG (Discounted Cumulative Gain) and nDCG (normalized DCG), which measure the relevance quality of ranked lists of documents But semantic retrieval, because it goes beyond mere keyword matching, synonyms, and token-level enrichment, and encompasses broader semantic understanding and context, typically requires a "ground truth" evaluation set - a [Golden Set](https://www.luigisbox.com/search-glossary/golden-set/). A Golden Set assesses the correctness and faithfulness of generated answers to a human annotated reference set. -To generate a starter pack for evaluation using a Golden Set, we can leverage the [T5 Model](https://huggingface.co/docs/transformers/model_doc/t5) . +To generate a starter pack for evaluation using a Golden Set, we can leverage the [T5 Model](https://huggingface.co/docs/transformers/model_doc/t5). ### End-to-End Evaluation -An end-to-end evaluation of a RAG application assesses the final outputs generated by LLMs in response to given inputs. It requires addressing issues discussed above, related to data heterogeneity, domain specificity, and user query and preference diversity. It's impossible to devise a fixed metric or methodology that fits all domains and use-cases. +An end-to-end evaluation of a RAG application assesses the final outputs generated by LLMs in response to given inputs. It requires addressing issues discussed above related to data heterogeneity, domain specificity, and user query and preference diversity. It's impossible to devise a fixed metric or methodology that fits all domains and use-cases. To address these difficulties, you can assess the fidelity and quality of generated text using established metrics like [BLEU](https://huggingface.co/spaces/evaluate-metric/bleu) and [ROUGE](https://huggingface.co/spaces/evaluate-metric/rouge), and combine these scores with LLM-based or human evaluation methods. This [Quality Criteria paper](https://scholarspace.manoa.hawaii.edu/server/api/core/bitstreams/c6a53998-09e3-4d17-91fd-c7416d51b250/content) provides some excellent ideas for creating such a solution. -## In sum... +## In sum -To summarize, a robust RAG evaluation strategy requires you to establish methods to automatically evaluate similarity and content overlap between generated response and reference summaries. You can also leverage human evaluation to evaluate subjective information, such as context-relevance, novelty, and fluency. In addition, you can build a classified 'domain - questions' set based on question complexity (easy, medium, hard). Doing this will provide you with an overall sense of the RAG application's performance. +To summarize, a robust RAG evaluation strategy requires you to establish methods to automatically evaluate similarity and content overlap between generated response and reference summaries. You can also leverage human evaluation to evaluate subjective information, such as context-relevance, novelty, and fluency. In addition, you can build a classified 'domain - questions' set based on question complexity (easy, medium, hard). Doing this will provide you with an overall sense of the RAG application's performance. While our proposed evaluation strategy is meant to improve RAG evaluation, we should acknowledge that no evaluation is perfect, and it remains complicated and challenging to formulate a comprehensive set of evaluation metrics.