Skip to content

持久化、重载与文档生命周期:练习答案 ​

参考实现 ​

标准库独立运行:

python
def compatible(stored, current):
    return all(stored[k] == current[k] for k in ('model','dimension','splitter'))
saved = {'model':'embedding-v1','dimension':8,'splitter':'64/8'}
assert compatible(saved, dict(saved))
assert not compatible(saved, dict(saved,model='embedding-v2'))
assert not compatible(saved, dict(saved,dimension=16))

生产manifest还要包含模板和归一化等影响空间的配置。检查只是拒绝错误组合,迁移仍需重新编码并评估。

返回题目。

两代切分器的重叠变体 ​

先在正文legacy.py的build中把chunk_overlap=0改为8;现代脚本做同样修改。分别追加下面代码,在各自环境运行。结果是每个节点的完整文本及连续节点共同的尾/首子串;不依赖随机节点ID或预估节点数量。

python
nodes=[n.get_content() for n in build(32).docstore.docs.values()]
def shared_suffix_prefix(a,b):
    lengths=[k for k in range(1,min(len(a),len(b))+1) if a[-k:]==b[:k]]
    return a[-max(lengths):] if lengths else ''
shared=[shared_suffix_prefix(a,b) for a,b in zip(nodes,nodes[1:])]
assert len(nodes)>1 and any(shared)
for i,text in enumerate(nodes):print(i,repr(text))
print('shared boundaries',shared)

本输入反复出现相同句子,因此共同子串也可能来自语料自身重复,不能仅凭any(shared)推断重叠算法正确。比较overlap=0和8的完整节点文本,并保留chunk_size与tokenizer不变,才是在隔离配置变化。两代输出顺序由文档节点序列比较,不按ID排序。

用心记录每一步成长