From cc9fa66213aebac2c2e7a6784df97075a01921ba Mon Sep 17 00:00:00 2001 From: Ricardo Niepel Date: Fri, 17 Jan 2025 18:59:11 +0100 Subject: [PATCH] feat: adding AI evaluations based on Microsoft.Extensions.AI.Evaluation and Aspire.Hosting.Testing (#8) --- .gitignore | 4 +- README.md | 65 ++++-- images/ai_evaluations.png | Bin 0 -> 139518 bytes src/ChatApp.AppHost/Program.cs | 2 +- .../.config/dotnet-tools.json | 13 ++ .../ChatApp.EvaluationTests.csproj | 50 +++++ src/ChatApp.EvaluationTests/EvalInput.cs | 38 ++++ .../EvaluationTests.cs | 199 ++++++++++++++++++ ...utedApplicationHostingTestingExtensions.cs | 92 ++++++++ src/ChatApp.EvaluationTests/Settings.cs | 40 ++++ src/ChatApp.EvaluationTests/appsettings.json | 4 + .../ChatApp.ServiceDefaults.csproj | 2 +- .../Clients/Backend/BackendClient.cs | 26 +++ .../Contracts}/AIChatCompletion.cs | 2 +- .../Contracts}/AIChatCompletionDelta.cs | 2 +- .../Contracts}/AIChatMessage.cs | 2 +- .../Contracts}/AIChatMessageDelta.cs | 2 +- .../Contracts}/AIChatRequest.cs | 2 +- .../Contracts}/AIChatRole.cs | 4 +- .../Contracts}/CreateWriterMessage.cs | 2 +- .../Converters/JsonCamelCaseEnumConverter.cs | 2 +- .../Agents/CreativeWriterApp.cs | 1 + .../Agents/CreativeWriterSession.cs | 1 + .../Controllers/ChatController.cs | 2 +- src/ChatApp.WebApi/Program.cs | 2 +- src/ChatApp.sln | 7 + src/data/test/eval_inputs.json | 20 ++ 27 files changed, 558 insertions(+), 28 deletions(-) create mode 100644 images/ai_evaluations.png create mode 100644 src/ChatApp.EvaluationTests/.config/dotnet-tools.json create mode 100644 src/ChatApp.EvaluationTests/ChatApp.EvaluationTests.csproj create mode 100644 src/ChatApp.EvaluationTests/EvalInput.cs create mode 100644 src/ChatApp.EvaluationTests/EvaluationTests.cs create mode 100644 src/ChatApp.EvaluationTests/Extensions/DistributedApplicationHostingTestingExtensions.cs create mode 100644 src/ChatApp.EvaluationTests/Settings.cs create mode 100644 src/ChatApp.EvaluationTests/appsettings.json create mode 100644 src/ChatApp.ServiceDefaults/Clients/Backend/BackendClient.cs rename src/{ChatApp.WebApi/Model => ChatApp.ServiceDefaults/Contracts}/AIChatCompletion.cs (92%) rename src/{ChatApp.WebApi/Model => ChatApp.ServiceDefaults/Contracts}/AIChatCompletionDelta.cs (92%) rename src/{ChatApp.WebApi/Model => ChatApp.ServiceDefaults/Contracts}/AIChatMessage.cs (89%) rename src/{ChatApp.WebApi/Model => ChatApp.ServiceDefaults/Contracts}/AIChatMessageDelta.cs (92%) rename src/{ChatApp.WebApi/Model => ChatApp.ServiceDefaults/Contracts}/AIChatRequest.cs (90%) rename src/{ChatApp.WebApi/Model => ChatApp.ServiceDefaults/Contracts}/AIChatRole.cs (75%) rename src/{ChatApp.WebApi/Model => ChatApp.ServiceDefaults/Contracts}/CreateWriterMessage.cs (86%) rename src/{ChatApp.WebApi => ChatApp.ServiceDefaults}/Converters/JsonCamelCaseEnumConverter.cs (88%) create mode 100644 src/data/test/eval_inputs.json diff --git a/.gitignore b/.gitignore index 8d6cacb..b43ab2a 100644 --- a/.gitignore +++ b/.gitignore @@ -398,4 +398,6 @@ FodyWeavers.xsd *.sln.iml **/appsettings.Development.json -.azure \ No newline at end of file +.azure + +src/ChatApp.EvaluationTests/report.html diff --git a/README.md b/README.md index a7bb79f..7df7244 100644 --- a/README.md +++ b/README.md @@ -30,13 +30,16 @@ The frontend of the application is developed using React and Vite. - [Features](#features) - [Getting Started](#getting-started) - - [Prerequisites](#prerequisites) - - [Try it out](#try-it-out) + - [Prerequisites for running experiments](#prerequisites-for-running-experiments) + - [Try it out (experimentation phase)](#try-it-out-experimentation-phase) - [Local Development](#local-development) - - [Prerequisites](#prerequisites-1) + - [Prerequisites for local development](#prerequisites-for-local-development) - [Running the app](#running-the-app) + - [Evaluating results](#evaluating-results) + - [Running the Evaluation Tests](#running-the-evaluation-tests) + - [Generating the Evaluation report](#generating-the-evaluation-report) - [Azure Deployment](#azure-deployment) - - [Prerequisites](#prerequisites-2) + - [Prerequisites for deployment](#prerequisites-for-deployment) - [Instructions](#instructions) - [Sample Product Data](#sample-product-data) - [Guidance](#guidance) @@ -70,25 +73,24 @@ The first step for getting started with this template are the notebooks which ca ![Notebook preview](./images/notebook_preview.png) -### Prerequisites +### Prerequisites for running experiments - .NET 9 SDK - VSCode - [Polyglot Notebooks Extension](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.dotnet-interactive-vscode) - [Azure Developer CLI (azd)](https://aka.ms/install-azd) -- [Node](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) -### Try it out +### Try it out (experimentation phase) Open the notebooks under `./experiments/` and follow their instructions. ## Local Development -### Prerequisites +### Prerequisites for local development - .NET 9 SDK - VSCode or Visual Studio 2022 17.12 -- Node.js 22 +- [Node.js 22](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) - [Azure CLI (az)](https://aka.ms/install-azcli) - [Azure Developer CLI (azd)](https://aka.ms/install-azd) @@ -135,11 +137,46 @@ If you want to use existing Azure resource, but their endpoints below the Azure } ``` +### Evaluating results + +Creative Writer Assistant uses evaluators to assess application response quality. +The 4 metrics the evaluators in this project assess are **Coherence, Fluency, Relevance and Groundedness**. + +To understand what is being evaluated open the `.\src\data\test\eval_inputs.json` file. +Observe that 3 examples of research, product and assignment context are stored in this file as different scenarios. +This data will be sent to the API so that each example will have the evaluations run and will **incoperate all of the context, research, products, and final article when grading the response**. + +#### Running the Evaluation Tests + +1. Make sure the Creative Writer application is configured and able to run on your local machine before running the tests. + The tests will call into the Creative Writer APIs to collect AI responses using an .NET Aspire test host. +2. The evaluation process will use the same Azure OpenAI model deployment which is used by the main application. +3. Run the tests from Visual Studio, VS Code, or `dotnet test`. + +#### Generating the Evaluation report + +1. Navigate into the `src\ChatApp.EvaluationTests` folder +2. Update your dotnet tools by running + + ```shell + dotnet tool restore + ``` + +3. Run the aieval report command to generate a report file. + + ```shell + dotnet aieval report --path .\bin\Debug\net9.0\cache --output .\report.html + ``` + +4. Open the `report.html` file in your web browser. + +![AI Evaluations](./images/ai_evaluations.png) + ## Azure Deployment ![Architecture](./images/container_architecture.png) -### Prerequisites +### Prerequisites for deployment - [Azure CLI (az)](https://aka.ms/install-azcli) - [Azure Developer CLI (azd)](https://aka.ms/install-azd) @@ -151,14 +188,14 @@ Navigate into `./ChatApp.AppHost/`. 1. Sign in to your Azure account. You'll need to login to both the Azure Developer CLI and Azure CLI: - i. First with Azure Developer CLI + i. First with Azure Developer CLI ```shell azd auth login ``` - ii. Then sign in with Azure CLI - + ii. Then sign in with Azure CLI + ```shell az login --use-device-code ``` @@ -182,7 +219,7 @@ To load sample product data into Azure AI Search as vector store, use the notebo This template uses `gpt-4o` and `text-embedding-3-large` which may not be available in all Azure regions. Check for [up-to-date region availability](https://learn.microsoft.com/azure/ai-services/openai/concepts/models#standard-deployment-model-availability) and select a region during deployment accordingly -* we recommend using eastus2 or swedencentral +- we recommend using eastus2 or swedencentral ### Costs diff --git a/images/ai_evaluations.png b/images/ai_evaluations.png new file mode 100644 index 0000000000000000000000000000000000000000..4e475a203b3dcd4b1a711a8786fbb1bc7b2e04cd GIT binary patch literal 139518 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

*@o5FIZY^Ki|XwCbMrJ z)u+-|Xlbk&SAWl4dR4zo3}z?uH8}%u2I7BM0pnIRY5$gQpHKb~Xse6hP6|epTkweH|Mqt3rrqz>>f^l+e|jHApE!tyK@qTR@GT;@ma!|%HhRd|~k zJd%B#sRxZ_=aA=;ItT+$G}Bf20TpNAt^C93 zezguRKee%&43>x`*=O5IJPQ5RhRq8+jGT3G3UcL8HSdk&Ty3wzaW~)s+7zoi^pFUH z?g>~oQ$}UV{seTHdXio4%LD%xP#OIUBJcg4@miOd^z51H((gF_^#hp8h3?uWSpgcy z<`1AY2KESzs~JrUJbL($5~hgAe$$+7euLj43cIvju<(bNJf4A3Ous&>G)s=o|Ma_aPqN6e)!d@LqPA+OXxx{R z%4YpP2TFgbSHE5&AYl4uG!2mgegAg^FMnC;?&>_OpfTdz{r#RQ^NT?{b`{l}?JV52?rX%l-AWBy zlQ&leZx2qUjR^87YZwi=Z7)9f_U>u9b*$abGxg~$;`Soq$31TUp#5~$!QYqs&><(^ ze?Xxv>Fl)skgjib8vj$%9;W{1l{q8E`j4#YEqNt>!#gIXRyt~=UH|#2vKIR16z~6u zm)P`u{B{TLJbDL$x|i&g3#plwQ4m~!c~8iOF$?RowX?f?>(<&$n>RB2o@2b_p=45G zqJ~FGll84cov_ds@*X1tk~BVB-JO_PA7*B*#}@CbaDNR24s|jErMY?f7VV!Ublj-e znB^wj_eid&`p(?$Ki8$vS@@&E8Q;8pU+iCf|1;)~Y0BVkMzTMdSK98JA9$5LxH>_v zPqcV_jgc1>j4>L#b^PF7v;=Z5Was7W{(A&U=Y~#U3l?7k=}&@nlQy2Osb12bRp;$w zu4K0!<6{pNOfNizYz4QeU6{zaxKeh0Y&ja?dxwUuqffnmypmHZwapYRjxl6G^j30u zzs7+hWYZ%zuuF6f=B^i}mGtw-)ur&U?XT!Xa?y4&)^Xse`9E$_?n3U?kL9O>q!W4- zO<%3drMT}X=XQT-l{ zF^cP;*}Mi{Po~ZG!D%)_hDPam{RwH`vSmn`bvReWpulZC5>S4R^nSay_V>ItY*0ep ziyrvB)oq^L-Jm45S6{N5--HyVW1mJorbXaP|RVDuGRJ6@NUA4qCg z_NX@a`gQqJr@~tY_1Yd~XS1fIrKQ(~eKv5B9dQ3^*QGP+`U;tfLTZ7o0Y!4 z{)ZxOZ*qH)fuO}34_pRo+wY#LfPhtR?@6-k-@l*22R0+(%@P(C#!@dPVPMqiWH=rY zEc1cSjvPCth(5jzeA+(q^Bxq%$POlYCO8OV*i8biUoTx+=w2eAk6b1UG9@Z+-3#7t|CvinjD`3EalvtO_UzfCuCC5SUDBAfbJs31{5j3GUvU!#c}U!& zS5Qz02o9#A@bmXKMQlW$`=4n=Oj8=Tpkc?fe1H642oJm&7IyjJ!z}}Sh8JE3FllGo za9H*A57s&kkPn@b#>W9 z*y#S!m2Kyq7yepJ61c-|-6D_2%aa zd!{n!larIfy?=kJiO&vP8g6cG3ZIW3wa=V6V_X%=UETCnTldwA7mT-fk5W=#$G8s= zo|u@3i|ZQ|#gd<&FXTFLMrT&1?K2(}6A6klW@g+H61rI^pvhMihtS6+B{G^Szo6jE zvghI9>nP;(JJy8la~H!+ou7K{T@EBKWZQQL&OjED%4};Zj7RYrhGsGYFI0l~5k6hI z;_co2Yq2)a?ZaRAYiKtfER)6gS=Rk_JTM&Z*Uzz|!oW$!Ztq_|zD7$r3-GGN231uZ z`Qjh}5L{MMvxbI-W)(es1+eru+Jbs$ zjV_Iw(b20oIXTHy!FRFU`mKbC2H+&^w1=-o+ zSSehxvfX_iCVzcIPbOaj11>t32MjB76E0uAEM)$cm3$gFAz39Hb_f_1(iRvB>RrV0 z8vF6%wb9}P%NcX?>cykC_b6ngZX?6&-P|NhOiW&2JHZuI%(C) zRTxW>U3hao^lPACVKE{MZ@hkeNNQ<*@=JG7kzItI=BZPD*vtm{1SWA8PM_vBb{oa0 zqmq^u7N{85T}iGv1S4_F6ISdG^ko))oIG^+a9L-kfqvXyOE(rvR{_1-(X!rNadZyw zqtc=#BIZQWl0;m52nR2RBSF~Vi#myL*}>0Wj^$*7(FUIe26{0NvI3mEFxED)bK#qb zyAtgpgb&xL71&qGGbtb-fcG*pKUo`*ti8|e$Jv?L*X_$hwt7+7;ICnatF{Pwml5P9*tcXX(Cs@}h^K;Dz>NZURaH#ZZ=($UiHq7c(V zBO|Zk_{A(CCahXqdKuCYR9}CBhnKexTU`Z4<4~Num!?U!I<)30t$glhXzg(_L#BB z$L#f0baWbYPLOeWz@wFWFHUl{PApqa&9!Y?x#bp*L{t|8TlQjC#|Cl8#^%KyB@L~t z9D|9;Nz5JExhNm+Q&9Y8?R+@~cm8^#3z_X_&PDR@JYzI+pFKv|Q)R5B)`}L!tWg&h zIx)5grB|=5e0E0`&9DCa{$8@`Lp@`a7szpsCHva|!;+M1**VQp$IF9qtu}T0M{F{x# zr=6Goe8yiJ=>J(!7+xy-+cO#v!1E7Cw&nje-2C5uiLzdfxHnd%oS39Ivml%F=>lV& z6;Su}KM9PxZw=o7$|l$6OVy0TALR4|muD1MLleez0x?K>IjDw%%oZ zW#?~Rf5@4-du4zA&{yW){@MP#;YLgYNb{`BJDXkiST%Q>^>Y2R`2j5<=kNMv%#H{M zE3m6GAUhKoF+#pp_1rZ$^KN?cXy31ZHQDVm^ZhH9g<*D0^rgnCAZalKo zzRO74ITES%JZVr?QMq~RR=mE);m4aBV&9&0egZNVNpHqNtl>&z@E#C`m4ui4#@1Xf z3!NGZEr+b5+P^$hYI2`u%%(lcm`$HPr>EmU$NK1DP zx$CsAEHDiD@xwt!FEdiM*M9Hby;cHc-#>e-b+5x;R}(q#`Lh%2-5kA;ui($pKvd1l%Uv#mB(JByS4z;gSKcfDD?vdi&g`Ej#Yo z8Rlf`WzP#y8+k8e+NG%?%ndGlItrJ`cVfNYzu!Q1UoXnsgUZUQ6+<{uIui6cuGNNC z<9vn!h-5tN{H4V?GANzH^%K*;dGkiMJTr516Il0GF)*-1eRYuVz$kh&;BD;a=m?FA zBaOItqt#hdKEz&0oOzhBdfC?(`NjeQ6==mJ$?qHYnj3@v=yQT&@lsx1UUo`xy=dtk zioRd<9y=$w9rOH!R~Ll%^_U(x65w)@M{1$SYeC}fy?f)YiWcZ(WMs_S4=E^c3kfj- zMdB2QOxa!a=FLqiYf#PvrCz>F32#|11R7jr1yxnr)oa!~0M@{9j*K_ZH56X3y}akvG^d!Sif4oyd`I=`Und2WAPVr&w-zp67BaeG2PtO zDIAm*7xTGmspUrLO8VE_no*b8{5UJ)kjv)c?(V$n$QXEl_<>r3Z|j?xl4=f) z0T}IOsX;63wPk78_!1Hl$W$BR_Qhpcy?V8fX$7r*k=JHGfsgsFdkM>KQxOkpA? zCB02=DV1uR%w{2JgWp5moAoYoZ{51w)zy_%)RL7j4+zpXhWtykY*_z7QQM;Y9N!B7 ze`byh`g?n4-0raAygN;XOaT5?f*L&XbRNfSeDyxQL@3^2hTZkI$37C$#?C)bAQ< z{rW5TJ+=!ZLPpk`0|LP7@SP`#;ft&W6h#|k=Wq`Wo;|w*Yv?N2s7*LQSFK)6sXD;I z$moOS#?v!ny)!7wnHU)V_)FF_5{KFl{hIeAc9n-#Z;h;F1*#O(7-?Nl!>uj+RS*czjyT=(E_ zg-}LgJQL+s#UP&&<6@MsT+Nqo1+ufVjp1xG@ze)*LCWFJ4YjolYk5`W$cz|Y-*UMR z_$+l8FpA4uGbBR+TiN}DghQG?larH=!-fDdXN!o)Iw~qElezRmDbkdoBfjctU^GZ> zKcQT3e^IMu+w@YR98^DXf>KaWkgO4`1nA?@BIlU#_9U8k@wa@Dw+x@NO!8P2u?1I{ zNM>rvswgX?*nDBrE05#154YlwoE!!2ih0`n54VDk97%Y`g|BoCQ<$osBqXdrbqI0q z08X7#wHAoOBKYKUZCuEU7eZ+%#EgkP3}Vc}Ejp{|9NzeTCvFF)=MN@4#p*gb*WgYs z!JxPEol%i-At4N?kC@i2W-sA(Pju2!D3^^y%!;!nre6dPxn} z2HNWDP12 z5A8aqcloP(>50yjAHGg@qYbzG_x}<)Vg(gdFKVa_wQtT(p(pFRb^XqO8=Lpagr@Q0 z!0@;?(R_@89vGs%yu85Y4%=n~@;+4^I%()Rr9m)9XXj=R3#Hg$NSXs`pa(BsuDe(; zwSjCjIBGpm@|z44+V)eE;^`togoeM)VpaKgE&S>Q<#n~FNOtk3_Y#YlnOXYJp<{-I zhA1srd=)6UU4XeL#l*yTwr>xV{w%@F&K?*PL`%DI&k7-`MpS`9mLG+{K5%2~q^iG@%^RA#Kqc|VTr^0AiWEn>gavot#2*cR`=={Lc6 zt+5Q)OB^KbWiw={OC|x^8Uxh=6duNgi92IC)VYnn2-!ML+AHymGQYlT#Zqo-Xi+4^Q&0+ZR==WKl!a6*(97lSLfRNi>^rh;mxJ8RnAunztBs?WcwM0%UPZ$2Diq9zPMipf=4F+1;*0hAbuNfQnr+Pn zzG9rRH{fx6BiXqTME@!p8sTr7n;N!k-J15Vh`KXkKcx?3iz7=~EXMvw^mA$-%T(rG zb3QO5x+z&@?5l$neF?z8`5NcFxF6e=Wg+*e`m-VdAt8t5v zRFssKQGjCEb?a9?NZ1EYp8OUofOdsZi=45rh|kQ_7;YWt>!ZXCwT;2zAVAaw&^67t zgp#;8CT?urEhy-pl$135*%C)6DB@cSti`zFV7n=!ulD{3C(wh3=TJ^|B~2NR^YF)I z_l}Xc7?eu{Tmg}sJ^N*m^Y9m1yat{(GK#P-xE3WC=ql^T4XmsIP(CsSlyS67M!otEGJ9en^J_&1P*K=&-pnJq&4$}6+SrHS8wG?Qg zS`$67tI?hN{*HGCE!tM(svr9zFS(vj(q(1K*@7RHO*BNi<;&H_r0jKF50%3d3PRPp zcN)B{Z}B0@%gcRs`qUj?_*T6?F;78J@!_*)&uU7zPIE@_>otG9|0vPa;+pRM))TdS zp3V_Y<1C_9brF-Cs&lIv?#5*?y7}&`ouiI0sz0T7?9d^ea$_w)^V&-S6s-HsuY(3O zX0$YA)Tf|gZq5s%XsQI~YaFVCe2$K0CFCYfg5#+s5!l2@rIQyu56%^V(8dk=dd^6k z^+oO1x?Wx?$rWHXOai%=h+Q?HTkg03s&oajrObyg%qDFOkp}1I%uz~n?{GRdvrmYel zCJb+E*itlicSRFe54Shd&jZ@AF)?dcSXjsgh`j|+J}BF}zQ3_)!uQOVhm14wE2Z-q zZ|poZ@u|Px7f)+KVq&Yqvnv$!U@mV)MmniT-}dnE7z57>9-|LgRN0WlB9f!)&WfNG zW1QUGK{5F06Bj=}omQ&;0c`FrLA*!r_(Aa-|48#KIpQS92PrA3*Qbwu{rXk&qF+j8 zB{ahTvk{y)sI#!21Lm(J`^?KnPHap}%Z>~cyeRx3?)>OzvGRVM`X;AcFV}wEuaGjI zaL}lsz8*+@SM%5RpEQ(NckKxGZxhzon!*lxVsmp*YV1jggXor+_xLn87?X*_Itx$ElHikl@b-%7gNVDejoOkG7!b@U+_^uZB=DU<3#!YlH5@aV^G(I6}o@aNTNEej}W}sA7jFf5gRs7FLXVVcNKH zCv}yBrdO~nTCV!sR~1!=gR@69DVNmHOB4?vB!Eml>#gtnk0l+1Xp?GKa2<_hTcxBr z_yjL^tz-SRYd}zE=MwLhhlNRPKa%|>Kfhb+eo7gC07X7t(ku9;be`Lja}6Bd?I6B) zP-mBpUyZRF=eN)ArGB++LaEydL&Et8oPvza?aY?S{rtsSkGx452&Ol zA0FGCJPziAnt_AF_i{mQI{8TTX5wzygXbC_A1AUf2%FzJ6U=LvS4sXvF_ zB^XQ}$^=ONU+|chb!$`gGLdOPN)T)qBHxZXZr7>tm;UjW$>L#qyri2GIPS*f)>9|r&9pW(6qtQK6jEDO09|8^yQ ztJ?lQ?74%x?fbt?v0H}Li(C9{U|_nr;{Rdy$A5{%Cdy0B(HWe;8;h0(!#(J>P*Px` z@?T*G)jW9sO)Iu<-!3k(hXWfu`Eov{qLMtLo7~B(lEK4$`pQgOjWaXF;pyQm=|qEq z?_%`2918_9UgIIOq@;{&-}vW>J}mTsw7}lMe?TBH&#~xF48-G6lNW(i)c@`>59Ntl zXfd?@XJQ7}!sq%9Ezl0N{=VE8R&M%UfI82u%IM)>FWBp|n?KwK<$Xh}qen-S&FGBh z6V*NTQ$rf_FhMbR&GfFs9IjFbmIN%~{7Kc%tVBK@p*_n`tpwnaG6vMB*06K}r=5>% zfozZ2Jz(+2FoC!?Ld)b z# zqVaaePU3#R9(l>fhk{S{<*EY*4uC@`Or$XK@{-xJcW*@CO>~Wb#HR28ht!;+SNFk~ zqk}|wo0ytvv{)f9QFduojS#E?0`%Y*ggmWJomvM0`mIcNy(sVm$b|^cNRiRfxt-mA z1$jJv4gh!yY{z4}n^n5H7yJAAE<=zo#XJ`x4euekEgAW1=+aAt4`=+nBL|G_G76A# zr;!>?itR&(R*=6H_OSzP2I;Y%Y;iCu5R?sch$Ck?1<~}$hTY1jBa|SlV(lHau@SSdQkf!Kw0&4ja%ZgWtY}?P`iR z`-nQ((V;IQA_6U&6UGWs@*X&FiFL)vc0!)v`(MK|K;&0cQtQ^Q=N1*+Kmm#L1`dh9 zQCtD?)u<&5w}XTMU44VBx_}~xd7P=?f$k|Fa*TURuj~Mg-o3Qwj6u_V_-!V?h!G?6 zLW>D_q7UcE3cMT`7%1-Fygkn2G8xMU6%kmHFq*})5H?t2I$Z`GO}%rOJYI-1w~(WGRAB1axeoM#$@RpUt@>ASr->x;(RpV!E;; z$6gr56?{-an1awCW}2+%SR zf~?YRBFt;oqNMf(K*5HrlXDI59f!7MF`6R+k@(t&N1+UU3Cr(H=7BJPgNqI%8xA50 zw2}XeXLuzn-ypxY3JWtqt~Yru`DZ8I;$Cd5wcXX-y@t|I{{C)Z;o~{y<9eWw;JM)5 zw{JZh0AN!NgM=Z53ebnNY$8Xp7O|Qz0@~371E`=B7NdY8wkueR}Apk>>(a5yy<{*lu%Tf9$bM+fFrYQ&T&Mx89T)lG*}?0q z0!da5-$ejOR6N`@S1G!lqL?Ce{=0WaZ#Twcs0m@KVVMBHBJGv7wzlMn^71MypMCvX z#0&`dwS_t_SB`B=o|E1|3FP5v&;VrnhC(R>bVe*AZUu%}U7_3u3D7H=9}tB3Bzz%e zkJ)ug0~NycLog(MGt!NOQ8{+&lfm@dsHji`0J>fS9%&48VGokNPKKhlI;lf(Z^%!T@it{KRS$rxQ*dw)fw8Qd@NVR5m%`KQJ=)6_X~^s#U+~H0024{zHi{Y! z2Ik+kb0#K77JqjS-oUjRGP6Yce=gk(dw$?m`9Dwfg0jj@7qd$;EJX^dex10@V~>*o zozYaV=qsYVPfA)^*y8;rV%Nh0LrazdHenLR0%EbGp==+rau1~&ZrFy3!_BtWj;EF(V>qrdMlBJJbu(2CJHF3MPC#O>rqwQ znwkN7zLo@>V1D^Z_vd4-_7J5*=dKD z8-f}ksxJwj``dc_xDv+WgfS$v-&x4LpO+^|c0m-rtrPFF4N6jfEb(O<1Ijj>bQy5CT>i^omb2tAfPExe$?4f$)awg#s937jXF*~KMZrt$e zo*93fL0zlp>93Rg{NJ9w|6Fr>+416Yz+8tU&X4tQ_bL_Uk?rSqpz20n3>m@v%JUl#HLPF}d4@p0R6a();6o1XT zcM34tSl+JhbW_E2vFpf>DXFYHeESS9Y!bj>zR#aO-*fHPi`Zv#IGM2v%YkX`>+Ab< zCiF3&3yPB0V2UlRRT@*bf8)f)<0&4L#-gIOM1lBimp{NNMK$X@Y}s%N<=ff5vY9%a|%IZN&LsNnx zX<4+}c36n|;EN?%fA`|F7>K-RtF;h!aiPN_BezIO>Sd*JZQp))LpB`)gFmn?1XOj< z@Sxd>;RJ=X9omu~7@yL|>1g@!2Tuq#}Iom3;h+xRfbTTWHPb;gqLTBv6ivI_@wmn#HJS0I=SR$Sbj6IHnqmYZ*3iDf zrLGyjWHf}$2VE?jtr$LiSv~5C6wNo~<#hGAe9st8x_SXKuUfO_*1*YJZ~5599W|Oe zWCvu9d`o;;s5}{S>y~d%k1=%C>+P~LJ-+ac8YQ*)rH_=p>}CsA+@}`V_9W97@zwO8 zEypm!O1M9Z5_r~i}9SOB*(*FSDFyD(>U zjx*t$5S2m7O%Cr%ZLTV9ynOfE?d|O~YSc#NirEJCALf!iwmI|Ug#nA5YJk+5($3m? z#M9kpp@C*b(4l}M>Rt&|CpJ4fIc2qZVUH4a88aT&E`R;H2llT^fq`qt*r9Q$^A~j1 zGSzhkm$8m?{D0165?;oIts_Jy!@L(B_QODz=I`&eCY}yL&Hp@qVs+utqC0s$VOEKb zo(8hJWfh{pV}1z7!Z^&f#b;Qoyzyo{9FurA4r&W^u7y`;!-?#;1RV;smd~khD`-1 z^(X;(_UA8@vCd6>BTkI1Fp0n$BJRDIFFq^)?-u?eTI?dnBh}kmx>ntla%Cnu;bp2d zj2kxa(m!W~k_o>F0llzqU;7pXuVPZeX@t!XRS@drBel32!0sqR`Z0Xs06J0x402Zh zgBUAzh2N@x#r^il= zC`3X8^IC%9_$nS(LYU*qy^;_){Jfha#li3F(L>gqlgv98o`K^=q_(*IyGTqwBSS7DL>t<#I&K%@-*$mF=VI6M2B z85w&?Lk0d8gzqwRY8L}vV;{ptFB{-UMmoU99xdVcR2#t&`T^$}9$lOLF*#Z0N3#~Y zmjJsAIoQFikc^=8Tm}kw>hKP4HWB{~x;amS8iDm%0enl->6G&$Og@&Jer^xz&f1`` zArc5~6f9q*@R=~KTjv)R#_ZzidU~vGOq3CrEP#(aUK&i#5;#~g_@(6IF;1ZLx<;#OZ{kO0O(0) z1C4s4?Sp%|l3tM$jrH{p-M)vW%3`A#nr>2K4(0vC^UuP?37kt=YisNIIcfN)usd9X$%(uGmdvVEtBNs??)3x#Ze*(<$|ESK4Fo*g z+_tI0g(V=+ec8T!5}Tym;0aF3|2341GyDpw3{k5#(!_NieRHH`1unoYw{QG}FhzBV zBZJ{}wP$|?9TK{!!IBDt=2#BDB|rwO9{meHy9phG+j$AQMqnJen|9S4#<@l8D3Hb> z;Bb&;H<)(_NN8>7=Jc9bw(x7J42?^4;5g<%84ALvb7r*Z9yS)Jl>*d(E9A$3sz@CP zUTlN=TSp#nbD;3Zr!!vtcpugsJg<!jqgM*fV)>&C)-ZFS zfCL|YewL=d^ncPVsF*T;-){KX@j00nhvMtFKvRQ%0i$?8UjDLn79g_;gE>4F zP+P|{B-@WQO`Q4K@cpmmyBCSeeKR7|_zw!i;M5IVg*Jw69~sZW2ne}Lpek>O2f zKsAK`94%_aX8tz%5*FQo{9ZKPmV%aE14^ve!8Rf^)CbUr_!o&XfUw9*pel6cY0cE0 z!Fh?h(g(wR842$L#ND!Ur;_U0pv{sSz_p4HOCs!%J>;m?(1`eS?|Tq73O_$T?SdmC zGt)GZ)LXVtZeI|GUqdm_M&sMv`NY(JB$Pqfs?UTY=GFpSgm{!lmoW z_gZFa>nq;P*4lK`%gKDLN(_A`KW!LxPXnHKDAr_{%=q}Y!RqEtdimll+}sb!TmzqF zRu(2mwm(Unuy=A&#DN1Dg7AJQ2=rDn;sf4KP5mC(RTgP%srKTOm%)Q+&kwh9cdJ2@ z?sFa296I3q(ujc}#9DScS|nO8m!ujBY}-af5gHx+SaoO;=QtrQ(E&yjg9<`rqJ&d;J2xVOt6mvn2T1#U)!u z7m_`ZQzCaqL`4Ob1nK3pGFwwTm5f$5c++fnK!|GMUt3TTIo6h@<9u$-6{7MYFAp0% zsX#!Ro7_>1FG2Gxf0y6Dr%xYcRJM3gP;m7r9XfETvF6yS#g2T}wdlJOo!XNQ6DaOC zUO{4b+m->oukY-WrRA^WVu*p&Nsfeq0Es?qNk&FS>(;H?aqE=Qx8M|s^C8qH8TMl9 zgquLvhlT=?$W*GX>xT*$)x$qO*lR^;uw%Q!gL|tnT?p=pWx5f@u~Pnzu@MkqSU)5pQSmdO74#N)?b zB9}L0eNxg9+`VfTs;%u=5yUbDIDZvSAX%-+uFP&5cDY-XU7fxV{Bl7zzUAA^*jQ_) zF0ts(Zl|cdn_&5_hefygbl=ge6>|I_ZA&jtC9u zhIBX8(9|SLCI7(jcEvG(-z^dnxhE&zbXu1xxT7-@kHr>uW`0_lhVz-}ryWa$=p4y(rY(Pen})G`;-EqtkbYW5t)Nxvd}Ba<9{;r>3sJeuc$Jgf!6C zn{-b~uIFvq@V{bMY1Ec@bbi1hSat$J9LN6q-=h}Kwkp3&e zq$C%;JX<4iB5R&4{zvAi!U!W%1f?k;IF6O8L1%Vf1zP{EjdIVkkpVjBHYaG7P}fkI zAOmM)2a9l`?7MdD8mV>&3yfMNBY&0KN#ke9c05H+=3il#c$mjj#BeR(v7|%gbK!Ig zEx~-x28CGae#Ve19PGp!EaneH%Pu_G8=s=#tY1q7GvkA!v7Oh_o8$H(K* zi)D+Xg1!$|a1aKnIl>OdPo2v*J~2@W7O3~L`Li{pV`ZdE$DNpjfWV-2`NPP9{U{By zg2yuxtrBL(_8ff?ckiCnhPxSu>${F(P2*HEU;Cp=sos#g-rK|Oj~l{y>-2E?$^V3M zZ=^XdooC(jPs+XS+2N*pXZSg%KVxCPKcd1p*-*+*#pix%#^Y*{#7dRi5iEFJ>;$NPw zyrwniaJi2nhvuO(+!8I(PU7QR`i`>f);OobYN2a*BJ8S9_~G>|#>bDWttnd3Zm!g@ zjy|P0zO_!AZ&UI^mp4=~xNE`($2O{Y3iFH0fuXYUn472R>>iFV{F%^I|{G(XcGl{8jJu zrXHWaGgSDtjkm^hE-n4#^G-9q3X{EAI;*~)N<4QnMgQZ46FmOEMCv}k8-B(Hix)w4VRO@b2`ueAbE}XeM^SVw@ zX4&z<44eC##sa%}U77c>mnG&+D*WIJmyPo4Q^i_iL6NpV=AL7haan znl9D%*$24kS52xOl69rG5TumjNS{{ZKH3p?Tl?m!GYjpfjI3H&-cS`b^=}`^;nAnz+N#boCF5t?c6m z4n!~2F0DMk6k~gAM$e2h;%WV-GMeDBD_!N+?;lQ^l?q*WI8ReB5WDTs10jE&LD8>; zI^u)3BOW}|x-7C(VH&yp>wYfjS5G2hPOYauv%IcGi;HbT+X0Im?wfBRyu4X;prFm))=5#8LK2{v!>YRBv;~Ly2@MZI^}|1FE$BZ$+xqCYrvh)gt#Y z;gkOU3shlzO|BQZ+x@e+cMrXonoRMVg>3RFanH#{fBN?=yXhU(TaLEZv`3`9dwDUw z*|*_(;Lwy#<~_aPh^8(tv%!;V1{Elxa}*}jE0=^1g)kMWrFgbbX1i<{l&9qLi2KDY zP`Gf%XA?E50mCS{aO79X-|A?!;IgL7_U~nCPvfQ^Fh>-{u~4E?fow) z$B&d{?XUK8a%~seDu=9b+i|}4(i^R$A_rE6Ua`$SJFfWbUP|SOSpWB%*j+cTqK)iw z7~sC}yw8(oo{}<%rC9X)n(Br$zHM^MLK!^l<3So}N;>dmzlG|B(Fbjd zhYTIr$pN5rF#L&gMd7C0qAN>T`OAC8FnQ4=X*d zoQ~b*&vcJ}M8}RkrknbN3O35HtB(uDABmLjukCYHs$(x7F1TdBQ}?8fvODkNh#2|V zWoNkALT2ZB({>n7I;|;T(3_RL`bD_4Dy-uaXVujw{Mw5GU&2#k+ZnLY?_4$_?PwQ& zb3Hd*_T$Z*7oLVLI%T=oTg{DY{b0-5cCox-`huRcW;=_SXMkdJ;4aTS8t>`qGAuu; zaX%k_@nBKsTp4B4H^wI??n(=emVaeo{IK{!If9c?{%!4o&##|OU0SWHikAgmV$}%q zRG(H1i@F`xnt4N;L-WS9pz7(poKZ5*c9iP`QTZ7My3mIf-rT1-lo8=%I5nCP_APJ6 znWAh;*GC*p=hT#IlQdJQ%#>}XJ=`}s%oyZ}88V&S8}(DeJw`M=>-mu1sA7gald;ox zSOAC4c?y1{qDW8DzP>%TFDi{^#{&=MZLXBNMh-NLJJrkizubOx2>tm*LArjOS|Nj(PL8<$ zlLcj8?&_{}pC<~dBk7+12n+!ua86J5C0$HiS0Fuwxq#Xpy5zkaoN2ETiiboExN?}z z7hRe<*pa7{J>w)%|LUTm&yf1@hIwNX9oAaM5m%1(u7=~yleKpDHL6_2p;avVJO zJR_~F*2v3;Hr*(O?a3FZ3vRhj%c)-%M>)A_T`(1M;=LJU&)>xRd zA6rwPO)+UG+?P{wbs;>#QG3bqT-mM`?mYu6rSR?w2QvHiV~`tq#vp zbG*N3kj%RHoK{@fjnhIpHNW{q)^odx*u;vTI#*AXOPxPINROH~wnfa>AU)|$snpSP z6KiN&=?taPZJAj39nG}5KDOuH>!Tby-YRu;!{b6swPdxge zW$=fZs*A^7vOZIv{xIC=d`ZDT`c+IzS+ViCP{sH2o4C(*55C-9yVI?t)oXsBJLz7H zp2eGKg;v97XJy59xG%L8#%*qqUE`XL*#j-ylqxlXu~&5HCPT^!?=2gd^`;8&I*}6= zHt)_Z^#0<`PdaQ|qD#kKsTO!`G>dt^5*DF~uNvCZRQ<5@Vx7NB7;GHO6}BRH~t+fJ_Rj{pY957F1)ZFi+$Iz zja&?V3f_sd!#lN~Uf}J!YakhKBVZP@h0A=T1J3Qnj9-Q?YM#~PnWfY0Q&B#3l`T5M zG4JWiS(j6y53;8MrKWyrOnbff&_FF@Fm_~n$Ub_pbQD2mFCN~Tzg)P^qIQkgPFHQF z@GEE8c{5XUKOX<0oEC>orQ;tu;wJ*#2TR|C6H9U3bOBWQCEk zSiWTCn2Y)MH4HuU+`^vAFKCx4b3EJ39wDLbMWHj8cyKv?Z5eOll#j{D;wSN*q zUMd_9*fn(aY>bEew=m|KK_>eVL_n~2HNNMIzAv#96sDX*LvO~d_kZ+u=J8OrT^t_~ zkAxI62vb_fE?JXFjBQfSWQoCyecwW5O{MTOgwVoJwjOJkkbMve55qKw5#cRsk(y}6 z@?KNP`}y?e`+48<@7(vyeVyz2+;d&${Lc44>y^5ZU#n8n8*Z;4T+^5+?B7~UJNu88 zJs;lF%PLj~rh6QV9@HG-MN_b+GBnqTp~Gt-W_j+4mZSt%+x!QjKV!o*t*5t-Y#&G{orr;(9K3e8-$^pBs-fJ?cYyTS zzpui_zHDY8`*v58Ooy_W-xP3bZt7Yh9z#~Js)Nd%eG!i0uhm+8lB%*W?sF^8qc_;!^B~T33*7a~+^2m_eXnSLd5`ybO!yg!Y}O7g zqCC#NX_hHk*MjnEqDHcv5vZ0%T$RJ?D)Zc^$(6JHA`(_nfg>2z4NaBY;xdm`x5z6= zoKN@!`=dXMd_P+1FQ$ji!7LkVG0qFJ=GXOGT5CIT0)kVSNwyW3`dD?Ha=QyJgR|=7 zjt>VUvUYo@DK?q2F_zPnk`DxjhRcunx*g#kNQn0oFY7fsyinxbrS9+;GH}aUe4b~i zYy#QA4+$~~?aPP}QZxzk|2AHpkAI0tJ+zn4F}^&bou;(fPxZxlKYaCAM*hvjB0wr* zbz+i(g6)oX^h&2cLpwOMxCMfLCl{4%>*c&O=NCAS!`Xi0=j-F-_&tt&6-(kAmfI=x zF)??fbqyNbd&D;mMKPC1F&fUYc$_}_!Ma*nlk}Ql_lR)W?WRVl`FS#!{oe5VL{TrM z_8wX*&US8k1r-(`JeN|QIchSh)j`D$N1`ph;j2yBBRYo_L?#BtuN0z1D8WTOR?fAf z0$o;GBj?tH-P)GP2xQhLdFEb=*OT2<8X9h@*CyYC;!Jgt zbcqNfU4;<31|)gf7vN5cr{#&Kv|f@#DjD8+8TW9l$eGefiOzF1(N8bQyU&XI&eWAg zEezLNbgB(p@kvw|dMsm#_qJ9-Mc`5qJNKyu;`0i)I4G+xjJEnD+csEHkwhMyJXXwumNu52k(}9zJ zFmrfyyhXDm#cN&V5R(C3G%Ncw9%K5Tu#ivW6-=tfx~dt(R%5+rDelD-98JXWr`NP; ze2Zj;i8Q0e_uxbD{dgi@)gXeT z+1E7c&0(}Hz>>ssFs|7>OYG?``5xJRIyk^da3TrF>v@08A4je5*`y9Oe}dz4-^zVj z@!|78Kr?!54Cz+=r@fQ=4|oh=)INWbc9!ko9auIijAC#FHS*ew!yd|XoYyXUMXAAM zO3}&0rG^t;>GQ$HkhR9S3^`|jKf7-$sP%f^oI$MAFrXmHGiwz%WgChhGvUFP4wTK6mHCeYD{akB>K~Q zM+;0L^w}3gL7wM5ED`tg6M*>>7=pbb zmlSoI8R~!4*K!_MVc*XNjbX6#*nMwqY|;5ZP+7^~r$kv&l6zB54p6QC70H@f#8SP& zhT?!?{HM)Y02q@0LPKL`+fgibv=a&0s;;EcKoHy!U^KyJY-~9xc*xd+?MHAIP|Y|GwKi*VfbhU&!D8n;3WW^AkGBv>OPFP5LKh5BYiP`O~Ca0iWY+ajZf zW&q5FQH_y-e8zuF@kOAT)di*AM_}v_pdn-Rfslc*Z)GabeySij_hn%WS5*wMYC!0h z>HR=(%hOcZnmT?K&B~< zs=E4t<=$ry2Ka^M@aqhqDt0hlHF@W_>GEu>TL)zWMzS1)Tn#Df0?EXy>_pOv=oowh zowoTs`qUyZ=D6Yf# + + + net9.0 + enable + enable + false + true + + + + + + + + + + + + + + + + + + + + + + + <_Parameter1>EvalQuestionsJsonPath + <_Parameter2>$(ProjectDir)..\data\test\eval_inputs.json + + + + + + PreserveNewest + + + + + + + + + + + + diff --git a/src/ChatApp.EvaluationTests/EvalInput.cs b/src/ChatApp.EvaluationTests/EvalInput.cs new file mode 100644 index 0000000..82c2a54 --- /dev/null +++ b/src/ChatApp.EvaluationTests/EvalInput.cs @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Xunit.Abstractions; + +namespace ChatApp.EvaluationTests; + +public class EvalQuestion : IXunitSerializable +{ + public required int ScenarioId { get; set; } + + public required string ResearchContext { get; set; } + + public required string ProductContext { get; set; } + + public required string AssignmentContext { get; set; } + + void IXunitSerializable.Deserialize(IXunitSerializationInfo info) + { + ScenarioId = info.GetValue("ScenarioId"); + ResearchContext = info.GetValue("ResearchContext"); + ProductContext = info.GetValue("ProductContext"); + AssignmentContext = info.GetValue("AssignmentContext"); + } + + void IXunitSerializable.Serialize(IXunitSerializationInfo info) + { + info.AddValue("ScenarioId", ScenarioId); + info.AddValue("ResearchContext", ResearchContext); + info.AddValue("ProductContext", ProductContext); + info.AddValue("AssignmentContext", AssignmentContext); + } + + public override string ToString() + { + return $"Scenario = {ScenarioId}"; + } +} diff --git a/src/ChatApp.EvaluationTests/EvaluationTests.cs b/src/ChatApp.EvaluationTests/EvaluationTests.cs new file mode 100644 index 0000000..6d0ae4f --- /dev/null +++ b/src/ChatApp.EvaluationTests/EvaluationTests.cs @@ -0,0 +1,199 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Reflection; +using System.Text.Json; +using Aspire.Hosting; +using Azure.AI.OpenAI; +using Azure.Identity; +using ChatApp.ServiceDefaults.Clients.Backend; +using ChatApp.ServiceDefaults.Contracts; +using Microsoft.Extensions.AI; +using Microsoft.Extensions.AI.Evaluation; +using Microsoft.Extensions.AI.Evaluation.Quality; +using Microsoft.Extensions.AI.Evaluation.Reporting; +using Microsoft.Extensions.AI.Evaluation.Reporting.Storage.Disk; +using Microsoft.ML.Tokenizers; +using YamlDotNet.Serialization; +using YamlDotNet.Serialization.NamingConventions; + +namespace ChatApp.EvaluationTests; + +public class EvaluationTests : IAsyncLifetime +{ + private DistributedApplication _app = null; + private Settings _settings = null; + private BackendClient? backendClient = null; + + private static ISerializer? yamlSerializer = null; + private static readonly string ExecutionName = $"{DateTime.UtcNow:yyyyMMddTHHmmss}"; + + public async Task InitializeAsync() + { + yamlSerializer = new SerializerBuilder() + .WithNamingConvention(CamelCaseNamingConvention.Instance) + .Build(); + + // Init and start Aspire app for testing + var appHost = await DistributedApplicationTestingBuilder.CreateAsync(); + appHost.Services.ConfigureHttpClientDefaults(clientBuilder => + { + clientBuilder.AddStandardResilienceHandler(); + }); + _app = await appHost.BuildAsync(); + var resourceNotificationService = _app.Services.GetRequiredService(); + await _app.StartAsync(); + + // Retrieve config settings from the backend resource + var httpClient = _app.CreateHttpClient("backend"); + await resourceNotificationService.WaitForResourceAsync("backend", KnownResourceStates.Running).WaitAsync(TimeSpan.FromSeconds(30)); + var response = await httpClient.GetAsync("/health"); + response.EnsureSuccessStatusCode(); + + var backend = (IResourceWithEnvironment)appHost.Resources.Single(static r => r.Name == "backend"); + var backendEnvVars = await backend.GetEnvironmentVariableValuesAsync(DistributedApplicationOperation.Publish); + + // Configure the clients + var openAiEndpoint = await _app.GetEndpointfromConnectionStringAsync("openAi"); + var deploymentName = backendEnvVars["AzureDeployment"]; + _settings = Settings.GetCurrentSettings(openAiEndpoint, deploymentName); + backendClient = new BackendClient(httpClient); + } + + public async Task DisposeAsync() => await _app.DisposeAsync(); + + static EvalQuestion[] LoadEvaluationQuestions() + { + var questionDataPath = Assembly.GetExecutingAssembly() + .GetCustomAttributes() + .Single(a => a.Key == "EvalQuestionsJsonPath").Value!; + var test = AppContext.BaseDirectory; + if (!File.Exists(questionDataPath)) + { + throw new FileNotFoundException("Questions not found. Ensure the data ingestor has run.", questionDataPath); + } + var questionsJson = File.ReadAllText(questionDataPath); + return JsonSerializer.Deserialize(questionsJson)!; + } + + public static TheoryData EvalQuestions => [.. LoadEvaluationQuestions().OrderBy(a => a.ScenarioId).Take(5)]; + + [Theory] + [MemberData(nameof(EvalQuestions))] + public async Task EvaluateQuestionsWithMemberData(EvalQuestion question) + { + var reportingConfiguration = GetReportingConfiguration(); + for (int i = 0; i < 1; i++) + { + var result = await EvaluateQuestion(question, reportingConfiguration, i, CancellationToken.None); + + // NOTE: Samples if you want to check the metrics during the test: + + // var coherenceMetric = result.Get(CoherenceEvaluator.CoherenceMetricName); + // Assert.False(coherenceMetric.Interpretation!.Failed, + // $"{coherenceMetric.Interpretation.Reason} {string.Join(", ", coherenceMetric.Diagnostics.Select(d => d.Message))}"); + + // var groundednessMetric = result.Get(GroundednessEvaluator.GroundednessMetricName); + // Assert.False(groundednessMetric.Interpretation!.Failed, + // $"{groundednessMetric.Interpretation.Reason} {string.Join(", ", groundednessMetric.Diagnostics.Select(d => d.Message))}"); + } + } + + private ReportingConfiguration GetReportingConfiguration() + { + var azureClient = new AzureOpenAIClient(_settings.OpenAIEndpoint, new DefaultAzureCredential(new DefaultAzureCredentialOptions { ExcludeVisualStudioCredential = true })); + + IChatClient chatClient = azureClient.AsChatClient(_settings.DeploymentName); + Tokenizer tokenizer = TiktokenTokenizer.CreateForModel(_settings.ModelName); + + var chatConfig = new ChatConfiguration(chatClient, tokenizer.ToTokenCounter(6000)); + + return DiskBasedReportingConfiguration.Create( + storageRootPath: _settings.StorageRootPath, + chatConfiguration: chatConfig, + evaluators: GetEvaluators(), + executionName: ExecutionName); + } + + private static IEnumerable GetEvaluators() + { + // Measures the extent to which the model's generated responses are pertinent and directly related to the given queries. + yield return new RelevanceTruthAndCompletenessEvaluator( + new RelevanceTruthAndCompletenessEvaluator.Options(includeReasoning: true)); + + // Measures how well the language model can produce output that flows smoothly, reads naturally, and resembles human-like language. + yield return new CoherenceEvaluator(); + + // Measures the grammatical proficiency of a generative AI's predicted answer. + yield return new FluencyEvaluator(); + + // Measures how well the model's generated answers align with information from the source data + yield return new GroundednessEvaluator(); + } + + private async Task EvaluateQuestion(EvalQuestion question, ReportingConfiguration reportingConfiguration, int i, CancellationToken cancellationToken) + { + await using ScenarioRun scenario = await reportingConfiguration + .CreateScenarioRunAsync($"Scenario_{question.ScenarioId}", $"Iteration {i + 1}", cancellationToken: cancellationToken); + + CreateWriterRequest createWriterRequest = new() + { + Research = question.ResearchContext, + Products = question.ProductContext, + Writing = question.AssignmentContext + }; + + var responseItems = backendClient!.ChatAsync(new AIChatRequest( + [ + new AIChatMessage{ Content = yamlSerializer!.Serialize(createWriterRequest) } + ]), cancellationToken); + + + var researchContext = ""; + var productsContext = ""; + var finalAnswer = ""; + await foreach (var item in responseItems) + { + if (item.Delta.Role == AIChatRole.Assistant && item.Delta.Context?.Name == "Researcher") + { + researchContext = item.Delta.Content; + } + if (item.Delta.Role == AIChatRole.Assistant && item.Delta.Context?.Name == "Marketing") + { + productsContext = item.Delta.Content; + } + if (item.Delta.Role == AIChatRole.Assistant && item.Delta.Context?.Name == "Writer") + { + finalAnswer = item.Delta.Content; + } + } + + EvaluationResult evalResult = await scenario.EvaluateAsync( + [ + new ChatMessage(ChatRole.User, "research_context: " + question.ResearchContext), + new ChatMessage(ChatRole.User, "product_context: " + question.ProductContext), + new ChatMessage(ChatRole.User, "assignment_context: " + question.AssignmentContext), + ], + new ChatMessage(ChatRole.Assistant, finalAnswer), + additionalContext: [ + new GroundednessEvaluator.Context(JsonSerializer.Serialize(new { research = researchContext, products = productsContext })) + ], + cancellationToken); + + foreach (var metricResult in evalResult.Metrics.Values) + { + if (metricResult.Interpretation == null) + { + Console.WriteLine($"Metric {metricResult.Name} did not have an interpretation. Diagnostics: {string.Join(", ", metricResult.Diagnostics.Select(d => d.Message))}"); + } + } + + // Assert that the evaluator was able to successfully generate an analysis + Assert.False(evalResult.Metrics.Values.Any(m => m.Interpretation!.Rating == EvaluationRating.Inconclusive), "Model response was inconclusive"); + + // Assert that the evaluators did not report any diagnostic errors + Assert.False(evalResult.ContainsDiagnostics(d => d.Severity == EvaluationDiagnosticSeverity.Error), "Evaluation had errors."); + + return evalResult; + } +} diff --git a/src/ChatApp.EvaluationTests/Extensions/DistributedApplicationHostingTestingExtensions.cs b/src/ChatApp.EvaluationTests/Extensions/DistributedApplicationHostingTestingExtensions.cs new file mode 100644 index 0000000..f1e51fd --- /dev/null +++ b/src/ChatApp.EvaluationTests/Extensions/DistributedApplicationHostingTestingExtensions.cs @@ -0,0 +1,92 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Data.Common; +using System.Globalization; +using Aspire.Hosting; +using Microsoft.Extensions.Hosting; + +public static class DistributedApplicationHostingTestingExtensions +{ + private const string ConnectionStringEndpoint = "Endpoint"; + + public static async Task GetEndpointfromConnectionStringAsync(this DistributedApplication app, string resourceName, CancellationToken cancellationToken = default) + { + var connectionString = await app.GetConnectionStringFixedAsync(resourceName, cancellationToken); + + if (Uri.TryCreate(connectionString, UriKind.Absolute, out var uri)) + { + return uri; + } + else + { + var connectionBuilder = new DbConnectionStringBuilder + { + ConnectionString = connectionString + }; + + if (connectionBuilder.ContainsKey(ConnectionStringEndpoint) && Uri.TryCreate(connectionBuilder[ConnectionStringEndpoint].ToString(), UriKind.Absolute, out var serviceUri)) + { + return serviceUri; + } + + throw new FormatException("ConnectionStringEndpointNotFound"); + } + } + + ///

+ /// Gets the connection string for the specified resource and workaround for bug https://github.com/dotnet/aspire/issues/7138 + /// + public static ValueTask GetConnectionStringFixedAsync(this DistributedApplication app, string resourceName, CancellationToken cancellationToken = default) + { + var resource = GetResource(app, resourceName); + if (resource is not IResourceWithConnectionString resourceWithConnectionString) + { + if (resource is not ParameterResource parameterResource) + { + throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Resource '{0}' does not expose a connection string.", resourceName), nameof(resourceName)); + } + + resourceWithConnectionString = new ResourceWithConnectionStringSurrogate(parameterResource, null); + } + + return resourceWithConnectionString.GetConnectionStringAsync(cancellationToken); + } + + static IResource GetResource(DistributedApplication app, string resourceName) + { + ThrowIfNotStarted(app); + var applicationModel = app.Services.GetRequiredService(); + + var resources = applicationModel.Resources; + var resource = resources.SingleOrDefault(r => string.Equals(r.Name, resourceName, StringComparison.OrdinalIgnoreCase)); + + if (resource is null) + { + throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "ResourceNotFoundExceptionMessage: {0}", resourceName), nameof(resourceName)); + } + + return resource; + } + + static void ThrowIfNotStarted(DistributedApplication app) + { + var lifetime = app.Services.GetRequiredService(); + if (!lifetime.ApplicationStarted.IsCancellationRequested) + { + throw new InvalidOperationException("ApplicationNotStartedExceptionMessage"); + } + } + + internal sealed class ResourceWithConnectionStringSurrogate(ParameterResource innerResource, string? environmentVariableName) : IResourceWithConnectionString + { + public string Name => innerResource.Name; + + public ResourceAnnotationCollection Annotations => innerResource.Annotations; + + public string? ConnectionStringEnvironmentVariable => environmentVariableName; + + public ReferenceExpression ConnectionStringExpression => + ReferenceExpression.Create($"{innerResource}"); + } +} \ No newline at end of file diff --git a/src/ChatApp.EvaluationTests/Settings.cs b/src/ChatApp.EvaluationTests/Settings.cs new file mode 100644 index 0000000..711b2de --- /dev/null +++ b/src/ChatApp.EvaluationTests/Settings.cs @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Microsoft.Extensions.Configuration; + +namespace ChatApp.EvaluationTests; + +public class Settings +{ + public readonly Uri OpenAIEndpoint; + public readonly string DeploymentName; + public readonly string ModelName; + public readonly string StorageRootPath; + + public Settings(IConfiguration config) + { + OpenAIEndpoint = new Uri(config.GetValue("OpenAIEndpoint")!); + DeploymentName = config.GetValue("DeploymentName") ?? throw new ArgumentNullException(nameof(DeploymentName)); + ModelName = config.GetValue("ModelName") ?? throw new ArgumentNullException(nameof(ModelName)); + StorageRootPath = config.GetValue("StorageRootPath") ?? throw new ArgumentNullException(nameof(StorageRootPath)); + } + + public static Settings GetCurrentSettings(Uri? openAIEndpoint, string deploymentName) + { + var builder = new ConfigurationBuilder() + .SetBasePath(AppContext.BaseDirectory) + .AddInMemoryCollection(new Dictionary + { + {"OpenAIEndpoint", openAIEndpoint?.ToString()}, + {"DeploymentName", deploymentName} + }) + .AddJsonFile("appsettings.json", optional: true, reloadOnChange: false) + .AddJsonFile("appsettings.Development.json", optional: true, reloadOnChange: false) + .AddEnvironmentVariables(); + + IConfigurationRoot config = builder.Build(); + + return new Settings(config); + } +} diff --git a/src/ChatApp.EvaluationTests/appsettings.json b/src/ChatApp.EvaluationTests/appsettings.json new file mode 100644 index 0000000..be5d077 --- /dev/null +++ b/src/ChatApp.EvaluationTests/appsettings.json @@ -0,0 +1,4 @@ +{ + "ModelName": "gpt-4o", + "StorageRootPath": "cache" +} \ No newline at end of file diff --git a/src/ChatApp.ServiceDefaults/ChatApp.ServiceDefaults.csproj b/src/ChatApp.ServiceDefaults/ChatApp.ServiceDefaults.csproj index e3f5024..8d1e3be 100644 --- a/src/ChatApp.ServiceDefaults/ChatApp.ServiceDefaults.csproj +++ b/src/ChatApp.ServiceDefaults/ChatApp.ServiceDefaults.csproj @@ -12,7 +12,7 @@ - + diff --git a/src/ChatApp.ServiceDefaults/Clients/Backend/BackendClient.cs b/src/ChatApp.ServiceDefaults/Clients/Backend/BackendClient.cs new file mode 100644 index 0000000..e20a1ad --- /dev/null +++ b/src/ChatApp.ServiceDefaults/Clients/Backend/BackendClient.cs @@ -0,0 +1,26 @@ +using System.Net.Http.Json; +using System.Runtime.CompilerServices; +using System.Text.Json; +using ChatApp.ServiceDefaults.Contracts; + +namespace ChatApp.ServiceDefaults.Clients.Backend; + +public class BackendClient(HttpClient http) +{ + public async IAsyncEnumerable ChatAsync(AIChatRequest request, [EnumeratorCancellation] CancellationToken cancellationToken) + { + var httpRequest = new HttpRequestMessage(HttpMethod.Post, "/chat/stream") + { + Content = JsonContent.Create(request), + }; + var response = await http.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead, cancellationToken); + var stream = await response.Content.ReadAsStreamAsync(cancellationToken); + await foreach (var item in JsonSerializer.DeserializeAsyncEnumerable(stream, true, cancellationToken: cancellationToken)) + { + if (item is not null) + { + yield return item; + } + } + } +} diff --git a/src/ChatApp.WebApi/Model/AIChatCompletion.cs b/src/ChatApp.ServiceDefaults/Contracts/AIChatCompletion.cs similarity index 92% rename from src/ChatApp.WebApi/Model/AIChatCompletion.cs rename to src/ChatApp.ServiceDefaults/Contracts/AIChatCompletion.cs index d547bd0..4e41ca8 100644 --- a/src/ChatApp.WebApi/Model/AIChatCompletion.cs +++ b/src/ChatApp.ServiceDefaults/Contracts/AIChatCompletion.cs @@ -3,7 +3,7 @@ using System.Text.Json.Serialization; -namespace ChatApp.WebApi.Model; +namespace ChatApp.ServiceDefaults.Contracts; public record AIChatCompletion([property: JsonPropertyName("message")] AIChatMessage Message) { diff --git a/src/ChatApp.WebApi/Model/AIChatCompletionDelta.cs b/src/ChatApp.ServiceDefaults/Contracts/AIChatCompletionDelta.cs similarity index 92% rename from src/ChatApp.WebApi/Model/AIChatCompletionDelta.cs rename to src/ChatApp.ServiceDefaults/Contracts/AIChatCompletionDelta.cs index 82b5885..628a4b1 100644 --- a/src/ChatApp.WebApi/Model/AIChatCompletionDelta.cs +++ b/src/ChatApp.ServiceDefaults/Contracts/AIChatCompletionDelta.cs @@ -3,7 +3,7 @@ using System.Text.Json.Serialization; -namespace ChatApp.WebApi.Model; +namespace ChatApp.ServiceDefaults.Contracts; public record AIChatCompletionDelta([property: JsonPropertyName("delta")] AIChatMessageDelta Delta) { diff --git a/src/ChatApp.WebApi/Model/AIChatMessage.cs b/src/ChatApp.ServiceDefaults/Contracts/AIChatMessage.cs similarity index 89% rename from src/ChatApp.WebApi/Model/AIChatMessage.cs rename to src/ChatApp.ServiceDefaults/Contracts/AIChatMessage.cs index 65d9ff1..0e1ebd3 100644 --- a/src/ChatApp.WebApi/Model/AIChatMessage.cs +++ b/src/ChatApp.ServiceDefaults/Contracts/AIChatMessage.cs @@ -3,7 +3,7 @@ using System.Text.Json.Serialization; -namespace ChatApp.WebApi.Model; +namespace ChatApp.ServiceDefaults.Contracts; public struct AIChatMessage { diff --git a/src/ChatApp.WebApi/Model/AIChatMessageDelta.cs b/src/ChatApp.ServiceDefaults/Contracts/AIChatMessageDelta.cs similarity index 92% rename from src/ChatApp.WebApi/Model/AIChatMessageDelta.cs rename to src/ChatApp.ServiceDefaults/Contracts/AIChatMessageDelta.cs index cf635bb..53d6808 100644 --- a/src/ChatApp.WebApi/Model/AIChatMessageDelta.cs +++ b/src/ChatApp.ServiceDefaults/Contracts/AIChatMessageDelta.cs @@ -3,7 +3,7 @@ using System.Text.Json.Serialization; -namespace ChatApp.WebApi.Model; +namespace ChatApp.ServiceDefaults.Contracts; public struct AIChatMessageDelta { diff --git a/src/ChatApp.WebApi/Model/AIChatRequest.cs b/src/ChatApp.ServiceDefaults/Contracts/AIChatRequest.cs similarity index 90% rename from src/ChatApp.WebApi/Model/AIChatRequest.cs rename to src/ChatApp.ServiceDefaults/Contracts/AIChatRequest.cs index 404e949..60c7c72 100644 --- a/src/ChatApp.WebApi/Model/AIChatRequest.cs +++ b/src/ChatApp.ServiceDefaults/Contracts/AIChatRequest.cs @@ -3,7 +3,7 @@ using System.Text.Json.Serialization; -namespace ChatApp.WebApi.Model; +namespace ChatApp.ServiceDefaults.Contracts; public record AIChatRequest([property: JsonPropertyName("messages")] IList Messages) { diff --git a/src/ChatApp.WebApi/Model/AIChatRole.cs b/src/ChatApp.ServiceDefaults/Contracts/AIChatRole.cs similarity index 75% rename from src/ChatApp.WebApi/Model/AIChatRole.cs rename to src/ChatApp.ServiceDefaults/Contracts/AIChatRole.cs index 9a05537..04b1f74 100644 --- a/src/ChatApp.WebApi/Model/AIChatRole.cs +++ b/src/ChatApp.ServiceDefaults/Contracts/AIChatRole.cs @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -using ChatApp.WebApi.Converters; using System.Text.Json.Serialization; +using ChatApp.ServiceDefaults.Converters; -namespace ChatApp.WebApi.Model; +namespace ChatApp.ServiceDefaults.Contracts; [JsonConverter(typeof(JsonCamelCaseEnumConverter))] public enum AIChatRole diff --git a/src/ChatApp.WebApi/Model/CreateWriterMessage.cs b/src/ChatApp.ServiceDefaults/Contracts/CreateWriterMessage.cs similarity index 86% rename from src/ChatApp.WebApi/Model/CreateWriterMessage.cs rename to src/ChatApp.ServiceDefaults/Contracts/CreateWriterMessage.cs index 97b2779..3106921 100644 --- a/src/ChatApp.WebApi/Model/CreateWriterMessage.cs +++ b/src/ChatApp.ServiceDefaults/Contracts/CreateWriterMessage.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -namespace ChatApp.WebApi.Model; +namespace ChatApp.ServiceDefaults.Contracts; public sealed class CreateWriterRequest { diff --git a/src/ChatApp.WebApi/Converters/JsonCamelCaseEnumConverter.cs b/src/ChatApp.ServiceDefaults/Converters/JsonCamelCaseEnumConverter.cs similarity index 88% rename from src/ChatApp.WebApi/Converters/JsonCamelCaseEnumConverter.cs rename to src/ChatApp.ServiceDefaults/Converters/JsonCamelCaseEnumConverter.cs index 6473181..12d6db5 100644 --- a/src/ChatApp.WebApi/Converters/JsonCamelCaseEnumConverter.cs +++ b/src/ChatApp.ServiceDefaults/Converters/JsonCamelCaseEnumConverter.cs @@ -4,7 +4,7 @@ using System.Text.Json; using System.Text.Json.Serialization; -namespace ChatApp.WebApi.Converters; +namespace ChatApp.ServiceDefaults.Converters; public class JsonCamelCaseEnumConverter : JsonStringEnumConverter where T : struct, Enum { diff --git a/src/ChatApp.WebApi/Agents/CreativeWriterApp.cs b/src/ChatApp.WebApi/Agents/CreativeWriterApp.cs index 3972542..4625415 100644 --- a/src/ChatApp.WebApi/Agents/CreativeWriterApp.cs +++ b/src/ChatApp.WebApi/Agents/CreativeWriterApp.cs @@ -8,6 +8,7 @@ using Microsoft.SemanticKernel.Plugins.Web.Bing; using System.Text.Json; using Microsoft.Extensions.VectorData; +using ChatApp.ServiceDefaults.Contracts; namespace ChatApp.WebApi.Agents; diff --git a/src/ChatApp.WebApi/Agents/CreativeWriterSession.cs b/src/ChatApp.WebApi/Agents/CreativeWriterSession.cs index 4b96663..950349e 100644 --- a/src/ChatApp.WebApi/Agents/CreativeWriterSession.cs +++ b/src/ChatApp.WebApi/Agents/CreativeWriterSession.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using ChatApp.ServiceDefaults.Contracts; using ChatApp.WebApi.Model; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Agents; diff --git a/src/ChatApp.WebApi/Controllers/ChatController.cs b/src/ChatApp.WebApi/Controllers/ChatController.cs index fda3195..a2f284c 100644 --- a/src/ChatApp.WebApi/Controllers/ChatController.cs +++ b/src/ChatApp.WebApi/Controllers/ChatController.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using ChatApp.ServiceDefaults.Contracts; using ChatApp.WebApi.Agents; using ChatApp.WebApi.Model; using Microsoft.AspNetCore.Mvc; @@ -17,7 +18,6 @@ public class ChatController : ControllerBase private readonly CreativeWriterApp _creativeWriterApp; private readonly IDeserializer _yamlDeserializer; - public ChatController(CreativeWriterApp creativeWriterApp) { _creativeWriterApp = creativeWriterApp; diff --git a/src/ChatApp.WebApi/Program.cs b/src/ChatApp.WebApi/Program.cs index 0fe548f..6b5ae82 100644 --- a/src/ChatApp.WebApi/Program.cs +++ b/src/ChatApp.WebApi/Program.cs @@ -2,8 +2,8 @@ // Licensed under the MIT License. using Azure.Identity; +using ChatApp.ServiceDefaults.Contracts; using ChatApp.WebApi.Agents; -using ChatApp.WebApi.Model; using Microsoft.SemanticKernel; using System.Text.Json; using System.Text.Json.Serialization; diff --git a/src/ChatApp.sln b/src/ChatApp.sln index cc3fccb..b8ca4fc 100644 --- a/src/ChatApp.sln +++ b/src/ChatApp.sln @@ -1,3 +1,4 @@ + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.10.35013.160 @@ -8,6 +9,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ChatApp.ServiceDefaults", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ChatApp.WebApi", "ChatApp.WebApi\ChatApp.WebApi.csproj", "{0E7A4CA7-2BB1-434D-A34C-1B772055BF81}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChatApp.EvaluationTests", "ChatApp.EvaluationTests\ChatApp.EvaluationTests.csproj", "{8048CE1B-0473-477A-A40B-3CA376EC2814}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -26,6 +29,10 @@ Global {0E7A4CA7-2BB1-434D-A34C-1B772055BF81}.Debug|Any CPU.Build.0 = Debug|Any CPU {0E7A4CA7-2BB1-434D-A34C-1B772055BF81}.Release|Any CPU.ActiveCfg = Release|Any CPU {0E7A4CA7-2BB1-434D-A34C-1B772055BF81}.Release|Any CPU.Build.0 = Release|Any CPU + {8048CE1B-0473-477A-A40B-3CA376EC2814}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8048CE1B-0473-477A-A40B-3CA376EC2814}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8048CE1B-0473-477A-A40B-3CA376EC2814}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8048CE1B-0473-477A-A40B-3CA376EC2814}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/data/test/eval_inputs.json b/src/data/test/eval_inputs.json new file mode 100644 index 0000000..071779d --- /dev/null +++ b/src/data/test/eval_inputs.json @@ -0,0 +1,20 @@ +[ + { + "ScenarioId": 1, + "ResearchContext": "Can you find the latest camping trends and what folks are doing in the winter?", + "ProductContext": "Can you use a selection of tents and sleeping bags as context?", + "AssignmentContext": "Write a fun and engaging article that includes the research and product information. The article should be between 800 and 1000 words. Make sure to cite sources in the article as you mention the research not at the end." + }, + { + "ScenarioId": 2, + "ResearchContext": "Can you find the latest trends in hiking shoes?", + "ProductContext": "Can you use a selection of hiking shoes as context?", + "AssignmentContext": "Write an article about the best kind of hiking shoes. The article should include the research and product information. Make sure to cite sources and link to them in the article." + }, + { + "ScenarioId": 3, + "ResearchContext": "Find information about the best snow camping spots in the world", + "ProductContext": "Can you use a selection of tents that are good for snow as context?", + "AssignmentContext": "Write an article about the best kind of tents for snow camping. The article should include the research and product information. Make sure to cite sources in the article as you mention the research not at the end." + } +] \ No newline at end of file