From a43c0b913b71b130de9c1be976cd3704ed579f84 Mon Sep 17 00:00:00 2001 From: Homelab Cursor Date: Thu, 26 Mar 2026 15:07:31 +0100 Subject: [PATCH] rag: bessere Treffer + Anti-Halluzination MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - top_k min=5, default=8 (LLM kann nicht mehr top_k=3 setzen) - docnm_kwd boost 1.5→3.0 (Ordner/Dateinamen staerker gewichten) - Ordnerpfad als Kategorie-Info in Ausgabe - Content-Snippet 400→600 Zeichen - SYSTEM_PROMPT_EXTRA: LLM darf keine Details erfinden - es_size erhoehen fuer breitere Suche Ref: Issue #51 --- .../__pycache__/llm.cpython-311.pyc | Bin 27797 -> 29836 bytes .../__pycache__/monitor.cpython-311.pyc | Bin 22061 -> 22655 bytes homelab-ai-bot/tools/rag.py | 44 +++++++++++++----- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/homelab-ai-bot/__pycache__/llm.cpython-311.pyc b/homelab-ai-bot/__pycache__/llm.cpython-311.pyc index f005230de8d5342c80efa184917eb38d73c6a53c..2c5514119fab404d7151a96cd9038ee4c831f184 100644 GIT binary patch delta 7336 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 V_ra_{$1_3!db5oSQ~`z_`CnF-B4_{r delta 5517 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 uR`@MAtACKv@EwA diff --git a/homelab-ai-bot/__pycache__/monitor.cpython-311.pyc b/homelab-ai-bot/__pycache__/monitor.cpython-311.pyc index aa7192d3716e834aa1775f686138724c1a9130b1..9ee00642d60d76b0998ed462c365621c50f5a864 100644 GIT binary patch delta 4682 zcmZ`-3s6+o8NTQ4o5!*&%fhk?EU#S_mX{#DMa1_5MNs1sLpGc%f-J0eFFx;znV5>! zM)cT*sA;yzjL~Qs+wHWOG?|!=X)>)%!67NLiEa8wJ9Z{5PLnj5$)o>&7X*yGyZfF0 z{IBz$|NQ5i3ol+F-&`fe=aZ8YICxfiuXmoTJY~!z`%bxQY<#!Yr=^6dx^)4aPZ!Yp z^n?>gm*Lc4j)@Y1?=qkjK9NNBhQY!MNvEzB^d|?5K4T!oml81fOo3EiD&eTcXQo>C z=-{KJdTLPGg!2Yp8cjUH`7AUEFujAL$l^SUZHJ#^aDm5!@8nq~GI%68z?aSE7QTubmmq{HodnfO+?d1At4luH4u3#4&ws?GiJ9z3mqV{D2-vM+U&^bWo z0-X=ElNKm+A<%iWNN^~6YU+Z1{H)<Jr?vVi%9miEALod^hnG^PJ!jin~f!lf_y?D|e|Cu?ty9;X^B@W<;wd9HfI` zDg1KSpOPGfkZr!1gRbiW7+hA&5aN84d1ghQ;2U{OPDO7}V&iHraYVB<2MKYrr?dx2 z5lh#7)_=gUqPwpn)b8);5yZ0k4xvYK76Il~t7$A;~ZGg>I{0%-dL3w>1DBjhF$AI13=A69q}^6hbkb)EN+Z`=nSRa`v}T zq1(TIu?}>YNpD*-ABanQ=jQ|rJ05iP| zzxcC^+a3wq4V+Xq$>F#z%%bwhR=Q-W7~~9EFQ;EwdI5^&vQjvx6n4mtu1p~M6%*R9 zOKC+l4o$e8-LwqcsHfbVt5YKa>69t%_?L#o7I`@hHN<-@?RZx zu(}jmV5RJ!tENXzR|BVf1}6zP)3zt1a?R7adq+D_W8kQY)^+EEbClK|&Xv+9X9B6p zjo4Y$vV8V&Qi{eY=R|U`mlV#E^B|nZ!ufJOR^d9jcBbcWfm|SVQI%XEJ27MJ{62mn zYg)Q)g7Wq7kQ*GTK4ci8}2xhlY z&ZkXN8Nk(LWo9>7!G4?WFhSX_o|;xy5qs2ZUpbxQnv~MiE1T{a#wEK3iFl9_*+o@T zL+l~I4N4nWy(Lo}cFXSghHUQS?%7(!Qa!6rvlyjKlY_vz;<=hZN->|V0{5_jK14Kv-J<0eI$|DTAbTUeeYO{I#IPpqbqk5t5$vQ#dWi}w&Q zOZKq(6l;lGGIREXJ60|i%cTn;s1xS~%6AaD^@v_Bj#MhHj;~H#UJPUK=@fI3ff2KMyOrf+>Pawq zz}8O^SD|1nLL*b#Tgk!b!}jkG5@i2yl&H6(!P<;m@)(<){ecS)f!islTZ=Fkp&Fo3 zxm{X3DiJl9D`yScopUN{D|BKBAwlSA3-~*`Loq$|OF~;n5?OBU^W;tTR_@~^M-=-` zK(P?O!;3{|MglV;zZ=MJ*bkgrNHzP|`KT#~iYkB4{+KERx7Z$bD6dYd5&b$Cr@_WfK_C)@+`IVv_jkW%6L6kzVg!bMZ$=?YVZb;k>0ulF1 z{N7YjgIh-2h|t9H3QDyPBKZ*8RItFSOnE9FF;yVc5!3l4NeBd`7!hN7QGkmXMiHN7 z=L>vA-v!$kzatpag@hi8BR+!Ojv?#^2vq{Gyuy4|S(wNg3M~mEz*vcrm!kf{Bz1q9 zCie~pFrXPTXFTaS?HO7f5l74=qvnzU-4tv0h}ko0_5jOjf3ov*XC(RJ?h$L%sI_V! zam;8QP~FOK3~fDi=**#UF3C`=z`)9J-jLi#Zdn{>){j|iLq%uSU36co8E)D(uHw_p zcQ`)1-~0)nd60~2IZOJPMUm>8X|CZk*H~80U<23;E+4aQ917~stY`$9ia{fr!qS3NN!29NHYg#{Z5 zb-ypv06kLCplYe+MynGxbE?rg0{E_ag}c?uz3)wEou_(#E@_>x%D3@F;cw zz)MwpPqfe66D(5gA~E(>_1PjcfP#{GgF%5RM&c;2zOA45K6-r*A&;eMZEUzE*Wtr1 z?!NzHL_T1%X7AKCqsEpAt2B0FcG5J-rLtBiLavCYY58Fzh+k! zxNO%^O&#j(?Gd9WQf6%d3eKZ6_Vog*2D5cDYFpT>Cck2VB@ZQDLOlcnVec*ZC%M7i zs2^$Y0|Wl@_zwy{LHHCPrlx&?pfU|u^Bc(i0$|3{{RFuPsnK_rK1vop45UXbUP1PY z2tP)62>@=nFQEzHTYLO|izT!v=Xu*MVZZndux-&Z%N7tq+3@m{TD&d9ubHsIsUcvK z&5p0QL88&EE5GD3!ytp@Rs%n#mLRz?Rl8pj55rt6tbfge4wQ&IdQd7u9j}a|$QWS% zU9*BTu*GYamng}=Dv2NGYNTF3xQw7wImRUt!d_f!cPJ%s6&W~VPhvdjN@9+&zpZui zTEddoW%7E$-0Qp=69iEeePEq|pJT>&Gzc|l$wO-WaLM5H+X%Tm3vEmt>-qW5bPBtk2j`kYoopGZEbK_?+?ZJ-jGrg@s-7R#b?;6O{@Er zYB8WoCo+}&^8`{u2qzKnpb+;0#MIrL@HX*7>?`r!QJAz7DqdL%Osi4}ka3`t>EKL6 zj54NgYwPg`1PDpp1~Dm{lbM>`iC&PxmkX&?Y-#gCed1x|GsX@#TiB`Q3q;H2wiNb{ zC6^A@Y#B494n1-;749KT4O}n)2CbDJ=FH#n;0pER@;cW>_f z?tlLG`OkmOoqTtOJa?KHpD`Hn1-M?^ac*Gk^!-LFS+~D_mQ6LN4Qm71a9$vf2ol+- zLmj+$wW-`hByob1$mjd>OH_hXu>U1jdtulRFocZ(W7rfhh0Oso5vV3mM78kCgP)e_ zs6O+~KcWv5(}JBspoA6zmaZ45;VBX*<4$7Twq6ymY!GPK(!hXk~_W0$ok3Bzs0rO{-yCGih7{<62sq z@qPPM=hp;NQx_<@s2d#B!Q+9TT3Qc0H*J7<)JY!d-6Wy|)=3E!2T7n_6r={JexsMC zW>{v?#!c#s*n_NGB-%JJBic0XpbQKf;i=?j%N%^WsJGW02ZK{NBLT`Qc4r=MbMlzz z7fYvI$D&dBx((5=G#FYpZ5;~@MEFn#LXRfUy2Jg{3kj`!z^%j zQXIHKAmuF0nt_#84Gmp?QoKsvz`xM-mlS|R1-&mfrpbIx?kY*mH+P!&K7&bPS8R#OagMpbp*SFm9q~$~k{|7~ET^{|hs8bx zPxgvC6(`$BRfpKx5t@$?jx*1aq|{Kxwmd=p@{H^S8*wx z`H<}JlY6{(6WX&=r??W+uR4raik7%Qr>M)!N<2c?jT!|?>QbOWCOp` z*{H^~;%BW@WIKP>`C-`&F#Oa6(BoC5^W=fB6unpGr>i=NpMP1kzw%ZPrSoHw6bXhy z1B0=&j)r6@7?au8MBzuPpCK>sj+$M04}zYbh4_0lRTCjz;nvz-ay^gMK4jj2j#Qz@ z*0d@n$t-ffwTSy%v-oaTy+)03`E#xzvV%L_eRG?b9ksQgL5az+bbfy{BEwNHu^1Zw z0c%CT^C&w@Y+AMyp@To~ZqoK3*~|avo@YuEmew&TCWpWgdz^RF1?qNzI4#~il+KGu z5sFR&Xs`p}9)K9OFdwON^N;J){Bm7s{+qy9jFLIY5>KIen^x0J#stJYnlVwM?ccuz>spTPDm$w z$HG9seZJ^IWtJK-_l=tSQs%xZS3WY8kD40B1OfpjWACNH;zzsocBLv-B^mC6F!YMqjU36+I5Rc`aBZ&SJ-%j+pWMYy&pAMXe9_zrf>9dz z&bbF2qiBcKVekK-vGxxr`+)b)J28C=l3Nkbz^lrXlU+i_s{k<-Ky~%@?0J%%$e;OL z^IzQdHOcpuG7Ty|jF5-08v!>8t47$1@GOEBVHjaQ!lMX}BRm0+Hm;ZCV1Fn=2k;n) zvBN0&F~ZLfaHFNQ(iRyuCdAB~0_~bX*!nSc8Wns9Z=;r8Vl2vH!G4+j0>=fJaj-vn zZ$xIlLbVqVGNE7NA1v?`y@G1$STq`8r%?1NH!r+i^9hjWlD>uAYVs04+_tvhD9RB2 zC2&>yXXG6JTl+|RA27Tc_9+TKL-;E|T21c_4`ot^1wDuC&jF?^;z{HpkfgZeA>v#O zq*u+3A^YbD#}S?ZfW!SC{HV{axeNn+@^#-lLhj_>-12A>o}KIqfEWSD9{FigFmpUY zHDzgilx<~Sfy}^PTzY|=f?g|49_sjuXuS`Zu-0G0E3KBHvS}3-wY7K^om0N$UqgF*yilvCO^|c#pqXqlIbKBzO7sVxJC3_HQuw zG#{ObQ1TEQ<}n!fq2?T2sfVI5872w;=LD89&;vEz(BsvDPgsOzE5?i str: @@ -104,6 +113,14 @@ def _ocr_note(text: str) -> str: return "" +def _folder_from_docname(name: str) -> str: + """Extrahiert den Ordnerpfad aus docnm_kwd (__ = Trenner).""" + parts = name.rsplit("__", 1) + if len(parts) == 2: + return parts[0].replace("__", " > ").replace("_", " ") + return "" + + def _es_hybrid_search(query: str, es_size: int) -> dict: qvec = _ollama_embed(query) if not qvec: @@ -125,7 +142,7 @@ def _es_hybrid_search(query: str, es_size: int) -> dict: "should": [ {"match": {"content_de": {"query": query, "boost": 2.0}}}, {"match": {"content_ltks": {"query": query.lower(), "boost": 0.4}}}, - {"match": {"docnm_kwd": {"query": query, "boost": 1.5}}}, + {"match": {"docnm_kwd": {"query": query, "boost": 3.0}}}, ], "minimum_should_match": 0, } @@ -153,12 +170,12 @@ def _es_hybrid_search(query: str, es_size: int) -> dict: return {"_error": str(e)} -def handle_rag_search(query: str, top_k: int = 5, **kw): +def handle_rag_search(query: str, top_k: int = 8, **kw): if not query or not query.strip(): return "rag_search: query fehlt." - top_k = max(1, min(int(top_k or 5), 10)) - es_size = min(100, max(top_k * 12, 35)) + top_k = max(MIN_TOP_K, min(int(top_k or 8), 10)) + es_size = min(120, max(top_k * 12, 50)) data = _es_hybrid_search(query.strip(), es_size) if "_error" in data: @@ -170,7 +187,7 @@ def handle_rag_search(query: str, top_k: int = 5, **kw): seen_docs: set[str] = set() lines: list[str] = [] - lines.append(f"**{len(hits)} Roh-Treffer fuer '{query}'** (Top {top_k} Dokumente):\n") + lines.append(f"**{len(hits)} Treffer fuer '{query}'** (Top {top_k} Dokumente):\n") count = 0 for h in hits: @@ -185,10 +202,15 @@ def handle_rag_search(query: str, top_k: int = 5, **kw): score = h.get("_score") or 0.0 raw = src.get("content_with_weight") or src.get("content_de") or "" - content = raw[:400].strip() + content = raw[:600].strip() ocr = _ocr_note(raw) + folder = _folder_from_docname(doc_name) + filename = doc_name.rsplit("__", 1)[-1] if "__" in doc_name else doc_name + folder_line = f" Ordner: {folder}" if folder else "" - lines.append(f"---\n**{count + 1}. {doc_name}** (Score: {score:.3f}){ocr}") + lines.append(f"---\n**{count + 1}. {filename}** (Score: {score:.1f}){ocr}") + if folder_line: + lines.append(folder_line) if content: lines.append(f"```\n{content}\n```") count += 1