issue-2026-03-27-添加粗排精排-第一轮-done-0327.txt
6.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
我:
进行一轮检索效果优化:
参考
[searcher.py](search/searcher.py)
[rerank_client.py](search/rerank_client.py)
[schema.py](config/schema.py)
[es_query_builder.py](search/es_query_builder.py)
[config.yaml](config/config.yaml)
[相关性检索优化说明.md](docs/相关性检索优化说明.md)
在ES返回到rerank期间增加一轮粗排+一轮精排。
1. ES召回,600
2. 粗排:600->240。配置文件增加粗排相关配置,包括输入条数(配置为700,ES拉取的条数改为粗排输入条数),然后增加粗排的融合公式配置,参考现有的reranker融合公式即可、只是去掉其中的重排模型项。
3. 现在的sku选择、为reranker生成title后缀这一套逻辑,是放在粗排后,因为精排也是一个reranker模型(只不过是一个轻量级的,bge-reranker),需要用这个title后缀。
4. 精排:240-80,使用bge-reranker,但是,因为reranker只能选一个backend,考虑如何重构。现在,精排也是一个独立的进程、独立提供端口,服务。但是,因为跟重排逻辑是一致的(即使有部分不一致也应该分离不一致的点进行配置化),所以共用代码,只是根据需要启动两个实例,避免代码冗余。
5. 重排:80,也是用当前的重排代码,调用单独的实例(即现在使用的实例),返回后,经过融合公式,到分页,也参考现在的融合公式,但是,加入一项精排模型打分。
测试时,使用跟我同样的环境./scripts/service_ctl.sh reranker backend 重启相关服务进行测试
codex:
前端这轮我把调试展示重构成了“两层漏斗”:
1. 整体漏斗
在 [frontend/static/js/app.js](/data/saas-search/frontend/static/js/app.js) 里把原来散着的 `Query Analysis / Rerank / Stage Timings / ES Query` 重新组织成了:
- `Query Context`
- `Ranking Funnel`
- `Timing Breakdown`
- `Raw Payloads`
其中 `Ranking Funnel` 现在按阶段卡片展示:
- `ES Recall`
- `Coarse Rank`
- `Fine Rank`
- `Final Rerank`
- `Page Return`
每张卡都尽量只放调参最关键的信息:输入/输出条数、模板、service URL、top_n、fusion/meta。这样你看漏斗收缩、看每段服务表现、看融合参数会更直接。
2. 单条结果漏斗
在结果卡片右侧的 debug 区,我改成了真正的单条漏斗卡片,按“分数结果”和“公式分解”分开看:
- 顶部先看 `Initial Rank / Final Rank / Rank Delta`
- 再看阶段分数:`ES / ES Norm / Coarse / Fine / Rerank / Fused`
- 再看融合因子:`coarse_text_factor / coarse_knn_factor / text_factor / knn_factor / fine_factor / rerank_factor`
- 再看信号拆解:`text_source / text_translation / text_primary / text_support / text_knn / image_knn`
同时保留了可展开的:
- `Rerank Input`
- `Selected SKU`
- `Matched Queries`
- `Multilingual Fields`
为了支撑前端,我顺手在 [search/searcher.py](/data/saas-search/search/searcher.py) 里补了单条 `coarse_score / coarse_text_factor / coarse_knn_factor` 到 `per_result`,这样单条卡片现在能把粗排也完整展示出来。
样式上在 [frontend/static/css/style.css](/data/saas-search/frontend/static/css/style.css) 加了阶段卡片、分数 pill、时延条形图和移动端适配。JS 语法我用 `node --check frontend/static/js/app.js` 过了,后端补充字段也用 `./.venv/bin/python -m py_compile search/searcher.py` 过了。
如果你愿意,我下一步可以继续把这个视图再往“调参工作台”方向推一层,比如再加:
- 漏斗阶段间的 drop rate
- 每条结果的 rank jump 高亮
- 批量对比 top N 结果里某个因子分布
- fusion 参数和结果联动的可视化摘要
我:
1. Fine Rank环节的信息都是N/A,是没有配置吗。fine rank是使用bge-reranker,复用当前reranker模型的代码,但是需要单独起一个服务、单独加载一个模型。
2. Ranking Funnel、Fusion Factors、Signal Breakdown
这些是不是整合起来、按漏斗收集、整理信息、以及进行呈现比较好。
ES 召回的环节,展示Matched Queries各项打分、ES的总分、norm后打分、排序位置,等等关键信息
粗排:粗排融合公式的各项输入、重要中间结果和参数、最后得分,排序位置以及上升/下降了多少。等等关键信息。
精排:同样例举关键的输入、中间过程、输出、排序和位置变化等。
reranker:类似
因为涉及的环节较多,非常要注意的一个点是:不要每次修改都在原来的基础上,为实现目标而打补丁,应该观察一下所涉及的代码现在是怎么做的,务必注意如何适当的清理掉现有逻辑,该如何对其进行修改,来达到目的,以达到代码的精简,避免冗余、分叉。
codex:
`Fine Rank` 之前显示 `N/A`,根因不是前端单纯没写,而是后端原来只有“精排成功拿到分数”时才会填那块 debug;一旦 `fine` 服务没起、没配 `service_url`、调用失败,前端只能看到空值。现在我把这层补齐了:
- 顶层 `debug_info.fine_rank` 现在会始终带 `status / service_profile / service_url / input_window / output_window / query_template / doc_template`
- 失败时会带 `error`
- 成功时再补 `docs / top_n / meta`
- 所以你现在能区分:
- `disabled`
- `pending`
- `ok`
- `failed_no_scores`
- `failed`
也就是说,`fine rank` 本身仍然需要你按设计单独起一个 `bge-reranker` 实例,这一层代码已经按“独立服务 + 共用 reranker 代码”的方式接好了,但服务本身还是要单独启动。
这轮我也把调试展示做了结构化重构,不再继续在旧视图上打补丁。现在是按阶段组织信息:
- 整体漏斗:
- `ES Recall`
- `Coarse Rank`
- `Fine Rank`
- `Final Rerank`
- `Page Return`
- 单条结果:
- 用统一的 `ranking_funnel` 结构来表达每个阶段的
- `rank`
- `delta`
- `score`
- 关键中间量
- 关键 factor
- 输入 payload
具体改动在:
- [search/searcher.py](/data/saas-search/search/searcher.py)
- [frontend/static/js/app.js](/data/saas-search/frontend/static/js/app.js)
- [frontend/static/css/style.css](/data/saas-search/frontend/static/css/style.css)
单条结果现在按 stage card 展示,而不是把 `Ranking Funnel / Fusion Factors / Signal Breakdown` 拆成三块平铺,这样你可以顺着 ES -> 粗排 -> 精排 -> rerank 看每段的输入、过程、输出和位次变化,更适合调融合公式。
检查我也跑过了:
- `node --check frontend/static/js/app.js`
- `./.venv/bin/python -m py_compile search/searcher.py`
- `./.venv/bin/pytest -q tests/test_search_rerank_window.py`
都通过了。
下一步如果你要,我建议直接继续做两件事中的一个:
1. 把 `fine` 实例真正拉起来,然后我再把前端里 `status=failed/pending` 的场景跑成真实数据。
2. 在当前漏斗视图上继续加“阶段 rank 分布 / delta 高亮 / topN 因子对比”,把它做成更像调参工作台。