ChromaDB:如何使用向量数据库避免教学踩坑

问题:教授还没有教过的内容 我有一个包含47个课时的编程课程。每个课时都有notes(我解释概念的地方)和labs(学生练习的地方)。我有个问题:有时我在labs中使用了还没在notes中解释过的概念。 “好的,在这个练习中用map来转换列表。” 问题在哪?我要到三个课时之后才解释map是什么鬼东西。 这种情况比你想象的更常见。你脑子里装着所有材料,在不同地方跳来跳去,不知不觉就假设学生知道你还没告诉他们的东西。结果:挫败感、困惑,还有学生认为自己很笨,其实笨的是你。 手动解决方案是检查每个lab,记下使用了哪些概念,然后验证这些概念之前是否已经解释过。但我有47个课时,每个都有好几个notebook。算了吧。 解决方案:使用ChromaDB进行语义搜索 思路很简单: 从每个notebook中提取概念(教了什么,用了什么) 保存在一个理解语义而不仅仅是文本的数据库中 对于lab中使用的每个概念,验证它是否存在于之前的notes中 这里"理解语义"是关键。如果在notes中我说"高阶函数",在lab中使用"higher-order function",grep什么也找不到。但语义上它们是一样的。 这就是ChromaDB的用武之地:一个向量数据库,它将文本转换为嵌入向量并允许按相似性搜索。用人话说:你保存文本,然后可以问"有没有类似这个的东西?“它会返回最相似的结果。 5分钟了解ChromaDB ChromaDB就像SQLite但用于嵌入向量。一个文件(或文件夹),无需服务器,无需配置。安装,使用,开跑。 1 2 3 pip install chromadb # 或者如果你使用uv: uv add chromadb 基本概念 在普通数据库中你保存带列的行。在ChromaDB中你保存带嵌入向量的文档: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import chromadb # 创建客户端(持久化到磁盘) client = chromadb.PersistentClient(path="./mi_db") # 创建一个"集合"(类似表) collection = client.get_or_create_collection( name="conceptos", metadata={"hnsw:space": "cosine"} # 余弦距离 ) # 保存文档 collection.add( ids=["c1", "c2", "c3"], documents=["纯函数", "for循环", "递归"], metadatas=[ {"clase": "class_010", "tipo": "notes"}, {"clase": "class_015", "tipo": "notes"}, {"clase": "class_020", "tipo": "notes"}, ] ) 就这样。ChromaDB自动: ...

2026年1月18日 · Fernando