defsoftmax(values: list[float]) -> list[float]: ifnot values: return [] maximum = max(values) exps = [math.exp(value - maximum) for value in values] total = sum(exps) return [value / total for value in exps]
追问:为什么减去最大值不改变结果?如何扩展到二维 Batch?
题目 2:交叉熵
1 2 3 4 5 6 7 8
import math
defcross_entropy(probabilities: list[float], target_index: int) -> float: ifnot0 <= target_index < len(probabilities): raise IndexError("target_index out of range") probability = max(probabilities[target_index], 1e-12) return -math.log(probability)
defcosine(left, right): numerator = sum(a * b for a, b inzip(left, right)) left_norm = math.sqrt(sum(a * a for a in left)) right_norm = math.sqrt(sum(b * b for b in right)) if left_norm == 0or right_norm == 0: return0.0 return numerator / (left_norm * right_norm)
deftop_k(query, documents, k=3): scored = [(cosine(query, vector), doc_id) for doc_id, vector in documents] returnsorted(scored, reverse=True)[:k]
追问:为什么大规模场景不用全量扫描?HNSW 的召回率和延迟怎么权衡?
题目 6:RRF 融合排序
1 2 3 4 5 6 7 8 9
from collections import defaultdict
defreciprocal_rank_fusion(rankings, constant=60): scores = defaultdict(float) for ranking in rankings: for rank, doc_id inenumerate(ranking, start=1): scores[doc_id] += 1.0 / (constant + rank) returnsorted(scores, key=scores.get, reverse=True)
defexecute(self, call_id, function, **kwargs): if call_id in self.results: return self.results[call_id] result = function(**kwargs) self.results[call_id] = result return result
追问:进程在外部操作成功后、写入 results 前崩溃怎么办?为什么真正系统需要业务端支持幂等?
题目 10:流式 SSE 解析
1 2 3 4 5 6 7 8 9 10 11 12 13
defparse_sse(lines): event = {"event": "message", "data": []} for raw in lines: line = raw.rstrip("\n") ifnot line: if event["data"]: yield {"event": event["event"], "data": "\n".join(event["data"])} event = {"event": "message", "data": []} elif line.startswith("event:"): event["event"] = line[6:].strip() elif line.startswith("data:"): event["data"].append(line[5:].lstrip())