From 6a888b8cb818e5bc227c79d4e6bb44dd63ed2d6f Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Thu, 26 Jun 2025 21:03:03 +0800 Subject: [PATCH] 'commit' --- dsRag/Start.py | 40 +++++++++++++++++++++++++++++++++ dsRag/Test/TestWriteDoc.py | 44 +++++++++++++++++++++++++++++++++++++ dsRag/Test/__init__.py | 0 dsRag/Test/output.docx | Bin 0 -> 36622 bytes dsRag/static/ai.html | 43 ++++++++++++++++++++++++++++++++++-- 5 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 dsRag/Test/TestWriteDoc.py create mode 100644 dsRag/Test/__init__.py create mode 100644 dsRag/Test/output.docx diff --git a/dsRag/Start.py b/dsRag/Start.py index ba49b059..6e56680e 100644 --- a/dsRag/Start.py +++ b/dsRag/Start.py @@ -15,6 +15,10 @@ from Config.Config import MS_MODEL_PATH, MS_MODEL_LIMIT, MS_HOST, MS_PORT, MS_MA from Milvus.Utils.MilvusCollectionManager import MilvusCollectionManager from Milvus.Utils.MilvusConnectionPool import * from Milvus.Utils.MilvusConnectionPool import MilvusConnectionPool +from docx import Document +from docx.shared import Inches +from io import BytesIO +import html2text # 初始化日志 logger = logging.getLogger(__name__) @@ -156,6 +160,42 @@ http://10.10.21.22:8000/static/ai.html class QueryRequest(BaseModel): query: str = Field(..., description="用户查询的问题") +class SaveWordRequest(BaseModel): + html: str = Field(..., description="要保存为Word的HTML内容") + +@app.post("/api/save-word") +async def save_to_word(request: Request): + try: + data = await request.json() + save_request = SaveWordRequest(**data) + except ValidationError as e: + logger.error(f"请求体验证失败: {e.errors()}") + raise HTTPException(status_code=422, detail=e.errors()) + except Exception as e: + logger.error(f"请求解析失败: {str(e)}") + raise HTTPException(status_code=400, detail="无效的请求格式") + + # 转换HTML为纯文本 + h = html2text.HTML2Text() + h.ignore_links = True + plain_text = h.handle(save_request.html) + + # 创建Word文档 + doc = Document() + doc.add_heading('小学数学问答', 0) + doc.add_paragraph(plain_text) + + # 保存到内存中的字节流 + file_stream = BytesIO() + doc.save(file_stream) + file_stream.seek(0) + + return StreamingResponse( + file_stream, + media_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document", + headers={"Content-Disposition": "attachment; filename=小学数学问答.docx"} + ) + @app.post("/api/rag") async def rag_stream(request: Request): try: diff --git a/dsRag/Test/TestWriteDoc.py b/dsRag/Test/TestWriteDoc.py new file mode 100644 index 00000000..dc8469e1 --- /dev/null +++ b/dsRag/Test/TestWriteDoc.py @@ -0,0 +1,44 @@ +from bs4 import BeautifulSoup +from docx import Document +""" +pip install python-docx html2text beautifulsoup4 +""" + +def html_to_word(html_content, word_path): + # 解析 HTML + soup = BeautifulSoup(html_content, 'html.parser') + + # 创建 Word 文档 + doc = Document() + + # 遍历 HTML 的所有段落 + for element in soup.find_all(['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div']): + # 获取文本内容 + text = element.get_text(strip=True) + if text: + # 添加到 Word 文档 + doc.add_paragraph(text) + + # 保存 Word 文档 + doc.save(word_path) + print(f"HTML content saved to {word_path}") + + +# 示例 HTML 内容 +html_content = """ + + +
+This is a paragraph.
+#7OORN9ty5!eVtO9rR%*H-UaaUOS_CMzyWbMp*Fx9vGpJ>= zSv?0-QHXufZuF+Y@DHli`cxl1?LVld{aUr#f5DT8W#ske=lcT|hQx0{8u5s$hqU~) zzl8fLogW9EG9B4gr-em$(h)_d*+iiGnb`W634_wfKIwO7oWE)H(sgvrGdwvh!?*>} z{U*Bb2ejC(yB%n4Y^|y~UMNo1K~J*aE9*yK6)-1*5RegVcnyRYi~GEQ<@Fvrg}dV( zXmx~bw3BsV7TflIhlg)a%V4H`{$r@TUgk~HI@7Itqz;x|#GwAFpMdPCE>8+5<@`Lv z@g$2|;wGk0QD>LtET@S%l0OOsxlq|eLgHQW@|SuTYK~UBL`;G%TDQuuAq;Ll)@Hg0 znZiZYx8yY8-TU~M*Mjqr@34>=T`mMjAdj+jm6x>KsWQ*L0IO^aQ_R@p3>3xG;4q5cI2lPPA2pNe zJvWomUw#PA$21&!?^lx@RfIIlBXU&nC4#l&P$~DzC`1bA1_)3q?cU%O!Ff<%x+ypm z_3sIk_b(qUHOZ@(i?1ZI_Q)gvX`a~i`tA#>lW8&Br;yEBRFTa}!-~jbs9&6T4b-I+ zeRCUlJa{97^Mp )mi1PhKKAEDO%7fEBqRF0aE=89-ZDR=?nIfB10L zU%W(-x~Esu1UkccQt|&-v!&JGsr789M1TL`Q+}}F5)!~ZJFo(2 5Pd{ z2%M+?5&WdUbpNMdL;zSYm}f5DWnH_jDf(-huI2SQ!+pU+yY4{UldOf_v#iCxfX9#k zHN<|^e*w>yP`P$nal@5wmDSy4vF`&%K^0q;HUnrvZ;nr3)h{HtxN)8oascY s1Tf<~ zfu%WuOG35_ghK)Z9SUSSvTBdzs0}FB<(CDM4HlEel+_L$h=3zGZ~q$1|E)HSL{oSi z)8Zd+J;C*T<6m_GE22)8MtAQ$F_cEeJ*HMLj@RRa*9XP;EB4J4_HE*dwl|GqJ@@he z)C~E{SH25Sg7v;UD&bzI0pt59iOK9`&OJ=d5W6r)e(K6&)qXD@(RIw8vO0e+1K}Dm zbZQCj69nj18fTQs6261016eg?b<*-mqw5f8Bb0YM>hW<7m6)Po4>j`eJ4(HVWLKZ> z_Pc=Zt*~Hd;p3d8nS-35w)J7QQ%&D6`+kNTxZpNwKaC5f^UcD8yu^hnhV;F8^NFWq z(jd_Jqd9&5<<92?SYA}&+RQDlysh>N1P_=ogg8%(xUSTFZEji!__#Kw++gq z{(;L(6n5~tekPX~q=C!Y<^KSP_oW8|d{F)qpsNpyn3i`#ir3-It<&(!=$!GsTktLy zkr_7c+@-=AIm}pWn@qr#m)iI*SmH5_QYc~;(ovPb-K`LO__#ZSIHWrZ>VGL9jG;M8 z$AW+v)6*6Z&gPx#XcvQzBXW#?>Ax&ZUP0oGt5SgFHLy$h2+rpI`X{|W8OERV!XyH_ zkSt*HJZNM7tNO^xTr8#kl}^A*I(A;x=C#ENiT&+ AxI5HiMSAO30fK5GtH!}?c5u%TOG70BUc zq8R?C?cr$6P=)o4BDKZpsc mqA#iC}=`UGx zywmZtA$ oD_k0~U0l@$_g#AIsv)7V$mYHhTE*B2>oEF# z_O;JTni{?CzYcRu(asQLVBqH7Z(#QdP%|;7sb>eTm(>cmVTG~s)e5GXxC(wVhwcMR z79J+%!{hw@ Y!RvuZ}63+DZE -1o5S9k4C-h|3NWSYOILaf15 zM!%^-bQp1= yO&SQie~jpT&~6j$ _fVI=MXyAp|DADS zoRF2Zfjy@>XmmWd<8X2%hfN#HB&(V+oy8*CbylYhJVioNq-fbME3}{JlL7i39$3%E zH;{_4JkPc6J9I+5Uu|G}6#acIn#!;aQa45lEvmD-3Xpf`e)0Eh#8SE((D(5#a#6fx zjGUzWB+3bX;VWXf$_V$p&ZxBU60P;KPCxcbJYAGE$SAm3N@x{{mju!c8WFthg_XF}tHGjAc3V)8fc1K>7>w8xh{)6|_qJSA zB`6 E}!5Q5HF- 3*eV!QdAp z-bcFhHeFivch)zb!x1l-$zX86E359&+BcqZbZt}Le&LeP4)I=(@`SE}D@9@$9C-R8 zD4goZYNW$T%_aItKau(o#}=h>mBvRw6r3%+83g(pDEj95oOVZ*0S}su7=0e|R^E!g zROoxb|EU5d_uNT0w$VkS$`(g3VBC6Zyj#Pq{Gx8?APNm*N2}mVKaH8nVsdHk86BGU zhxO36^u7_IfyH(%ScaeRU*R{njIcV_uvzfl`3O5dqws~2ag`};6wxGDGmBi#Z)Az* z$w=8gu@Xr31;4yGDhY&xLwCeRgstR}kUm%4M3!3)tQX5!7PaqE@jWv7{dn?7%ADQ_ zdC1eD3N`8~GNRu}*YAf%5o9EkPmevMAi%pF }$me`YET@0~_Bqtk`Af6*D zX5XgbD?30oMSI iBlrQK~>6tdzqYG5>VHOT$> zUqCf~03rSxs0j>I@M3xflt2WEG)c=E|59So+cWM8`~zWEM+p3E@ioqpg#>Eid=~$z z^o3J3@I3Twv8Zf;W^sPAR=H5I%B%D214Y ~^$+ck5NJRC zJn|vktBu5#=N2#h4CP1lmI78B(VY^urAGV|oEOi#fcB>YSYKY}(qDBW=~*9Qq!GcD z*x(QQq5Ny%+R0d|Sfvq-Jr;ZGksN^zU9}vGuKX0+2Ami0D;EHEV7UlSci-BT@YBhd zQ`KtA7z3@l`Vm`B2(7!DB5a~B?)5(4pXc+9yo2ZXxF8^0>);>=|9L)N%i7IK%EH3j z)a}os`u_T9MbeF@k06|u;}PZDR0xW%6aLefP@@JDyO$Za_rg_G^ZJ>!iO2HvZQ#@T zqIrRsU*cuIgq{M@=|l+ %+^5XV-Jy%*49>)g$n%tF8|1{54Dj}S z=C;0eZ!q-#C{%YFP-+iKvj7AHyte8Gc-ri)PWTu1ftWjj&H(}5!iL=yowr^^Wv_g% zCKIknV|k%j5p8MvJ^}4Lo~!$=E<;(sGi#vFDbLDcVv_QqG(8#bb-kfsMDCCLh}Ds$ zy?|PjtF@QiOBt4#F@ZV TMVtekx;O0b$nuf| PRSR`rpQ&s5sxc)* zCKtOF{9P 3 zv`HMyF0K0%7F*5k)v9KyusNrfMP4uK+T12_9Um26m<^gdKl5ae(jgyjcierYyxnfc zqsC(t0e{83Z}fYrS61ro6VX;ieR&)+Y^|E&)>+%!R4ywEAxmYcBGZhIp8!5SZi5Da zbH~o0*WA>Tfb-P&rQKH|vV+%(k%*~Pp8&u7_iu#GNsB~CQ|o>fW`ArnC?0xpeW*IT zq3w!kkRWobI$*SK|pQ9<2EaTO0~(pT`f0nT{Q08k_UeGaRnv+9^er|)| zgPS;Rfg--z#4o*|ZCPZlzS`TFi620F*@o=g+l($l+|`l8(;eVX=6zV6(&J3f#jW#< z=bS`v)=T}SgX*oG>4Y=9ofJ!*a`d{5mSe05FF;XeV|}x&YE0L+DDk;wbdY5xI%0qB z0OZ`!^XLv5GpPKW$Ky#BM_dl*NATG%TR1Fx)*p-@^JaXYh8{5AD_d|dbS&5_XlHan zsWpUJCq#PH7Oveem=+ot`0ST97^mhqrq+;zia0YAlN{?L7*%KTmc%cYmVkk1+bc1u z5u $I%R@=U{=k>`-b u@>H*$M zuGR*M1wU)`6Anl-8pS%v9Blck3$RDfRgz>3VV}lL8Yg(jIE+SM)=O_GAZSyqLGe~& zI6zL_>p(3=wg&pVAJ&725F2C)93tGt?Kh5fLfX0*uV{rpRZ|Cd(ER{+ke`A(62Kkx z((SNL|Aru5gl~g*&Lrxi-uWH$SN889uPJ*-;?nZpD9yj&|3LYBz~52+cNO?tZLm)1 zg+HKp6}~$_62n=yL7;|&g2A}{q4i&qen1^FVK{=r5Wr!!{|f7ObU@l-m1_Bovkt|J zJo_8x?*V`FTrb@WJFiE%0S?0ihyAvOYU@%Z_kenPeHHf@wokFINApxCm(&db@S6`{ z5@Bka078$QFkx%X%+MR9?x5TlHGy2l?&JdXf{EFDtKw&>rnXDUMI4c1Y&VTw51-B= z_V;tf2k)?Ah~z}PCIA~AydDo{{2hL;hqklFwzph0W4k;^Wu6mgcrW)}Aox=k-=EKG zIlVZ7Ib9o%KbdRaw04<&%B>|u-suo=-#tMgjhWwE**8!UVl~^G0ur@WJ;z6zRljsF z_iO{N;{AVqJzRL00PU^ZJXtqPeRLs-ybe?AIOENp_QS|{0-AUDJ@a++d4`#a)GSWu z-);eizQ#`|XW7sCZ|nt5&v_=Nah*8<5A5>*lAyWsnKXfpHSsg5@wKIz%{2ej&U@vN zwwj+`XC3ui`?>+EnWWPJtC?}8XYt-=mt?cgTThI&BA?3Mz>xhA_=R(Rju)Z0 oUiL(x5Ue6lG;9K_Ln+137C;@{=DZD;j5L99x2w z;n%WM*)skSO_svhuJvw$Ji?#mh<|wz&p|EJ!By5_lmj+{_}R(I*KBR8$Vs(Ays9yV zcY8yY&(R}$#2)J4cl>8#wcuYn<*y}Shv9S8sk{m?29kQIyzGR77sA5Dwk4&l@V|+B z>!R#eNWW8lMBR@9sVsKl+e$r4K-G>&u%qGxWvInfOqAV5AgfJ+R1#w=5xXUvFEmBI z3o8z&UvfrZD*_uzyN28su9ZA?PDO+d^Ru3wclmR?4V4FacasEP8or>oyR7(uo}S{R zgtPVm*SgPhyW@>d%_0We#0r(nPwgw`JS@aa4rq?I^PCxR8kfDwV_sVw0AEo1TCU0G z66YZaht$LdK^lhwQt6DEy~8QKL(P?%+?nfXycXCe8l+?6W@SE=o(ZxxJ{69W`u?4( zi`Mr}?vWUHGOT!4W**aMhmj}x#ypI_S|>{?U3^Jg9Ba68Y^NQ}+~L*GIh2Gfh+QUm zg+>(~F~r0|+kx=TUom!|C>G#9xJ|^>sj -=OnB_n!D|I*5k!wAxomp-U$ zH)U|{vbn~YZ&^J!)uF^xAq4#YUQNsHaNzUbObc L$hCdxBwtUPO7LLhj zOEV20E+_Kq#TKsEGkOuZ;{!-BXF0m)gnTEpW;P{O_}m jBb52%e z-^{Aa%XaTx6@U8sdeyKur7_9bxj ~ cjn)%{ zwU#~;yeiw-DX7^Q1P?k_a~0ISXLBQ^UD~lRI_Gm9^Y_;8>L}pcuBV46jU7!BZl?1O zA?^$9ofSv#&p7+$J&L6qML*1Wo2}0bc$S*R85heTC$ jA#}~r<)L`rcC6!8c@*EhD^ >gv{&*7k-=uzxWWW08Udt@o4x*BfyYpmjy~VZ z=v$?{L2oBTo0o3h&8$hqfs4~Sz|+^yUhVo1Ac@?QFGxcfD=hp+A50{TVMILQ4<}gh zg(i!Lu520mf{q*SFHTS6qnp1*+i(+~gppA9J!PZDnVBIdGGs`Jp~9rT5K$cXrQL%f zg_xNkiH Nr%D(!;c_rf2;a@%P#XV<4r-Uv@k(6fMH2f-q!1QeRs%xfNkJyc^ zS>?= Z0>I7Z}a!oI;o zW%_QyIK1Rpz4WNRb7Bx~HrjbMvq<7=+l7Z#cN|7#*KBp^AcpD7xS_LWXG6?c`2?6) zlg87noEGkYoy?(^a;5+G>P(g3i*q&C?^p8=&kSp}xu|CbTlshWmOII=mLG{{tph%i zFxMGdJ@n?HtD8UDX`U5TeHdyjvgSMF(LE$t%yOY5M(i9+Cpt9QlP3j^k3ChUe5Npp zXf7qiSs0akyRzvrT2C2D*L)5=IZqRAu78%E#y45&Nu`#QB8pv3c(G+t)K_eag9ur_ zyt#yi94t^nWM1w&>$qc{#mU!?Ok ang2ok-PGu!=a-q!)OxvZS*sV#sMceSMag2_3&;-aZ?_B#zqgT*_khXg9XXJk zsTlQ^K0Le|U%MU%z(_N6$sqLyK1OQVU~u@_PgplPt;7WA;hUd`qa;O(p1tNy2=KkO zjMd)ScHdsX#Gld;#$*!)*tjE&o-fwCT}qg2BJN5Ap&g`lJNMXl`E(Gn5QC2%5jhQ) zU{*4#zjb@|aM!}mf_Eit2^vw-_a3w+$RPC5e7(HcVf47jo>d3$I|jdod}|Kv9Rx|^ zoBaYzH>9}THWv#GiuKX5arH||Q5Ui)#m`ZfC5M6Tde@_U6{Fqz_PBKEPH0E!Q!fsm z5aDP|%kzSYxYNmKG`Vlx2+3#F_H%&f1Td$xeYn0R)nD^ubQP1Tp1gk*!b+N6+kJNh zXOXAn`H2o?I#}#4BLbskSEPJ_Kv$UTXye!4!VI-ivQow4I>;3PQ`IrHw6mef2M2Z~ zXXS$$;-wOQRD^pqz3B3Nh1P4mu=fi7Schr8lj)ZZhoi&JmZFF{ZZldZ=wuoB2CiY9 z9o#_oDSK@UVCx_QEv*!d %tV{Z-&^-L0+J6Ezv@4obN|VK4`(D6t!PnBzCtnc>vs^ zDR;I^S!2J>cViE4x$>F(f>_Cu|J=wN?|U+r*Xk|n Qgl KhB^ (YYw1aSq=ZQ86PQ_ou$r9IFM46!~!w2`TQcg7XfRhL#*322EeKuaiJO)FGx_Dqy= zXK6f{G*~T1N&U8OP3_N(ZRcz3>Tl0+C}l&DdRk)dNG8}D^c`0EXmkI4>(S{U(~|AQ z5xTPx(3W}!^0UE;DY ziHk|3f`AB%!=(Hdvd56t<)T*gJ{^8+>aJ#rF81f56&_`6&MdY}&$-}M^WxSJZo?Bi z%XJ-4CT)n2idOY>1-|oYB{I~|)|Bq58`bT-g_$_fy#^ITkBQxC_S0(g>y(*l7>8 m)n<$~d@k+3 z?^($hJ1!PQe!98a$a&g;cO9w>59rto=p-sg)sXJG4^mH;W9qrvsC(L^frk9>Z|P H@Sx=oP2%#UtNFq#`ZyUg*C)iZ zIyKu)6W~YH;>p7?r=k@%t2bk-FPAz(ClADEv8Mz?S3v`k zcS0|}jHz`5>Aa>^3$pt3I#o-Aa*ToN@PTmqD7FWRlf84! U1Ef_`IC`BrG z>$@EEAiz=)7E34Sz2lzko*pi#nUrZBGF6O3D{WWhf$^X|=;e*j6bIo#?h#K3UHe9w zi&Th#fJ9iChR_yf;rFRJRwq`frwK0QnSh`cg d?FGi%LZN76BFsg= z(8$G*NyhX;5(+|+(9E7sJK&%g2&f`5bbcd|)ajwtl~(9kh4p1MeANaY`C7q1B09T= zCcdOUWf%m7L;{3g=R|+18V1xi3kS#iz!o9GX^QDOPIxIF_CG@+0slMX`KkpVq}#<` zA$cA{7V9nk6*3C~i9|504?(UkM|q-{7{tYz+6EnKo%$gfNhne!jZxHa25kh+-UxzJ z)bNHh5Mi}5#g#@B$j}lZB+v6qLWv8YwxZPj%JQ2qm|z}8#sXDnJ;;Gw2o#X>t56NE z=*~?DRKv>`VX%=PsNa#@lT(iI%VtNdlCLO@Iz=AkNd9fW{lkF^K*C^9$gBC#jx$)B zwCa}`YB(fFtobf$^E6DiwRTX*uBI?|!B7|J18M#Ae>|Y`F`WhWT1k)(h5~|{?n6>h z805+lO^mFr@;p0?`AR7Y1ZJJj9qo)oE4XDI21L|Kc+epNM!JR64@C@uDgvg@lsO|~ ztsV>G6Cg^%?7v)$5)R$Om?$or=h3bWHUJ^om~?|J7zRWP!pjDHge56Idj450hbhN?6Kbql*17c*2dXW6Ts9>?S1!G4c`47j!@fiNn zo-aoN_RGh{GCs4y6W8Zz`_o`P|K|pi$0zwcdh7J?cng^KP1|?_WCdLMF5fy%u1Nf8 z!5|xw;gIn1o_!4CK4|x>d*4V^eBRqqz@7Sy;=&*%a1&wRCo&VmQ73c~Umpc02nK+T zf`MuHehvB$`sMZ`6MoPlyp9eJrp~NS>kNe6rL223Dme47bv3c|w6S$}Nlt_Y%RrUg z?OYr9^AP?rNGHWbM`2P+8jZSmi&~@}Yb6O^z)e=AZ%=K1CVC&$J!%+@LhqMdrO`eW z5sog-9 ltgRn_}yo#S+=-a%X|7iH(Dg?_Y2jSs2~8nBE8)-R>AA>@dO;BZt+0 zr1JK;^F-G7{W%zuwvziUiKySptpCYJ0J)!FtSWy9LEd~yo1VCKn+zvy`&;_4sLMwy z^7>`>fphO+QXzZ Gc3a89`uc^t%V%nOYf8@jz1r(tDa*Y| zemo%c3ry{HmwwPn?qeP8(Sya8ukP<7?(hD*xeC%}GHuDYNsA@5rt;>K8Z1=xyR>VG zw=ZV&1LvVD+hHq=0^~RbrrMh383vY7`3?(2P~sZLR5IJTZY2=4xr66_3tQRlS@{LH zf@!p_8zgogGFJdh7YH7Qx<0C85NfxvYJG7O%!R_~F4gQ6l{0%1xYOwk#`A_kYE2a; z&QqJAY6 F~ z`drNYeUwF5SpT#545`Z}vFqc;lppHLBLsWJMqUxecXAhH!iRFKq~{`q;hc?c?+F;Y z4* H(B?0fNN=)-RYUvFY8Y))wLdW11(0rN@kJW z9|`l_X8HnRzy|K`Ym=5RzvTn_+e`y*X*sFN __buHfCpfKDzvJVK&z3%j)}Zq_m{n?{gMJZ4>ht#C1o(PFgDOpF{PFzfi 4tO0K42L$d)M6^#xjhRh8AXO#4JIYB1&6pe{%y; z&W>}uk6{yKbr~WLGk*XAO%JhzK*J)>aO%+(*CN6w(0XJEGe?>x%6M=I#x(K!QZWQQ zH>IB@%ob>Aetf$EEa@gZFvmNOG(Cl!N|dn#3TKK_fURhlWI3W?u$Es{3pYpSg)PeZ z2jiuEAd JA3Eh2hIv{9y8|8D`zdC+rkv|R+|>xC?5NYfX= z)PHDwW$?xKQ>7%s>n4Sto5FJf FN4H$`q`x+S }mBpkuN)o1^Wzem-(*V-i+R&}UWqub9p;Y#*daBW+ihcx+ZC+O}tXyGNFb-C` z*)VxtSJq|VZNM!D2%Dn5Sjph#OiDBv6{FuQ+~GqZ6&~|*z76f+(v##_Qfo(;bk41^ zsv__qy{;wBA-!qc4|-Yx;KM^(!X(V3KPql%Sn&T=;Q<_Eu5TMQD5d)Lar>tDRry~! zRPv4iIzC+ft>a^Sqk)Cw|3Sj7Kr734_~At{MOpv*Usj-|{juUv`QH$aWdJKs{~uP2 z7##!;A3z+3HYDC!dy{!gOx~>F46j)C7{RrE@d5f;9rsR`X+4`UWz8)e)nsSa4%XTG zWAhi9!PMG2`*yuNhvbo3f+bH54xa iM6q~bNOGPR{A^#V{^Xi=Pd`KWJ;3EP{nJf)M^Nqs2-F~uX{iV%9CiW zSRYgA2xdpJP^?Jik_}%Y8u3J&111uzi|~R42g7HT{l)3p^U;$U&QYRQ qCl^1GrY0ix2|o+Qri$!`QQ+=+SM4P$qPQXge8}!{D)p zaKhNN{gz^tICZL&s38N&^?6Q^Y_Mqj+0j)y=$F|9{=-$tVl=<15wsq{7+xxx(5c2m z5}a7eIT}O^AO=~RW;rZbxIRGrt6mi{F3TT9O+b}|h4w9)h00?vD&4NL#LG-Qz4axJ z8l}S-7$LyM@Q^{;C^lR)L)=N|dqm5ERmA1;lsDt8*v-F8$JwRNg{pQ%Ej@nV 6J4Gln0+q3=5zEz6`| zE<-~cQDww;4P%eeZ!Ot!{@-MA&}=?>^uDNT_)FIkQGc-6>t&v173{*#``W4 @iDmRSjVlGcrIhY b;prd)Zr(R5(Pks3b@l_4x=yerBTs@uQVSKW ziOCBanjY^@ve%@F#?7qCLMZ|d$iU)6$i0;B Az^y zS475D#3DSY@*>tICCiL=ejFzzOv%_kkWh)BCr^zlijfDRs49);psA77QAwhk(Ff3+ z&6vSgr1c|WtEr}$ VaTB<79C5bfX>Ztk^eiwY@UZzG{)G3n?ZswD+7bF z>CJAkPUB;lyo| 6dO@TS#w?EH#)d)Bbz3kd5*p`-P0hz1wO{G?>nX&~8)sk*e3>yf zb@)kXkSo-S++;M}IUrynTtWdEWg6NOmbdg%yoo7SBx|C@B+A8T%E3G~ucQi9()kWm zXEXmtvj%EdHpWzbtyMqE9#ei$Bs-q?_aBmL6j9k}@AVKtxKNxgd^Av;!h+}Zzu EL97hE2rCm|4fxKrJe24-O@G!EwHkFh7%k(6;; CH~ z+SLu&ava4&L5Kr^F8#IRG(ZIR``Hg1CFYAqzZ5y1JqrWl?)BYw5WD*4zhcIZZ{|-O zAV5Q+$a~C>0R|f6)b|@8CUIl5G_xJ5I7)w%hQI)nlBoie$}94N#yRrD({D*aTc9aO zZ)qDpV3OfUa;4^TZZL-ifffNMal6mc#S-(1_8)*^NOC aK5GeBfn@~RrFN(12otFfgU@8AHlewdxWf14uS1)`2~^hC&U z!~kriJp)M>=Xg=>Ae9Llni@4J!}aE!ON1$Z_jg#5auKa~w7 F7vc52tt*p*FY&Y{r~#R>pozK(;$K- z%Wvo(WTLQXr3@XK`LDP@Y16UB$K-f1cwA`Z4khUemsA{^3*5IS+|zs%-lok6La@r7 zp?UDw(;~A$8_Kk1qOSFaoFMOowCrsfX1X53Qib43g`0 7{aXR?U$a`|;^>-8E94 zm^|v5ZX}wHaE+|XVCB^=tSLyxb_!ZNv}yGrQ<^Yy^UKuhL#`D-Ji7yi0k_3o2B*}L z;HGMJ*JoiIm8kg%B(|~7zQ^NWU;HQo?+HsA?eY*1RdHjiyUpQB*M6F(3j6Ke$DG8G z&N})?+`lxCkRXI{5$*YfiL{a+ s`tBjTJf-9epv6PVFh#6_QU!m7ni&zoyY1Wz;|E#^<4 TtX z93n*W&0`Dr9SD3AN` zfNoY;Z_G+ z8YV#WVaOwn> zp?ia=@Tmfw?U*Md_CUyDx^sVvH *1lmS1@TNtrSHoaBBS%=4)R_P1kLLN#569J!4G z4EQ&9Wi-)HE*LkEQ(9g}bbpAg`l 2U0q6eS7wp0;J}@!)-yL@Yt1 z6cBhe_>B?FGX$^KP42q$aoQ=@W@GoY_+oaJjfgP7z-U-Mm0_*ncbOiYmGT4w_`ys4 z)qn@f4C?xrtg*zkdVk+5Z`F+m@b|`jbEDs(8dPc-QhMAQXEM~N3aNzCz^-YabFA77 z#h;1({^*tJn1a2(YGtwZAaRqF4F-1QJhO4gQ3n*-E&~dkx|ZXw>Y9NsU%KYM0Jx+$ zN E=)sF WB-1eSOCmVE?(Dg6Ue z`ZtW8eCf0DB>tb@>0}*QA%PWAyKJ?u?FIp$vE^L|zZx^%h9Yzh)KC5l-(~x@YDMs> zGMat&e+K&^U&?(xH((XAU>m$JrJ{)WFFI@Co2&RStG~QGs ulrH2(S$&xL ztgdPnHXtx|*uGg2?Xs=2#zn}xNaf$*mZs;8asQD5@4GOi1di|@pzMCjy;vD_Fs|u$ z=ZwwWp-hN3Lx4!V(sp<{0NT9ZfK`hH5qkDf!dVulJgbnIJlC{iMy6YahjeNmfEZk9 zJ0tInD`5SY87)ZGkq`HD{P_&zg(d_loMT4kIa{kgIM=iujwILgBV1A0g1085KsUZD zIV| Fv 6U@%v)bG4O&v`v{%pcn%qgg$4@)&+Aoz=l6wE`9bG6C|8Ofy#6* UQI?9Or zlsqLwbC83&2))0yajy2>RQGdQ_8g{XxD^83Hi8z``~bf%|3-oFJj796`j}8nw!#l> zpfLL-vb3pV 2mGm1h16HTRsdndFox4$#Up(vb#ISu80J?ppCU+}Cp#6sNdSsZHI)Noct-Q0xs zO59eUE{gI8L@N`I^ALirw3KsHXTW8WNR1iDJmDo4|3S@L1Esj6uH_+ZH_gV@bgy@~O zS#7p}fjErE=eu1D_5cnh$Y? 5ja!D~IZ}g5mX((>K)NW72uK%MJfYYS z4~q;Yq|iournXk@n)C9qplB&KA``wWVoXSBB%xYd%#2(>VK+kIB_&Q;sU#= zRiNPwblGEms(7~?-y+1c<3!^jMxopquvJE;7CfW$EdLvDi=;ifO_iM1&4=CRckGkD z?gyl@QGQl1+=2{sC00NR1_K!VrHL9hlFHvNJ#isfcBDVIFcXsETa*`=!o+XlKI1dU zOWm3a8V-^Q6w$`4c7@{>_%W`4xxxQ>Et#PmsDg4w?*-*F7yujEQE|jAtU?De?f4d% zk6Y<+$Ix*Xmkk3uYqudCG{rU}3(AX$vuI%!gbV(lLLIl-#dbcpr*Od?qaG_yP>NH* zKUj<{a2)E+Ulo)u)Z&9%13|d^i-5;Y<3SP$G~d4nP#i*VqhpUdv1NOKh$+aDl?Gdk z#V=&eix8C(l}d{X$-4zT>^mwaNQE}%YYNFr80jX6`aMfdCoFWRc4|3G$6H_?G&vHF zSrOjl1Y||DW1D lUsgaC4K_IUl8}71s^!6!qAgMBE?tCi>feT} z!TsTr3_$qHkdhQo03WH9%plgUe9`H%tD?@@fOg{UmZC*)hH eSpE z5Nk?4?;9Z_KA^9)jgSpnq*LZg&wbFd)SlPB%Atu;(^AN$@)hjEfSY8uaa1^!@8H2M z`sA{J7V}Zw6jfRWEuR(rQ6zs_oFtXqhYO1t!1)-=DNQ+Bm(2~4_{?W)F$eLDtqrx> zEcVZn!hEdoZ}rJN^V39s&5$%QuJsYK^P>PqR!#OKnZ={6rS_2kFvK2%#iT7d>axYe z3k^}C+6nRK=Huj>QpDuHtbALG%1p1WoS|!o2H=nkx^v{z_Y#;*qvL88jYyCf#=BW1 zG|(lG$f0PO?h4n9_0&n8CZV-7j?Kny_`Ms`p7-~Yzyo$4*E(3u D*XYnX z;DZ~){?x7a7XwU#fM95)&QMK~P~T$viviB&$P4($q-lI3-pH(( fxer^+ubKWK9NZ5QW>YZ8~zV<*a3gk zi6H%Nb+&K-bzD&0e(z`K{{b^ScyWn$E&UtF9s?WlZY@f#{okZm=x%R)6SLnw|EpeG zp@6tSFDMYuG4%haZscO->S|?g@z*-5X7x?ypIm4?+ogtWyXMd>PO|&dr(|_oaul|J z%?E%Qz606ab0)y$D{PalM~tVKr(Is4-#-87?Qt0zRbb45|C$G%Y|IbC7%&GUN=-|{ zaW}V8YWrry#*`8k!9;Dy&*O*vz2oC@pP${3-Z~xF6N%#R(7UZ!y*M$Py0tI7Jq`ve zz^0tL{&zVis{Fl6^+@qSgr>Hl_@xmFxDd<5#@KV+GRdWG6gPb{o3mZE6wQi_w(!$F z{XMsnPGT{g4Z;8iG9?by5mE4(vRN1Bhe0=S+k^bqU+DGwQ|Fh1J5kP0${Mv8$3@3* zNh#!5ftW+-3ULwqj&Fg5E324TowW5%!AC~3Sua!Yyp-`6o_WC(FOFH@j0>I7aT#cE zM %6y$^#3;06E;8>YTyjfg8k@4pnD6mkt;8EP32r>|0*_R8^6nN=}
x}l rFs!1F@Ey>5a`-Kv{p3Ckj`owgOkE z8E^l>G*&l~ OjR`dlq=ha+dY1iv2dCuu*M{J;TO0@%2#6AUzCpq956On6Pg z>C!D4OLW4;nJEM(=kD#GRA#P4cN=^H8Go>8 l6D*cI)}*8E7o?`!2%P31Hy3l-0?zJjd6C?t zJ?l2#2Q?A}!OwEDYHioraO=~3wE?axy7D^2B(L`J$PFFn4Mzz@`idFe&HHkP8UAL; zUUN7?$-zx=%%R^lS7DGttGFWL-oFvCw*|hsTJU_U3Px9|F!Qd5J{A$@)WPLpjWj^- zshpOm59gt?t}7ePKveE9R_f%vZy1}5xi8V@xHPLz9qzuEpJedT+A|AJv~zl6ueq?u z67hAtZ8nv?%73XG^+j@<+>m>cvnw_j--O_}G~Yr2pZvN_N@zxVLIA|NT6}F>KaI{$ z30i15JPxaGjWnHgC!fjg^%`9>nAPBUo==kU`~7;PEj`@#aBmARPvLt9%J_18SU?}C z6c{PHD`Q&x2uLk4Ml@YLLJLDn#R-OmP{5^r!?X%rajo?!&*?kifNlD{^jfZL|5vH0 z6YWD4AV8_97Qp*Y<;}lpnSC=eR{0+neDrL;^&k@*(5zR_z(In_zG)P*Z~_Y!erJ+U z3!)<)Idd~$G1T nR_8qh@hNfnmM_jU!;VzGT>}dv3xxV!-o>IR;jhq5lMyN? zUZ`k{j0>2g%k?7t3h);M;jri-6611~2B~8t-C^!=?5I3E{8df7Ib3ApGfMj)f$UBB z0w Iv+*L=*jh)V25Wv z3ApUGK2$d+czDQSVho#)<8`}R@P95yedW$`F#%M6dxZfMjrzA^=77qisz%1Pf7NT; zOzF4($%HrZ>w5%MYL>KZVlx^t%}7YoBm%A%5Gr0B#(MmvVEg>*4_@0?rpr31&U?E! z&r8}VGT;CxY*!IUP-5=SnP=nA`*(cp)^BtT6rwaVZNK_(9O(u?nTxy+cnM#+CqqoA zqo0u^0#LWpkq o`)K4_N2~ zC~nM%G^5z@XT#3YBZ1l)TyQ %V6n7b&p(*^G*HKWqy$bSm!+Vp z)zrEh74Gi6EACm}pT`}T?@q-0K FMtJ!XV=L&0Xmzqrs;VCdcDK zf|WZb4Q2-;>U{37DdJ$ b3>;^?sXv204q zIy%d2d#PCj%duXVpT-|9%%9C|y#`agx%~FBaN%z=w-hK+;Z+m3Odh;(n^w0e0xkMG zs)mjS{V8|+DJr8?b$brrAdJ)XzYf2L|8RRt?V&g?^^~g-ulRoRUzIA8gh<*(0L2J9 zX@G#x|9wijTAJCJG5&RA{;QIiww%K{2UgFM22#ht;>)^QM2FbL>g93?JW8ubY?G*t zEtL|{DOnHvrBk1u(PrHs%tgy!U9}+W#r%7QJ$?(qi2)Y%S_GAn^U<)}Pjbjnl4m~e zUIXRprSnh%;MXuG+4o27LuC(mqU{od$I;7XufUJtWt<(57X-3JiOXi{J)4zUy*8Ly zC`=D1$+nr=zLrB6WL@gyHu_NFUQy74$#!Hj0<_!sXc>e+$b@CmV(az|IuE2*jO+Z+ zpUazbQ0q`|XvJ=qAV4l31o4DDJJxh~&Cu)3gV~9av>AvRTwck~D!->nyJWCdLyPRj z-|;<}1VaZvz?_LGf2wo8HA*u}NRh^)iP9Cw&OQtZWHSgMNoy{huDWC0sl7ZrOlDeH zRb;S%U+dSdT&m4?Qtr;S6pPV5qXD+So|lq}0~uxmPjH=#cHWdsOfE@LXxut=#W| ;o}iX-%yQ57=l%86nf^)%M*S}@hfDjTwFK|FV7<`q zPADHouZ$l)FVw%!pT9ZecsB!$CH8ImzFf2#^y>N{Ne!LX=Dy$Tt(`mYf8K>sinYN* zgi37yd4&b?o&a4aD$p1-k>fOw=YwMIk+}{Mx}1oBGXy*YRrX)W68nq!A1&%{~52J9tym_ ztSrh(>8qqGf0=r&L|pmab#BhN&FHwU;~EKn9Zt$y*LCpI%@{eITq~Tj nDr5TRLiiH3oK1`|E*2w@@B#TblJeX$FFjPpCr@NI)|DDF5?7rjV9W5mV0h9gy zNrHzEO=mHDd1>M(IKSZTyUJclQdc|8;^H!8vH0b!Rk>0)mV#ug^nRM>!S73hQ{?EP z0om-AgLH)yNou)994pF36qJK9COPnDzN{JNC=KT<0_2Wap;4{WI-laNErn%F<*Bnz zO$F6mR6hp-9LhE$mN_w8_W}c3nzzb0=nMz*?4l3wC43%0+6gtPkrV2-TWtI1=d3Tl zN1x*DU)@{^N !vuaT1A)+GX#x}#abdy^cZs1EQIL;=>E1T7 GOlUe?Ns!jvvO$^1P+LHY-OiMFc+w_8wcI}XO#RDeSkxG= zk3dp U(7VL{$xzymwSIMP$61L# zCc#c=0;Qubj|Eo2)kHrLBxBYIt84p|-nEdXnxqcYkVXv(B>a9YAo5y1!ktRFH)AVv zpeB2uQWQ&@|NDa|765gEJ8cuUp3!H?HL zeyyW&*9C-wy=rB7x9zjH8)bR>uv}3k-zOn-$8%1N#tBJBfZk4FZz@-@$Wyje4HsPO zs+Zshlu9>`|G)!=HIs<8u!pA>@g!!77s)`)uZjXwr*WPD5urF*TdR6;%R2Ju7m2mv z$Voxta|#Kv4foTwZB=#<32j(&2=OA^^Y<=E6_XMlWPSPWp-D;hxM#C89$ Y!MNXq5`AGh4PC-(__ho z)mdg6JMLxd&|N`nR*h7X7%kWI!*UvPgl#fLLrREr(il@JGB|>4F=NJ%7K3($)TTL* z+!T$Y1#*+?Aa5Fk)N8AY;p?~DasA@`e8W24&)sx7Xy;h2_gcN*kpIlZa{PE!N&$a( z5P |Iqb! z71;l%`>O LL;+b7b|kKhn`sFvM(vQ1-0CS%0mWw7 z!vB17vGYZ&Y!jl0ohvJ;NcKB%ym#U_vsm@DPbO+{YN8cqIs-0xxhnk9Z{2Qcc@r)w zM1tMURO(PYPLD*VmPV8^8N{v0V3On3aAj;Uo7wR(|J+O5NvVP-PI_l#TZBaby;bj& z(G`f_VdFQ(NYm7bV!{>rkXFwY(SL-!DmjDnp)RK;Ti&TI@V@d6^3Mis?v$0=1qe0< z2*>(|@IR9ODvSPCt7ga5+XphCiGAxCxZN9P&I7YV3zGz*wpo(a!*};1w uAO!*2!7-5y9jO2Xy( zb=zsQdI5p~f$WyxFn#*wWTVSss)bb2p3@WJa8Mt2JX>J8&viQzgJzQfCCS7Ii=s-e zOU7pmn)DY2U{$H}n;NH6hMAJ^xy$@4%i7h6Oqx2I-JYISu7XlCeXkQTQIq`3rFZaF z%|Uqe)^OM-LRZ8&*}dU!zAa`iwuaIP$lrGhn!W&UJ$)0&(1dt6xE+ogi>;=0Y@iELnOO$CDLdeP#f&38Z)SaoN)W6Vq&S2C9- z)3jCD0%Z}bvM66Cqfvdgxj($+-@t#rT?Zy?A%vs3a9joIlx~aA9mz~B?|(d{o={vo zDMPQJp!}F^^A)uE-2I51c|~5I2S=f)Ev3@r`AK=R`cpDJ%9b~pGi=~KWl!@usrJBb zs(f057LU|xW_bQ9{*I|e_zttQ$}nrNEu>0iUf~-H2h9HMyjzyyrir>!S8W(&Soux_ zEKG3+x=k=r?fQYZ6NTa)IE5wwn}*`t#mKUHol?J(%2GZvsal_ +AK)>T5im|t&<-nfwA|l+KTa2Mqkr3!Ul#!1rjX#+h`9{!R@bdSeM8XLojYBg z|2oX)U|4{F6fL1(GXk!Qq!zE-Rhlb#uHQ`ACRyxP|JG65&G}7Xvi{JNnr>JIeO-v9 zrQm`!O}iy#mOlPB>`&rbXGz8MLQD#(%pVJ6a+26to_*;G-#KIBvJni~lOoG0XiU@L zZt0eUNwwt|l%lA~(EDLul!p2J*R4Nl0V{AV$?r}NGRI()U+G3zB&v n~l#M zpNu;x>W`y`V+j0l;ku 8%{wYo1uBX`{n!biO@tCZXCvy zSgy_ %a zbOUz{?`{0=JjWF=Uq5?b<;3A|ad#0Qffe<2pWO9sT$^uq1$gx6SQE29>^=8w+iUCc zOe_p*urU_<_*gG$ARezqACZq%`mUzxgy89z2D@-p``}z`4D+!etPMq2r?`XHC_nSJ zK4JgaV-<`oTXcg10R<5O0bv4qEI@(ozq%>F$O~|N+8bHfGFUsBSzM~yIHIbd@ppQ0 zQrk@ (|CMW@k1dE0>LSlWx&WC0Idb6=v1g#hpZ}8({bM3t+>u%F!hTH4dzF@S# zU~u*p#S5AV4%EzD=)S3E(!ROIk*iYr0-eJZ=%lrMU>C>+#1d|zpmEVyyTi6!Y8#d= zDu8V)ge_GE29p~P-7nC3x5McaiU|!-fpFuqmUJ4>3j$GqdyJ8` pP0AE*ldi$b1~t;$FmGSY z7R6W70|7A{>&Q3-aKliK;RJ29nXUD+O057s)b>%vbsOWyWkWr)WS-PZTPS+R5w_RO z1avQm{rKEl=tmfKLIghH`shd4XDovvI*eS})Qk$d8?I`8n_`?$RE>@a{ISOPT2zrA zH0%~NDo{y0OTRa^>Mp_#`yL=clhLhZjgiQT#fKSQttS@SO;e&6m9k}0yxz$l(|YLf z6dy^B#9JbeE$n1nX32j_FL50NAXP;VA4quW4mY*3#?1r{N5O(Y3E}f^A_Ywvf>0&} zfHT99cy{fC0%?QY!&u(1eiH=!39-VB7CnI);c50&AUnDeu0~0N3wI$%5`#I>yX!a( zh9wm(PM9hF`GB7#7Ok*3ZVEf?Tv9u?#_cQ751KGT)e0TBl!vwWtRc_KJ(%9tzQp62 z4EzoT3*sCFXGp;TgrVex#PjWy$B!}5D1v#n&)xg)c8YF|AGa32eR?2syWhrx0tEVV zhbl26m|Fc3lt{OH$PuZj0}pUIZc_S#XZRO`6I?Z_PvC22 n>5oh$stx#Y-f105b6``FV|ZMD>601h?CdYzs`1S$~(00 zU-Gre1(kX5f|gb;K38p7LJm+~**jbOt`6ITEf&zvBl?OmD`*!F&nBp2k4rNHdW5}y z*8Ft4!c`?AD^EDjs=46l&^W!I7^d_G)FWp3Vp*MkZ9Ql3D^bqF{LWSd*{1?5@ykgL z^Yj4>m~4a$OLzcTm|TDb#O$v;Pf-I`nr%*sJHY`8MzFM3*c>fL)RseJzZG)7s&r@_ zgq(0veXx^^! GQOKI4gV^aO1Xz*nw-rPmMrN8Z*F4`R z;uhJ^F0f$e2A$}3-E$1Bra(_1jSoVjC+X+m4G!jG4U*$q%?FQ?pi?e4NwY$K0QUDr zT@NiXH;=|k{$h2Tl+{`CqswdgB4EI)YPcm~p2f? mgiAG7t!+V1D&b>1zHR-5CRSpKcM@vZN# z0`C`-g9Z >@s3+u(YYR zC|5;^A2thaocQ5!QR(3>v6r!{+xpK(Po9)`b3 6Q=@OsHcEqZlG=l3^V}67#O0RfrG)Rc_r~7l?AEAv7pu&x&f7H z-VQ&2O78*3k-1^Ifpi1oF`yBUHa@s%kFK$!jXO9KsN^D0qacdL=Rgs7-IJVO1RjY- z*Z$@9ZSmJY?KvzA3<4 wzM0?TG~i*j(-9&l7J1wB|I>+o+b$0E&QT4uD3K<^uhW zO?zI0w2%?d^3y=8WKb;s$pO_4@j0>~SVMvR%KDkb`oN}eC@TX$ib<)!L3yx4ic2bU zQo+-e=wX0 @mFy!~+1Zk2;(H literal 0 HcmV?d00001 diff --git a/dsRag/static/ai.html b/dsRag/static/ai.html index ead942c5..b724b497 100644 --- a/dsRag/static/ai.html +++ b/dsRag/static/ai.html @@ -90,7 +90,7 @@ background-color: #d32f2f; } - #downloadBtn { + #saveWordBtn { background-color: #4CAF50; color: white; border: none; @@ -99,12 +99,20 @@ border-radius: 5px; cursor: pointer; transition: background-color 0.3s; + display: flex; + align-items: center; + gap: 8px; } - #downloadBtn:hover { + #saveWordBtn:hover { background-color: #45a049; } + #saveWordBtn::before { + content: "\1F4C4"; /* Word文档图标 */ + font-size: 18px; + } + .status { text-align: center; margin-bottom: 20px; @@ -163,7 +171,38 @@ + + +