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

166 lines
19 KiB
Plaintext
Raw Normal View History

2026-04-10 16:52:07 +08:00
Ë
š±Øiè/ã ó˜—dZddlZddlZddlmZddlmZmZmZddl m
Z
ddl Z ddl
Z
e
je«ZdZe
Gd„d««ZGd „d
«Zd efd „Zed
k(�réddlZej,d¬«Zej1dd¬«ej1dd¬«ej1ded¬«ej1ded¬«ej1ddd¬«ej5«Zeej8«Zej<rƒej?«Ze d«e d ed!›�«e d"ed#d$›�«e d%ed&›�«e d'«e!ed(jE«d)„¬*«dd+Z#e#D]\Z$Z%e d,e$›d-e%›�«ŒyejLrªejOejLejPejR¬.«Z*e d/ejL›d0�«e*D]\Z+e d1e+jX›d2e+jZ›d3e+j\›�«e d4e+j^›�«e d5e+j`›d6�«Œ^ye d7«yy)8uW
Few-shot示例选择器 - 基于�验数�集动�选择相关示例
与 Schema ��检索一致,使用 utils.embedding.get_embedder()(本地 Qwen3 或远程 OpenAI 兼容 API,
由 USE_LOCAL_EMBEDDING � OPENAI_* / MODELSCOPE_* / DASHSCOPE_* 等环境��决定)。
用法:
from utils.fewshot_selector import FewShotSelector
selector = FewShotSelector("data/experiences/all_samples.jsonl")
examples = selector.select(question="查询2024年1月的销售�", top_k=3)
# 在Prompt中使用
prompt = f"{examples}
当�问题:{question}
Schema:{schema}"
éN)ÚPath)ÚListÚDictÚOptional)Ú dataclassz"./data/models/Qwen3-Embedding-0.6Bcó¬—eZdZUdZeed<eed<eeed<eed<eed<eeed<eeed<eed <e d
e
d dfd „«Z dd
e d efd„Z
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
rrrrÚmedium)r
r r r
rrrr)Úget)Úclsrs úSC:\Users\24019\Desktop\backman-camel\text2sql_agent_camel\utils\fewshot_selector.pyÚ from_dictzExperienceSample.from_dict*s{€áØ—‘˜ Ó#ØŸ™ °Ó3ØŸ™ Ó/Ø—‘˜ Ó#ØŸ™ °Ó3Ø—8‘8˜HÓ%Ø—‘˜& "Ó%Ø—x‘x  ¨hÓ7ô 
ð
óÚinclude_explanationcó„—d|j›d|j›�}|r!|jr|d|jdd›�z
}|S)u转æ�¢ä¸ºfew-shotæ ¼å¼�õ 问题:u
SQL:
u
说明:NéÈ)r r
r)ÚselfrÚresults rÚto_fewshot_formatz"ExperienceSample.to_fewshot_format7sN€à˜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
rrr)r s rÚto_dictzExperienceSample.to_dict>s8€à—8‘8Ø×(Ñ(Ø—8‘8Ø—k‘kØ—I‘IØŸ/™/ñ

ð
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ð

Ð&8ò

óð

ñ°TðÀSóð
˜ô
rr cóÖ—eZdZdZ ddedeedefd„Zd„Zd„Z dd ed
e
d ee
d ee ed
edee ede e fd„Z
dd ed
e
d e
defd„Zdde ede
defd„Zdefd„Zy)ÚFewShotSelectoruž
Few-shot示例选择器
根�用户问题,从�验数�集中检索最相似的示例,
用于增强Prompt,��LLM生�质�。
NÚ samples_pathÚembedding_model_pathÚ use_cachecó —t|«|_g|_d|_d|_||_d|_|�|n'tjdt«j«|_ |j«|j«y)u]
Args:
samples_path: 样本JSONL文件路径
embedding_model_path: 本地 Embedding 模型目录;None 时用环境��
EMBEDDING_MODEL_PATH(仅 USE_LOCAL_EMBEDDING=true 时有效)
use_cache: 是�缓存样本��(按��维度分文件,�模型会自动�建)
NÚEMBEDDING_MODEL_PATH)rr3ÚsamplesÚ _embedderÚ
embeddingsr5Ú
cache_pathÚosÚgetenvÚ_DEFAULT_LOCAL_EMBED_PATHÚstripÚ_embedding_model_pathÚ
_load_samplesÚ _build_index)r r3r4r5s rÚ__init__zFewShotSelector.__init__Qs|€ô! Ó.ˆÔØ/1ˆŒ ؈ŒØ04ˆŒØ"ˆŒØ*.ˆŒð$Ð/ñ
!ä—‘Ð1Ô3LÓM×SÑSÓUð
Ô"ð
×ÑÔØ ×ÑÕrcó—|jj«std|j›�«‚tj d|j›�«|jj dd¬«5}|D]S}t
j|j««}|jjtj|««ŒU ddd«tj dt|j«›d�«y#1swYŒ6xYw) u加载样本数æ�®u样本文件ä¸�存在: u加载样本: Úrzutf-8)ÚencodingNu [OK] 加载 u
个样本)r3ÚexistsÚFileNotFoundErrorÚloggerÚinfoÚopenÚjsonÚloadsr?r8Úappendr rÚlen)r ÚfÚliners rrAzFewShotSelector._load_samplesms΀à× Ñ ×'Ñ'Ô)Ü#Ð&=¸d×>OÑ>OÐ=PÐ$QÓRÐ Rä� ‰ �n T×%6Ñ%6Ð$7Ð8Ô9Ø
×
Ñ
×
#Ñ
# C°'Ð
#Ô
:¸aÛ�Ü—z‘z $§*¡*£,Ó/�Ø— ‘ ×#Ñ#Ô$4×$>Ñ$>¸tÓ$DÕEñ÷;ô
� ‰ �l¤3 t§|¡|Ó#4Ð"5°ZÐ@ÕA÷ ;Ð
:ús
Á2ADÄD
c óH—ddlm}||j«|_|jj dgddd¬«}t |j d«}|jj|jj›d|›d �z |_
|jr­|jj«r“ tj|j«|_|jj dt!|j"«k(r?|jj d|k(r#t$j'd
|j›�«y |j"D�cgc]$}|j,xsdj/«xsd‘Œ&}}|s-tj0d|ftj2¬«|_y t$j'dt!|«›d�«|jj |t5dt!|««dd¬«|_|jrZ|j�Mtj6|j|j«t$j'd|j›�«y y y #t($r$}t$j+d |›d
�«Yd }~�ŒPd }~wwxYwcc}w)u+用项目统一 Embedder 构建语义索引r)Ú get_embedderÚ éTF©Ú
batch_sizeÚ normalizeÚ
show_progressz .fewshot_dimz.npyu#[OK] 加载 Few-shot å�‘é‡�缓存: NuFew-shot 缓存加载失败: u,将é‡�新计算r)Údtypeu计算 u 个 Few-shot 样本å�‘é‡�...é u[OK] Few-shot å�‘é‡�已缓存: )Úutils.embeddingrSr@r9Úencoder,Úshaper3ÚparentÚstemr;r5rGÚnpÚloadr:rOr8rIrJÚ ExceptionÚwarningr r?ÚemptyÚfloat32ÚminÚsave)r rSÚprobeÚdimÚeÚsÚ questionss rrBzFewShotSelector._build_indexzs6€å0á% d×&@Ñ&@ÓAˆŒØ—‘×%Ñ%Ø
ˆEØØØð &ó
ˆô �%—+‘+˜a‘.Ó!ˆà × Ñ × $Ñ $¨$×*;Ñ*;×*@Ñ*@Ð)AÀÈcÈUÐRVÐ'WÑ Wð
Œð �>Š>˜dŸo™o×4Ñ4Ô6ð
VÜ"$§'¡'¨$¯/©/Ó":�”à—O‘O×)Ñ)¨!Ñ,´°D·L±LÓ0AÒAØŸ™×-Ñ-¨aÑ0°CÒ7ä—K‘KÐ"EÀdÇoÁoÐEVÐ WÔXØð—\’\ó
á!�ð�]‰]Ò
˜b× 'Ñ 'Ó )Ò 0¨SÑ 0Ø!ð ð
ñÜ Ÿ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ð:ˆ>øô)ò
VÜ—‘Ð!>¸q¸cÐASÐT×UÒUûð
Vüò
sÂ5BI/Å)JÉ/ JÉ8JÊJr$Útop_kÚ
min_ratingÚ
required_tagsÚmax_difficultyÚ exclude_qidsrc
óì‡
—|j� |j€tjd«gSt |j
«dk(rgS|jj
|gddd¬«d}tj|j|«}g} tt||j
««D]Œ\}
\} Š
|r‰
j|vrŒ|r‰
jr‰
j|krŒ8|dk(r‰
jdk7rŒM|d k(r‰
jd
k(rŒb|rtˆ
fd „|D««sŒy| j|
| ‰
f«ŒŽ| j!d „¬
«| d|D� �
cgc]\} } }
|
‘Œ
}} }
tj#d|dd›dt |«›d|›d|›d� «|D]R}tj%d|j›d|j&dd›d|j›d|j(dd›d� «ŒT|Scc}
} w)uñ
选择最相关的few-shot示例
Args:
question: 用户问题
top_k: 返回示例数�
min_rating: 最低评分(None表示��制)
required_tags: 必须包�的标签(如["aggregation", "join"])
max_difficulty: 最大难度(过滤更难的示例)
exclude_qids: 排除的QID(��与当�问题相�)
Returns:
排��的示例列表(最相关优先)
NuFew-shot 索引未åˆ�始化rrUTFrVÚeasyrÚhardc3ó:•K—|]}|‰jv–—Œy­w©N©r©Ú.0ÚtagÚsamples €rÚ <genexpr>z)FewShotSelector.select.<locals>.<genexpr>Üsøèø€Ð(UÁ}À¨°· ± Ô);Á}ùóƒcó—|d S©NrUr0©Úxs rÚ<lambda>z(FewShotSelector.select.<locals>.<lambda>ás
€ q¨¡t¡er©ÚkeyuFew-shot选择: 问题='éu...' → 选中u个示例 (top_k=z
, min_rating=Ú)z [z] é2z ... (rating=z, tags=é)r9r:rIÚerrorrOr8r]raÚdotÚ enumerateÚzipr
rrÚallrNÚsortrJÚdebugr r)r r$rnrorprqrrÚq_embÚscoresÚ
candidatesÚidxÚscoreÚ_r|Úselectedrls ` rÚselectzFewShotSelector.select«sø€ð. �>‰>Ð ! T§_¡_Ð%<Ü �L‰LÐ6Ô 7؈Iä ˆt�|‰|Ó  Ò !؈Ià—‘×%Ñ%Ø
ˆJØØØð &ó