Files
ai-g3sb-backman2.0/backend/utils/__pycache__/fewshot_selector.cpython-312.pyc
T

187 lines
26 KiB
Plaintext
Raw Normal View History

2026-04-10 16:52:07 +08:00
Ë
2026-04-16 10:53:10 +08:00
KàiMã ó”—dZddlZddlZddlmZddlmZmZmZddl m
2026-04-10 16:52:07 +08:00
Z
ddl Z ddl
Z
e
2026-04-10 16:52:07 +08:00
je«Ze
Gd„d««ZGd„d «Zd
efd „Zed k(�réddlZej*d
¬«Zej/dd¬«ej/dd¬«ej/ded¬«ej/ded¬«ej/ddd¬«ej3«Zeej6«Zej:rƒej=«Zed«eded ›�«ed!ed"d#›�«ed$ed%›�«ed&«e ed'jC«d(„¬)«dd*Z"e"D]\Z#Z$ed+e#›d,e$›�«ŒyejJrªejMejJejNejP¬-«Z)ed.ejJ›d/�«e)D]\Z*ed0e*jV›d1e*jX›d2e*jZ›�«ed3e*j\›�«ed4e*j^›d5�«Œ^yed6«yy)7u²
2026-04-10 16:52:07 +08:00
Few-shot示例选择器 - 基于�验数�集动�选择相关示例
与 Schema ��检索一致,使用 utils.embedding.get_embedder()(远程 OpenAI 兼容 API;
由 OPENAI_* / MODELSCOPE_* / DASHSCOPE_* 等环境��决定)。
用法:
from utils.fewshot_selector import FewShotSelector
2026-04-10 16:52:07 +08:00
# Chroma 模�(FEWSHOT_USE_CHROMA=true):��传 JSONL,路径传 None 或 ""
selector = FewShotSelector(None)
# 或传统:FewShotSelector("data/experiences/all_samples.jsonl")
examples = selector.select(question="查询2024年1月的销售�", top_k=3)
# 在Prompt中使用
2026-04-10 16:52:07 +08:00
prompt = f"{examples}
当�问题:{question}
Schema:{schema}"
éN)ÚPath)ÚListÚDictÚOptional)Ú dataclasscó¬—eZdZUdZeed<eed<eeed<eed<eed<eeed<eeed<eed <e d
e
d dfd „«Z dd
e d efd„Z
2026-04-10 16:52:07 +08:00
d e
fd„Zy)ÚExperienceSampleuç»�验数æ�®æ ·æœ¬ÚqidÚ question_zhÚ question_enÚsqlÚ explanationÚratingÚtagsÚ
difficultyÚdataÚreturnc
ó—||jdd«|jdd«|jd«|jdd«|jdd«|jd«|jdg«|jd d
«¬ «S) Nr
Úr r r
2026-04-10 16:52:07 +08:00
rrrrÚmedium)r
r r r
rrrr)Úget)Úclsrs ú!backend/utils/fewshot_selector.pyÚ from_dictzExperienceSample.from_dict)s{€áØ—‘˜ Ó#ØŸ™ °Ó3ØŸ™ Ó/Ø—‘˜ Ó#ØŸ™ °Ó3Ø—8‘8˜HÓ%Ø—‘˜& "Ó%Ø—x‘x  ¨hÓ7ô 
ð
2026-04-10 16:52:07 +08:00
óÚinclude_explanationcó„—d|j›d|j›�}|r!|jr|d|jdd›�z
}|S)u转æ�¢ä¸ºfew-shotæ ¼å¼�õ 问题:u
SQL:
2026-04-10 16:52:07 +08:00
u
说明:NéÈ)r r
r)ÚselfrÚresults rÚto_fewshot_formatz"ExperienceSample.to_fewshot_format6sN€à˜T×-Ñ-Ð.¨j¸¿¹¸
ÐCˆÙ  4×#3Ò#3Ø ˜  D×$4Ñ$4°T°cÐ$:Ð#;Ð<Ñ <ˆF؈
rcóŒ—|j|j|j|j|j|j
dœS)N)r
Úquestionr
rrr)r
r r
2026-04-16 10:53:10 +08:00
rrr©r s rÚto_dictzExperienceSample.to_dict=s8€à—8‘8Ø×(Ñ(Ø—8‘8Ø—k‘kØ—I‘IØŸ/™/ñ

ð
2026-04-10 16:52:07 +08:00
rN)T)Ú__name__Ú
__module__Ú __qualname__Ú__doc__ÚstrÚ__annotations__rÚintrÚ classmethodÚdictrÚboolr"r&©rrr r s}…áØ ƒHØÓؘ#‘ÓØ ƒHØÓØ �S‰MÓØ
ˆs‰)ƒO؃Oàð

˜Tð
2026-04-16 10:53:10 +08:00

2026-04-10 16:52:07 +08:00
Ð&8ò

óð
2026-04-10 16:52:07 +08:00

ñ°TðÀSóð
˜ô
2026-04-16 10:53:10 +08:00
rr cól—eZdZdZ ddeededeedeefd„Zdd „Zd
„Z dd „Z
2026-04-16 10:53:10 +08:00
dd „Z d
ede dee dee
ededee
2026-04-16 10:53:10 +08:00
ede
efd„Z dd
ede dee dee
2026-04-16 10:53:10 +08:00
ededee
ede
efd„Z dd
ede de defd„Zde
efd„Zd de
ede defd„Zdefd„Zedefd„«Zy)!ÚFewShotSelectoruž
Few-shot示例选择器
根�用户问题,从�验数�集中检索最相似的示例,
2026-04-16 10:53:10 +08:00
用于增强Prompt,��LLM生�质�。
2026-04-10 16:52:07 +08:00
NÚ samples_pathÚ use_cacheÚ
use_chromaÚchroma_persist_dircóœ—|xsdj«}|r t|«nd|_g|_d|_d|_||_d|_d|_d|_ |�|n%tjdd«j«dv|_
||_|jr|j«y|j!«|j#«y)uS
Args:
samples_path: 样本 JSONL 路径;**空字符串**表示�读文件(仅当 ``FEWSHOT_USE_CHROMA=true``
2026-04-16 10:53:10 +08:00
且 Chroma 中已有数�时�用)。构建索引�请用 ``scripts/build_fewshot_chroma_index.py --samples``。
use_cache: 是�缓存样本��(按��维度分文件,�模型会自动�建)
use_chroma: 是�使用 Chroma �久化��库;None 时读环境�� FEWSHOT_USE_CHROMA
chroma_persist_dir: Chroma 目录;None 时用 FEWSHOT_CHROMA_PATH 或默认 chroma_fewshot
rNFÚFEWSHOT_USE_CHROMAÚfalse©Ú1ÚtrueÚyes)Ústriprr4ÚsamplesÚ _embedderÚ
embeddingsr5Ú
cache_pathÚ
2026-04-16 10:53:10 +08:00
_chroma_storeÚ_chroma_ground_truthÚosÚgetenvÚlowerr6Ú_chroma_persist_dirÚ_init_chroma_modeÚ
_load_samplesÚ_init_embedder_and_vector_index)r r4r5r6r7Úsps rÚ__init__zFewShotSelector.__init__PsÁ€ðÒ ˜b×
'Ñ
'Ó
)ˆÙ8:¬D°¬HÀˆÔØ/1ˆŒ ؈ŒØ04ˆŒØ"ˆŒØ*.ˆŒØ!ˆÔà$)ˆÔ!ðÐ%ñ
ä—‘Ð/°Ó9×?Ñ?ÓAÐEYÐYð
Œð
$6ˆÔ à �?Š?Ø × "Ñ "Õ $à × Ñ Ô Ø × 0Ñ 0Õ 2rrcó¶—ddlm}ddlm}|«|_||j|j
¬«|_|j j«}|dkDr,tjd||j j«ná|j«|jrHtjd|j«|j j|jd¬«n}|j€tjd
2026-04-10 16:52:07 +08:00
«n[|jj!«s!tjd |j«n tjd |j«d |_d |_t'j(d
d«j+«dv|_tjd|j j«|j,«y )u@Chroma 模å¼�:先连å�‘é‡�库;库é�žç©ºåˆ™ä¸�å†�读 JSONL。r©Ú get_embedder)ÚFewShotChromaStore)Ú persist_diru8[Few-shot] 已从å�‘é‡�库加载(Chroma %s æ�¡ï¼Œ%s)u?Few-shot Chroma 库为空,正从 JSONL 写入å�‘é‡�索引: %sF)Ú
force_rebuildNu{[Few-shot] Chroma 库为空且未é…�ç½® JSONL;请è¿�行 scripts/build_fewshot_chroma_index.py 或设置 FEWSHOT_DATA_PATHuA[Few-shot] Chroma 库为空且 JSONL ä¸�存在: %s;请先ç�Œåº“u8[Few-shot] Chroma 库为空且 JSONL 无有效样本: %sÚFEWSHOT_CHROMA_GROUND_TRUTHr=r;u=[OK] Few-shot 使用 Chroma(%s æ�¡ï¼‰chroma_ground_truth=%s)Úutils.embeddingrQÚutils.fewshot_chroma_storerRrArIrDÚcountÚloggerÚinforSrKr@r4Úbuild_from_samplesÚwarningÚexistsrBrCrFrGrHrE)r rQrRÚns rrJz!FewShotSelector._init_chroma_modevs~€å0ÝAá%›ˆŒÙ/Ø �N‰NØ×0Ñ0ô
ˆÔð
× Ñ × $Ñ $Ó &ˆØ ˆqŠ5Ü �K‰KØJØØ×"Ñ"×.Ñ.õ
ð
× Ñ Ô Ø�|Š|Ü— ‘ ØUØ×%Ñ%ôð×"Ñ"×5Ñ5°d·l±lÐRWÐ5ÕXØ×"Ñ"Ð*Ü—‘ðXõð×&Ñ&×-Ñ-Ô/Ü—‘ØWØ×%Ñ%õô
—‘ØNØ×%Ñ%ôð
ˆŒØˆŒä$&§I¡IØ )¨6ó%
ç
‰%‹'Ð)ð%*ˆÔ!ô � ‰ Ø KØ × Ñ × $Ñ $Ó &Ø × %Ñ %õ
rcóÜ—|j€-|jrtjd«yt d«‚|jj «sE|jr!tj
2026-04-16 10:53:10 +08:00
d|j«ytd|j›�«‚tjd|j«|jjdd¬ «5}|D]S}tj|j««}|jjtj|««ŒU ddd«tjd
t!|j««y#1swYŒ3xYw) ud从 JSONL 加载样本到内存(é�ž Chroma 模å¼�必需;Chroma 空库时用于首次ç�Œåº“)。NuA[Few-shot] 未é…�ç½® JSONL 路径,è¿�行时仅从 Chroma 检索uG未指定样本 JSONL 路径且未å�¯ç”¨ Chroma(FEWSHOT_USE_CHROMA)uI[Few-shot] JSONL ä¸�存在 %s,跳过文件加载,仅从 Chroma 检索u样本文件ä¸�存在: u从 JSONL 加载样本: %sÚrzutf-8)Úencodingu"[OK] 自 JSONL 加载 %s 个样本)r4r6rYrZÚ
2026-04-10 16:52:07 +08:00
ValueErrorr]r\ÚFileNotFoundErrorÚopenÚjsonÚloadsr?r@Úappendr rÚlen)r ÚfÚliners rrKzFewShotSelector._load_samples«s€à × Ñ Ð $Ø�ŠÜ— ‘ Ð_Ô`ØÜÐfÓgÐ gà× Ñ ×'Ñ'Ô)Ø�ŠÜ—‘Ø_Ø×%Ñ%ôðÜ#Ð&=¸d×>OÑ>OÐ=PÐ$QÓRÐ Rä� ‰ Ð0°$×2CÑ2CÔDØ
×
Ñ
×
#Ñ
# C°'Ð
#Ô
:¸aÛ�Ü—z‘z $§*¡*£,Ó/�Ø— ‘ ×#Ñ#Ô$4×$>Ñ$>¸tÓ$DÕEñ÷;ô
2026-04-10 16:52:07 +08:00
� ‰ Ð8¼#¸d¿l¹lÓ:KÕL÷ ;Ð
:ús
ÃAE"Å"E+cóH—ddlm}|«|_|j«y)u9é�ž Chroma:åˆ�始化 Embedder 与内存 numpy 索引。rrPN)rVrQrAÚ_build_numpy_index)r rQs rrLz/FewShotSelector._init_embedder_and_vector_indexÄs€å0á%›ˆŒØ ×ÑÕ!rc ó*—|j€J‚|jjdgddd¬«}t|jd«}|jj
|jj ›d|›d�z |_|jr­|jj«r“ tj|j«|_ |jjd t|j«k(r?|jjd|k(r#tj!d
|j›�«y|jD�cgc]$}|j&xsd
j)«xsd‘Œ&}}|s-tj*d |ftj,¬«|_ ytj!dt|«›d�«|jj|t/dt|««dd¬«|_ |jrZ|j�Mtj0|j|j«tj!d|j›�«yyy#t"$r$}tj%d |›d �«Yd}~�ŒPd}~wwxYwcc}w)u?内存å�‘é‡� + å�¯é€‰ .npy 缓存(与历å�²è¡Œä¸ºä¸€è‡´ï¼‰ã€‚NÚ éTF©Ú
batch_sizeÚ normalizeÚ
2026-04-16 10:53:10 +08:00
show_progressz .fewshot_dimz.npyru#[OK] 加载 Few-shot å�‘é‡�缓存: uFew-shot 缓存加载失败: u,将é‡�新计算r)Údtypeu计算 u 个 Few-shot 样本å�‘é‡�...é u[OK] Few-shot å�‘é‡�已缓存: )rAÚencoder-Úshaper4ÚparentÚstemrCr5r]ÚnpÚloadrBrhr@rYrZÚ Exceptionr\r r?ÚemptyÚfloat32ÚminÚsave)r ÚprobeÚdimÚeÚsÚ questionss rrlz"FewShotSelector._build_numpy_indexËs1€à�~‰~Ð)Ð)Ð)Ø—‘×%Ñ%Ø
ˆEØØØð &ó
2026-04-10 16:52:07 +08:00
ˆô �%—+‘+˜a‘.Ó!ˆà × Ñ × $Ñ $¨$×*;Ñ*;×*@Ñ*@Ð)AÀÈcÈUÐRVÐ'WÑ Wð
2026-04-16 10:53:10 +08:00
Œð �>Š>˜dŸo™o×4Ñ4Ô6ð
2026-04-10 16:52:07 +08:00
VÜ"$§'¡'¨$¯/©/Ó":�”à—O‘O×)Ñ)¨!Ñ,´°D·L±LÓ0AÒAØŸ™×-Ñ-¨aÑ0°CÒ7ä—K‘KÐ"EÀdÇoÁoÐEVÐ WÔXØð—\’\ó
2026-04-16 10:53:10 +08:00
á!�ð�]‰]Ò
˜b× 'Ñ 'Ó )Ò 0¨SÑ 0Ø!ð ð
2026-04-10 16:52:07 +08:00
ñÜ Ÿh™h¨¨3 x´r·z±zÔBˆDŒOØ ä� ‰ �gœc )›nÐ-Ð-JÐKÔLØŸ.™.×/Ñ/Ø Ü˜2œs 9›~Ó.ØØð 0ó
ˆŒð �>Š>˜dŸo™oÐ9Ü �G‰G�D—O‘O T§_¡_Ô 5Ü �K‰KÐ9¸$¿/¹/Ð9JÐKÕ Lð:ˆ>øô)ò
2026-04-16 10:53:10 +08:00
VÜ—‘Ð!>¸q¸cÐASÐT×UÒUûð
Vüò
sÂ&BI Å)JÉ J
É)JÊJ
2026-04-16 10:53:10 +08:00
r$Útop_kÚ
min_ratingÚ
required_tagsÚmax_difficultyÚ exclude_qidsc
ó ‡—ddlm}|j€J‚t|j«}|jj «} t
|xsg«}
2026-04-10 16:52:07 +08:00
|r$t| t||
zdz|dz««} d} d}
2026-04-16 10:53:10 +08:00
nt|dzd«} |} |}
|jj|| ¬«}g}|D]’\}}}|||«Š|r‰j|vrŒ!| r‰j�‰j| krŒ?|
d k(r‰jd k7rŒT|
d
k(r‰jdk(rŒi|rtˆfd „|D««sŒ€|j|‰f«Œ”|jd „¬
«|d|D��cgc]\}}|‘Œ }}}|d|D��cgc]&\}}|jt!t#|«d«f‘Œ(}}}|r$t$j'dt
|«|||«|St$j'dt
2026-04-16 10:53:10 +08:00
|«dkDr|dddzn|t
|«|||«|Scc}}wcc}}w)Nr)Úsample_from_chroma_metadataééÚhardé é0)r†Úeasyrc3ó:•K—|]}|‰jv–—Œy­w©N©r)Ú.0Útagr„s €rÚ <genexpr>z1FewShotSelector._select_chroma.<locals>.<genexpr>søèø€Ð(PÁ-¸3¨°·±¬Á-ùóƒcó—|d S©Nrr1©Úxs rÚ<lambda>z0FewShotSelector._select_chroma.<locals>.<lambda>#ó
€ q¨¡t¡er©ÚkeyéuiFew-shot(Chroma 黄金库): 相似度优先 → 选中 %s æ�¡ top_k=%s (忽略 min_rating=%sï¼›scores=%s)uXFew-shot(Chroma)选择: 问题=%r → 选中 %s æ�¡ (top_k=%s, min_rating=%s, scores=%s)éPu…)rWrŒrDr0rErXrhrÚmaxÚ
search_rawr
rrÚallrgÚsortÚroundÚfloatrYrZ)r r$r†r‡rˆr‰rŠrŒÚgtr^Úexcl_nÚ
over_fetchÚeff_min_ratingÚ eff_max_diffÚrowsÚ
2026-04-10 16:52:07 +08:00
candidatesÚscoreÚmetaÚdocÚ_r„ÚselectedÚscÚscoreds ` rÚ_select_chromazFewShotSelector._select_chromaús(ø€õ Kà×!Ñ!Ð-Ð-Ð-Ü
�$×+Ñ+Ó
2026-04-16 10:53:10 +08:00
,ˆØ × Ñ × $Ñ $Ó &ˆÜ�\Ò' RÓ(ˆá
ܘQ¤ E¨F¡N°QÑ$6¸À¹ Ó BÓCˆJØ!ˆNØ!‰Lä˜U R™Z¨Ó,ˆJØ'ˆNØ)ˆLà×!Ñ!×,Ñ,¨X¸ZÐ,ÓHˆØ;=ˆ
Û $Ñ ˆE�4˜Ù+¨D°#Ó6ˆAÙ §¡¨Ñ 5ØÙ !§(¡(Ð"6¸1¿8¹8ÀnÒ;TØØ˜vÒ%¨!¯,©,¸&Ò*@ØØ˜xÒ'¨A¯L©L¸FÒ,BØÙ¤SÓ(PÁ-Ó(PÔ%PØØ × Ñ ˜u a˜jÕ )ð!%ð �‰™OˆÔ,Ø",¨V¨eÑ"4Ô5Ñ"4™$˜!˜Q’AÐ"4ˆÑ5Ø<FÀvÈÑ<NÔOÑ<N±5°2°q�1—5‘5œ%¤ b£ ¨1Ó-Ò.Ð<NˆÑOÙ
Ü �K‰KØ{Ü�H“
2026-04-10 16:52:07 +08:00
ØØØô 
ð ˆô
2026-04-16 10:53:10 +08:00
�K‰KØjÜ+.¨x«=¸2Ò+=�˜#˜2� Ò&À8Ü�H“
2026-04-10 16:52:07 +08:00
ØØØô

ðˆùó'6ùÛOs Å HÅ5+H
c
ó0‡
—|j�|j||||||«S|j� |j€tj d«gSt
|j«dk(rgS|jj|gddd¬«d}tj|j|«}g} tt||j««D]Œ\}
\} Š