{"version":2,"relationshipURLBase":"https://codingai-lec03.pages.dev/course/notebook-blocks/0befde2587964e63937189481b9abcce.html","relationshipResolution":"Resolve relative relationship URLs against relationshipURLBase; complete records and absolute URLs are in blocks.","title":"1 · 输入、来源、编码和缓存身份 · 实现代码","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/0befde2587964e63937189481b9abcce.html","markdown":"https://codingai-lec03.pages.dev/course/notebook-blocks/0befde2587964e63937189481b9abcce.md","pages":[{"id":"reading-opening","title":"1 · 输入、来源、编码和缓存身份 · 实现代码","unit":"1 · 输入、来源、编码和缓存身份 · 实现代码","unitId":"notebook-blocks/0befde2587964e63937189481b9abcce","chapter":"course","number":1}],"aliases":[{"oldId":"b-9de98a0a5cf3a51423aa6bdc","targetId":"b-9de98a0a5cf3a51423aa6bdc","page":"reading-opening","operation":"move","beforeSHA256":"1a4de4df51c1a8787dc96ec401888dfe89d250842519319b9af7a931ca765eee","afterSHA256":"1a4de4df51c1a8787dc96ec401888dfe89d250842519319b9af7a931ca765eee","reason":"Same source body in authored semantic page"},{"oldId":"b-9fa303be1d4804c17b000af7","targetId":"b-9fa303be1d4804c17b000af7","page":"reading-opening","operation":"move","beforeSHA256":"cdddee5f74680fdb15e734642557f849cce654d09b0d25d03c3c2a1560698935","afterSHA256":"cdddee5f74680fdb15e734642557f849cce654d09b0d25d03c3c2a1560698935","reason":"Same source body in authored semantic page"},{"oldId":"b-bb5fb3be6a3979189399d629","targetId":"b-bb5fb3be6a3979189399d629","page":"reading-opening","operation":"move","beforeSHA256":"dc06c1e728a4b5740ba634b145bc9a1da6323031626734cb4555db5a744df806","afterSHA256":"dc06c1e728a4b5740ba634b145bc9a1da6323031626734cb4555db5a744df806","reason":"Same source body in authored semantic page"},{"oldId":"b-3f838f2b2329a2bac9e75465","targetId":"b-3f838f2b2329a2bac9e75465","page":"reading-opening","operation":"move","beforeSHA256":"8021c18afc52ba7b6612f43ecfb0fdd4789efe91cc9cd656984357d81a8514de","afterSHA256":"8021c18afc52ba7b6612f43ecfb0fdd4789efe91cc9cd656984357d81a8514de","reason":"Same source body in authored semantic page"},{"oldId":"b-b0fc9de9d1817861d6cbcf68","targetId":"b-b0fc9de9d1817861d6cbcf68","page":"reading-opening","operation":"move","beforeSHA256":"3d32c29794a1b985da1ce28a5c69a139c3d4040422600609c15a1f81f9536114","afterSHA256":"3d32c29794a1b985da1ce28a5c69a139c3d4040422600609c15a1f81f9536114","reason":"Same source body in authored semantic page"}],"blocks":[{"id":"b-9de98a0a5cf3a51423aa6bdc","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/0befde2587964e63937189481b9abcce.html#b-9de98a0a5cf3a51423aa6bdc","content":"[LAB 12 · CLIP延伸：缓存与检索（近似索引选读）](/course/notebooks/921eeaf784284ce19568c6ca7619b55a.html)","sha256":"1a4de4df51c1a8787dc96ec401888dfe89d250842519319b9af7a931ca765eee","chapter":{"id":"course","title":"1 · 输入、来源、编码和缓存身份 · 实现代码"},"unit":{"id":"notebook-blocks/0befde2587964e63937189481b9abcce","title":"1 · 输入、来源、编码和缓存身份 · 实现代码"},"page":{"id":"reading-opening","title":"1 · 输入、来源、编码和缓存身份 · 实现代码","number":1},"sectionTitle":"1 · 输入、来源、编码和缓存身份 · 实现代码","currentQuestion":"1 · 输入、来源、编码和缓存身份 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":null,"nextBlock":"b-9fa303be1d4804c17b000af7","prerequisites":[],"relatedBlocks":[]},{"id":"b-9fa303be1d4804c17b000af7","type":"h1","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/0befde2587964e63937189481b9abcce.html#b-9fa303be1d4804c17b000af7","content":"# 1 · 输入、来源、编码和缓存身份 · 实现代码","sha256":"cdddee5f74680fdb15e734642557f849cce654d09b0d25d03c3c2a1560698935","chapter":{"id":"course","title":"1 · 输入、来源、编码和缓存身份 · 实现代码"},"unit":{"id":"notebook-blocks/0befde2587964e63937189481b9abcce","title":"1 · 输入、来源、编码和缓存身份 · 实现代码"},"page":{"id":"reading-opening","title":"1 · 输入、来源、编码和缓存身份 · 实现代码","number":1},"sectionTitle":"1 · 输入、来源、编码和缓存身份 · 实现代码","currentQuestion":"1 · 输入、来源、编码和缓存身份 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-9de98a0a5cf3a51423aa6bdc","nextBlock":"b-bb5fb3be6a3979189399d629","prerequisites":[{"id":"b-9de98a0a5cf3a51423aa6bdc","url":"#b-9de98a0a5cf3a51423aa6bdc","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-bb5fb3be6a3979189399d629","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/0befde2587964e63937189481b9abcce.html#b-bb5fb3be6a3979189399d629","content":"并入相关学习路径","sha256":"dc06c1e728a4b5740ba634b145bc9a1da6323031626734cb4555db5a744df806","chapter":{"id":"course","title":"1 · 输入、来源、编码和缓存身份 · 实现代码"},"unit":{"id":"notebook-blocks/0befde2587964e63937189481b9abcce","title":"1 · 输入、来源、编码和缓存身份 · 实现代码"},"page":{"id":"reading-opening","title":"1 · 输入、来源、编码和缓存身份 · 实现代码","number":1},"sectionTitle":"1 · 输入、来源、编码和缓存身份 · 实现代码","currentQuestion":"1 · 输入、来源、编码和缓存身份 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-9fa303be1d4804c17b000af7","nextBlock":"b-3f838f2b2329a2bac9e75465","prerequisites":[{"id":"b-9fa303be1d4804c17b000af7","url":"#b-9fa303be1d4804c17b000af7","role":"section-title"},{"id":"b-9de98a0a5cf3a51423aa6bdc","url":"#b-9de98a0a5cf3a51423aa6bdc","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-3f838f2b2329a2bac9e75465","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/0befde2587964e63937189481b9abcce.html#b-3f838f2b2329a2bac9e75465","content":"同一CLIP缓存、exact/IVF搜索、延迟/扫描量、区域交互基线","sha256":"8021c18afc52ba7b6612f43ecfb0fdd4789efe91cc9cd656984357d81a8514de","chapter":{"id":"course","title":"1 · 输入、来源、编码和缓存身份 · 实现代码"},"unit":{"id":"notebook-blocks/0befde2587964e63937189481b9abcce","title":"1 · 输入、来源、编码和缓存身份 · 实现代码"},"page":{"id":"reading-opening","title":"1 · 输入、来源、编码和缓存身份 · 实现代码","number":1},"sectionTitle":"1 · 输入、来源、编码和缓存身份 · 实现代码","currentQuestion":"1 · 输入、来源、编码和缓存身份 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-bb5fb3be6a3979189399d629","nextBlock":"b-b0fc9de9d1817861d6cbcf68","prerequisites":[{"id":"b-9fa303be1d4804c17b000af7","url":"#b-9fa303be1d4804c17b000af7","role":"section-title"},{"id":"b-9de98a0a5cf3a51423aa6bdc","url":"#b-9de98a0a5cf3a51423aa6bdc","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-b0fc9de9d1817861d6cbcf68","type":"pre","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/0befde2587964e63937189481b9abcce.html#b-b0fc9de9d1817861d6cbcf68","content":"```\n# 独立材料，不依赖另一册 notebook 的内存；重复运行复用本项目已下载内容。\nfrom pathlib import Path\nimport io, json, zipfile, requests, sys, hashlib\n_candidates=[Path.cwd()/'lecture03-clip-retrieval', Path.cwd()]\nRETRIEVAL_ROOT=next((p for p in _candidates if (p/'cache/clip-features.npz').exists()),None)\nif RETRIEVAL_ROOT is None:\n    _response=requests.get('https://codingai-lec03.pages.dev/course/materials/lecture03-clip-retrieval.zip',timeout=60)\n    _response.raise_for_status()\n    _data=_response.content\n    print('下载材料 ZIP:',len(_data),'bytes; SHA256',hashlib.sha256(_data).hexdigest())\n    with zipfile.ZipFile(io.BytesIO(_data)) as z:\n        for info in z.infolist():\n            target=(Path.cwd()/info.filename).resolve()\n            assert target.is_relative_to(Path.cwd().resolve()), '拒绝越界路径'\n            if info.is_dir():target.mkdir(parents=True,exist_ok=True)\n            elif not target.exists():\n                target.parent.mkdir(parents=True,exist_ok=True);target.write_bytes(z.read(info))\n    RETRIEVAL_ROOT=Path.cwd()/'lecture03-clip-retrieval'\nassert (RETRIEVAL_ROOT/'cache/provenance.json').is_file()\nsys.path.insert(0,str(RETRIEVAL_ROOT))\nimport run_clip_retrieval as cr\nimport numpy as np\np=json.loads((RETRIEVAL_ROOT/'cache/provenance.json').read_text())\nassert cr.sha(RETRIEVAL_ROOT/'cache/clip-features.npz')==p['cache_sha256']\nassert cr.sha(RETRIEVAL_ROOT/'assets/manifest.json')==p['manifest_sha256']\nmanifest=json.loads((RETRIEVAL_ROOT/'assets/manifest.json').read_text())\nfor r in manifest['gallery']+manifest['relation']+manifest['holder']:\n    assert cr.sha(RETRIEVAL_ROOT/r['path'])==r['sha256']\na=np.load(RETRIEVAL_ROOT/'cache/clip-features.npz')\nprint('已核验真实 CLIP 缓存；生成时间',p['generated_at_utc'])\nprint('本格只载入缓存，没有在当前 notebook 运行 CLIP 编码器。')\nprint('gallery, queries:',a['gallery'].shape,a['queries'].shape)\n\n```","sha256":"3d32c29794a1b985da1ce28a5c69a139c3d4040422600609c15a1f81f9536114","chapter":{"id":"course","title":"1 · 输入、来源、编码和缓存身份 · 实现代码"},"unit":{"id":"notebook-blocks/0befde2587964e63937189481b9abcce","title":"1 · 输入、来源、编码和缓存身份 · 实现代码"},"page":{"id":"reading-opening","title":"1 · 输入、来源、编码和缓存身份 · 实现代码","number":1},"sectionTitle":"1 · 输入、来源、编码和缓存身份 · 实现代码","currentQuestion":"1 · 输入、来源、编码和缓存身份 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-3f838f2b2329a2bac9e75465","nextBlock":null,"prerequisites":[{"id":"b-9fa303be1d4804c17b000af7","url":"#b-9fa303be1d4804c17b000af7","role":"section-title"},{"id":"b-9de98a0a5cf3a51423aa6bdc","url":"#b-9de98a0a5cf3a51423aa6bdc","role":"problem-context"}],"relatedBlocks":[]}]}
